Browse Source

Fix lingering additional documentation after field/ctor removal.

pull/863/head
Siegfried Pammer 8 years ago
parent
commit
b035f2cbf6
  1. 10
      ICSharpCode.Decompiler/CSharp/Transforms/AddXmlDocumentationTransform.cs
  2. 59
      ILSpy/Languages/CSharpLanguage.cs

10
ICSharpCode.Decompiler/CSharp/Transforms/AddXmlDocumentationTransform.cs

@ -58,7 +58,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
} }
} }
} catch (XmlException ex) { } 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; var insertionPoint = rootNode.FirstChild;
for (int i = 0; i < msg.Length; i++) for (int i = 0; i < msg.Length; i++)
rootNode.InsertChildBefore(insertionPoint, new Comment(msg[i], CommentType.Documentation), Roles.Comment); rootNode.InsertChildBefore(insertionPoint, new Comment(msg[i], CommentType.Documentation), Roles.Comment);
@ -83,12 +83,16 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
skippedWhitespaceLines++; skippedWhitespaceLines++;
} else { } else {
while (skippedWhitespaceLines > 0) { 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--; skippedWhitespaceLines--;
} }
if (line.StartsWith(indentation, StringComparison.Ordinal)) if (line.StartsWith(indentation, StringComparison.Ordinal))
line = line.Substring(indentation.Length); 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(); line = r.ReadLine();
} }

59
ILSpy/Languages/CSharpLanguage.cs

@ -118,6 +118,7 @@ namespace ICSharpCode.ILSpy
class SelectCtorTransform : IAstTransform class SelectCtorTransform : IAstTransform
{ {
readonly IMethod ctor; readonly IMethod ctor;
readonly HashSet<ISymbol> removedSymbols = new HashSet<ISymbol>();
public SelectCtorTransform(IMethod ctor) public SelectCtorTransform(IMethod ctor)
{ {
@ -128,25 +129,39 @@ namespace ICSharpCode.ILSpy
{ {
ConstructorDeclaration ctorDecl = null; ConstructorDeclaration ctorDecl = null;
foreach (var node in rootNode.Children) { foreach (var node in rootNode.Children) {
ConstructorDeclaration ctor = node as ConstructorDeclaration; switch (node) {
if (ctor != null) { case ConstructorDeclaration ctor:
if (ctor.GetSymbol() == this.ctor) { if (ctor.GetSymbol() == this.ctor) {
ctorDecl = ctor; ctorDecl = ctor;
} else { } else {
// remove other ctors // remove other ctors
ctor.Remove(); 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) { if (ctorDecl?.Initializer.ConstructorInitializerType == ConstructorInitializerType.This) {
// remove all fields // remove all fields
foreach (var node in rootNode.Children) foreach (var node in rootNode.Children) {
if (node is FieldDeclaration) switch (node) {
node.Remove(); 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) public void Run(AstNode rootNode, TransformContext context)
{ {
foreach (var child in rootNode.Children) { foreach (var node in rootNode.Children) {
if (child is EntityDeclaration) { switch (node) {
if (child.GetSymbol() != field) case EntityDeclaration ed:
child.Remove(); if (node.GetSymbol() != field)
node.Remove();
break;
case Comment c:
if (c.GetSymbol() != field)
node.Remove();
break;
} }
} }
} }

Loading…
Cancel
Save