Browse Source

When copying type parameters into inner classes, re-use the same ITypeParameter instance.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
aa2e97f564
  1. 4
      ICSharpCode.NRefactory.CSharp/Ast/AstType.cs
  2. 16
      ICSharpCode.NRefactory.ConsistencyCheck/Program.cs
  3. 5
      ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs
  4. 5
      ICSharpCode.NRefactory/TypeSystem/ITypeParameter.cs
  5. 16
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs

4
ICSharpCode.NRefactory.CSharp/Ast/AstType.cs

@ -110,7 +110,9 @@ namespace ICSharpCode.NRefactory.CSharp
/// Create an ITypeReference for this AstType. /// Create an ITypeReference for this AstType.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// The resulting type reference requires a <see cref="CSharpTypeResolveContext"/> to be resolved. /// The resulting type reference requires a
/// <see cref="ICSharpCode.NRefactory.CSharp.TypeSystem.CSharpTypeResolveContext"/>
/// to be resolved.
/// </remarks> /// </remarks>
public abstract ITypeReference ToTypeReference(SimpleNameLookupMode lookupMode = SimpleNameLookupMode.Type); public abstract ITypeReference ToTypeReference(SimpleNameLookupMode lookupMode = SimpleNameLookupMode.Type);

16
ICSharpCode.NRefactory.ConsistencyCheck/Program.cs

@ -28,22 +28,16 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
{ {
class Program class Program
{ {
/*
public static readonly string[] AssemblySearchPaths = { public static readonly string[] AssemblySearchPaths = {
@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0", @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0",
@"C:\Windows\Microsoft.NET\Framework\v2.0.50727",
@"C:\Program Files (x86)\GtkSharp\2.12\lib\gtk-sharp-2.0", @"C:\Program Files (x86)\GtkSharp\2.12\lib\gtk-sharp-2.0",
@"C:\Program Files (x86)\GtkSharp\2.12\lib\Mono.Posix", @"C:\Program Files (x86)\GtkSharp\2.12\lib\Mono.Posix",
@"C:\work\SD\src\Tools\NUnit" @"C:\work\SD\src\Tools\NUnit"
}; };
public const string SolutionFile = @"C:\work\NRefactory\NRefactory.sln"; //public const string SolutionFile = @"C:\work\NRefactory\NRefactory.sln";
/*/ //public const string SolutionFile = @"C:\work\SD\SharpDevelop.sln";
public static readonly string[] AssemblySearchPaths = { public const string SolutionFile = @"C:\work\ILSpy\ILSpy.sln";
@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0",
@"C:\Windows\Microsoft.NET\Framework\v2.0.50727",
};
public const string SolutionFile = @"C:\work\SD\SharpDevelop.sln";
//*/
public const string TempPath = @"C:\temp"; public const string TempPath = @"C:\temp";
@ -63,7 +57,7 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
//RunTestOnAllFiles("Roundtripping test", RoundtripTest.RunTest); //RunTestOnAllFiles("Roundtripping test", RoundtripTest.RunTest);
RunTestOnAllFiles("Resolver test", ResolverTest.RunTest); RunTestOnAllFiles("Resolver test", ResolverTest.RunTest);
//RunTestOnAllFiles("Resolver test (randomized order)", RandomizedOrderResolverTest.RunTest); RunTestOnAllFiles("Resolver test (randomized order)", RandomizedOrderResolverTest.RunTest);
Console.Write("Press any key to continue . . . "); Console.Write("Press any key to continue . . . ");
Console.ReadKey(true); Console.ReadKey(true);

5
ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs

@ -565,7 +565,8 @@ namespace ICSharpCode.NRefactory.TypeSystem
public void InnerClassInGenericClass_TypeParameterOwner() public void InnerClassInGenericClass_TypeParameterOwner()
{ {
ITypeDefinition type = GetTypeDefinition(typeof(OuterGeneric<>.Inner)); ITypeDefinition type = GetTypeDefinition(typeof(OuterGeneric<>.Inner));
Assert.AreSame(type, type.TypeParameters[0].Owner); Assert.AreSame(type.DeclaringTypeDefinition.TypeParameters[0], type.TypeParameters[0]);
Assert.AreSame(type.DeclaringTypeDefinition, type.TypeParameters[0].Owner);
} }
[Test] [Test]
@ -574,7 +575,6 @@ namespace ICSharpCode.NRefactory.TypeSystem
ITypeDefinition type = GetTypeDefinition(typeof(OuterGeneric<>.Inner)); ITypeDefinition type = GetTypeDefinition(typeof(OuterGeneric<>.Inner));
IField f = type.Fields.Single(); IField f = type.Fields.Single();
Assert.AreEqual("ICSharpCode.NRefactory.TypeSystem.TestCase.OuterGeneric`1[[`0]]", f.Type.ReflectionName); Assert.AreEqual("ICSharpCode.NRefactory.TypeSystem.TestCase.OuterGeneric`1[[`0]]", f.Type.ReflectionName);
Assert.AreSame(type, ((f.Type as ParameterizedType).TypeArguments[0] as ITypeParameter).Owner);
} }
[Test] [Test]
@ -583,7 +583,6 @@ namespace ICSharpCode.NRefactory.TypeSystem
ITypeDefinition type = GetTypeDefinition(typeof(OuterGeneric<>.Inner)); ITypeDefinition type = GetTypeDefinition(typeof(OuterGeneric<>.Inner));
IParameter p = type.Methods.Single(m => m.IsConstructor).Parameters.Single(); IParameter p = type.Methods.Single(m => m.IsConstructor).Parameters.Single();
Assert.AreEqual("ICSharpCode.NRefactory.TypeSystem.TestCase.OuterGeneric`1[[`0]]", p.Type.ReflectionName); Assert.AreEqual("ICSharpCode.NRefactory.TypeSystem.TestCase.OuterGeneric`1[[`0]]", p.Type.ReflectionName);
Assert.AreSame(type, ((p.Type as ParameterizedType).TypeArguments[0] as ITypeParameter).Owner);
} }
ResolveResult GetParamsAttributeArgument(int index) ResolveResult GetParamsAttributeArgument(int index)

5
ICSharpCode.NRefactory/TypeSystem/ITypeParameter.cs

@ -72,6 +72,11 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// Gets the owning method/class. /// Gets the owning method/class.
/// This property may return null (for example for the dummy type parameters used by <see cref="ParameterListComparer.NormalizeMethodTypeParameters"/>). /// This property may return null (for example for the dummy type parameters used by <see cref="ParameterListComparer.NormalizeMethodTypeParameters"/>).
/// </summary> /// </summary>
/// <remarks>
/// For "class Outer&lt;T&gt; { class Inner {} }",
/// inner.TypeParameters[0].Owner will be the outer class, because the same
/// ITypeParameter instance is used both on Outer`1 and Outer`1+Inner.
/// </remarks>
IEntity Owner { get; } IEntity Owner { get; }
/// <summary> /// <summary>

16
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs

@ -47,7 +47,21 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
this.parts = parts; this.parts = parts;
ITypeResolveContext contextForTypeParameters = parts[0].CreateResolveContext(parentContext); ITypeResolveContext contextForTypeParameters = parts[0].CreateResolveContext(parentContext);
contextForTypeParameters = contextForTypeParameters.WithCurrentTypeDefinition(this); contextForTypeParameters = contextForTypeParameters.WithCurrentTypeDefinition(this);
this.TypeParameters = parts[0].TypeParameters.CreateResolvedTypeParameters(contextForTypeParameters); if (parentContext.CurrentTypeDefinition == null || parentContext.CurrentTypeDefinition.TypeParameterCount == 0) {
this.TypeParameters = parts[0].TypeParameters.CreateResolvedTypeParameters(contextForTypeParameters);
} else {
// This is a nested class inside a generic class; copy type parameters from outer class if we can:
var outerClass = parentContext.CurrentTypeDefinition;
ITypeParameter[] typeParameters = new ITypeParameter[parts[0].TypeParameters.Count];
for (int i = 0; i < typeParameters.Length; i++) {
var unresolvedTP = parts[0].TypeParameters[i];
if (i < outerClass.TypeParameterCount && outerClass.TypeParameters[i].Name == unresolvedTP.Name)
typeParameters[i] = outerClass.TypeParameters[i];
else
typeParameters[i] = unresolvedTP.CreateResolvedTypeParameter(contextForTypeParameters);
}
this.TypeParameters = Array.AsReadOnly(typeParameters);
}
List<IUnresolvedAttribute> unresolvedAttributes = new List<IUnresolvedAttribute>(); List<IUnresolvedAttribute> unresolvedAttributes = new List<IUnresolvedAttribute>();
List<ITypeResolveContext> contextPerAttribute = new List<ITypeResolveContext>(); List<ITypeResolveContext> contextPerAttribute = new List<ITypeResolveContext>();
List<ITypeResolveContext> contextPerMember = new List<ITypeResolveContext>(); List<ITypeResolveContext> contextPerMember = new List<ITypeResolveContext>();

Loading…
Cancel
Save