Browse Source

Fix implementations of BaseTypesEntryNode and DerivedTypesEntryNode and Language.TypeToString

pull/1198/head
Siegfried Pammer 8 years ago
parent
commit
ac00b1e42c
  1. 20
      ICSharpCode.Decompiler/CSharp/AstTypeBuilder.cs
  2. 107
      ILSpy/Languages/CSharpLanguage.cs
  3. 7
      ILSpy/Languages/ILAstLanguage.cs
  4. 7
      ILSpy/Languages/ILLanguage.cs
  5. 30
      ILSpy/Languages/Language.cs
  6. 12
      ILSpy/SearchStrategies.cs
  7. 10
      ILSpy/TreeNodes/BaseTypesEntryNode.cs
  8. 5
      ILSpy/TreeNodes/BaseTypesTreeNode.cs
  9. 2
      ILSpy/TreeNodes/DerivedTypesEntryNode.cs
  10. 19
      ILSpy/TreeNodes/DerivedTypesTreeNode.cs
  11. 2
      ILSpy/TreeNodes/TypeTreeNode.cs

20
ICSharpCode.Decompiler/CSharp/AstTypeBuilder.cs

@ -68,7 +68,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -68,7 +68,7 @@ namespace ICSharpCode.Decompiler.CSharp
public AstType GetGenericTypeParameter(GenericContext genericContext, int index)
{
return new SimpleType(genericContext.GetGenericMethodTypeParameterName(index));
return new SimpleType(genericContext.GetGenericTypeParameterName(index));
}
public AstType GetModifiedType(AstType modifier, AstType unmodifiedType, bool isRequired)
@ -213,14 +213,12 @@ namespace ICSharpCode.Decompiler.CSharp @@ -213,14 +213,12 @@ namespace ICSharpCode.Decompiler.CSharp
public AstType GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind)
{
var td = reader.GetTypeDefinition(handle);
var genericParams = td.GetGenericParameters().Select(gp => (AstType)new SimpleType(reader.GetString(reader.GetGenericParameter(gp).Name))).ToList();
return MakeAstType(handle.GetFullTypeName(reader), genericParams);
return MakeAstType(handle.GetFullTypeName(reader));
}
public AstType GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind)
{
return MakeAstType(handle.GetFullTypeName(reader), EmptyList<AstType>.Instance);
return MakeAstType(handle.GetFullTypeName(reader));
}
public AstType GetTypeFromSpecification(MetadataReader reader, GenericContext genericContext, TypeSpecificationHandle handle, byte rawTypeKind)
@ -229,19 +227,15 @@ namespace ICSharpCode.Decompiler.CSharp @@ -229,19 +227,15 @@ namespace ICSharpCode.Decompiler.CSharp
return ts.DecodeSignature(this, genericContext);
}
AstType MakeAstType(FullTypeName fullTypeName, IList<AstType> genericParams)
AstType MakeAstType(FullTypeName fullTypeName)
{
if (fullTypeName.IsNested) {
int count = fullTypeName.GetNestedTypeAdditionalTypeParameterCount(fullTypeName.NestingLevel - 1);
if ((options & (ConvertTypeOptions.IncludeOuterTypeName | ConvertTypeOptions.IncludeNamespace)) != 0) {
var outerType = MakeAstType(fullTypeName.GetDeclaringType(), genericParams);
var mt = new MemberType(outerType, fullTypeName.Name);
return mt;
var outerType = MakeAstType(fullTypeName.GetDeclaringType());
return new MemberType(outerType, fullTypeName.Name);
} else {
var st = new SimpleType(fullTypeName.Name);
for (int i = 0; i < fullTypeName.TypeParameterCount - count; i++)
genericParams.RemoveAt(0);
return st;
return new SimpleType(fullTypeName.Name);
}
}
AstType baseType;

107
ILSpy/Languages/CSharpLanguage.cs

@ -132,7 +132,7 @@ namespace ICSharpCode.ILSpy @@ -132,7 +132,7 @@ namespace ICSharpCode.ILSpy
{
AddReferenceWarningMessage(method.Module, output);
var md = method.Module.Metadata.GetMethodDefinition(method.Handle);
WriteCommentLine(output, TypeDefinitionToString(new Entity(method.Module, md.GetDeclaringType()), includeNamespace: true));
WriteCommentLine(output, TypeToString(new Entity(method.Module, md.GetDeclaringType()), includeNamespace: true));
CSharpDecompiler decompiler = CreateDecompiler(method.Module, options);
var methodDefinition = decompiler.TypeSystem.ResolveAsMethod(method.Handle);
if (methodDefinition.IsConstructor && methodDefinition.DeclaringType.IsReferenceType != false) {
@ -201,7 +201,7 @@ namespace ICSharpCode.ILSpy @@ -201,7 +201,7 @@ namespace ICSharpCode.ILSpy
CSharpDecompiler decompiler = CreateDecompiler(property.Module, options);
var metadata = property.Module.Metadata;
var accessorHandle = metadata.GetPropertyDefinition(property.Handle).GetAccessors().GetAny();
WriteCommentLine(output, TypeDefinitionToString(new Decompiler.Metadata.TypeDefinition(property.Module, metadata.GetMethodDefinition(accessorHandle).GetDeclaringType()), includeNamespace: true));
WriteCommentLine(output, TypeToString(new Decompiler.Metadata.TypeDefinition(property.Module, metadata.GetMethodDefinition(accessorHandle).GetDeclaringType()), includeNamespace: true));
WriteCode(output, options.DecompilerSettings, decompiler.Decompile(property.Handle), decompiler.TypeSystem);
}
@ -209,7 +209,7 @@ namespace ICSharpCode.ILSpy @@ -209,7 +209,7 @@ namespace ICSharpCode.ILSpy
{
AddReferenceWarningMessage(field.Module, output);
var fd = field.Module.Metadata.GetFieldDefinition(field.Handle);
WriteCommentLine(output, TypeDefinitionToString(new Decompiler.Metadata.TypeDefinition(field.Module, fd.GetDeclaringType()), includeNamespace: true));
WriteCommentLine(output, TypeToString(new Decompiler.Metadata.TypeDefinition(field.Module, fd.GetDeclaringType()), includeNamespace: true));
CSharpDecompiler decompiler = CreateDecompiler(field.Module, options);
var fieldDefinition = decompiler.TypeSystem.ResolveAsField(field.Handle);
if (fd.HasFlag(FieldAttributes.Literal)) {
@ -270,7 +270,7 @@ namespace ICSharpCode.ILSpy @@ -270,7 +270,7 @@ namespace ICSharpCode.ILSpy
AddReferenceWarningMessage(ev.Module, output);
var metadata = ev.Module.Metadata;
var accessorHandle = metadata.GetEventDefinition(ev.Handle).GetAccessors().GetAny();
base.WriteCommentLine(output, TypeDefinitionToString(new Decompiler.Metadata.TypeDefinition(ev.Module, metadata.GetMethodDefinition(accessorHandle).GetDeclaringType()), includeNamespace: true));
base.WriteCommentLine(output, TypeToString(new Decompiler.Metadata.TypeDefinition(ev.Module, metadata.GetMethodDefinition(accessorHandle).GetDeclaringType()), includeNamespace: true));
CSharpDecompiler decompiler = CreateDecompiler(ev.Module, options);
WriteCode(output, options.DecompilerSettings, decompiler.Decompile(ev.Handle), decompiler.TypeSystem);
}
@ -278,7 +278,7 @@ namespace ICSharpCode.ILSpy @@ -278,7 +278,7 @@ namespace ICSharpCode.ILSpy
public override void DecompileType(Decompiler.Metadata.TypeDefinition type, ITextOutput output, DecompilationOptions options)
{
AddReferenceWarningMessage(type.Module, output);
WriteCommentLine(output, TypeDefinitionToString(type, includeNamespace: true));
WriteCommentLine(output, TypeToString(type, includeNamespace: true));
CSharpDecompiler decompiler = CreateDecompiler(type.Module, options);
WriteCode(output, options.DecompilerSettings, decompiler.Decompile(type.Handle), decompiler.TypeSystem);
}
@ -402,44 +402,70 @@ namespace ICSharpCode.ILSpy @@ -402,44 +402,70 @@ namespace ICSharpCode.ILSpy
}
}
public override string TypeDefinitionToString(Decompiler.Metadata.TypeDefinition type, bool includeNamespace)
public override string TypeToString(Entity type, GenericContext genericContext = null, bool includeNamespace = true)
{
if (type.Handle.IsNil)
throw new ArgumentNullException(nameof(type));
var metadata = type.Module.Metadata;
var td = metadata.GetTypeDefinition(type.Handle);
var genericParams = td.GetGenericParameters();
ConvertTypeOptions convertTypeOptions = ConvertTypeOptions.IncludeTypeParameterDefinitions;
if (includeNamespace)
convertTypeOptions |= ConvertTypeOptions.IncludeNamespace;
//if (includeTypeName)
// convertTypeOptions |= ConvertTypeOptions.IncludeOuterTypeName;
var builder = new AstTypeBuilder(convertTypeOptions);
AstType astType;
switch (type.Handle.Kind) {
case HandleKind.TypeReference:
astType = builder.GetTypeFromReference(metadata, (TypeReferenceHandle)type.Handle, 0);
return TypeToString(astType, metadata, null);
case HandleKind.TypeDefinition:
var td = metadata.GetTypeDefinition((TypeDefinitionHandle)type.Handle);
var genericParams = td.GetGenericParameters();
var buffer = new System.Text.StringBuilder();
var buffer = new System.Text.StringBuilder();
var name = td.GetFullTypeName(metadata);
var name = td.GetFullTypeName(metadata);
if (includeNamespace)
buffer.Append(name.ToString());
else
buffer.Append(name.Name);
if (includeNamespace)
buffer.Append(name.ToString());
else
buffer.Append(name.Name);
if (genericParams.Count > 0) {
buffer.Append('<');
int i = 0;
foreach (var h in genericParams) {
var gp = metadata.GetGenericParameter(h);
if (i > 0)
buffer.Append(", ");
buffer.Append(metadata.GetString(gp.Name));
i++;
}
buffer.Append('>');
}
if (genericParams.Count > 0) {
buffer.Append('<');
int i = 0;
foreach (var h in genericParams) {
var gp = metadata.GetGenericParameter(h);
if (i > 0)
buffer.Append(", ");
buffer.Append(metadata.GetString(gp.Name));
i++;
}
buffer.Append('>');
}
return buffer.ToString();
return buffer.ToString();
case HandleKind.TypeSpecification:
var ts = metadata.GetTypeSpecification((TypeSpecificationHandle)type.Handle);
astType = builder.GetTypeFromSpecification(metadata, genericContext ?? GenericContext.Empty, (TypeSpecificationHandle)type.Handle, 0);
return TypeToString(astType, metadata, ts.GetCustomAttributes());
default:
throw new NotSupportedException();
}
}
public override string FieldToString(Decompiler.Metadata.FieldDefinition field, bool includeTypeName, bool includeNamespace)
{
if (field.Handle.IsNil)
throw new ArgumentNullException(nameof(field));
ConvertTypeOptions convertTypeOptions = ConvertTypeOptions.IncludeTypeParameterDefinitions;
if (includeNamespace)
convertTypeOptions |= ConvertTypeOptions.IncludeNamespace;
if (includeTypeName)
convertTypeOptions |= ConvertTypeOptions.IncludeOuterTypeName;
var metadata = field.Module.Metadata;
var fd = metadata.GetFieldDefinition(field.Handle);
AstType fieldType = fd.DecodeSignature(new AstTypeBuilder(ConvertTypeOptions.IncludeTypeParameterDefinitions), new GenericContext(fd.GetDeclaringType(), field.Module));
AstType fieldType = fd.DecodeSignature(new AstTypeBuilder(convertTypeOptions), new GenericContext(fd.GetDeclaringType(), field.Module));
string simple = metadata.GetString(fd.Name) + " : " + TypeToString(fieldType, metadata, fd.GetCustomAttributes());
if (!includeTypeName)
return simple;
@ -453,6 +479,11 @@ namespace ICSharpCode.ILSpy @@ -453,6 +479,11 @@ namespace ICSharpCode.ILSpy
{
if (property.IsNil)
throw new ArgumentNullException(nameof(property));
ConvertTypeOptions convertTypeOptions = ConvertTypeOptions.IncludeTypeParameterDefinitions;
if (includeNamespace)
convertTypeOptions |= ConvertTypeOptions.IncludeNamespace;
if (includeTypeName)
convertTypeOptions |= ConvertTypeOptions.IncludeOuterTypeName;
var metadata = property.Module.Metadata;
var pd = metadata.GetPropertyDefinition(property.Handle);
var accessors = pd.GetAccessors();
@ -474,7 +505,7 @@ namespace ICSharpCode.ILSpy @@ -474,7 +505,7 @@ namespace ICSharpCode.ILSpy
}
}
buffer.Append(@"this[");
var signature = pd.DecodeSignature(new AstTypeBuilder(ConvertTypeOptions.IncludeTypeParameterDefinitions), new GenericContext(accessorHandle, property.Module));
var signature = pd.DecodeSignature(new AstTypeBuilder(convertTypeOptions), new GenericContext(accessorHandle, property.Module));
var parameterHandles = accessor.GetParameters();
@ -511,7 +542,7 @@ namespace ICSharpCode.ILSpy @@ -511,7 +542,7 @@ namespace ICSharpCode.ILSpy
buffer.Append(" : ");
buffer.Append(TypeToString(signature.ReturnType, metadata, returnTypeAttributes));
} else {
var signature = pd.DecodeSignature(new AstTypeBuilder(ConvertTypeOptions.IncludeTypeParameterDefinitions), new GenericContext(accessorHandle, property.Module));
var signature = pd.DecodeSignature(new AstTypeBuilder(convertTypeOptions), new GenericContext(accessorHandle, property.Module));
var parameterHandles = accessor.GetParameters();
@ -562,10 +593,15 @@ namespace ICSharpCode.ILSpy @@ -562,10 +593,15 @@ namespace ICSharpCode.ILSpy
{
if (method.IsNil)
throw new ArgumentNullException("method");
ConvertTypeOptions convertTypeOptions = ConvertTypeOptions.IncludeTypeParameterDefinitions;
if (includeNamespace)
convertTypeOptions |= ConvertTypeOptions.IncludeNamespace;
if (includeTypeName)
convertTypeOptions |= ConvertTypeOptions.IncludeOuterTypeName;
var metadata = method.Module.Metadata;
var md = metadata.GetMethodDefinition(method.Handle);
var name = (md.IsConstructor(metadata)) ? TypeDefinitionToString(new Decompiler.Metadata.TypeDefinition(method.Module, md.GetDeclaringType()), includeNamespace) : metadata.GetString(md.Name);
var signature = md.DecodeSignature(new AstTypeBuilder(ConvertTypeOptions.IncludeTypeParameterDefinitions), new GenericContext(method));
var name = (md.IsConstructor(metadata)) ? TypeToString(new Decompiler.Metadata.TypeDefinition(method.Module, md.GetDeclaringType()), includeNamespace: includeNamespace) : metadata.GetString(md.Name);
var signature = md.DecodeSignature(new AstTypeBuilder(convertTypeOptions), new GenericContext(method));
int i = 0;
var buffer = new System.Text.StringBuilder(name);
@ -622,13 +658,18 @@ namespace ICSharpCode.ILSpy @@ -622,13 +658,18 @@ namespace ICSharpCode.ILSpy
{
if (@event.IsNil)
throw new ArgumentNullException(nameof(@event));
ConvertTypeOptions convertTypeOptions = ConvertTypeOptions.IncludeTypeParameterDefinitions;
if (includeNamespace)
convertTypeOptions |= ConvertTypeOptions.IncludeNamespace;
if (includeTypeName)
convertTypeOptions |= ConvertTypeOptions.IncludeOuterTypeName;
var metadata = @event.Module.Metadata;
var ed = metadata.GetEventDefinition(@event.Handle);
var accessors = ed.GetAccessors();
var accessorHandle = accessors.GetAny();
var accessor = metadata.GetMethodDefinition(accessorHandle);
var declaringType = metadata.GetTypeDefinition(accessor.GetDeclaringType());
var signature = ed.DecodeSignature(metadata, new AstTypeBuilder(ConvertTypeOptions.IncludeTypeParameterDefinitions), new GenericContext(accessorHandle, @event.Module));
var signature = ed.DecodeSignature(metadata, new AstTypeBuilder(convertTypeOptions), new GenericContext(accessorHandle, @event.Module));
var parameterHandles = accessor.GetParameters();
CustomAttributeHandleCollection? returnTypeAttributes = null;

7
ILSpy/Languages/ILAstLanguage.cs

@ -70,13 +70,6 @@ namespace ICSharpCode.ILSpy @@ -70,13 +70,6 @@ namespace ICSharpCode.ILSpy
}
}
public override string TypeDefinitionToString(TypeDefinition type, bool includeNamespace)
{
PlainTextOutput output = new PlainTextOutput();
((SRM.EntityHandle)type.Handle).WriteTo(type.Module, output, GenericContext.Empty, includeNamespace ? ILNameSyntax.TypeName : ILNameSyntax.ShortTypeName);
return output.ToString();
}
public override void DecompileMethod(MethodDefinition method, ITextOutput output, DecompilationOptions options)
{
base.DecompileMethod(method, output, options);

7
ILSpy/Languages/ILLanguage.cs

@ -148,12 +148,5 @@ namespace ICSharpCode.ILSpy @@ -148,12 +148,5 @@ namespace ICSharpCode.ILSpy
dis.WriteModuleContents(module);
}
}
public override string TypeDefinitionToString(Decompiler.Metadata.TypeDefinition type, bool includeNamespace)
{
PlainTextOutput output = new PlainTextOutput();
((EntityHandle)type.Handle).WriteTo(type.Module, output, GenericContext.Empty, includeNamespace ? ILNameSyntax.TypeName : ILNameSyntax.ShortTypeName);
return output.ToString();
}
}
}

30
ILSpy/Languages/Language.cs

@ -101,7 +101,7 @@ namespace ICSharpCode.ILSpy @@ -101,7 +101,7 @@ namespace ICSharpCode.ILSpy
{
var metadata = method.Module.Metadata;
var methodDefinition = metadata.GetMethodDefinition(method.Handle);
WriteCommentLine(output, TypeDefinitionToString(new TypeDefinition(method.Module, methodDefinition.GetDeclaringType()), true) + "." + metadata.GetString(methodDefinition.Name));
WriteCommentLine(output, TypeToString(new TypeDefinition(method.Module, methodDefinition.GetDeclaringType()), includeNamespace: true) + "." + metadata.GetString(methodDefinition.Name));
}
public virtual void DecompileProperty(PropertyDefinition property, ITextOutput output, DecompilationOptions options)
@ -109,14 +109,14 @@ namespace ICSharpCode.ILSpy @@ -109,14 +109,14 @@ namespace ICSharpCode.ILSpy
var metadata = property.Module.Metadata;
var propertyDefinition = metadata.GetPropertyDefinition(property.Handle);
var declaringType = metadata.GetMethodDefinition(propertyDefinition.GetAccessors().GetAny()).GetDeclaringType();
WriteCommentLine(output, TypeDefinitionToString(new TypeDefinition(property.Module, declaringType), true) + "." + metadata.GetString(propertyDefinition.Name));
WriteCommentLine(output, TypeToString(new TypeDefinition(property.Module, declaringType), includeNamespace: true) + "." + metadata.GetString(propertyDefinition.Name));
}
public virtual void DecompileField(FieldDefinition field, ITextOutput output, DecompilationOptions options)
{
var metadata = field.Module.Metadata;
var fieldDefinition = metadata.GetFieldDefinition(field.Handle);
WriteCommentLine(output, TypeDefinitionToString(new TypeDefinition(field.Module, fieldDefinition.GetDeclaringType()), true) + "." + metadata.GetString(fieldDefinition.Name));
WriteCommentLine(output, TypeToString(new TypeDefinition(field.Module, fieldDefinition.GetDeclaringType()), includeNamespace: true) + "." + metadata.GetString(fieldDefinition.Name));
}
public virtual void DecompileEvent(EventDefinition ev, ITextOutput output, DecompilationOptions options)
@ -124,12 +124,12 @@ namespace ICSharpCode.ILSpy @@ -124,12 +124,12 @@ namespace ICSharpCode.ILSpy
var metadata = ev.Module.Metadata;
var eventDefinition = metadata.GetEventDefinition(ev.Handle);
var declaringType = metadata.GetMethodDefinition(eventDefinition.GetAccessors().GetAny()).GetDeclaringType();
WriteCommentLine(output, TypeDefinitionToString(new TypeDefinition(ev.Module, declaringType), true) + "." + metadata.GetString(eventDefinition.Name));
WriteCommentLine(output, TypeToString(new TypeDefinition(ev.Module, declaringType), includeNamespace: true) + "." + metadata.GetString(eventDefinition.Name));
}
public virtual void DecompileType(TypeDefinition type, ITextOutput output, DecompilationOptions options)
{
WriteCommentLine(output, TypeDefinitionToString(type, true));
WriteCommentLine(output, TypeToString(type, includeNamespace: true));
}
public virtual void DecompileNamespace(string nameSpace, IEnumerable<TypeDefinition> types, ITextOutput output, DecompilationOptions options)
@ -161,16 +161,22 @@ namespace ICSharpCode.ILSpy @@ -161,16 +161,22 @@ namespace ICSharpCode.ILSpy
}
/// <summary>
/// Converts a type definition into a string. This method is used by the type tree nodes and search results.
/// Converts a type definition, reference or specification into a string. This method is used by the type tree nodes and search results.
/// </summary>
public virtual string TypeDefinitionToString(TypeDefinition type, bool includeNamespace)
public virtual string TypeToString(Entity type, GenericContext genericContext = null, bool includeNamespace = true)
{
var provider = includeNamespace ? ILSignatureProvider.WithNamespace : ILSignatureProvider.WithoutNamespace;
var metadata = type.Module.Metadata;
var fullName = type.Handle.GetFullTypeName(metadata);
if (includeNamespace)
return fullName.ToString();
else
return fullName.Name;
switch (type.Handle.Kind) {
case SRM.HandleKind.TypeReference:
return provider.GetTypeFromReference(metadata, (SRM.TypeReferenceHandle)type.Handle, 0);
case SRM.HandleKind.TypeDefinition:
return provider.GetTypeFromDefinition(metadata, (SRM.TypeDefinitionHandle)type.Handle, 0);
case SRM.HandleKind.TypeSpecification:
return provider.GetTypeFromSpecification(metadata, genericContext ?? GenericContext.Empty, (SRM.TypeSpecificationHandle)type.Handle, 0);
default:
throw new NotSupportedException();
}
}
/// <summary>

12
ILSpy/SearchStrategies.cs

@ -152,7 +152,7 @@ namespace ICSharpCode.ILSpy @@ -152,7 +152,7 @@ namespace ICSharpCode.ILSpy
var metadata = member.Module.Metadata;
switch (member) {
case TypeDefinition t:
return language.TypeDefinitionToString(t, fullName);
return language.TypeToString(t, includeNamespace: fullName);
case FieldDefinition f:
return language.FieldToString(f, fullName, fullName);
case PropertyDefinition p:
@ -182,7 +182,7 @@ namespace ICSharpCode.ILSpy @@ -182,7 +182,7 @@ namespace ICSharpCode.ILSpy
Image = image(item),
Name = GetLanguageSpecificName(language, item),
LocationImage = TypeTreeNode.GetIcon(type),
Location = language.TypeDefinitionToString(type, includeNamespace: true)
Location = language.TypeToString(type, includeNamespace: true)
});
}
}
@ -500,7 +500,7 @@ namespace ICSharpCode.ILSpy @@ -500,7 +500,7 @@ namespace ICSharpCode.ILSpy
var td = metadata.GetTypeDefinition(type.Handle);
if (MatchName(type, language)) {
string name = language.TypeDefinitionToString(type, includeNamespace: false);
string name = language.TypeToString(type, includeNamespace: false);
var declaringType = td.GetDeclaringType();
addResult(new SearchResult {
Member = type,
@ -508,7 +508,7 @@ namespace ICSharpCode.ILSpy @@ -508,7 +508,7 @@ namespace ICSharpCode.ILSpy
Image = TypeTreeNode.GetIcon(type),
Name = name,
LocationImage = !declaringType.IsNil ? TypeTreeNode.GetIcon(new TypeDefinition(type.Module, declaringType)) : Images.Namespace,
Location = !declaringType.IsNil ? language.TypeDefinitionToString(new TypeDefinition(type.Module, declaringType), includeNamespace: true) : type.Handle.GetFullTypeName(metadata).TopLevelTypeName.Namespace
Location = !declaringType.IsNil ? language.TypeToString(new TypeDefinition(type.Module, declaringType), includeNamespace: true) : type.Handle.GetFullTypeName(metadata).TopLevelTypeName.Namespace
});
}
@ -529,7 +529,7 @@ namespace ICSharpCode.ILSpy @@ -529,7 +529,7 @@ namespace ICSharpCode.ILSpy
{
if (MatchName(type, language))
{
string name = language.TypeDefinitionToString(type, includeNamespace: false);
string name = language.TypeToString(type, includeNamespace: false);
var metadata = type.Module.Metadata;
var declaringType = metadata.GetTypeDefinition(type.Handle).GetDeclaringType();
addResult(new SearchResult {
@ -538,7 +538,7 @@ namespace ICSharpCode.ILSpy @@ -538,7 +538,7 @@ namespace ICSharpCode.ILSpy
Fitness = CalculateFitness(type),
Name = name,
LocationImage = !declaringType.IsNil ? TypeTreeNode.GetIcon(new TypeDefinition(type.Module, declaringType)) : Images.Namespace,
Location = !declaringType.IsNil ? language.TypeDefinitionToString(new TypeDefinition(type.Module, declaringType), includeNamespace: true) : type.Handle.GetFullTypeName(metadata).TopLevelTypeName.Namespace
Location = !declaringType.IsNil ? language.TypeToString(new TypeDefinition(type.Module, declaringType), includeNamespace: true) : type.Handle.GetFullTypeName(metadata).TopLevelTypeName.Namespace
});
}

10
ILSpy/TreeNodes/BaseTypesEntryNode.cs

@ -27,14 +27,16 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -27,14 +27,16 @@ namespace ICSharpCode.ILSpy.TreeNodes
sealed class BaseTypesEntryNode : ILSpyTreeNode, IMemberTreeNode
{
readonly Entity tr;
TypeDefinition td;
readonly GenericContext context;
readonly bool isInterface;
TypeDefinition td;
public BaseTypesEntryNode(Entity entity, bool isInterface)
public BaseTypesEntryNode(GenericContext context, Entity entity, bool isInterface)
{
if (entity.IsNil) throw new ArgumentNullException(nameof(entity));
this.tr = entity;
this.td = tr.ResolveAsType();
this.context = context;
this.isInterface = isInterface;
this.LazyLoading = true;
}
@ -50,7 +52,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -50,7 +52,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text
{
get { return tr.Handle.GetFullTypeName(tr.Module.Metadata) + tr.Handle.ToSuffixString(); }
get { return this.Language.TypeToString(tr, context, includeNamespace: true) + tr.Handle.ToSuffixString(); }
}
public override object Icon
@ -96,7 +98,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -96,7 +98,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{
language.WriteCommentLine(output, language.TypeDefinitionToString(td, true));
language.WriteCommentLine(output, language.TypeToString(tr, context, includeNamespace: true));
}
IMetadataEntity IMemberTreeNode.Member => tr;

5
ILSpy/TreeNodes/BaseTypesTreeNode.cs

@ -50,11 +50,12 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -50,11 +50,12 @@ namespace ICSharpCode.ILSpy.TreeNodes
{
var metadata = type.Module.Metadata;
var def = metadata.GetTypeDefinition(type.Handle);
var context = new GenericContext(type);
if (!def.BaseType.IsNil)
children.Add(new BaseTypesEntryNode(new Entity(type.Module, def.BaseType), false));
children.Add(new BaseTypesEntryNode(context, new Entity(type.Module, def.BaseType), false));
foreach (var i in def.GetInterfaceImplementations()) {
var interfaceImpl = metadata.GetInterfaceImplementation(i);
children.Add(new BaseTypesEntryNode(new Entity(type.Module, interfaceImpl.Interface), true));
children.Add(new BaseTypesEntryNode(context, new Entity(type.Module, interfaceImpl.Interface), true));
}
}

2
ILSpy/TreeNodes/DerivedTypesEntryNode.cs

@ -104,7 +104,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -104,7 +104,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{
language.WriteCommentLine(output, language.TypeDefinitionToString(type, true));
language.WriteCommentLine(output, language.TypeToString(type, includeNamespace: true));
}
IMetadataEntity IMemberTreeNode.Member => type;

19
ILSpy/TreeNodes/DerivedTypesTreeNode.cs

@ -18,8 +18,6 @@ @@ -18,8 +18,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.PortableExecutable;
using System.Threading;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
@ -76,13 +74,12 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -76,13 +74,12 @@ namespace ICSharpCode.ILSpy.TreeNodes
cancellationToken.ThrowIfCancellationRequested();
var td = new TypeDefinition(module, h);
var typeDefinition = metadata.GetTypeDefinition(h);
if ((typeDefinition.Attributes & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface) {
foreach (var iface in typeDefinition.GetInterfaceImplementations()) {
var ifaceImpl = metadata.GetInterfaceImplementation(iface);
if (IsSameType(metadata, ifaceImpl.Interface, type.Handle))
yield return new DerivedTypesEntryNode(td, assemblies);
}
} else if (!typeDefinition.BaseType.IsNil && IsSameType(metadata, typeDefinition.BaseType, type.Handle)) {
foreach (var iface in typeDefinition.GetInterfaceImplementations()) {
var ifaceImpl = metadata.GetInterfaceImplementation(iface);
if (IsSameType(metadata, ifaceImpl.Interface, type))
yield return new DerivedTypesEntryNode(td, assemblies);
}
if (!typeDefinition.BaseType.IsNil && IsSameType(metadata, typeDefinition.BaseType, type)) {
yield return new DerivedTypesEntryNode(td, assemblies);
}
}
@ -90,10 +87,10 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -90,10 +87,10 @@ namespace ICSharpCode.ILSpy.TreeNodes
yield break;
}
static bool IsSameType(SRM.MetadataReader metadata, SRM.EntityHandle typeRef, SRM.TypeDefinitionHandle type)
static bool IsSameType(SRM.MetadataReader referenceMetadata, SRM.EntityHandle typeRef, TypeDefinition type)
{
// FullName contains only namespace, name and type parameter count, therefore this should suffice.
return typeRef.GetFullTypeName(metadata) == type.GetFullTypeName(metadata);
return typeRef.GetFullTypeName(referenceMetadata) == type.Handle.GetFullTypeName(type.Module.Metadata);
}
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)

2
ILSpy/TreeNodes/TypeTreeNode.cs

@ -47,7 +47,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -47,7 +47,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public AssemblyTreeNode ParentAssemblyNode { get; }
public override object Text => this.Language.TypeDefinitionToString(TypeDefinition, false) + TypeDefinition.Handle.ToSuffixString();
public override object Text => this.Language.TypeToString(TypeDefinition, includeNamespace: false) + TypeDefinition.Handle.ToSuffixString();
public override bool IsPublicAPI {
get {

Loading…
Cancel
Save