Browse Source

Implemented reduced method model.

pull/32/merge
Mike Krüger 13 years ago
parent
commit
aaf2b919f5
  1. 4
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 2
      ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
  3. 4
      ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs
  4. 60
      ICSharpCode.NRefactory.CSharp/Resolver/ReducedExtensionMethod.cs
  5. 10
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/ExtensionMethodTests.cs
  6. 6
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/LinqTests.cs
  7. 5
      ICSharpCode.NRefactory/TypeSystem/IMethod.cs
  8. 6
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedMethod.cs
  9. 6
      ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMethod.cs

4
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//
//
// CSharpCompletionEngine.cs
//
// Author:
@ -2570,7 +2570,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2570,7 +2570,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
foreach (var m in meths) {
if (!lookup.IsAccessible(m, isProtectedAllowed))
continue;
result.AddMember(new InvocatedExtensionMethod (m));
result.AddMember(new ReducedExtensionMethod (m));
}
}
}

2
ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj

@ -512,7 +512,7 @@ @@ -512,7 +512,7 @@
<Compile Include="Refactoring\CodeActions\CreateEnumValue.cs" />
<Compile Include="Resolver\AliasTypeResolveResult.cs" />
<Compile Include="Resolver\AliasNamespaceResolveResult.cs" />
<Compile Include="Resolver\InvocatedExtensionMethod.cs" />
<Compile Include="Resolver\ReducedExtensionMethod.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">

4
ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
@ -951,7 +951,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -951,7 +951,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
throw new InvalidOperationException();
if (this.IsExtensionMethodInvocation && member is IMethod)
member =new InvocatedExtensionMethod ((IMethod)member);
member =new ReducedExtensionMethod ((IMethod)member);
return new CSharpInvocationResolveResult(
this.IsExtensionMethodInvocation ? new TypeResolveResult(member.DeclaringType) : targetResolveResult,
member,

60
ICSharpCode.NRefactory.CSharp/Resolver/InvocatedExtensionMethod.cs → ICSharpCode.NRefactory.CSharp/Resolver/ReducedExtensionMethod.cs

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
//
// InvocatedExtensionMethod.cs
// ReducedExtensionMethod.cs
//
// Author:
// Mike Krüger <mkrueger@xamarin.com>
@ -35,26 +35,64 @@ namespace ICSharpCode.NRefactory.CSharp @@ -35,26 +35,64 @@ namespace ICSharpCode.NRefactory.CSharp
/// It's used to hide the internals of extension method invocation in certain situation to simulate the
/// syntactic way of writing extension methods on semantic level.
/// </summary>
public class InvocatedExtensionMethod : IMethod
public class ReducedExtensionMethod : IMethod
{
readonly IMethod baseMethod;
public IMethod InvocatedMethod {
get {
return baseMethod;
public ReducedExtensionMethod(IMethod baseMethod)
{
this.baseMethod = baseMethod;
}
public override bool Equals(object obj)
{
var other = obj as ReducedExtensionMethod;
if (other == null)
return false;
return baseMethod.Equals(other.baseMethod);
}
public override int GetHashCode()
{
unchecked {
return baseMethod.GetHashCode() + 1;
}
}
public InvocatedExtensionMethod(IMethod baseMethod)
public override string ToString()
{
this.baseMethod = baseMethod;
return string.Format("[ReducedExtensionMethod: ReducedFrom={0}]", ReducedFrom);
}
#region IMember implementation
[Serializable]
public sealed class ReducedExtensionMethodMemberReference : IMemberReference
{
readonly IMethod baseMethod;
public ReducedExtensionMethodMemberReference (IMethod baseMethod)
{
this.baseMethod = baseMethod;
}
#region IMemberReference implementation
public IMember Resolve(ITypeResolveContext context)
{
return new ReducedExtensionMethod ((IMethod)baseMethod.ToMemberReference ().Resolve (context));
}
public ITypeReference DeclaringTypeReference {
get {
return baseMethod.ToMemberReference ().DeclaringTypeReference;
}
}
#endregion
}
public IMemberReference ToMemberReference()
{
return baseMethod.ToMemberReference ();
return new ReducedExtensionMethodMemberReference (baseMethod);
}
public IMember MemberDefinition {
@ -129,7 +167,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -129,7 +167,7 @@ namespace ICSharpCode.NRefactory.CSharp
public bool IsExtensionMethod {
get {
return baseMethod.IsExtensionMethod;
return false;
}
}
@ -181,6 +219,10 @@ namespace ICSharpCode.NRefactory.CSharp @@ -181,6 +219,10 @@ namespace ICSharpCode.NRefactory.CSharp
}
}
public IMethod ReducedFrom {
get { return baseMethod; }
}
#endregion
#region IParameterizedMember implementation

10
ICSharpCode.NRefactory.Tests/CSharp/Resolver/ExtensionMethodTests.cs

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
@ -54,12 +54,12 @@ namespace XN { @@ -54,12 +54,12 @@ namespace XN {
InvocationResolveResult mrr;
mrr = Resolve<CSharpInvocationResolveResult>(program.Replace("$", "$a.F(1)$"));
var member = ((InvocatedExtensionMethod)mrr.Member).InvocatedMethod;
var member = ((IMethod)mrr.Member).ReducedFrom;
Assert.AreEqual("XN.XC.F", member.FullName);
Assert.AreEqual("System.Int32", member.Parameters [1].Type.FullName);
mrr = Resolve<CSharpInvocationResolveResult>(program.Replace("$", "$a.F(\"text\")$"));
member = ((InvocatedExtensionMethod)mrr.Member).InvocatedMethod;
member = ((IMethod)mrr.Member).ReducedFrom;
Assert.AreEqual("XN.XC.F", member.FullName);
Assert.AreEqual("System.String", member.Parameters[1].Type.FullName);
@ -67,7 +67,7 @@ namespace XN { @@ -67,7 +67,7 @@ namespace XN {
Assert.AreEqual("B.F", mrr.Member.FullName);
mrr = Resolve<CSharpInvocationResolveResult>(program.Replace("$", "$b.F(\"text\")$"));
member = ((InvocatedExtensionMethod)mrr.Member).InvocatedMethod;
member = ((IMethod)mrr.Member).ReducedFrom;
Assert.AreEqual("XN.XC.F", member.FullName);
Assert.AreEqual("System.String", member.Parameters[1].Type.FullName);
@ -146,7 +146,7 @@ public static class XC { @@ -146,7 +146,7 @@ public static class XC {
";
var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.AreEqual("A[]", rr.Type.ReflectionName);
var member = ((InvocatedExtensionMethod)rr.Member).InvocatedMethod;
var member = ((IMethod)rr.Member).ReducedFrom;
Assert.AreEqual("System.Linq.Enumerable.ToArray", member.FullName);
Assert.AreEqual("A", ((SpecializedMethod)member).TypeArguments.Single().ReflectionName);
}

6
ICSharpCode.NRefactory.Tests/CSharp/Resolver/LinqTests.cs

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
@ -349,7 +349,7 @@ class TestClass @@ -349,7 +349,7 @@ class TestClass
}";
var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.IsFalse(rr.IsError);
var member = ((InvocatedExtensionMethod)rr.Member).InvocatedMethod;
var member = ((IMethod)rr.Member).ReducedFrom;
Assert.AreEqual("SelectMany", member.Name);
Assert.AreEqual(3, member.Parameters.Count);
var typeArguments = ((SpecializedMethod)member).TypeArguments;
@ -372,7 +372,7 @@ class TestClass @@ -372,7 +372,7 @@ class TestClass
}";
var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.IsFalse(rr.IsError);
var member = ((InvocatedExtensionMethod)rr.Member).InvocatedMethod;
var member = ((IMethod)rr.Member).ReducedFrom;
Assert.AreEqual("SelectMany", member.Name);
Assert.AreEqual(3, member.Parameters.Count);
var typeArguments = ((SpecializedMethod)member).TypeArguments;

5
ICSharpCode.NRefactory/TypeSystem/IMethod.cs

@ -132,5 +132,10 @@ namespace ICSharpCode.NRefactory.TypeSystem @@ -132,5 +132,10 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// Otherwise, returns null.
/// </summary>
IMember AccessorOwner { get; }
/// <summary>
/// If this method is reduced from an extension method return the original method, <c>null</c> otherwhise.
/// </summary>
IMethod ReducedFrom { get; }
}
}

6
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedMethod.cs

@ -208,7 +208,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -208,7 +208,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public bool IsAccessor {
get { return ((IUnresolvedMethod)unresolved).AccessorOwner != null; }
}
public IMethod ReducedFrom {
get { return null; }
}
public IMember AccessorOwner {
get {
var reference = ((IUnresolvedMethod)unresolved).AccessorOwner;

6
ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMethod.cs

@ -136,7 +136,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -136,7 +136,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public bool IsAccessor {
get { return methodDefinition.IsAccessor; }
}
public IMethod ReducedFrom {
get { return null; }
}
IMember accessorOwner;
public IMember AccessorOwner {

Loading…
Cancel
Save