Browse Source

Fix icsharpcode/NRefactory#33: Determining if a ThisResolveResult represents this. or base.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
9771b6db8f
  1. 2
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs
  2. 18
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/InvocationTests.cs

2
ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs

@ -2133,7 +2133,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -2133,7 +2133,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
if (t != null) {
foreach (IType baseType in t.DirectBaseTypes) {
if (baseType.Kind != TypeKind.Unknown && baseType.Kind != TypeKind.Interface) {
return new ThisResolveResult(baseType);
return new ThisResolveResult(baseType, causesNonVirtualInvocation: true);
}
}
}

18
ICSharpCode.NRefactory.Tests/CSharp/Resolver/InvocationTests.cs

@ -521,5 +521,23 @@ class C { @@ -521,5 +521,23 @@ class C {
Assert.That(rr.TargetResult, Is.InstanceOf<TypeResolveResult>());
}
[Test]
public void BaseInvocation()
{
string program = @"
class B {
public virtual void F(int x, int y) {}
}
class D : B {
public override void F(int x, int y) {}
public void M() {
$base.F(0, 1)$;
}
}";
var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.IsFalse(rr.IsError);
Assert.IsFalse(rr.IsVirtualCall);
}
}
}

Loading…
Cancel
Save