From b035f2cbf6cb9f7b8a2476f3fbf2b53075165bb9 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 15 Sep 2017 09:59:49 +0200 Subject: [PATCH] Fix lingering additional documentation after field/ctor removal. --- .../AddXmlDocumentationTransform.cs | 10 +++- ILSpy/Languages/CSharpLanguage.cs | 59 +++++++++++++------ 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/AddXmlDocumentationTransform.cs b/ICSharpCode.Decompiler/CSharp/Transforms/AddXmlDocumentationTransform.cs index 0115e0afc..5b12d3080 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/AddXmlDocumentationTransform.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/AddXmlDocumentationTransform.cs @@ -58,7 +58,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms } } } catch (XmlException ex) { - string[] msg = (" Exception while reading XmlDoc: " + ex.ToString()).Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + string[] msg = (" Exception while reading XmlDoc: " + ex).Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); var insertionPoint = rootNode.FirstChild; for (int i = 0; i < msg.Length; i++) rootNode.InsertChildBefore(insertionPoint, new Comment(msg[i], CommentType.Documentation), Roles.Comment); @@ -83,12 +83,16 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms skippedWhitespaceLines++; } else { while (skippedWhitespaceLines > 0) { - node.Parent.InsertChildBefore(node, new Comment(string.Empty, CommentType.Documentation), Roles.Comment); + Comment emptyLine = new Comment(string.Empty, CommentType.Documentation); + emptyLine.AddAnnotation(node.GetResolveResult()); + node.Parent.InsertChildBefore(node, emptyLine, Roles.Comment); skippedWhitespaceLines--; } if (line.StartsWith(indentation, StringComparison.Ordinal)) line = line.Substring(indentation.Length); - node.Parent.InsertChildBefore(node, new Comment(" " + line, CommentType.Documentation), Roles.Comment); + Comment comment = new Comment(" " + line, CommentType.Documentation); + comment.AddAnnotation(node.GetResolveResult()); + node.Parent.InsertChildBefore(node, comment, Roles.Comment); } line = r.ReadLine(); } diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs index c74c22302..df161baef 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -118,6 +118,7 @@ namespace ICSharpCode.ILSpy class SelectCtorTransform : IAstTransform { readonly IMethod ctor; + readonly HashSet removedSymbols = new HashSet(); public SelectCtorTransform(IMethod ctor) { @@ -128,25 +129,39 @@ namespace ICSharpCode.ILSpy { ConstructorDeclaration ctorDecl = null; foreach (var node in rootNode.Children) { - ConstructorDeclaration ctor = node as ConstructorDeclaration; - if (ctor != null) { - if (ctor.GetSymbol() == this.ctor) { - ctorDecl = ctor; - } else { - // remove other ctors - ctor.Remove(); - } + switch (node) { + case ConstructorDeclaration ctor: + if (ctor.GetSymbol() == this.ctor) { + ctorDecl = ctor; + } else { + // remove other ctors + ctor.Remove(); + removedSymbols.Add(ctor.GetSymbol()); + } + break; + case FieldDeclaration fd: + // Remove any fields without initializers + if (fd.Variables.All(v => v.Initializer.IsNull)) { + fd.Remove(); + removedSymbols.Add(fd.GetSymbol()); + } + break; } - // Remove any fields without initializers - FieldDeclaration fd = node as FieldDeclaration; - if (fd != null && fd.Variables.All(v => v.Initializer.IsNull)) - fd.Remove(); } if (ctorDecl?.Initializer.ConstructorInitializerType == ConstructorInitializerType.This) { // remove all fields - foreach (var node in rootNode.Children) - if (node is FieldDeclaration) - node.Remove(); + foreach (var node in rootNode.Children) { + switch (node) { + case FieldDeclaration fd: + fd.Remove(); + removedSymbols.Add(fd.GetSymbol()); + break; + } + } + } + foreach (var node in rootNode.Children) { + if (node is Comment && removedSymbols.Contains(node.GetSymbol())) + node.Remove(); } } } @@ -202,10 +217,16 @@ namespace ICSharpCode.ILSpy public void Run(AstNode rootNode, TransformContext context) { - foreach (var child in rootNode.Children) { - if (child is EntityDeclaration) { - if (child.GetSymbol() != field) - child.Remove(); + foreach (var node in rootNode.Children) { + switch (node) { + case EntityDeclaration ed: + if (node.GetSymbol() != field) + node.Remove(); + break; + case Comment c: + if (c.GetSymbol() != field) + node.Remove(); + break; } } }