From 6653487f81ecd796da1c3fb270d1d817d7244883 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 8 Jul 2018 18:47:26 +0200 Subject: [PATCH] Refactor CSharpLanguage.TypeToString --- ILSpy/Languages/CSharpLanguage.cs | 32 ++++++++++++++++++++----------- ILSpy/Languages/Language.cs | 7 ------- ILSpy/SearchStrategies.cs | 12 ++++++------ ILSpy/TreeNodes/TypeTreeNode.cs | 2 +- 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs index b4460d496..389a16eef 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -410,9 +410,19 @@ namespace ICSharpCode.ILSpy { if (type == null) throw new ArgumentNullException(nameof(type)); + if (type is ITypeDefinition definition && definition.TypeParameterCount > 0) { + return TypeToStringInternal(new ParameterizedType(definition, definition.TypeParameters), includeNamespace, false); + } + return TypeToStringInternal(type, includeNamespace, false); + } + + string TypeToStringInternal(IType t, bool includeNamespace, bool useBuiltinTypeNames = true) + { TypeSystemAstBuilder builder = new TypeSystemAstBuilder(); builder.AlwaysUseShortTypeNames = !includeNamespace; - AstType astType = builder.ConvertType(type); + builder.AlwaysUseBuiltinTypeNames = useBuiltinTypeNames; + + AstType astType = builder.ConvertType(t); StringWriter w = new StringWriter(); astType.AcceptVisitor(new CSharpOutputVisitor(w, TypeToStringFormattingOptions)); @@ -427,7 +437,7 @@ namespace ICSharpCode.ILSpy string simple = field.Name + " : " + TypeToString(field.Type, includeNamespace); if (!includeTypeName) return simple; - return TypeToString(MakeParameterizedType(field.DeclaringTypeDefinition), includeNamespace) + "." + simple; + return TypeToStringInternal(field.DeclaringTypeDefinition, includeNamespace) + "." + simple; } public override string PropertyToString(IProperty property, bool includeTypeName, bool includeNamespace, bool? isIndexer = null) @@ -451,7 +461,7 @@ namespace ICSharpCode.ILSpy foreach (var param in parameters) { if (i > 0) buffer.Append(", "); - buffer.Append(TypeToString(param.Type, includeNamespace)); + buffer.Append(TypeToStringInternal(param.Type, includeNamespace)); i++; } @@ -460,10 +470,10 @@ namespace ICSharpCode.ILSpy buffer.Append(property.Name); } buffer.Append(" : "); - buffer.Append(TypeToString(property.ReturnType, includeNamespace)); + buffer.Append(TypeToStringInternal(property.ReturnType, includeNamespace)); if (!includeTypeName) return buffer.ToString(); - return TypeToString(MakeParameterizedType(property.DeclaringTypeDefinition), includeNamespace) + "." + buffer.ToString(); + return TypeToString(property.DeclaringTypeDefinition, includeNamespace) + "." + buffer.ToString(); } public override string MethodToString(IMethod method, bool includeTypeName, bool includeNamespace) @@ -472,10 +482,10 @@ namespace ICSharpCode.ILSpy throw new ArgumentNullException(nameof(method)); string name; if (method.IsConstructor) { - name = TypeToString(MakeParameterizedType(method.DeclaringTypeDefinition), includeNamespace: includeNamespace); + name = TypeToString(method.DeclaringTypeDefinition, includeNamespace: includeNamespace); } else { if (includeTypeName) { - name = TypeToString(MakeParameterizedType(method.DeclaringTypeDefinition), includeNamespace: includeNamespace) + "."; + name = TypeToString(method.DeclaringTypeDefinition, includeNamespace: includeNamespace) + "."; } else { name = ""; } @@ -501,13 +511,13 @@ namespace ICSharpCode.ILSpy foreach (var param in parameters) { if (i > 0) buffer.Append(", "); - buffer.Append(TypeToString(param.Type, includeNamespace)); + buffer.Append(TypeToStringInternal(param.Type, includeNamespace)); i++; } buffer.Append(')'); buffer.Append(" : "); - buffer.Append(TypeToString(method.ReturnType, includeNamespace)); + buffer.Append(TypeToStringInternal(method.ReturnType, includeNamespace)); return buffer.ToString(); } @@ -517,11 +527,11 @@ namespace ICSharpCode.ILSpy throw new ArgumentNullException(nameof(@event)); var buffer = new System.Text.StringBuilder(); if (includeTypeName) { - buffer.Append(TypeToString(MakeParameterizedType(@event.DeclaringTypeDefinition), includeNamespace) + "."); + buffer.Append(TypeToString(@event.DeclaringTypeDefinition, includeNamespace) + "."); } buffer.Append(@event.Name); buffer.Append(" : "); - buffer.Append(TypeToString(@event.ReturnType, includeNamespace)); + buffer.Append(TypeToStringInternal(@event.ReturnType, includeNamespace)); return buffer.ToString(); } diff --git a/ILSpy/Languages/Language.cs b/ILSpy/Languages/Language.cs index 9fbd9ff5c..26b851940 100644 --- a/ILSpy/Languages/Language.cs +++ b/ILSpy/Languages/Language.cs @@ -243,13 +243,6 @@ namespace ICSharpCode.ILSpy } } - public static IType MakeParameterizedType(ITypeDefinition type) - { - if (type.TypeParameterCount == 0) - return type; - return new ParameterizedType(type, type.TypeParameters); - } - /// /// Used for WPF keyboard navigation. /// diff --git a/ILSpy/SearchStrategies.cs b/ILSpy/SearchStrategies.cs index 92aa1ee84..907d72145 100644 --- a/ILSpy/SearchStrategies.cs +++ b/ILSpy/SearchStrategies.cs @@ -163,7 +163,7 @@ namespace ICSharpCode.ILSpy { switch (member) { case ITypeDefinition t: - return language.TypeToString(Language.MakeParameterizedType(t), includeNamespace: fullName); + return language.TypeToString(t, includeNamespace: fullName); case IField f: return language.FieldToString(f, fullName, fullName); case IProperty p: @@ -193,7 +193,7 @@ namespace ICSharpCode.ILSpy Image = image(item), Name = GetLanguageSpecificName(language, item), LocationImage = TypeTreeNode.GetIcon(type), - Location = language.TypeToString(Language.MakeParameterizedType(type), includeNamespace: true) + Location = language.TypeToString(type, includeNamespace: true) }); } } @@ -497,7 +497,7 @@ namespace ICSharpCode.ILSpy public override void Search(ITypeDefinition type, Language language, Action addResult) { if (MatchName(type, language)) { - string name = language.TypeToString(Language.MakeParameterizedType(type), includeNamespace: false); + string name = language.TypeToString(type, includeNamespace: false); var declaringType = type.DeclaringTypeDefinition; addResult(new SearchResult { Member = type, @@ -505,7 +505,7 @@ namespace ICSharpCode.ILSpy Image = TypeTreeNode.GetIcon(type), Name = name, LocationImage = declaringType != null ? TypeTreeNode.GetIcon(declaringType) : Images.Namespace, - Location = declaringType != null ? language.TypeToString(Language.MakeParameterizedType(declaringType), includeNamespace: true) : type.Namespace + Location = declaringType != null ? language.TypeToString(declaringType, includeNamespace: true) : type.Namespace }); } @@ -526,7 +526,7 @@ namespace ICSharpCode.ILSpy { if (MatchName(type, language)) { - string name = language.TypeToString(Language.MakeParameterizedType(type), includeNamespace: false); + string name = language.TypeToString(type, includeNamespace: false); var declaringType = type.DeclaringTypeDefinition; addResult(new SearchResult { Member = type, @@ -534,7 +534,7 @@ namespace ICSharpCode.ILSpy Fitness = CalculateFitness(type), Name = name, LocationImage = declaringType != null ? TypeTreeNode.GetIcon(declaringType) : Images.Namespace, - Location = declaringType != null ? language.TypeToString(Language.MakeParameterizedType(declaringType), includeNamespace: true) : type.Namespace + Location = declaringType != null ? language.TypeToString(declaringType, includeNamespace: true) : type.Namespace }); } diff --git a/ILSpy/TreeNodes/TypeTreeNode.cs b/ILSpy/TreeNodes/TypeTreeNode.cs index 85ddb3790..2ef084718 100644 --- a/ILSpy/TreeNodes/TypeTreeNode.cs +++ b/ILSpy/TreeNodes/TypeTreeNode.cs @@ -40,7 +40,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public AssemblyTreeNode ParentAssemblyNode { get; } - public override object Text => this.Language.TypeToString(Language.MakeParameterizedType(TypeDefinition), includeNamespace: false) + public override object Text => this.Language.TypeToString(TypeDefinition, includeNamespace: false) + TypeDefinition.MetadataToken.ToSuffixString(); public override bool IsPublicAPI {