Browse Source

Fixed resolving non-generic classes that are nested within generic classes.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
fd91bdccb2
  1. 12
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs
  2. 45
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs

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

@ -2008,9 +2008,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
} }
} }
bool parameterizeResultType = k > 0; bool parameterizeResultType = !(typeArguments.Count != 0 && typeArguments.All(t => t.Kind == TypeKind.UnboundTypeArgument));
if (parameterizeResultType && typeArguments.All(t => t.Kind == TypeKind.UnboundTypeArgument))
parameterizeResultType = false;
ResolveResult r = null; ResolveResult r = null;
if (currentTypeDefinition != null) { if (currentTypeDefinition != null) {
@ -2152,7 +2150,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
def = context.GetTypeDefinition(ns.NamespaceName, identifier, k, StringComparer.Ordinal); def = context.GetTypeDefinition(ns.NamespaceName, identifier, k, StringComparer.Ordinal);
if (def != null) { if (def != null) {
if (firstResult == null) { if (firstResult == null) {
if (parameterizeResultType) if (parameterizeResultType && k > 0)
firstResult = new ParameterizedType(def, typeArguments); firstResult = new ParameterizedType(def, typeArguments);
else else
firstResult = def; firstResult = def;
@ -2238,9 +2236,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
bool parameterizeResultType = typeArguments.Count > 0; bool parameterizeResultType = !(typeArguments.Count != 0 && typeArguments.All(t => t.Kind == TypeKind.UnboundTypeArgument));
if (parameterizeResultType && typeArguments.All(t => t.Kind == TypeKind.UnboundTypeArgument))
parameterizeResultType = false;
NamespaceResolveResult nrr = target as NamespaceResolveResult; NamespaceResolveResult nrr = target as NamespaceResolveResult;
if (nrr != null) { if (nrr != null) {
@ -2260,7 +2256,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
} }
ITypeDefinition def = context.GetTypeDefinition(nrr.NamespaceName, identifier, typeArguments.Count, StringComparer.Ordinal); ITypeDefinition def = context.GetTypeDefinition(nrr.NamespaceName, identifier, typeArguments.Count, StringComparer.Ordinal);
if (def != null) { if (def != null) {
if (parameterizeResultType) if (parameterizeResultType && typeArguments.Count > 0)
return new TypeResolveResult(new ParameterizedType(def, typeArguments)); return new TypeResolveResult(new ParameterizedType(def, typeArguments));
else else
return new TypeResolveResult(def); return new TypeResolveResult(def);

45
ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs

@ -144,6 +144,49 @@ public class Foo
var lrr = Resolve<MemberResolveResult>(program); var lrr = Resolve<MemberResolveResult>(program);
Assert.AreEqual("System.Int32", lrr.Type.FullName); Assert.AreEqual("System.Int32", lrr.Type.FullName);
} }
[Test]
public void TestOuterTemplateParameterInDerivedClass()
{
string program = @"public class A<T>
{
public class B
{
public T field;
}
}
public class Foo : A<int>.B
{
public void Bar ()
{
$field$.ToString ();
}
}";
var lrr = Resolve<MemberResolveResult>(program);
Assert.AreEqual("System.Int32", lrr.Type.FullName);
}
[Test]
public void TestOuterTemplateParameterInDerivedClass2()
{
string program = @"public class A<T>
{
public class B
{
public T field;
}
}
public class Foo : A<int>
{
public void Bar (B v)
{
$v.field$.ToString ();
}
}";
var lrr = Resolve<MemberResolveResult>(program);
Assert.AreEqual("System.Int32", lrr.Type.FullName);
}
} }
} }

Loading…
Cancel
Save