diff --git a/ICSharpCode.Decompiler/Ast/AstBuilder.cs b/ICSharpCode.Decompiler/Ast/AstBuilder.cs index 3e2fd1ce3..736a76d1c 100644 --- a/ICSharpCode.Decompiler/Ast/AstBuilder.cs +++ b/ICSharpCode.Decompiler/Ast/AstBuilder.cs @@ -155,8 +155,11 @@ namespace Decompiler astType.ClassType = ClassType.Class; } - astType.TypeParameters.AddRange(MakeTypeParameters(typeDef.GenericParameters)); - astType.Constraints.AddRange(MakeConstraints(typeDef.GenericParameters)); + IEnumerable genericParameters = typeDef.GenericParameters; + if (typeDef.DeclaringType != null && typeDef.DeclaringType.HasGenericParameters) + genericParameters = genericParameters.Skip(typeDef.DeclaringType.GenericParameters.Count); + astType.TypeParameters.AddRange(MakeTypeParameters(genericParameters)); + astType.Constraints.AddRange(MakeConstraints(genericParameters)); // Nested types foreach(TypeDefinition nestedTypeDef in typeDef.NestedTypes) { @@ -548,10 +551,13 @@ namespace Decompiler if (gp.HasNotNullableValueTypeConstraint) c.BaseTypes.Add(new PrimitiveType("struct")); - foreach (var constraintType in gp.Constraints) + foreach (var constraintType in gp.Constraints) { + if (gp.HasNotNullableValueTypeConstraint && constraintType.FullName == "System.ValueType") + continue; c.BaseTypes.Add(ConvertType(constraintType)); + } - if (gp.HasDefaultConstructorConstraint) + if (gp.HasDefaultConstructorConstraint && !gp.HasNotNullableValueTypeConstraint) c.BaseTypes.Add(new PrimitiveType("new")); // new() must be last if (c.BaseTypes.Any()) yield return c; diff --git a/ICSharpCode.Decompiler/Tests/Generics.cs b/ICSharpCode.Decompiler/Tests/Generics.cs index 3666d0d95..26b5c783d 100644 --- a/ICSharpCode.Decompiler/Tests/Generics.cs +++ b/ICSharpCode.Decompiler/Tests/Generics.cs @@ -6,8 +6,14 @@ using System.Collections.Generic; public static class Generics { - class MyArray + public class MyArray { + public class NestedClass + { + public T Item1; + public Y Item2; + } + private T[] arr; public MyArray(int capacity) @@ -33,8 +39,13 @@ public static class Generics { } - public static Dictionary.KeyCollection.Enumerator GetEnumerator(Dictionary d) + public static void MethodWithStructConstraint() where T : struct + { + } + + public static Dictionary.KeyCollection.Enumerator GetEnumerator(Dictionary d, MyArray.NestedClass nc) { + // Tests references to inner classes in generic classes return d.Keys.GetEnumerator(); } }