Browse Source

Fix #1818: Assembly-level TypeForwardedTo not displaying unresolved generics properly

pull/1835/head
Siegfried Pammer 6 years ago
parent
commit
8706fe284a
  1. 44
      ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs
  2. 2
      ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs

44
ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs

@ -272,26 +272,32 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
return astType; return astType;
} else { } else {
AstType astType; AstType astType;
if (type is ITypeDefinition typeDef) { switch (type) {
if (ShowTypeParametersForUnboundTypes) { case ITypeDefinition _:
astType = ConvertTypeHelper(typeDef, typeDef.TypeArguments); case UnknownType _:
} else if (typeDef.TypeParameterCount > 0) { if (type.IsUnbound()) {
// Unbound type if (ShowTypeParametersForUnboundTypes) {
IType[] typeArguments = new IType[typeDef.TypeParameterCount]; astType = ConvertTypeHelper(type, type.TypeArguments);
for (int i = 0; i < typeArguments.Length; i++) { } else {
typeArguments[i] = SpecialType.UnboundTypeArgument; IType[] typeArguments = new IType[type.TypeParameterCount];
for (int i = 0; i < typeArguments.Length; i++) {
typeArguments[i] = SpecialType.UnboundTypeArgument;
}
astType = ConvertTypeHelper(type, typeArguments);
}
} else {
astType = ConvertTypeHelper(type, EmptyList<IType>.Instance);
} }
astType = ConvertTypeHelper(typeDef, typeArguments); break;
} else { case ParameterizedType pt:
astType = ConvertTypeHelper(typeDef, EmptyList<IType>.Instance); if (AlwaysUseBuiltinTypeNames && pt.IsKnownType(KnownTypeCode.NullableOfT)) {
} return ConvertType(pt.TypeArguments[0]).MakeNullableType();
} else if (type is ParameterizedType pt) { }
if (AlwaysUseBuiltinTypeNames && pt.IsKnownType(KnownTypeCode.NullableOfT)) { astType = ConvertTypeHelper(pt.GenericType, pt.TypeArguments);
return ConvertType(pt.TypeArguments[0]).MakeNullableType(); break;
} default:
astType = ConvertTypeHelper(pt.GenericType, pt.TypeArguments); astType = MakeSimpleType(type.Name);
} else { break;
astType = MakeSimpleType(type.Name);
} }
if (type.Nullability == Nullability.Nullable) { if (type.Nullability == Nullability.Nullable) {
AddTypeAnnotation(astType, type.ChangeNullability(Nullability.Oblivious)); AddTypeAnnotation(astType, type.ChangeNullability(Nullability.Oblivious));

2
ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs

@ -211,7 +211,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
{ {
if (type == null) if (type == null)
throw new ArgumentNullException(nameof(type)); throw new ArgumentNullException(nameof(type));
return type is ITypeDefinition && type.TypeParameterCount > 0; return (type is ITypeDefinition || type is UnknownType) && type.TypeParameterCount > 0;
} }
/// <summary> /// <summary>

Loading…
Cancel
Save