Browse Source

Replace Format*Name with *ToString methods. Remove HighlightSearchMatch.

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
6601f53a40
  1. 290
      ICSharpCode.Decompiler/CSharp/AstTypeBuilder.cs
  2. 2
      ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs
  3. 273
      ILSpy/Languages/CSharpLanguage.cs
  4. 4
      ILSpy/Languages/ILAstLanguage.cs
  5. 4
      ILSpy/Languages/ILLanguage.cs
  6. 61
      ILSpy/Languages/Language.cs
  7. 9
      ILSpy/LoadedAssembly.cs
  8. 20
      ILSpy/SearchStrategies.cs
  9. 14
      ILSpy/TextView/DecompilerTextView.cs
  10. 5
      ILSpy/TreeNodes/AssemblyTreeNode.cs
  11. 2
      ILSpy/TreeNodes/BaseTypesEntryNode.cs
  12. 2
      ILSpy/TreeNodes/DerivedTypesEntryNode.cs
  13. 14
      ILSpy/TreeNodes/EventTreeNode.cs
  14. 5
      ILSpy/TreeNodes/FieldTreeNode.cs
  15. 6
      ILSpy/TreeNodes/ILSpyTreeNode.cs
  16. 25
      ILSpy/TreeNodes/MethodTreeNode.cs
  17. 2
      ILSpy/TreeNodes/NamespaceTreeNode.cs
  18. 5
      ILSpy/TreeNodes/PropertyTreeNode.cs
  19. 2
      ILSpy/TreeNodes/TypeTreeNode.cs

290
ICSharpCode.Decompiler/CSharp/AstTypeBuilder.cs

@ -25,23 +25,9 @@ namespace ICSharpCode.Decompiler.CSharp @@ -25,23 +25,9 @@ namespace ICSharpCode.Decompiler.CSharp
{
ConvertTypeOptions options;
public static AstType BuildAstType(EntityHandle type, PEFile module, GenericContext context, CustomAttributeHandleCollection customAttributes = default, ConvertTypeOptions options = ConvertTypeOptions.None)
public AstTypeBuilder(ConvertTypeOptions options)
{
if (type.IsNil)
return AstType.Null;
var metadata = module.GetMetadataReader();
var provider = new AstTypeBuilder() { options = options };
switch (type.Kind) {
case HandleKind.TypeDefinition:
return provider.GetTypeFromDefinition(metadata, (TypeDefinitionHandle)type, 0);
case HandleKind.TypeReference:
return provider.GetTypeFromReference(metadata, (TypeReferenceHandle)type, 0);
case HandleKind.TypeSpecification:
var ts = metadata.GetTypeSpecification((TypeSpecificationHandle)type);
return ts.DecodeSignature(provider, context);
default:
throw new NotSupportedException();
}
this.options = options;
}
public AstType GetArrayType(AstType elementType, ArrayShape shape)
@ -61,17 +47,26 @@ namespace ICSharpCode.Decompiler.CSharp @@ -61,17 +47,26 @@ namespace ICSharpCode.Decompiler.CSharp
public AstType GetGenericInstantiation(AstType genericType, ImmutableArray<AstType> typeArguments)
{
return new ComposedType { BaseType = genericType };
switch (genericType) {
case SimpleType st:
st.TypeArguments.AddRange(typeArguments);
return st;
case MemberType mt:
mt.TypeArguments.AddRange(typeArguments);
return mt;
default:
throw new NotImplementedException();
}
}
public AstType GetGenericMethodParameter(GenericContext genericContext, int index)
{
throw new NotImplementedException();
return new SimpleType(genericContext.GetGenericMethodTypeParameterName(index));
}
public AstType GetGenericTypeParameter(GenericContext genericContext, int index)
{
throw new NotImplementedException();
return new SimpleType(genericContext.GetGenericMethodTypeParameterName(index));
}
public AstType GetModifiedType(AstType modifier, AstType unmodifiedType, bool isRequired)
@ -91,48 +86,117 @@ namespace ICSharpCode.Decompiler.CSharp @@ -91,48 +86,117 @@ namespace ICSharpCode.Decompiler.CSharp
public AstType GetPrimitiveType(PrimitiveTypeCode typeCode)
{
AstType t;
switch (typeCode) {
case PrimitiveTypeCode.Boolean:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("Boolean");
return AstType.Create("System.Boolean");
}
return new PrimitiveType("bool");
case PrimitiveTypeCode.Byte:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("Byte");
return AstType.Create("System.Byte");
}
return new PrimitiveType("byte");
case PrimitiveTypeCode.SByte:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("SByte");
return AstType.Create("System.SByte");
}
return new PrimitiveType("sbyte");
case PrimitiveTypeCode.Char:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("Char");
return AstType.Create("System.Char");
}
return new PrimitiveType("char");
case PrimitiveTypeCode.Int16:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("Int16");
return AstType.Create("System.Int16");
}
return new PrimitiveType("short");
case PrimitiveTypeCode.UInt16:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("UInt16");
return AstType.Create("System.UInt16");
}
return new PrimitiveType("ushort");
case PrimitiveTypeCode.Int32:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("Int32");
return AstType.Create("System.In32");
}
return new PrimitiveType("int");
case PrimitiveTypeCode.UInt32:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("UInt32");
return AstType.Create("System.UInt32");
}
return new PrimitiveType("uint");
case PrimitiveTypeCode.Int64:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("Int64");
return AstType.Create("System.Int64");
}
return new PrimitiveType("long");
case PrimitiveTypeCode.UInt64:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("UInt64");
return AstType.Create("System.UInt64");
}
return new PrimitiveType("ulong");
case PrimitiveTypeCode.Single:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("Single");
return AstType.Create("System.Single");
}
return new PrimitiveType("float");
case PrimitiveTypeCode.Double:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("Double");
return AstType.Create("System.Double");
}
return new PrimitiveType("double");
case PrimitiveTypeCode.IntPtr:
t = AstType.Create("System.IntPtr");
t.AddAnnotation(new FullTypeName("System.IntPtr"));
return t;
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("IntPtr");
return AstType.Create("System.IntPtr");
case PrimitiveTypeCode.UIntPtr:
t = AstType.Create("System.UIntPtr");
t.AddAnnotation(new FullTypeName("System.UIntPtr"));
return t;
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("UIntPtr");
return AstType.Create("System.UIntPtr");
case PrimitiveTypeCode.Object:
return new PrimitiveType("object"); // TODO : dynamic
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("Object");
return AstType.Create("System.Object");
}
return new PrimitiveType("object");
case PrimitiveTypeCode.String:
if ((options & ConvertTypeOptions.DoNotUsePrimitiveTypeNames) != 0) {
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("String");
return AstType.Create("System.String");
}
return new PrimitiveType("string");
case PrimitiveTypeCode.TypedReference:
t = AstType.Create("System.TypedReference");
t.AddAnnotation(new FullTypeName("System.TypedReference"));
return t;
if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("TypedReference");
return AstType.Create("System.TypedReference");
case PrimitiveTypeCode.Void:
return new PrimitiveType("void");
default:
@ -147,139 +211,73 @@ namespace ICSharpCode.Decompiler.CSharp @@ -147,139 +211,73 @@ namespace ICSharpCode.Decompiler.CSharp
public AstType GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind)
{
AstType MakeAstType(FullTypeName fullTypeName)
{
if (fullTypeName.IsNested) {
if ((options & (ConvertTypeOptions.IncludeOuterTypeName | ConvertTypeOptions.IncludeNamespace)) != 0) {
var outerType = MakeAstType(fullTypeName.GetDeclaringType());
return new MemberType(outerType, fullTypeName.Name);
} else {
return AstType.Create(fullTypeName.Name);
}
}
var name = Decompiler.TypeSystem.ReflectionHelper.SplitTypeParameterCountFromReflectionName(fullTypeName.ReflectionName, out int parameterCount);
if ((options & ConvertTypeOptions.IncludeNamespace) != 0)
return AstType.Create(name);
return AstType.Create(fullTypeName.Name);
}
return MakeAstType(handle.GetFullTypeName(reader));
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);
}
public AstType GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind)
{
throw new NotImplementedException();
return MakeAstType(handle.GetFullTypeName(reader), EmptyList<AstType>.Instance);
}
public AstType GetTypeFromSpecification(MetadataReader reader, GenericContext genericContext, TypeSpecificationHandle handle, byte rawTypeKind)
{
throw new NotImplementedException();
var ts = reader.GetTypeSpecification(handle);
return ts.DecodeSignature(this, genericContext);
}
#if false
static void ApplyTypeArgumentsTo(AstType baseType, List<AstType> typeArguments)
AstType MakeAstType(FullTypeName fullTypeName, IList<AstType> genericParams)
{
SimpleType st = baseType as SimpleType;
if (st != null) {
TypeReference type = st.Annotation<TypeReference>();
if (type != null) {
ReflectionHelper.SplitTypeParameterCountFromReflectionName(type.Name, out int typeParameterCount);
if (typeParameterCount > typeArguments.Count)
typeParameterCount = typeArguments.Count;
st.TypeArguments.AddRange(typeArguments.GetRange(typeArguments.Count - typeParameterCount, typeParameterCount));
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);
ApplyGenericParametersTo(mt, genericParams, count);
return mt;
} else {
st.TypeArguments.AddRange(typeArguments);
var st = new SimpleType(fullTypeName.Name);
for (int i = 0; i < fullTypeName.TypeParameterCount - count; i++)
genericParams.RemoveAt(0);
ApplyGenericParametersTo(st, genericParams, count);
return st;
}
}
MemberType mt = baseType as MemberType;
if (mt != null) {
TypeReference type = mt.Annotation<TypeReference>();
if (type != null) {
ReflectionHelper.SplitTypeParameterCountFromReflectionName(type.Name, out int typeParameterCount);
if (typeParameterCount > typeArguments.Count)
typeParameterCount = typeArguments.Count;
mt.TypeArguments.AddRange(typeArguments.GetRange(typeArguments.Count - typeParameterCount, typeParameterCount));
typeArguments.RemoveRange(typeArguments.Count - typeParameterCount, typeParameterCount);
if (typeArguments.Count > 0)
ApplyTypeArgumentsTo(mt.Target, typeArguments);
} else {
mt.TypeArguments.AddRange(typeArguments);
}
AstType baseType;
var topLevel = fullTypeName.TopLevelTypeName;
if ((options & ConvertTypeOptions.IncludeNamespace) != 0) {
baseType = AstType.Create(topLevel.Namespace + "." + topLevel.Name);
} else {
baseType = AstType.Create(topLevel.Name);
}
ApplyGenericParametersTo(baseType, genericParams, topLevel.TypeParameterCount);
return baseType;
}
#endif
}
class StringSignatureBuilder : ISignatureTypeProvider<string, GenericContext>
{
public string GetArrayType(string elementType, ArrayShape shape)
{
throw new NotImplementedException();
}
public string GetByReferenceType(string elementType)
void ApplyGenericParametersTo(AstType targetType, IList<AstType> genericParams, int count)
{
throw new NotImplementedException();
}
public string GetFunctionPointerType(MethodSignature<string> signature)
{
throw new NotImplementedException();
}
public string GetGenericInstantiation(string genericType, ImmutableArray<string> typeArguments)
{
throw new NotImplementedException();
}
public string GetGenericMethodParameter(GenericContext genericContext, int index)
{
throw new NotImplementedException();
}
public string GetGenericTypeParameter(GenericContext genericContext, int index)
{
throw new NotImplementedException();
}
public string GetModifiedType(string modifier, string unmodifiedType, bool isRequired)
{
throw new NotImplementedException();
}
public string GetPinnedType(string elementType)
{
throw new NotImplementedException();
}
public string GetPointerType(string elementType)
{
throw new NotImplementedException();
}
public string GetPrimitiveType(PrimitiveTypeCode typeCode)
{
throw new NotImplementedException();
}
public string GetSZArrayType(string elementType)
{
throw new NotImplementedException();
}
public string GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind)
{
throw new NotImplementedException();
}
public string GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind)
{
throw new NotImplementedException();
}
public string GetTypeFromSpecification(MetadataReader reader, GenericContext genericContext, TypeSpecificationHandle handle, byte rawTypeKind)
{
throw new NotImplementedException();
if (count > genericParams.Count)
count = genericParams.Count;
int i = 0;
switch (targetType) {
case MemberType mt:
while (i < count) {
// Always add the first and remove it from the other list.
mt.TypeArguments.Add(genericParams[0]);
genericParams.RemoveAt(0);
i++;
}
break;
case SimpleType st:
while (i < count) {
// Always add the first and remove it from the other list.
st.TypeArguments.Add(genericParams[0]);
genericParams.RemoveAt(0);
i++;
}
break;
}
}
}
}

2
ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs

@ -102,7 +102,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -102,7 +102,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
return new DynamicAwareTypeReference(reference, isDynamic, dynamicInfo);
}
static bool HasDynamicAttribute(SRM.CustomAttributeHandleCollection? attributes, SRM.MetadataReader metadata, out bool[] mapping)
public static bool HasDynamicAttribute(SRM.CustomAttributeHandleCollection? attributes, SRM.MetadataReader metadata, out bool[] mapping)
{
mapping = null;
if (attributes == null)

273
ILSpy/Languages/CSharpLanguage.cs

@ -38,6 +38,8 @@ using System.Reflection.Metadata; @@ -38,6 +38,8 @@ using System.Reflection.Metadata;
using System.Collections.Immutable;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler.TypeSystem.Implementation;
using ICSharpCode.Decompiler.Util;
using System.Reflection;
namespace ICSharpCode.ILSpy
{
@ -130,7 +132,7 @@ namespace ICSharpCode.ILSpy @@ -130,7 +132,7 @@ namespace ICSharpCode.ILSpy
{
AddReferenceWarningMessage(method.Module, output);
var md = method.This();
WriteCommentLine(output, TypeToString(new Entity(method.Module, md.GetDeclaringType()), includeNamespace: true));
WriteCommentLine(output, TypeDefinitionToString(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) {
@ -199,7 +201,7 @@ namespace ICSharpCode.ILSpy @@ -199,7 +201,7 @@ namespace ICSharpCode.ILSpy
CSharpDecompiler decompiler = CreateDecompiler(property.Module, options);
var metadata = property.Module.GetMetadataReader();
var accessorHandle = metadata.GetPropertyDefinition(property.Handle).GetAccessors().GetAny();
WriteCommentLine(output, TypeToString(new Decompiler.Metadata.TypeDefinition(property.Module, metadata.GetMethodDefinition(accessorHandle).GetDeclaringType()), includeNamespace: true));
WriteCommentLine(output, TypeDefinitionToString(new Decompiler.Metadata.TypeDefinition(property.Module, metadata.GetMethodDefinition(accessorHandle).GetDeclaringType()), includeNamespace: true));
WriteCode(output, options.DecompilerSettings, decompiler.Decompile(property.Handle), decompiler.TypeSystem);
}
@ -207,10 +209,10 @@ namespace ICSharpCode.ILSpy @@ -207,10 +209,10 @@ namespace ICSharpCode.ILSpy
{
AddReferenceWarningMessage(field.Module, output);
var fd = field.This();
WriteCommentLine(output, TypeToString(new Entity(field.Module, fd.GetDeclaringType()), includeNamespace: true));
WriteCommentLine(output, TypeDefinitionToString(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(System.Reflection.FieldAttributes.Literal)) {
if (fd.HasFlag(FieldAttributes.Literal)) {
WriteCode(output, options.DecompilerSettings, decompiler.Decompile(field.Handle), decompiler.TypeSystem);
} else {
var members = CollectFieldsAndCtors(fieldDefinition.DeclaringTypeDefinition, fieldDefinition.IsStatic);
@ -268,7 +270,7 @@ namespace ICSharpCode.ILSpy @@ -268,7 +270,7 @@ namespace ICSharpCode.ILSpy
AddReferenceWarningMessage(ev.Module, output);
var metadata = ev.Module.GetMetadataReader();
var accessorHandle = metadata.GetEventDefinition(ev.Handle).GetAccessors().GetAny();
WriteCommentLine(output, TypeToString(new Decompiler.Metadata.TypeDefinition(ev.Module, metadata.GetMethodDefinition(accessorHandle).GetDeclaringType()), includeNamespace: true));
base.WriteCommentLine(output, TypeDefinitionToString(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);
}
@ -276,7 +278,7 @@ namespace ICSharpCode.ILSpy @@ -276,7 +278,7 @@ namespace ICSharpCode.ILSpy
public override void DecompileType(Decompiler.Metadata.TypeDefinition type, ITextOutput output, DecompilationOptions options)
{
AddReferenceWarningMessage(type.Module, output);
WriteCommentLine(output, TypeToString(type, includeNamespace: true));
WriteCommentLine(output, TypeDefinitionToString(type, includeNamespace: true));
CSharpDecompiler decompiler = CreateDecompiler(type.Module, options);
WriteCode(output, options.DecompilerSettings, decompiler.Decompile(type.Handle), decompiler.TypeSystem);
}
@ -400,57 +402,50 @@ namespace ICSharpCode.ILSpy @@ -400,57 +402,50 @@ namespace ICSharpCode.ILSpy
}
}
public override string TypeToString(Entity type, bool includeNamespace, CustomAttributeHandleCollection typeAttributes = default)
public override string TypeDefinitionToString(Decompiler.Metadata.TypeDefinition type, bool includeNamespace)
{
ConvertTypeOptions options = ConvertTypeOptions.IncludeTypeParameterDefinitions;
if (includeNamespace)
options |= ConvertTypeOptions.IncludeNamespace;
return TypeToString(options, type, typeAttributes);
}
string TypeToString(ConvertTypeOptions options, Entity type, CustomAttributeHandleCollection typeAttributes = default)
{
var currentMetadata = type.Module.GetMetadataReader();
var astType = AstTypeBuilder.BuildAstType(type.Handle, type.Module, GenericContext.Empty, typeAttributes, options);
StringWriter w = new StringWriter();
/*if (type.IsByReference) {
ParameterDefinition pd = typeAttributes as ParameterDefinition;
if (pd != null && (!pd.IsIn && pd.IsOut))
w.Write("out ");
else
w.Write("ref ");
var metadata = type.Module.GetMetadataReader();
var provider = new AstTypeBuilder(options);
if (astType is ComposedType && ((ComposedType)astType).PointerRank > 0)
((ComposedType)astType).PointerRank--;
}*/
astType.AcceptVisitor(new CSharpOutputVisitor(w, TypeToStringFormattingOptions));
return w.ToString();
AstType astType = provider.GetTypeFromDefinition(metadata, type.Handle, 0);
return TypeToString(astType, metadata, null);
}
public override ISignatureTypeProvider<string, GenericContext> CreateSignatureTypeProvider(bool includeNamespace)
public override string FieldToString(Decompiler.Metadata.FieldDefinition field, bool includeTypeName, bool includeNamespace)
{
return base.CreateSignatureTypeProvider(includeNamespace);
if (field.Handle.IsNil)
throw new ArgumentNullException(nameof(field));
var metadata = field.Module.GetMetadataReader();
var fd = metadata.GetFieldDefinition(field.Handle);
AstType fieldType = fd.DecodeSignature(new AstTypeBuilder(ConvertTypeOptions.IncludeTypeParameterDefinitions), new GenericContext(fd.GetDeclaringType(), field.Module));
string simple = metadata.GetString(fd.Name) + " : " + TypeToString(fieldType, metadata, fd.GetCustomAttributes());
if (!includeTypeName)
return simple;
var typeName = fd.GetDeclaringType().GetFullTypeName(metadata);
if (!includeNamespace)
return typeName.Name + "." + simple;
return typeName + "." + simple;
}
static readonly CSharpFormattingOptions TypeToStringFormattingOptions = FormattingOptionsFactory.CreateEmpty();
public override string FormatPropertyName(Decompiler.Metadata.PropertyDefinition property, bool? isIndexer)
public override string PropertyToString(Decompiler.Metadata.PropertyDefinition property, bool includeTypeName, bool includeNamespace, bool? isIndexer = null)
{
if (property.IsNil)
throw new ArgumentNullException(nameof(property));
var metadata = property.Module.GetMetadataReader();
var pd = metadata.GetPropertyDefinition(property.Handle);
var accessorHandle = metadata.GetPropertyDefinition(property.Handle).GetAccessors().GetAny();
var accessors = pd.GetAccessors();
var accessorHandle = accessors.GetAny();
var accessor = metadata.GetMethodDefinition(accessorHandle);
var declaringType = metadata.GetTypeDefinition(accessor.GetDeclaringType());
if (!isIndexer.HasValue) {
isIndexer = accessor.GetDeclaringType().GetDefaultMemberName(metadata) != null;
}
var buffer = new System.Text.StringBuilder();
if (isIndexer.Value) {
var buffer = new System.Text.StringBuilder();
var overrides = accessorHandle.GetMethodImplementations(metadata);
if (overrides.Any()) {
string name = metadata.GetString(pd.Name);
@ -461,12 +456,32 @@ namespace ICSharpCode.ILSpy @@ -461,12 +456,32 @@ namespace ICSharpCode.ILSpy
}
}
buffer.Append(@"this[");
var signature = pd.DecodeSignature(CreateSignatureTypeProvider(false), new GenericContext(accessorHandle, property.Module));
for (int i = 0; i < signature.ParameterTypes.Length; i++) {
if (i > 0)
buffer.Append(", ");
buffer.Append(signature.ParameterTypes[i]);
var signature = pd.DecodeSignature(new AstTypeBuilder(ConvertTypeOptions.IncludeTypeParameterDefinitions), new GenericContext(accessorHandle, property.Module));
var parameterHandles = accessor.GetParameters();
int i = 0;
CustomAttributeHandleCollection? returnTypeAttributes = null;
if (signature.RequiredParameterCount > parameterHandles.Count) {
foreach (var type in signature.ParameterTypes) {
if (i > 0)
buffer.Append(", ");
buffer.Append(TypeToString(signature.ParameterTypes[i], metadata, null));
i++;
}
} else {
foreach (var h in parameterHandles) {
var p = metadata.GetParameter(h);
if (p.SequenceNumber > 0 && i < signature.ParameterTypes.Length) {
if (i > 0)
buffer.Append(", ");
buffer.Append(TypeToString(signature.ParameterTypes[i], metadata, p.GetCustomAttributes(), h));
i++;
}
if (p.SequenceNumber == 0) {
returnTypeAttributes = p.GetCustomAttributes();
}
}
}
if (signature.Header.CallingConvention == SignatureCallingConvention.VarArgs) {
if (signature.ParameterTypes.Length > 0)
@ -475,26 +490,141 @@ namespace ICSharpCode.ILSpy @@ -475,26 +490,141 @@ namespace ICSharpCode.ILSpy
}
buffer.Append(@"]");
return buffer.ToString();
} else
return metadata.GetString(pd.Name);
buffer.Append(" : ");
buffer.Append(TypeToString(signature.ReturnType, metadata, returnTypeAttributes));
} else {
var signature = pd.DecodeSignature(new AstTypeBuilder(ConvertTypeOptions.IncludeTypeParameterDefinitions), new GenericContext(accessorHandle, property.Module));
var parameterHandles = accessor.GetParameters();
CustomAttributeHandleCollection? returnTypeAttributes = null;
if (parameterHandles.Count > 0) {
var p = metadata.GetParameter(parameterHandles.First());
if (p.SequenceNumber == 0) {
returnTypeAttributes = p.GetCustomAttributes();
}
}
buffer.Append(metadata.GetString(pd.Name));
buffer.Append(" : ");
buffer.Append(TypeToString(signature.ReturnType, metadata, returnTypeAttributes));
}
return buffer.ToString();
}
static readonly CSharpFormattingOptions TypeToStringFormattingOptions = FormattingOptionsFactory.CreateEmpty();
string TypeToString(AstType astType, MetadataReader metadata, CustomAttributeHandleCollection? customAttributes, ParameterHandle paramHandle = default)
{
StringWriter w = new StringWriter();
if (astType is ComposedType ct && ct.HasRefSpecifier) {
if (!paramHandle.IsNil) {
var p = metadata.GetParameter(paramHandle);
if ((p.Attributes & ParameterAttributes.In) == 0 && (p.Attributes & ParameterAttributes.Out) != 0) {
w.Write("out ");
} else {
w.Write("ref ");
}
} else {
w.Write("ref ");
}
astType = ct.BaseType;
astType.Remove();
}
var st = new SyntaxTree();
st.AddChild(astType, Roles.Type);
st.AcceptVisitor(new InsertDynamicTypeVisitor(metadata, customAttributes));
st.FirstChild.AcceptVisitor(new CSharpOutputVisitor(w, TypeToStringFormattingOptions));
return w.ToString();
}
public override string FormatMethodName(Decompiler.Metadata.MethodDefinition method)
public override string MethodToString(Decompiler.Metadata.MethodDefinition method, bool includeTypeName, bool includeNamespace)
{
if (method.IsNil)
throw new ArgumentNullException("method");
var metadata = method.Module.GetMetadataReader();
var md = metadata.GetMethodDefinition(method.Handle);
return (md.IsConstructor(metadata)) ? FormatTypeName(new Decompiler.Metadata.TypeDefinition(method.Module, md.GetDeclaringType())) : metadata.GetString(md.Name);
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));
int i = 0;
var buffer = new System.Text.StringBuilder(name);
var genericParams = md.GetGenericParameters();
if (genericParams.Count > 0) {
buffer.Append('<');
foreach (var h in genericParams) {
var gp = metadata.GetGenericParameter(h);
if (i > 0)
buffer.Append(", ");
buffer.Append(metadata.GetString(gp.Name));
i++;
}
buffer.Append('>');
}
buffer.Append('(');
i = 0;
var parameterHandles = md.GetParameters();
CustomAttributeHandleCollection? returnTypeAttributes = null;
if (signature.RequiredParameterCount > parameterHandles.Count) {
foreach (var type in signature.ParameterTypes) {
if (i > 0)
buffer.Append(", ");
buffer.Append(TypeToString(signature.ParameterTypes[i], metadata, null));
i++;
}
} else {
foreach (var h in parameterHandles) {
var p = metadata.GetParameter(h);
if (p.SequenceNumber > 0 && i < signature.ParameterTypes.Length) {
if (i > 0)
buffer.Append(", ");
buffer.Append(TypeToString(signature.ParameterTypes[i], metadata, p.GetCustomAttributes(), h));
i++;
}
if (p.SequenceNumber == 0) {
returnTypeAttributes = p.GetCustomAttributes();
}
}
}
if (signature.Header.CallingConvention == SignatureCallingConvention.VarArgs) {
if (signature.ParameterTypes.Length > 0)
buffer.Append(", ");
buffer.Append("...");
}
buffer.Append(')');
buffer.Append(" : ");
buffer.Append(TypeToString(signature.ReturnType, metadata, returnTypeAttributes));
return buffer.ToString();
}
public override string FormatTypeName(Decompiler.Metadata.TypeDefinition type)
public override string EventToString(Decompiler.Metadata.EventDefinition @event, bool includeTypeName, bool includeNamespace)
{
if (type.IsNil)
throw new ArgumentNullException("type");
return TypeToString(ConvertTypeOptions.DoNotUsePrimitiveTypeNames | ConvertTypeOptions.IncludeTypeParameterDefinitions, type);
if (@event.IsNil)
throw new ArgumentNullException(nameof(@event));
var metadata = @event.Module.GetMetadataReader();
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 parameterHandles = accessor.GetParameters();
CustomAttributeHandleCollection? returnTypeAttributes = null;
if (parameterHandles.Count > 0) {
var p = metadata.GetParameter(parameterHandles.First());
if (p.SequenceNumber == 0) {
returnTypeAttributes = p.GetCustomAttributes();
}
}
var buffer = new System.Text.StringBuilder();
buffer.Append(metadata.GetString(ed.Name));
buffer.Append(" : ");
buffer.Append(TypeToString(signature, metadata, returnTypeAttributes));
return buffer.ToString();
}
public override bool ShowMember(IMetadataEntity member)
@ -533,6 +663,10 @@ namespace ICSharpCode.ILSpy @@ -533,6 +663,10 @@ namespace ICSharpCode.ILSpy
symbol = decompilerTypeSystem.ResolveAsField(entity.Handle);
if (symbol == null) return base.GetTooltip(entity);
break;
case HandleKind.TypeDefinition:
symbol = decompilerTypeSystem.ResolveAsType(entity.Handle).GetDefinition();
if (symbol == null) return base.GetTooltip(entity);
break;
default:
return base.GetTooltip(entity);
}
@ -540,4 +674,41 @@ namespace ICSharpCode.ILSpy @@ -540,4 +674,41 @@ namespace ICSharpCode.ILSpy
return new CSharpAmbience() { ConversionFlags = flags }.ConvertSymbol(symbol);
}
}
class InsertDynamicTypeVisitor : DepthFirstAstVisitor
{
bool isDynamic;
bool[] mapping;
int typeIndex;
public InsertDynamicTypeVisitor(MetadataReader metadata, CustomAttributeHandleCollection? customAttributes)
{
isDynamic = DynamicAwareTypeReference.HasDynamicAttribute(customAttributes, metadata, out mapping);
}
public override void VisitComposedType(ComposedType composedType)
{
typeIndex++;
base.VisitComposedType(composedType);
}
public override void VisitPrimitiveType(PrimitiveType primitiveType)
{
if (isDynamic && primitiveType.KnownTypeCode == KnownTypeCode.Object && (mapping == null || typeIndex >= mapping.Length || mapping[typeIndex])) {
primitiveType.ReplaceWith(new SimpleType("dynamic"));
} else {
base.VisitPrimitiveType(primitiveType);
}
}
public override void VisitMemberType(MemberType memberType)
{
base.VisitMemberType(memberType);
}
public override void VisitSimpleType(SimpleType simpleType)
{
base.VisitSimpleType(simpleType);
}
}
}

4
ILSpy/Languages/ILAstLanguage.cs

@ -70,10 +70,10 @@ namespace ICSharpCode.ILSpy @@ -70,10 +70,10 @@ namespace ICSharpCode.ILSpy
}
}
public override string TypeToString(Entity type, bool includeNamespace, SRM.CustomAttributeHandleCollection typeAttributes = default)
public override string TypeDefinitionToString(TypeDefinition type, bool includeNamespace)
{
PlainTextOutput output = new PlainTextOutput();
type.WriteTo(output, GenericContext.Empty, includeNamespace ? ILNameSyntax.TypeName : ILNameSyntax.ShortTypeName);
type.WriteTo(output, includeNamespace ? ILNameSyntax.TypeName : ILNameSyntax.ShortTypeName);
return output.ToString();
}

4
ILSpy/Languages/ILLanguage.cs

@ -146,10 +146,10 @@ namespace ICSharpCode.ILSpy @@ -146,10 +146,10 @@ namespace ICSharpCode.ILSpy
}
}
public override string TypeToString(Entity type, bool includeNamespace, CustomAttributeHandleCollection typeAttributes = default(CustomAttributeHandleCollection))
public override string TypeDefinitionToString(Decompiler.Metadata.TypeDefinition type, bool includeNamespace)
{
PlainTextOutput output = new PlainTextOutput();
type.WriteTo(output, GenericContext.Empty, includeNamespace ? ILNameSyntax.TypeName : ILNameSyntax.ShortTypeName);
type.WriteTo(output, includeNamespace ? ILNameSyntax.TypeName : ILNameSyntax.ShortTypeName);
return output.ToString();
}
}

61
ILSpy/Languages/Language.cs

@ -101,7 +101,7 @@ namespace ICSharpCode.ILSpy @@ -101,7 +101,7 @@ namespace ICSharpCode.ILSpy
{
var metadata = method.Module.GetMetadataReader();
var methodDefinition = metadata.GetMethodDefinition(method.Handle);
WriteCommentLine(output, TypeToString(new Entity(method.Module, methodDefinition.GetDeclaringType()), true) + "." + metadata.GetString(methodDefinition.Name));
WriteCommentLine(output, TypeDefinitionToString(new TypeDefinition(method.Module, methodDefinition.GetDeclaringType()), 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.GetMetadataReader();
var propertyDefinition = metadata.GetPropertyDefinition(property.Handle);
var declaringType = metadata.GetMethodDefinition(propertyDefinition.GetAccessors().GetAny()).GetDeclaringType();
WriteCommentLine(output, TypeToString(new Entity(property.Module, declaringType), true) + "." + metadata.GetString(propertyDefinition.Name));
WriteCommentLine(output, TypeDefinitionToString(new TypeDefinition(property.Module, declaringType), true) + "." + metadata.GetString(propertyDefinition.Name));
}
public virtual void DecompileField(FieldDefinition field, ITextOutput output, DecompilationOptions options)
{
var metadata = field.Module.GetMetadataReader();
var fieldDefinition = metadata.GetFieldDefinition(field.Handle);
WriteCommentLine(output, TypeToString(new Entity(field.Module, fieldDefinition.GetDeclaringType()), true) + "." + metadata.GetString(fieldDefinition.Name));
WriteCommentLine(output, TypeDefinitionToString(new TypeDefinition(field.Module, fieldDefinition.GetDeclaringType()), 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.GetMetadataReader();
var eventDefinition = metadata.GetEventDefinition(ev.Handle);
var declaringType = metadata.GetMethodDefinition(eventDefinition.GetAccessors().GetAny()).GetDeclaringType();
WriteCommentLine(output, TypeToString(new Entity(ev.Module, declaringType), true) + "." + metadata.GetString(eventDefinition.Name));
WriteCommentLine(output, TypeDefinitionToString(new TypeDefinition(ev.Module, declaringType), true) + "." + metadata.GetString(eventDefinition.Name));
}
public virtual void DecompileType(TypeDefinition type, ITextOutput output, DecompilationOptions options)
{
WriteCommentLine(output, TypeToString(type, true));
WriteCommentLine(output, TypeDefinitionToString(type, true));
}
public virtual void DecompileNamespace(string nameSpace, IEnumerable<TypeDefinition> types, ITextOutput output, DecompilationOptions options)
@ -161,9 +161,9 @@ namespace ICSharpCode.ILSpy @@ -161,9 +161,9 @@ namespace ICSharpCode.ILSpy
}
/// <summary>
/// Converts a type reference into a string. This method is used by the member tree node for parameter and return types.
/// Converts a type definition into a string. This method is used by the type tree nodes and search results.
/// </summary>
public virtual string TypeToString(Entity type, bool includeNamespace, SRM.CustomAttributeHandleCollection typeAttributes = default(SRM.CustomAttributeHandleCollection))
public virtual string TypeDefinitionToString(TypeDefinition type, bool includeNamespace)
{
var metadata = type.Module.GetMetadataReader();
var fullName = type.Handle.GetFullTypeName(metadata);
@ -173,11 +173,6 @@ namespace ICSharpCode.ILSpy @@ -173,11 +173,6 @@ namespace ICSharpCode.ILSpy
return fullName.Name;
}
public virtual SRM.ISignatureTypeProvider<string, GenericContext> CreateSignatureTypeProvider(bool includeNamespace)
{
return new ILSignatureProvider(includeNamespace);
}
/// <summary>
/// Converts a member signature to a string.
/// This is used for displaying the tooltip on a member reference.
@ -192,7 +187,7 @@ namespace ICSharpCode.ILSpy @@ -192,7 +187,7 @@ namespace ICSharpCode.ILSpy
return entity.Handle.GetFullTypeName(metadata).ToString();
case SRM.HandleKind.FieldDefinition:
var fieldDefinition = metadata.GetFieldDefinition((SRM.FieldDefinitionHandle)entity.Handle);
string fieldType = fieldDefinition.DecodeSignature(CreateSignatureTypeProvider(false), new GenericContext(fieldDefinition.GetDeclaringType(), entity.Module));
string fieldType = fieldDefinition.DecodeSignature(ILSignatureProvider.WithoutNamespace, new GenericContext(fieldDefinition.GetDeclaringType(), entity.Module));
return fieldType + " " + fieldDefinition.GetDeclaringType().GetFullTypeName(metadata) + "." + metadata.GetString(fieldDefinition.Name);
case SRM.HandleKind.MethodDefinition:
return TreeNodes.MethodTreeNode.GetText(entity, this).ToString();
@ -205,23 +200,40 @@ namespace ICSharpCode.ILSpy @@ -205,23 +200,40 @@ namespace ICSharpCode.ILSpy
}
}
public virtual string FormatFieldName(FieldDefinition field)
public virtual string FieldToString(FieldDefinition field, bool includeTypeName, bool includeNamespace)
{
if (field.Handle.IsNil)
throw new ArgumentNullException(nameof(field));
var metadata = field.Module.GetMetadataReader();
return metadata.GetString(metadata.GetFieldDefinition(field.Handle).Name);
var fd = metadata.GetFieldDefinition(field.Handle);
string fieldType = fd.DecodeSignature(ILSignatureProvider.WithoutNamespace, new GenericContext(fd.GetDeclaringType(), field.Module));
string simple = metadata.GetString(fd.Name) + " : " + fieldType;
if (!includeTypeName)
return simple;
var typeName = fd.GetDeclaringType().GetFullTypeName(metadata);
if (!includeNamespace)
return typeName.Name + "." + simple;
return typeName + "." + simple;
}
public virtual string FormatPropertyName(PropertyDefinition property, bool? isIndexer = null)
public virtual string PropertyToString(PropertyDefinition property, bool includeTypeName, bool includeNamespace, bool? isIndexer = null)
{
if (property.Handle.IsNil)
throw new ArgumentNullException(nameof(property));
var metadata = property.Module.GetMetadataReader();
return metadata.GetString(metadata.GetPropertyDefinition(property.Handle).Name);
var pd = metadata.GetPropertyDefinition(property.Handle);
var declaringType = metadata.GetMethodDefinition(pd.GetAccessors().GetAny()).GetDeclaringType();
var signature = pd.DecodeSignature(!includeNamespace ? ILSignatureProvider.WithoutNamespace : ILSignatureProvider.WithNamespace, new GenericContext(declaringType, property.Module));
string simple = metadata.GetString(metadata.GetPropertyDefinition(property.Handle).Name) + " : " + signature.ReturnType;
if (!includeTypeName)
return simple;
var typeName = declaringType.GetFullTypeName(metadata);
if (!includeNamespace)
return typeName.Name + "." + simple;
return typeName + "." + simple;
}
public virtual string FormatMethodName(MethodDefinition method)
public virtual string MethodToString(MethodDefinition method, bool includeTypeName, bool includeNamespace)
{
if (method.Handle.IsNil)
throw new ArgumentNullException(nameof(method));
@ -229,7 +241,7 @@ namespace ICSharpCode.ILSpy @@ -229,7 +241,7 @@ namespace ICSharpCode.ILSpy
return metadata.GetString(metadata.GetMethodDefinition(method.Handle).Name);
}
public virtual string FormatEventName(EventDefinition @event)
public virtual string EventToString(EventDefinition @event, bool includeTypeName, bool includeNamespace)
{
if (@event.Handle.IsNil)
throw new ArgumentNullException(nameof(@event));
@ -237,14 +249,6 @@ namespace ICSharpCode.ILSpy @@ -237,14 +249,6 @@ namespace ICSharpCode.ILSpy
return metadata.GetString(metadata.GetEventDefinition(@event.Handle).Name);
}
public virtual string FormatTypeName(TypeDefinition type)
{
if (type.Handle.IsNil)
throw new ArgumentNullException(nameof(type));
var metadata = type.Module.GetMetadataReader();
return metadata.GetString(metadata.GetTypeDefinition(type.Handle).Name);
}
/// <summary>
/// Used for WPF keyboard navigation.
/// </summary>
@ -311,6 +315,9 @@ namespace ICSharpCode.ILSpy @@ -311,6 +315,9 @@ namespace ICSharpCode.ILSpy
class ILSignatureProvider : SRM.ISignatureTypeProvider<string, GenericContext>
{
public static readonly ILSignatureProvider WithoutNamespace = new ILSignatureProvider(false);
public static readonly ILSignatureProvider WithNamespace = new ILSignatureProvider(true);
bool includeNamespace;
public ILSignatureProvider(bool includeNamespace)

9
ILSpy/LoadedAssembly.cs

@ -155,7 +155,7 @@ namespace ICSharpCode.ILSpy @@ -155,7 +155,7 @@ namespace ICSharpCode.ILSpy
// search for pdb in same directory as dll
pdbFileName = Path.Combine(pdbDirectory, Path.GetFileNameWithoutExtension(fileName) + ".pdb");
if (File.Exists(pdbFileName)) {
module.DebugInfo = new DiaSymNativeDebugInfoProvider(module, pdbFileName, File.OpenRead(pdbFileName));
module.DebugInfo = new DiaSymNativeDebugInfoProvider(module, pdbFileName, OpenStream(pdbFileName));
return;
}
@ -164,7 +164,12 @@ namespace ICSharpCode.ILSpy @@ -164,7 +164,12 @@ namespace ICSharpCode.ILSpy
Stream OpenStream(string fileName)
{
return File.OpenRead(fileName);
if (!File.Exists(fileName))
return null;
var memory = new MemoryStream();
using (var stream = File.OpenRead(fileName))
stream.CopyTo(memory);
return memory;
}
}

20
ILSpy/SearchStrategies.cs

@ -152,15 +152,15 @@ namespace ICSharpCode.ILSpy @@ -152,15 +152,15 @@ namespace ICSharpCode.ILSpy
var metadata = member.Module.GetMetadataReader();
switch (member) {
case TypeDefinition t:
return language.TypeToString(t, fullName);
return language.TypeDefinitionToString(t, fullName);
case FieldDefinition f:
return fullName ? language.TypeToString(new TypeDefinition(member.Module, metadata.GetFieldDefinition(f.Handle).GetDeclaringType()), fullName) + "." + language.FormatFieldName(f) : language.FormatFieldName(f);
return language.FieldToString(f, fullName, fullName);
case PropertyDefinition p:
return fullName ? language.TypeToString(new TypeDefinition(member.Module, metadata.GetMethodDefinition(metadata.GetPropertyDefinition(p.Handle).GetAccessors().GetAny()).GetDeclaringType()), fullName) + "." + language.FormatPropertyName(p) : language.FormatPropertyName(p);
return language.PropertyToString(p, fullName, fullName, p.Handle.HasMatchingDefaultMemberAttribute(member.Module, out _));
case MethodDefinition m:
return fullName ? language.TypeToString(new TypeDefinition(member.Module, metadata.GetMethodDefinition(m.Handle).GetDeclaringType()), fullName) + "." + language.FormatMethodName(m) : language.FormatMethodName(m);
return language.MethodToString(m, fullName, fullName);
case EventDefinition e:
return fullName ? language.TypeToString(new TypeDefinition(member.Module, metadata.GetMethodDefinition(metadata.GetEventDefinition(e.Handle).GetAccessors().GetAny()).GetDeclaringType()), fullName) + "." + language.FormatEventName(e) : language.FormatEventName(e);
return language.EventToString(e, fullName, fullName);
default:
throw new NotSupportedException(member?.GetType() + " not supported!");
}
@ -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.TypeToString(type, includeNamespace: true)
Location = language.TypeDefinitionToString(type, includeNamespace: true)
});
}
}
@ -497,7 +497,7 @@ namespace ICSharpCode.ILSpy @@ -497,7 +497,7 @@ namespace ICSharpCode.ILSpy
public override void Search(TypeDefinition type, Language language, Action<SearchResult> addResult)
{
if (MatchName(type, language)) {
string name = language.TypeToString(type, includeNamespace: false);
string name = language.TypeDefinitionToString(type, includeNamespace: false);
var metadata = type.Module.GetMetadataReader();
var declaringType = type.This().GetDeclaringType();
addResult(new SearchResult {
@ -506,7 +506,7 @@ namespace ICSharpCode.ILSpy @@ -506,7 +506,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.TypeToString(new TypeDefinition(type.Module, declaringType), includeNamespace: true) : type.Handle.GetFullTypeName(metadata).TopLevelTypeName.Namespace
Location = !declaringType.IsNil ? language.TypeDefinitionToString(new TypeDefinition(type.Module, declaringType), includeNamespace: true) : type.Handle.GetFullTypeName(metadata).TopLevelTypeName.Namespace
});
}
@ -527,7 +527,7 @@ namespace ICSharpCode.ILSpy @@ -527,7 +527,7 @@ namespace ICSharpCode.ILSpy
{
if (MatchName(type, language))
{
string name = language.TypeToString(type, includeNamespace: false);
string name = language.TypeDefinitionToString(type, includeNamespace: false);
var metadata = type.Module.GetMetadataReader();
var declaringType = type.This().GetDeclaringType();
addResult(new SearchResult {
@ -536,7 +536,7 @@ namespace ICSharpCode.ILSpy @@ -536,7 +536,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.TypeToString(new TypeDefinition(type.Module, declaringType), includeNamespace: true) : type.Handle.GetFullTypeName(metadata).TopLevelTypeName.Namespace
Location = !declaringType.IsNil ? language.TypeDefinitionToString(new TypeDefinition(type.Module, declaringType), includeNamespace: true) : type.Handle.GetFullTypeName(metadata).TopLevelTypeName.Namespace
});
}

14
ILSpy/TextView/DecompilerTextView.cs

@ -206,18 +206,14 @@ namespace ICSharpCode.ILSpy.TextView @@ -206,18 +206,14 @@ namespace ICSharpCode.ILSpy.TextView
}
}
return $"{code.Name} (0x{code.Code:x})";
} else if (segment.Reference is Entity entity) {
// if possible, resolve the reference
if (entity.IsType()) {
var td = entity.ResolveAsType();
if (!td.IsNil) entity = td;
}
} else if (segment.Reference is IMetadataEntity entity) {
XmlDocRenderer renderer = new XmlDocRenderer();
renderer.AppendText(MainWindow.Instance.CurrentLanguage.GetTooltip(entity));
renderer.AppendText(MainWindow.Instance.CurrentLanguage.GetTooltip(new Entity(entity.Module, entity.Handle)));
try {
var docProvider = entity.Module.DocumentationResolver.GetProvider(); // TODO implement proper API
//var docProvider = entity.Module.DocumentationResolver.GetProvider(); // TODO implement proper API
var docProvider = XmlDocLoader.LoadDocumentation(entity.Module);
if (docProvider != null) {
string documentation = docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(entity));
string documentation = docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(new Entity(entity.Module, entity.Handle)));
if (documentation != null) {
renderer.AppendText(Environment.NewLine);
renderer.AddXmlDocumentation(documentation);

5
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -74,10 +74,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -74,10 +74,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
}
}
public override object Text
{
get { return HighlightSearchMatch(assembly.Text); }
}
public override object Text => assembly.Text;
public override object Icon
{

2
ILSpy/TreeNodes/BaseTypesEntryNode.cs

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

2
ILSpy/TreeNodes/DerivedTypesEntryNode.cs

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

14
ILSpy/TreeNodes/EventTreeNode.cs

@ -55,19 +55,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -55,19 +55,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public static object GetText(EventDefinition ev, Language language)
{
var metadata = ev.Module.GetMetadataReader();
var eventDefinition = metadata.GetEventDefinition(ev.Handle);
var accessors = eventDefinition.GetAccessors();
SRM.TypeDefinitionHandle declaringType;
if (!accessors.Adder.IsNil) {
declaringType = metadata.GetMethodDefinition(accessors.Adder).GetDeclaringType();
} else if (!accessors.Remover.IsNil) {
declaringType = metadata.GetMethodDefinition(accessors.Remover).GetDeclaringType();
} else {
declaringType = metadata.GetMethodDefinition(accessors.Raiser).GetDeclaringType();
}
var eventType = eventDefinition.DecodeSignature(metadata, language.CreateSignatureTypeProvider(false), new GenericContext(declaringType, ev.Module));
return HighlightSearchMatch(metadata.GetString(eventDefinition.Name), " : " + eventType);
return language.EventToString(ev, false, false);
}
public override object Icon => GetIcon(EventDefinition);

5
ILSpy/TreeNodes/FieldTreeNode.cs

@ -43,10 +43,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -43,10 +43,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public static object GetText(FieldDefinition field, Language language)
{
var metadata = field.Module.GetMetadataReader();
var fieldDefinition = metadata.GetFieldDefinition(field.Handle);
string fieldType = fieldDefinition.DecodeSignature(language.CreateSignatureTypeProvider(false), new GenericContext(fieldDefinition.GetDeclaringType(), field.Module));
return HighlightSearchMatch(metadata.GetString(fieldDefinition.Name), " : " + fieldType);
return language.FieldToString(field, includeTypeName: false, includeNamespace: false);
}
public override object Icon => GetIcon(FieldDefinition);

6
ILSpy/TreeNodes/ILSpyTreeNode.cs

@ -57,12 +57,6 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -57,12 +57,6 @@ namespace ICSharpCode.ILSpy.TreeNodes
return FilterResult.Hidden;
}
protected static object HighlightSearchMatch(string text, string suffix = null)
{
// TODO: implement highlighting the search match
return text + suffix;
}
public abstract void Decompile(Language language, ITextOutput output, DecompilationOptions options);
/// <summary>

25
ILSpy/TreeNodes/MethodTreeNode.cs

@ -47,30 +47,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -47,30 +47,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public static object GetText(MethodDefinition method, Language language)
{
var b = new StringBuilder();
var metadata = method.Module.GetMetadataReader();
var methodDefinition = metadata.GetMethodDefinition(method.Handle);
var signatureProvider = language.CreateSignatureTypeProvider(false);
var signature = methodDefinition.DecodeSignature(signatureProvider, new GenericContext(method));
b.Append('(');
for (int i = 0; i < signature.ParameterTypes.Length; i++) {
if (i > 0)
b.Append(", ");
b.Append(signature.ParameterTypes[i]);
}
if (signature.Header.CallingConvention == SRM.SignatureCallingConvention.VarArgs) {
if (signature.ParameterTypes.Length > 0)
b.Append(", ");
b.Append("...");
}
if (methodDefinition.IsConstructor(metadata)) {
b.Append(')');
} else {
b.Append(") : ");
b.Append(signature.ReturnType);
}
return HighlightSearchMatch(language.FormatMethodName(method), b.ToString());
return language.MethodToString(method, false, false);
}
public override object Icon => GetIcon(MethodDefinition);

2
ILSpy/TreeNodes/NamespaceTreeNode.cs

@ -41,7 +41,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -41,7 +41,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
}
public override object Text {
get { return HighlightSearchMatch(name.Length == 0 ? "-" : name); }
get { return name.Length == 0 ? "-" : name; }
}
public override object Icon {

5
ILSpy/TreeNodes/PropertyTreeNode.cs

@ -59,10 +59,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -59,10 +59,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public static object GetText(PropertyDefinition property, Language language, bool? isIndexer = null)
{
var metadata = property.Module.GetMetadataReader();
var propertyDefinition = metadata.GetPropertyDefinition(property.Handle);
var signature = propertyDefinition.DecodeSignature(language.CreateSignatureTypeProvider(false), new GenericContext(propertyDefinition.GetAccessors().GetAny(), property.Module));
return HighlightSearchMatch(language.FormatPropertyName(property, isIndexer), " : " + signature.ReturnType);
return language.PropertyToString(property, false, false, isIndexer);
}
public override object Icon => GetIcon(PropertyDefinition);

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 => HighlightSearchMatch(this.Language.FormatTypeName(TypeDefinition), TypeDefinition.Handle.ToSuffixString());
public override object Text => this.Language.TypeDefinitionToString(TypeDefinition, false) + TypeDefinition.Handle.ToSuffixString();
public override bool IsPublicAPI {
get {

Loading…
Cancel
Save