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

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

@ -144,6 +144,49 @@ public class Foo @@ -144,6 +144,49 @@ public class Foo
var lrr = Resolve<MemberResolveResult>(program);
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