Browse Source

Fixed some issues resolving members.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
cbb1fe5008
  1. 13
      ICSharpCode.NRefactory.ConsistencyCheck/TypeSystemTests.cs
  2. 11
      ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs
  3. 2
      ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractUnresolvedMember.cs
  4. 7
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMemberReference.cs
  5. 5
      ICSharpCode.NRefactory/TypeSystem/Implementation/DummyTypeParameter.cs
  6. 9
      ICSharpCode.NRefactory/TypeSystem/Implementation/ExplicitInterfaceImplementationMemberReference.cs

13
ICSharpCode.NRefactory.ConsistencyCheck/TypeSystemTests.cs

@ -56,17 +56,24 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
{ {
foreach (var project in solution.Projects) { foreach (var project in solution.Projects) {
var compilation = project.Compilation; var compilation = project.Compilation;
var context = new SimpleTypeResolveContext(compilation.MainAssembly); var assemblyContext = new SimpleTypeResolveContext(compilation.MainAssembly);
foreach (var typeDef in compilation.MainAssembly.GetAllTypeDefinitions()) { foreach (var typeDef in compilation.MainAssembly.GetAllTypeDefinitions()) {
foreach (var part in typeDef.Parts) { foreach (var part in typeDef.Parts) {
if (!typeDef.Equals(part.Resolve(context))) if (!typeDef.Equals(part.Resolve(assemblyContext)))
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
foreach (var member in typeDef.Members) { foreach (var member in typeDef.Members) {
var resolvedMember = member.UnresolvedMember.Resolve(context); var resolvedMember = member.UnresolvedMember.Resolve(assemblyContext);
if (!member.Equals(resolvedMember)) if (!member.Equals(resolvedMember))
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
// ToMemberReference() requires an appropriate generic context if the member
// contains open generics; otherwise the main context of the compilation is sufficient.
ITypeResolveContext context;
if (typeDef.TypeParameterCount > 0)
context = new SimpleTypeResolveContext(typeDef);
else
context = compilation.TypeResolveContext;
// Include (potentially specialized) inherited members when testing ToMemberReference() // Include (potentially specialized) inherited members when testing ToMemberReference()
foreach (var member in typeDef.GetMembers()) { foreach (var member in typeDef.GetMembers()) {
var resolvedMember = member.ToMemberReference().Resolve(context); var resolvedMember = member.ToMemberReference().Resolve(context);

11
ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs

@ -107,6 +107,17 @@ namespace ICSharpCode.NRefactory.CSharp.Parser
} }
} }
[Test]
public void ExplicitImplementationOfUnifiedMethods_ToMemberReference()
{
IType type = compilation.FindType(typeof(ExplicitGenericInterfaceImplementationWithUnifiableMethods<int, int>));
Assert.AreEqual(2, type.GetMethods(m => m.IsExplicitInterfaceImplementation).Count());
foreach (IMethod method in type.GetMethods(m => m.IsExplicitInterfaceImplementation)) {
IMethod resolvedMethod = (IMethod)method.ToMemberReference().Resolve(compilation.TypeResolveContext);
Assert.AreEqual(method, resolvedMethod);
}
}
[Test] [Test]
public void PartialMethodWithImplementation() public void PartialMethodWithImplementation()
{ {

2
ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractUnresolvedMember.cs

@ -213,7 +213,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
return method; return method;
} else if (method.IsExplicitInterfaceImplementation && method.ImplementedInterfaceMembers.Count == 1) { } else if (method.IsExplicitInterfaceImplementation && method.ImplementedInterfaceMembers.Count == 1) {
IType explicitInterfaceType = explicitInterfaceTypeReference.Resolve(contextForMethod); IType explicitInterfaceType = explicitInterfaceTypeReference.Resolve(contextForMethod);
if (explicitInterfaceTypeReference.Equals(method.ImplementedInterfaceMembers[0].DeclaringType)) if (explicitInterfaceType.Equals(method.ImplementedInterfaceMembers[0].DeclaringType))
return method; return method;
} }
} }

7
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMemberReference.cs

@ -24,7 +24,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
{ {
/// <summary> /// <summary>
/// References an entity by its type and name. /// References an entity by its type and name.
/// This class can be used to refer to fields, events, and parameterless properties. /// This class can be used to refer to all members except for constructors and explicit interface implementations.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Resolving a DefaultMemberReference requires a context that provides enough information for resolving the declaring type reference /// Resolving a DefaultMemberReference requires a context that provides enough information for resolving the declaring type reference
@ -64,11 +64,12 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
IEnumerable<IMember> members; IEnumerable<IMember> members;
if (entityType == EntityType.Method) { if (entityType == EntityType.Method) {
members = type.GetMethods( members = type.GetMethods(
m => m.Name == name && m.EntityType == EntityType.Method && m.TypeParameters.Count == typeParameterCount, m => m.Name == name && m.EntityType == EntityType.Method
&& m.TypeParameters.Count == typeParameterCount && !m.IsExplicitInterfaceImplementation,
GetMemberOptions.IgnoreInheritedMembers); GetMemberOptions.IgnoreInheritedMembers);
} else { } else {
members = type.GetMembers( members = type.GetMembers(
m => m.Name == name && m.EntityType == entityType, m => m.Name == name && m.EntityType == entityType && !m.IsExplicitInterfaceImplementation,
GetMemberOptions.IgnoreInheritedMembers); GetMemberOptions.IgnoreInheritedMembers);
} }
var resolvedParameterTypes = parameterTypes.Resolve(context); var resolvedParameterTypes = parameterTypes.Resolve(context);

5
ICSharpCode.NRefactory/TypeSystem/Implementation/DummyTypeParameter.cs

@ -138,6 +138,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
} }
} }
public override string ToString()
{
return ReflectionName + " (dummy)";
}
public override bool? IsReferenceType { public override bool? IsReferenceType {
get { return null; } get { return null; }
} }

9
ICSharpCode.NRefactory/TypeSystem/Implementation/ExplicitInterfaceImplementationMemberReference.cs

@ -28,6 +28,9 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
/// Resolving an ExplicitInterfaceImplementationMemberReference requires a context /// Resolving an ExplicitInterfaceImplementationMemberReference requires a context
/// that provides enough information for resolving the declaring type reference /// that provides enough information for resolving the declaring type reference
/// and the interface member reference. /// and the interface member reference.
/// Note that the interface member reference is resolved in '<c>context.WithCurrentTypeDefinition(declaringType.GetDefinition())</c>'
/// - this is done to ensure that open generics in the interface member reference resolve to the type parameters of the
/// declaring type.
/// </remarks> /// </remarks>
[Serializable] [Serializable]
public sealed class ExplicitInterfaceImplementationMemberReference : IMemberReference public sealed class ExplicitInterfaceImplementationMemberReference : IMemberReference
@ -51,11 +54,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public IMember Resolve(ITypeResolveContext context) public IMember Resolve(ITypeResolveContext context)
{ {
IMember interfaceMember = interfaceMemberReference.Resolve(context); IType declaringType = typeReference.Resolve(context);
IMember interfaceMember = interfaceMemberReference.Resolve(context.WithCurrentTypeDefinition(declaringType.GetDefinition()));
if (interfaceMember == null) if (interfaceMember == null)
return null; return null;
IType type = typeReference.Resolve(context); var members = declaringType.GetMembers(
var members = type.GetMembers(
m => m.EntityType == interfaceMember.EntityType && m.IsExplicitInterfaceImplementation, m => m.EntityType == interfaceMember.EntityType && m.IsExplicitInterfaceImplementation,
GetMemberOptions.IgnoreInheritedMembers); GetMemberOptions.IgnoreInheritedMembers);
return members.FirstOrDefault(m => m.ImplementedInterfaceMembers.Count == 1 && interfaceMember.Equals(m.ImplementedInterfaceMembers[0])); return members.FirstOrDefault(m => m.ImplementedInterfaceMembers.Count == 1 && interfaceMember.Equals(m.ImplementedInterfaceMembers[0]));

Loading…
Cancel
Save