Browse Source

Allow comparing metadata entities across compilations.

pull/1030/head
Daniel Grunwald 7 years ago
parent
commit
d63a37dcda
  1. 15
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataEvent.cs
  2. 17
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataField.cs
  3. 15
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataMethod.cs
  4. 44
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataProperty.cs
  5. 15
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs
  6. 10
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeParameter.cs
  7. 5
      ILSpy/Controls/CustomDialog.cs

15
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataEvent.cs

@ -127,9 +127,22 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
public string ReflectionName => $"{DeclaringType?.ReflectionName}.{Name}"; public string ReflectionName => $"{DeclaringType?.ReflectionName}.{Name}";
public string Namespace => DeclaringType?.Namespace ?? string.Empty; public string Namespace => DeclaringType?.Namespace ?? string.Empty;
public override bool Equals(object obj)
{
if (obj is MetadataEvent ev) {
return handle == ev.handle && assembly.PEFile == ev.assembly.PEFile;
}
return false;
}
public override int GetHashCode()
{
return 0x7937039a ^ assembly.PEFile.GetHashCode() ^ handle.GetHashCode();
}
bool IMember.Equals(IMember obj, TypeVisitor typeNormalization) bool IMember.Equals(IMember obj, TypeVisitor typeNormalization)
{ {
return this == obj; return Equals(obj);
} }
public IMember Specialize(TypeParameterSubstitution substitution) public IMember Specialize(TypeParameterSubstitution substitution)

17
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataField.cs

@ -255,9 +255,22 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
return null; return null;
} }
public bool Equals(IMember obj, TypeVisitor typeNormalization) public override bool Equals(object obj)
{ {
return this == obj; if (obj is MetadataField f) {
return handle == f.handle && assembly.PEFile == f.assembly.PEFile;
}
return false;
}
public override int GetHashCode()
{
return 0x11dda32b ^ assembly.PEFile.GetHashCode() ^ handle.GetHashCode();
}
bool IMember.Equals(IMember obj, TypeVisitor typeNormalization)
{
return Equals(obj);
} }
public IMember Specialize(TypeParameterSubstitution substitution) public IMember Specialize(TypeParameterSubstitution substitution)

15
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataMethod.cs

@ -406,9 +406,22 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
public string ReflectionName => $"{DeclaringType?.ReflectionName}.{Name}"; public string ReflectionName => $"{DeclaringType?.ReflectionName}.{Name}";
public string Namespace => DeclaringType?.Namespace ?? string.Empty; public string Namespace => DeclaringType?.Namespace ?? string.Empty;
public override bool Equals(object obj)
{
if (obj is MetadataMethod m) {
return handle == m.handle && assembly.PEFile == m.assembly.PEFile;
}
return false;
}
public override int GetHashCode()
{
return 0x5a00d671 ^ assembly.PEFile.GetHashCode() ^ handle.GetHashCode();
}
bool IMember.Equals(IMember obj, TypeVisitor typeNormalization) bool IMember.Equals(IMember obj, TypeVisitor typeNormalization)
{ {
return obj == this; return Equals(obj);
} }
public IMethod Specialize(TypeParameterSubstitution substitution) public IMethod Specialize(TypeParameterSubstitution substitution)

44
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataProperty.cs

@ -36,8 +36,8 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
readonly MetadataAssembly assembly; readonly MetadataAssembly assembly;
readonly PropertyDefinitionHandle propertyHandle; readonly PropertyDefinitionHandle propertyHandle;
readonly MethodDefinitionHandle getterHandle; readonly IMethod getter;
readonly MethodDefinitionHandle setterHandle; readonly IMethod setter;
readonly string name; readonly string name;
readonly SymbolKind symbolKind; readonly SymbolKind symbolKind;
@ -56,8 +56,8 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
var metadata = assembly.metadata; var metadata = assembly.metadata;
var prop = metadata.GetPropertyDefinition(handle); var prop = metadata.GetPropertyDefinition(handle);
var accessors = prop.GetAccessors(); var accessors = prop.GetAccessors();
getterHandle = accessors.Getter; getter = assembly.GetDefinition(accessors.Getter);
setterHandle = accessors.Setter; setter = assembly.GetDefinition(accessors.Setter);
name = metadata.GetString(prop.Name); name = metadata.GetString(prop.Name);
if (name == (DeclaringTypeDefinition as MetadataTypeDefinition)?.DefaultMemberName) { if (name == (DeclaringTypeDefinition as MetadataTypeDefinition)?.DefaultMemberName) {
symbolKind = SymbolKind.Indexer; symbolKind = SymbolKind.Indexer;
@ -78,12 +78,12 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
public EntityHandle MetadataToken => propertyHandle; public EntityHandle MetadataToken => propertyHandle;
public string Name => name; public string Name => name;
public bool CanGet => !getterHandle.IsNil; public bool CanGet => getter != null;
public bool CanSet => !setterHandle.IsNil; public bool CanSet => setter != null;
public IMethod Getter => assembly.GetDefinition(getterHandle); public IMethod Getter => getter;
public IMethod Setter => assembly.GetDefinition(setterHandle); public IMethod Setter => setter;
IMethod AnyAccessor => assembly.GetDefinition(getterHandle.IsNil ? setterHandle : getterHandle); IMethod AnyAccessor => getter ?? setter;
public bool IsIndexer => symbolKind == SymbolKind.Indexer; public bool IsIndexer => symbolKind == SymbolKind.Indexer;
public SymbolKind SymbolKind => symbolKind; public SymbolKind SymbolKind => symbolKind;
@ -114,11 +114,12 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
var propertyDef = assembly.metadata.GetPropertyDefinition(propertyHandle); var propertyDef = assembly.metadata.GetPropertyDefinition(propertyHandle);
var genericContext = new GenericContext(DeclaringType.TypeParameters); var genericContext = new GenericContext(DeclaringType.TypeParameters);
var signature = propertyDef.DecodeSignature(assembly.TypeProvider, genericContext); var signature = propertyDef.DecodeSignature(assembly.TypeProvider, genericContext);
var accessors = propertyDef.GetAccessors();
ParameterHandleCollection? parameterHandles; ParameterHandleCollection? parameterHandles;
if (!getterHandle.IsNil) if (!accessors.Getter.IsNil)
parameterHandles = assembly.metadata.GetMethodDefinition(getterHandle).GetParameters(); parameterHandles = assembly.metadata.GetMethodDefinition(accessors.Getter).GetParameters();
else if (!setterHandle.IsNil) else if (!accessors.Setter.IsNil)
parameterHandles = assembly.metadata.GetMethodDefinition(setterHandle).GetParameters(); parameterHandles = assembly.metadata.GetMethodDefinition(accessors.Setter).GetParameters();
else else
parameterHandles = null; parameterHandles = null;
var (returnType, parameters) = MetadataMethod.DecodeSignature(assembly, this, signature, parameterHandles); var (returnType, parameters) = MetadataMethod.DecodeSignature(assembly, this, signature, parameterHandles);
@ -169,7 +170,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
Accessibility ComputeAccessibility() Accessibility ComputeAccessibility()
{ {
if (IsOverride && (getterHandle.IsNil || setterHandle.IsNil)) { if (IsOverride && (getter == null || setter == null)) {
foreach (var baseMember in InheritanceHelper.GetBaseMembers(this, includeImplementedInterfaces: false)) { foreach (var baseMember in InheritanceHelper.GetBaseMembers(this, includeImplementedInterfaces: false)) {
if (!baseMember.IsOverride) if (!baseMember.IsOverride)
return baseMember.Accessibility; return baseMember.Accessibility;
@ -219,9 +220,22 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
public string ReflectionName => $"{DeclaringType?.ReflectionName}.{Name}"; public string ReflectionName => $"{DeclaringType?.ReflectionName}.{Name}";
public string Namespace => DeclaringType?.Namespace ?? string.Empty; public string Namespace => DeclaringType?.Namespace ?? string.Empty;
public override bool Equals(object obj)
{
if (obj is MetadataProperty p) {
return propertyHandle == p.propertyHandle && assembly.PEFile == p.assembly.PEFile;
}
return false;
}
public override int GetHashCode()
{
return 0x32b6a76c ^ assembly.PEFile.GetHashCode() ^ propertyHandle.GetHashCode();
}
bool IMember.Equals(IMember obj, TypeVisitor typeNormalization) bool IMember.Equals(IMember obj, TypeVisitor typeNormalization)
{ {
return this == obj; return Equals(obj);
} }
public IMember Specialize(TypeParameterSubstitution substitution) public IMember Specialize(TypeParameterSubstitution substitution)

15
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs

@ -422,9 +422,22 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
return this; return this;
} }
public override bool Equals(object obj)
{
if (obj is MetadataTypeDefinition td) {
return handle == td.handle && assembly.PEFile == td.assembly.PEFile;
}
return false;
}
public override int GetHashCode()
{
return 0x2e0520f2 ^ assembly.PEFile.GetHashCode() ^ handle.GetHashCode();
}
bool IEquatable<IType>.Equals(IType other) bool IEquatable<IType>.Equals(IType other)
{ {
return this == other; return Equals(other);
} }
#region GetNestedTypes #region GetNestedTypes

10
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeParameter.cs

@ -143,6 +143,16 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
return result; return result;
} }
public override int GetHashCode()
{
return 0x51fc5b83 ^ assembly.PEFile.GetHashCode() ^ handle.GetHashCode();
}
public override bool Equals(IType other)
{
return other is MetadataTypeParameter tp && handle == tp.handle && assembly.PEFile == tp.assembly.PEFile;
}
public override string ToString() public override string ToString()
{ {
return $"{MetadataTokens.GetToken(handle):X8} Index={Index} Owner={Owner}"; return $"{MetadataTokens.GetToken(handle):X8} Index={Index} Owner={Owner}";

5
ILSpy/Controls/CustomDialog.cs

@ -158,10 +158,5 @@ namespace ICSharpCode.ILSpy.Controls
this.AutoScaleMode = AutoScaleMode.Dpi; this.AutoScaleMode = AutoScaleMode.Dpi;
this.AutoScaleDimensions = new SizeF(96, 96); this.AutoScaleDimensions = new SizeF(96, 96);
} }
private void CustomDialog_KeyDown(object sender, KeyEventArgs e)
{
throw new NotImplementedException();
}
} }
} }

Loading…
Cancel
Save