Browse Source

Refactor CSharpLanguage.TypeToString

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
6653487f81
  1. 32
      ILSpy/Languages/CSharpLanguage.cs
  2. 7
      ILSpy/Languages/Language.cs
  3. 12
      ILSpy/SearchStrategies.cs
  4. 2
      ILSpy/TreeNodes/TypeTreeNode.cs

32
ILSpy/Languages/CSharpLanguage.cs

@ -410,9 +410,19 @@ namespace ICSharpCode.ILSpy
{ {
if (type == null) if (type == null)
throw new ArgumentNullException(nameof(type)); 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(); TypeSystemAstBuilder builder = new TypeSystemAstBuilder();
builder.AlwaysUseShortTypeNames = !includeNamespace; builder.AlwaysUseShortTypeNames = !includeNamespace;
AstType astType = builder.ConvertType(type); builder.AlwaysUseBuiltinTypeNames = useBuiltinTypeNames;
AstType astType = builder.ConvertType(t);
StringWriter w = new StringWriter(); StringWriter w = new StringWriter();
astType.AcceptVisitor(new CSharpOutputVisitor(w, TypeToStringFormattingOptions)); astType.AcceptVisitor(new CSharpOutputVisitor(w, TypeToStringFormattingOptions));
@ -427,7 +437,7 @@ namespace ICSharpCode.ILSpy
string simple = field.Name + " : " + TypeToString(field.Type, includeNamespace); string simple = field.Name + " : " + TypeToString(field.Type, includeNamespace);
if (!includeTypeName) if (!includeTypeName)
return simple; 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) 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) { foreach (var param in parameters) {
if (i > 0) if (i > 0)
buffer.Append(", "); buffer.Append(", ");
buffer.Append(TypeToString(param.Type, includeNamespace)); buffer.Append(TypeToStringInternal(param.Type, includeNamespace));
i++; i++;
} }
@ -460,10 +470,10 @@ namespace ICSharpCode.ILSpy
buffer.Append(property.Name); buffer.Append(property.Name);
} }
buffer.Append(" : "); buffer.Append(" : ");
buffer.Append(TypeToString(property.ReturnType, includeNamespace)); buffer.Append(TypeToStringInternal(property.ReturnType, includeNamespace));
if (!includeTypeName) if (!includeTypeName)
return buffer.ToString(); 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) public override string MethodToString(IMethod method, bool includeTypeName, bool includeNamespace)
@ -472,10 +482,10 @@ namespace ICSharpCode.ILSpy
throw new ArgumentNullException(nameof(method)); throw new ArgumentNullException(nameof(method));
string name; string name;
if (method.IsConstructor) { if (method.IsConstructor) {
name = TypeToString(MakeParameterizedType(method.DeclaringTypeDefinition), includeNamespace: includeNamespace); name = TypeToString(method.DeclaringTypeDefinition, includeNamespace: includeNamespace);
} else { } else {
if (includeTypeName) { if (includeTypeName) {
name = TypeToString(MakeParameterizedType(method.DeclaringTypeDefinition), includeNamespace: includeNamespace) + "."; name = TypeToString(method.DeclaringTypeDefinition, includeNamespace: includeNamespace) + ".";
} else { } else {
name = ""; name = "";
} }
@ -501,13 +511,13 @@ namespace ICSharpCode.ILSpy
foreach (var param in parameters) { foreach (var param in parameters) {
if (i > 0) if (i > 0)
buffer.Append(", "); buffer.Append(", ");
buffer.Append(TypeToString(param.Type, includeNamespace)); buffer.Append(TypeToStringInternal(param.Type, includeNamespace));
i++; i++;
} }
buffer.Append(')'); buffer.Append(')');
buffer.Append(" : "); buffer.Append(" : ");
buffer.Append(TypeToString(method.ReturnType, includeNamespace)); buffer.Append(TypeToStringInternal(method.ReturnType, includeNamespace));
return buffer.ToString(); return buffer.ToString();
} }
@ -517,11 +527,11 @@ namespace ICSharpCode.ILSpy
throw new ArgumentNullException(nameof(@event)); throw new ArgumentNullException(nameof(@event));
var buffer = new System.Text.StringBuilder(); var buffer = new System.Text.StringBuilder();
if (includeTypeName) { if (includeTypeName) {
buffer.Append(TypeToString(MakeParameterizedType(@event.DeclaringTypeDefinition), includeNamespace) + "."); buffer.Append(TypeToString(@event.DeclaringTypeDefinition, includeNamespace) + ".");
} }
buffer.Append(@event.Name); buffer.Append(@event.Name);
buffer.Append(" : "); buffer.Append(" : ");
buffer.Append(TypeToString(@event.ReturnType, includeNamespace)); buffer.Append(TypeToStringInternal(@event.ReturnType, includeNamespace));
return buffer.ToString(); return buffer.ToString();
} }

7
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);
}
/// <summary> /// <summary>
/// Used for WPF keyboard navigation. /// Used for WPF keyboard navigation.
/// </summary> /// </summary>

12
ILSpy/SearchStrategies.cs

@ -163,7 +163,7 @@ namespace ICSharpCode.ILSpy
{ {
switch (member) { switch (member) {
case ITypeDefinition t: case ITypeDefinition t:
return language.TypeToString(Language.MakeParameterizedType(t), includeNamespace: fullName); return language.TypeToString(t, includeNamespace: fullName);
case IField f: case IField f:
return language.FieldToString(f, fullName, fullName); return language.FieldToString(f, fullName, fullName);
case IProperty p: case IProperty p:
@ -193,7 +193,7 @@ namespace ICSharpCode.ILSpy
Image = image(item), Image = image(item),
Name = GetLanguageSpecificName(language, item), Name = GetLanguageSpecificName(language, item),
LocationImage = TypeTreeNode.GetIcon(type), 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<SearchResult> addResult) public override void Search(ITypeDefinition type, Language language, Action<SearchResult> addResult)
{ {
if (MatchName(type, language)) { if (MatchName(type, language)) {
string name = language.TypeToString(Language.MakeParameterizedType(type), includeNamespace: false); string name = language.TypeToString(type, includeNamespace: false);
var declaringType = type.DeclaringTypeDefinition; var declaringType = type.DeclaringTypeDefinition;
addResult(new SearchResult { addResult(new SearchResult {
Member = type, Member = type,
@ -505,7 +505,7 @@ namespace ICSharpCode.ILSpy
Image = TypeTreeNode.GetIcon(type), Image = TypeTreeNode.GetIcon(type),
Name = name, Name = name,
LocationImage = declaringType != null ? TypeTreeNode.GetIcon(declaringType) : Images.Namespace, 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)) if (MatchName(type, language))
{ {
string name = language.TypeToString(Language.MakeParameterizedType(type), includeNamespace: false); string name = language.TypeToString(type, includeNamespace: false);
var declaringType = type.DeclaringTypeDefinition; var declaringType = type.DeclaringTypeDefinition;
addResult(new SearchResult { addResult(new SearchResult {
Member = type, Member = type,
@ -534,7 +534,7 @@ namespace ICSharpCode.ILSpy
Fitness = CalculateFitness(type), Fitness = CalculateFitness(type),
Name = name, Name = name,
LocationImage = declaringType != null ? TypeTreeNode.GetIcon(declaringType) : Images.Namespace, 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
}); });
} }

2
ILSpy/TreeNodes/TypeTreeNode.cs

@ -40,7 +40,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public AssemblyTreeNode ParentAssemblyNode { get; } 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(); + TypeDefinition.MetadataToken.ToSuffixString();
public override bool IsPublicAPI { public override bool IsPublicAPI {

Loading…
Cancel
Save