diff --git a/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs b/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs index 7d6bcf1094..8081c1d339 100644 --- a/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs +++ b/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs @@ -2869,40 +2869,56 @@ namespace ICSharpCode.NRefactory.CSharp CompilerArguments = args; } - public static void InsertComment (AstNode node, Comment comment) + static AstNode GetOuterLeft (AstNode node) { - if (node.EndLocation < comment.StartLocation) { - node.AddChild (comment, AstNode.Roles.Comment); - return; - } - - foreach (var child in node.Children) { - if (child.StartLocation < comment.StartLocation && comment.StartLocation < child.EndLocation) { - InsertComment (child, comment); - return; - } - if (comment.StartLocation < child.StartLocation) { - node.InsertChildBefore (child, comment, AstNode.Roles.Comment); - return; - } - } - - node.AddChild (comment, AstNode.Roles.Comment); + var outerLeft = node; + while (outerLeft.FirstChild != null) + outerLeft = outerLeft.FirstChild; + return outerLeft; + } + + static AstNode NextLeaf (AstNode node) + { + if (node == null) + return null; + var next = node.NextSibling; + if (next == null) + return node.Parent; + return GetOuterLeft(next); } static void InsertComments (CompilerCompilationUnit top, ConversionVisitor conversionVisitor) { + var leaf = GetOuterLeft(conversionVisitor.Unit); + foreach (var special in top.SpecialsBag.Specials) { var comment = special as SpecialsBag.Comment; - - if (comment != null) { - var type = (CommentType)comment.CommentType; - var start = new AstLocation (comment.Line, comment.Col); - var end = new AstLocation (comment.EndLine, comment.EndCol); - var domComment = new Comment (type, start, end); - domComment.StartsLine = comment.StartsLine; - domComment.Content = comment.Content; - InsertComment (conversionVisitor.Unit, domComment); + if (comment == null) + continue; + + var type = (CommentType)comment.CommentType; + var start = new AstLocation (comment.Line, comment.Col); + var end = new AstLocation (comment.EndLine, comment.EndCol); + var domComment = new Comment (type, start, end); + domComment.StartsLine = comment.StartsLine; + domComment.Content = comment.Content; + + while (true) { + var nextLeaf = NextLeaf(leaf); + // instert comment at the end + if (nextLeaf == null) { + leaf.Parent.AddChild(domComment, AstNode.Roles.Comment); + leaf = domComment; + break; + } + + // comment is between 2 nodes + if (leaf.EndLocation <= domComment.StartLocation && domComment.StartLocation <= nextLeaf.StartLocation) { + leaf.Parent.InsertChildAfter(leaf, domComment, AstNode.Roles.Comment); + leaf = domComment; + break; + } + leaf = nextLeaf; } } }