From 8706fe284ac6dfc9783c03b5017cbe5089412947 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 30 Nov 2019 17:57:14 +0100 Subject: [PATCH] Fix #1818: Assembly-level TypeForwardedTo not displaying unresolved generics properly --- .../CSharp/Syntax/TypeSystemAstBuilder.cs | 44 +++++++++++-------- .../TypeSystem/TypeSystemExtensions.cs | 2 +- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs b/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs index a4a77358d..2e0132265 100644 --- a/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs @@ -272,26 +272,32 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax return astType; } else { AstType astType; - if (type is ITypeDefinition typeDef) { - if (ShowTypeParametersForUnboundTypes) { - astType = ConvertTypeHelper(typeDef, typeDef.TypeArguments); - } else if (typeDef.TypeParameterCount > 0) { - // Unbound type - IType[] typeArguments = new IType[typeDef.TypeParameterCount]; - for (int i = 0; i < typeArguments.Length; i++) { - typeArguments[i] = SpecialType.UnboundTypeArgument; + switch (type) { + case ITypeDefinition _: + case UnknownType _: + if (type.IsUnbound()) { + if (ShowTypeParametersForUnboundTypes) { + astType = ConvertTypeHelper(type, type.TypeArguments); + } else { + 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.Instance); } - astType = ConvertTypeHelper(typeDef, typeArguments); - } else { - astType = ConvertTypeHelper(typeDef, EmptyList.Instance); - } - } else if (type is ParameterizedType pt) { - if (AlwaysUseBuiltinTypeNames && pt.IsKnownType(KnownTypeCode.NullableOfT)) { - return ConvertType(pt.TypeArguments[0]).MakeNullableType(); - } - astType = ConvertTypeHelper(pt.GenericType, pt.TypeArguments); - } else { - astType = MakeSimpleType(type.Name); + break; + case ParameterizedType pt: + if (AlwaysUseBuiltinTypeNames && pt.IsKnownType(KnownTypeCode.NullableOfT)) { + return ConvertType(pt.TypeArguments[0]).MakeNullableType(); + } + astType = ConvertTypeHelper(pt.GenericType, pt.TypeArguments); + break; + default: + astType = MakeSimpleType(type.Name); + break; } if (type.Nullability == Nullability.Nullable) { AddTypeAnnotation(astType, type.ChangeNullability(Nullability.Oblivious)); diff --git a/ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs b/ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs index c6beca5c3..dfd54c865 100644 --- a/ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs +++ b/ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs @@ -211,7 +211,7 @@ namespace ICSharpCode.Decompiler.TypeSystem { if (type == null) throw new ArgumentNullException(nameof(type)); - return type is ITypeDefinition && type.TypeParameterCount > 0; + return (type is ITypeDefinition || type is UnknownType) && type.TypeParameterCount > 0; } ///