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. 4
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedMethod.cs
  9. 4
      ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMethod.cs

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

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

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

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

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

@ -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 // 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 // software and associated documentation files (the "Software"), to deal in the Software
@ -951,7 +951,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
throw new InvalidOperationException(); throw new InvalidOperationException();
if (this.IsExtensionMethodInvocation && member is IMethod) if (this.IsExtensionMethodInvocation && member is IMethod)
member =new InvocatedExtensionMethod ((IMethod)member); member =new ReducedExtensionMethod ((IMethod)member);
return new CSharpInvocationResolveResult( return new CSharpInvocationResolveResult(
this.IsExtensionMethodInvocation ? new TypeResolveResult(member.DeclaringType) : targetResolveResult, this.IsExtensionMethodInvocation ? new TypeResolveResult(member.DeclaringType) : targetResolveResult,
member, member,

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

@ -1,5 +1,5 @@
// //
// InvocatedExtensionMethod.cs // ReducedExtensionMethod.cs
// //
// Author: // Author:
// Mike Krüger <mkrueger@xamarin.com> // Mike Krüger <mkrueger@xamarin.com>
@ -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 /// 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. /// syntactic way of writing extension methods on semantic level.
/// </summary> /// </summary>
public class InvocatedExtensionMethod : IMethod public class ReducedExtensionMethod : IMethod
{ {
readonly IMethod baseMethod; readonly IMethod baseMethod;
public IMethod InvocatedMethod { public ReducedExtensionMethod(IMethod baseMethod)
get { {
return 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 #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() public IMemberReference ToMemberReference()
{ {
return baseMethod.ToMemberReference (); return new ReducedExtensionMethodMemberReference (baseMethod);
} }
public IMember MemberDefinition { public IMember MemberDefinition {
@ -129,7 +167,7 @@ namespace ICSharpCode.NRefactory.CSharp
public bool IsExtensionMethod { public bool IsExtensionMethod {
get { get {
return baseMethod.IsExtensionMethod; return false;
} }
} }
@ -181,6 +219,10 @@ namespace ICSharpCode.NRefactory.CSharp
} }
} }
public IMethod ReducedFrom {
get { return baseMethod; }
}
#endregion #endregion
#region IParameterizedMember implementation #region IParameterizedMember implementation

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

@ -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 // 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 // software and associated documentation files (the "Software"), to deal in the Software
@ -54,12 +54,12 @@ namespace XN {
InvocationResolveResult mrr; InvocationResolveResult mrr;
mrr = Resolve<CSharpInvocationResolveResult>(program.Replace("$", "$a.F(1)$")); 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("XN.XC.F", member.FullName);
Assert.AreEqual("System.Int32", member.Parameters [1].Type.FullName); Assert.AreEqual("System.Int32", member.Parameters [1].Type.FullName);
mrr = Resolve<CSharpInvocationResolveResult>(program.Replace("$", "$a.F(\"text\")$")); 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("XN.XC.F", member.FullName);
Assert.AreEqual("System.String", member.Parameters[1].Type.FullName); Assert.AreEqual("System.String", member.Parameters[1].Type.FullName);
@ -67,7 +67,7 @@ namespace XN {
Assert.AreEqual("B.F", mrr.Member.FullName); Assert.AreEqual("B.F", mrr.Member.FullName);
mrr = Resolve<CSharpInvocationResolveResult>(program.Replace("$", "$b.F(\"text\")$")); 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("XN.XC.F", member.FullName);
Assert.AreEqual("System.String", member.Parameters[1].Type.FullName); Assert.AreEqual("System.String", member.Parameters[1].Type.FullName);
@ -146,7 +146,7 @@ public static class XC {
"; ";
var rr = Resolve<CSharpInvocationResolveResult>(program); var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.AreEqual("A[]", rr.Type.ReflectionName); 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("System.Linq.Enumerable.ToArray", member.FullName);
Assert.AreEqual("A", ((SpecializedMethod)member).TypeArguments.Single().ReflectionName); Assert.AreEqual("A", ((SpecializedMethod)member).TypeArguments.Single().ReflectionName);
} }

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

@ -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 // 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 // software and associated documentation files (the "Software"), to deal in the Software
@ -349,7 +349,7 @@ class TestClass
}"; }";
var rr = Resolve<CSharpInvocationResolveResult>(program); var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.IsFalse(rr.IsError); Assert.IsFalse(rr.IsError);
var member = ((InvocatedExtensionMethod)rr.Member).InvocatedMethod; var member = ((IMethod)rr.Member).ReducedFrom;
Assert.AreEqual("SelectMany", member.Name); Assert.AreEqual("SelectMany", member.Name);
Assert.AreEqual(3, member.Parameters.Count); Assert.AreEqual(3, member.Parameters.Count);
var typeArguments = ((SpecializedMethod)member).TypeArguments; var typeArguments = ((SpecializedMethod)member).TypeArguments;
@ -372,7 +372,7 @@ class TestClass
}"; }";
var rr = Resolve<CSharpInvocationResolveResult>(program); var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.IsFalse(rr.IsError); Assert.IsFalse(rr.IsError);
var member = ((InvocatedExtensionMethod)rr.Member).InvocatedMethod; var member = ((IMethod)rr.Member).ReducedFrom;
Assert.AreEqual("SelectMany", member.Name); Assert.AreEqual("SelectMany", member.Name);
Assert.AreEqual(3, member.Parameters.Count); Assert.AreEqual(3, member.Parameters.Count);
var typeArguments = ((SpecializedMethod)member).TypeArguments; var typeArguments = ((SpecializedMethod)member).TypeArguments;

5
ICSharpCode.NRefactory/TypeSystem/IMethod.cs

@ -132,5 +132,10 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// Otherwise, returns null. /// Otherwise, returns null.
/// </summary> /// </summary>
IMember AccessorOwner { get; } 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; }
} }
} }

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

@ -209,6 +209,10 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return ((IUnresolvedMethod)unresolved).AccessorOwner != null; } get { return ((IUnresolvedMethod)unresolved).AccessorOwner != null; }
} }
public IMethod ReducedFrom {
get { return null; }
}
public IMember AccessorOwner { public IMember AccessorOwner {
get { get {
var reference = ((IUnresolvedMethod)unresolved).AccessorOwner; var reference = ((IUnresolvedMethod)unresolved).AccessorOwner;

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

@ -137,6 +137,10 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return methodDefinition.IsAccessor; } get { return methodDefinition.IsAccessor; }
} }
public IMethod ReducedFrom {
get { return null; }
}
IMember accessorOwner; IMember accessorOwner;
public IMember AccessorOwner { public IMember AccessorOwner {

Loading…
Cancel
Save