Browse Source

Fix output of generic parameters in AstTypeBuilder and CSharpLanguage.TypeDefinitionToString

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
56c90bf119
  1. 36
      ICSharpCode.Decompiler/CSharp/AstTypeBuilder.cs
  2. 30
      ILSpy/Languages/CSharpLanguage.cs

36
ICSharpCode.Decompiler/CSharp/AstTypeBuilder.cs

@ -42,7 +42,9 @@ namespace ICSharpCode.Decompiler.CSharp
public AstType GetFunctionPointerType(MethodSignature<AstType> signature) public AstType GetFunctionPointerType(MethodSignature<AstType> signature)
{ {
throw new NotImplementedException(); if ((options & ConvertTypeOptions.IncludeNamespace) == 0)
return AstType.Create("IntPtr");
return AstType.Create("System.IntPtr");
} }
public AstType GetGenericInstantiation(AstType genericType, ImmutableArray<AstType> typeArguments) public AstType GetGenericInstantiation(AstType genericType, ImmutableArray<AstType> typeArguments)
@ -71,12 +73,12 @@ namespace ICSharpCode.Decompiler.CSharp
public AstType GetModifiedType(AstType modifier, AstType unmodifiedType, bool isRequired) public AstType GetModifiedType(AstType modifier, AstType unmodifiedType, bool isRequired)
{ {
throw new NotImplementedException(); return unmodifiedType;
} }
public AstType GetPinnedType(AstType elementType) public AstType GetPinnedType(AstType elementType)
{ {
throw new NotImplementedException(); return elementType;
} }
public AstType GetPointerType(AstType elementType) public AstType GetPointerType(AstType elementType)
@ -234,13 +236,11 @@ namespace ICSharpCode.Decompiler.CSharp
if ((options & (ConvertTypeOptions.IncludeOuterTypeName | ConvertTypeOptions.IncludeNamespace)) != 0) { if ((options & (ConvertTypeOptions.IncludeOuterTypeName | ConvertTypeOptions.IncludeNamespace)) != 0) {
var outerType = MakeAstType(fullTypeName.GetDeclaringType(), genericParams); var outerType = MakeAstType(fullTypeName.GetDeclaringType(), genericParams);
var mt = new MemberType(outerType, fullTypeName.Name); var mt = new MemberType(outerType, fullTypeName.Name);
ApplyGenericParametersTo(mt, genericParams, count);
return mt; return mt;
} else { } else {
var st = new SimpleType(fullTypeName.Name); var st = new SimpleType(fullTypeName.Name);
for (int i = 0; i < fullTypeName.TypeParameterCount - count; i++) for (int i = 0; i < fullTypeName.TypeParameterCount - count; i++)
genericParams.RemoveAt(0); genericParams.RemoveAt(0);
ApplyGenericParametersTo(st, genericParams, count);
return st; return st;
} }
} }
@ -251,33 +251,7 @@ namespace ICSharpCode.Decompiler.CSharp
} else { } else {
baseType = AstType.Create(topLevel.Name); baseType = AstType.Create(topLevel.Name);
} }
ApplyGenericParametersTo(baseType, genericParams, topLevel.TypeParameterCount);
return baseType; return baseType;
} }
void ApplyGenericParametersTo(AstType targetType, IList<AstType> genericParams, int count)
{
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;
}
}
} }
} }

30
ILSpy/Languages/CSharpLanguage.cs

@ -404,15 +404,33 @@ namespace ICSharpCode.ILSpy
public override string TypeDefinitionToString(Decompiler.Metadata.TypeDefinition type, bool includeNamespace) public override string TypeDefinitionToString(Decompiler.Metadata.TypeDefinition type, bool includeNamespace)
{ {
ConvertTypeOptions options = ConvertTypeOptions.IncludeTypeParameterDefinitions; var metadata = type.Module.GetMetadataReader();
var td = metadata.GetTypeDefinition(type.Handle);
var genericParams = td.GetGenericParameters();
var buffer = new System.Text.StringBuilder();
var name = td.GetFullTypeName(metadata);
if (includeNamespace) if (includeNamespace)
options |= ConvertTypeOptions.IncludeNamespace; buffer.Append(name.ToString());
else
buffer.Append(name.Name);
var metadata = type.Module.GetMetadataReader(); if (genericParams.Count > 0) {
var provider = new AstTypeBuilder(options); 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('>');
}
AstType astType = provider.GetTypeFromDefinition(metadata, type.Handle, 0); return buffer.ToString();
return TypeToString(astType, metadata, null);
} }
public override string FieldToString(Decompiler.Metadata.FieldDefinition field, bool includeTypeName, bool includeNamespace) public override string FieldToString(Decompiler.Metadata.FieldDefinition field, bool includeTypeName, bool includeNamespace)

Loading…
Cancel
Save