From b161b7e94797215c110d33bc0e49e5d9d81b5751 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 11 Mar 2011 16:53:00 +0100 Subject: [PATCH] Fix conversion of field initializers when there are constructors that call 'this..ctor(...);' --- .../ConvertConstructorCallIntoInitializer.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ICSharpCode.Decompiler/Ast/Transforms/ConvertConstructorCallIntoInitializer.cs b/ICSharpCode.Decompiler/Ast/Transforms/ConvertConstructorCallIntoInitializer.cs index daf9d868e..ec88a2699 100644 --- a/ICSharpCode.Decompiler/Ast/Transforms/ConvertConstructorCallIntoInitializer.cs +++ b/ICSharpCode.Decompiler/Ast/Transforms/ConvertConstructorCallIntoInitializer.cs @@ -50,15 +50,18 @@ namespace ICSharpCode.Decompiler.Ast.Transforms } }; + static readonly AstNode thisCallPattern = new ExpressionStatement(new ThisReferenceExpression().Invoke(".ctor", new Repeat(new AnyNode()))); + public override object VisitTypeDeclaration(TypeDeclaration typeDeclaration, object data) { var instanceCtors = typeDeclaration.Members.OfType().Where(c => (c.Modifiers & Modifiers.Static) == 0).ToArray(); - if (instanceCtors.Length > 0 && typeDeclaration.ClassType == NRefactory.TypeSystem.ClassType.Class) { + var instanceCtorsNotChainingWithThis = instanceCtors.Where(ctor => thisCallPattern.Match(ctor.Body.Statements.FirstOrDefault()) == null).ToArray(); + if (instanceCtorsNotChainingWithThis.Length > 0 && typeDeclaration.ClassType == NRefactory.TypeSystem.ClassType.Class) { // Recognize field initializers: // Convert first statement in all ctors (if all ctors have the same statement) into a field initializer. bool allSame; do { - Match m = fieldInitializerPattern.Match(instanceCtors[0].Body.FirstOrDefault()); + Match m = fieldInitializerPattern.Match(instanceCtorsNotChainingWithThis[0].Body.FirstOrDefault()); if (m == null) break; @@ -70,12 +73,12 @@ namespace ICSharpCode.Decompiler.Ast.Transforms break; allSame = true; - for (int i = 1; i < instanceCtors.Length; i++) { - if (instanceCtors[0].Body.First().Match(instanceCtors[i].Body.FirstOrDefault()) == null) + for (int i = 1; i < instanceCtorsNotChainingWithThis.Length; i++) { + if (instanceCtors[0].Body.First().Match(instanceCtorsNotChainingWithThis[i].Body.FirstOrDefault()) == null) allSame = false; } if (allSame) { - foreach (var ctor in instanceCtors) + foreach (var ctor in instanceCtorsNotChainingWithThis) ctor.Body.First().Remove(); fieldOrEventDecl.GetChildrenByRole(AstNode.Roles.Variable).Single().Initializer = m.Get("initializer").Single().Detach(); }