From ec86ba2dad62e982b81a768fc24cd1267b82ca1e Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 23 Mar 2018 22:12:12 +0100 Subject: [PATCH] Fix some bugs introduced by nested type lazy-loading. --- .../CSharp/ExpressionBuilder.cs | 2 +- .../TypeSystem/CecilLoader.cs | 37 ++++++++++--------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index adc19a08d..d5e141cd8 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -1311,7 +1311,7 @@ namespace ICSharpCode.Decompiler.CSharp // A = inputType.GetSize() // B = inputStackType.GetSize() // C = inst.TargetType.GetSize(). - // We know that C <= B (otherwise this wouldn't be the truncation case). + // We know that C < B (otherwise this wouldn't be the truncation case). // 1) If C < B < A, we just combine the two truncations into one. // 2) If C < B = A, there's no input conversion, just the truncation // 3) If C <= A < B, all the extended bits get removed again by the truncation. diff --git a/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs b/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs index 99252ed06..901bea2fd 100644 --- a/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs +++ b/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs @@ -967,14 +967,6 @@ namespace ICSharpCode.Decompiler.TypeSystem { if (!typeDefinition.HasNestedTypes) return; - if (LazyLoad) { - foreach (TypeDefinition nestedTypeDef in typeDefinition.NestedTypes) { - var nestedTd = new LazyCecilTypeDefinition(this, nestedTypeDef, declaringTypeDefinition); - nestedTypes.Add(nestedTd); - RegisterCecilObject(nestedTd, nestedTypeDef); - } - return; - } foreach (TypeDefinition nestedTypeDef in typeDefinition.NestedTypes) { TypeAttributes visibility = nestedTypeDef.Attributes & TypeAttributes.VisibilityMask; if (this.IncludeInternalMembers @@ -986,12 +978,18 @@ namespace ICSharpCode.Decompiler.TypeSystem int pos = name.LastIndexOf('/'); if (pos > 0) name = name.Substring(pos + 1); - name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(name); - var nestedType = new DefaultUnresolvedTypeDefinition(declaringTypeDefinition, name); - nestedType.MetadataToken = nestedTypeDef.MetadataToken; - InitTypeParameters(nestedTypeDef, nestedType.TypeParameters); - nestedTypes.Add(nestedType); - InitTypeDefinition(nestedTypeDef, nestedType); + if (LazyLoad) { + var nestedTd = new LazyCecilTypeDefinition(this, nestedTypeDef, declaringTypeDefinition, name); + nestedTypes.Add(nestedTd); + RegisterCecilObject(nestedTd, nestedTypeDef); + } else { + name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(name); + var nestedType = new DefaultUnresolvedTypeDefinition(declaringTypeDefinition, name); + nestedType.MetadataToken = nestedTypeDef.MetadataToken; + InitTypeParameters(nestedTypeDef, nestedType.TypeParameters); + nestedTypes.Add(nestedType); + InitTypeDefinition(nestedTypeDef, nestedType); + } } } } @@ -1167,7 +1165,7 @@ namespace ICSharpCode.Decompiler.TypeSystem IList nestedTypes; IList members; - public LazyCecilTypeDefinition(CecilLoader loader, TypeDefinition typeDefinition, IUnresolvedTypeDefinition declaringTypeDefinition = null) + public LazyCecilTypeDefinition(CecilLoader loader, TypeDefinition typeDefinition, IUnresolvedTypeDefinition declaringTypeDefinition = null, string name = null) { this.loader = loader; this.cecilTypeDef = typeDefinition; @@ -1179,7 +1177,7 @@ namespace ICSharpCode.Decompiler.TypeSystem } else { this.namespaceName = typeDefinition.Namespace; } - this.Name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(typeDefinition.Name); + this.Name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(name ?? typeDefinition.Name); var tps = new List(); InitTypeParameters(typeDefinition, tps); this.typeParameters = FreezableHelper.FreezeList(tps); @@ -1206,7 +1204,12 @@ namespace ICSharpCode.Decompiler.TypeSystem public FullTypeName FullTypeName { get { - return new TopLevelTypeName(namespaceName, this.Name, typeParameters.Count); + IUnresolvedTypeDefinition declaringTypeDef = this.DeclaringTypeDefinition; + if (declaringTypeDef != null) { + return declaringTypeDef.FullTypeName.NestedType(this.Name, typeParameters.Count - declaringTypeDef.TypeParameters.Count); + } else { + return new TopLevelTypeName(namespaceName, this.Name, typeParameters.Count); + } } }