For example, I have the following documentation comment in my C # code file:
I want to REPLACE it with node
_tst.AddElement(k+5);
How to do this using C # / Roslyn? I found how to add this line, but did not find how to replace it. My code that node adds:
public static MethodDeclarationSyntax getChangedNode(MethodDeclarationSyntax method) { var newmethod = method; var TestEntryArgName = "_tst"; foreach (var s in newmethod.Body.DescendantNodes()) { SyntaxTrivia st = SyntaxFactory.SyntaxTrivia(SyntaxKind.WhitespaceTrivia, " "); bool fl = false; bool before = true; var lt = s.GetLeadingTrivia(); foreach (var triviaEntry in lt) { if (triviaEntry.Kind() == SyntaxKind.SingleLineDocumentationCommentTrivia) { fl = true; st = triviaEntry; break; } } if (!fl) { lt = s.GetTrailingTrivia(); before = false; foreach (var triviaEntry in lt) { if (triviaEntry.Kind() == SyntaxKind.SingleLineDocumentationCommentTrivia) { fl = true; st = triviaEntry; break; } } if (!fl) continue; } var commentContents = st.ToString(); char[] delim = { ' ', '\n', '\t', '\r' }; var ar = commentContents.Split(delim, StringSplitOptions.RemoveEmptyEntries); if (ar.Length != 2 || ar[0] != "add") continue; var lineToAdd = TestEntryArgName + ".AddElement(" + ar[1] + ")"; var linelist = new List<ExpressionStatementSyntax>(); linelist.Add(SyntaxFactory.ExpressionStatement(SyntaxFactory.ParseExpression(lineToAdd))); var childlist = s.Parent.ChildNodes(); foreach (var si in childlist) { if (s != si) continue; if (before) newmethod = newmethod.InsertNodesBefore(si, linelist); else newmethod = newmethod.InsertNodesAfter(si, linelist); break; } break; } return newmethod; }
I need to replace all such comments in my method. This function inserts only node and does it only once.
Change At this point, I have the following solution, but it seems too complicated and not obvious ...
public static MethodDeclarationSyntax getChangedNode(MethodDeclarationSyntax method) { var TestEntryArgName = "__tst"; var parlist = method.ChildNodes().OfType<ParameterListSyntax>().First(); var newparlist = parlist.AddParameters(SyntaxFactory.Parameter( SyntaxFactory.Identifier(TestEntryArgName)) .WithType(SyntaxFactory.ParseTypeName("Heap "))); var newmethod = method.ReplaceNode(parlist, newparlist); /* Adding __tst.AddElement(i); */ while (true) { IEnumerable<SyntaxNode> desc; bool triviaFound; desc = newmethod.Body.DescendantNodes(); triviaFound = false; foreach (var s in desc) { SyntaxTrivia st = SyntaxFactory.SyntaxTrivia(SyntaxKind.WhitespaceTrivia, " "); bool fl = false; bool before = true; var lt = s.GetLeadingTrivia(); foreach (var triviaEntry in lt) { if (triviaEntry.Kind() == SyntaxKind.SingleLineDocumentationCommentTrivia) { fl = true; st = triviaEntry; break; } } if (!fl) { lt = s.GetTrailingTrivia(); before = false; foreach (var triviaEntry in lt) { if (triviaEntry.Kind() == SyntaxKind.SingleLineDocumentationCommentTrivia) { fl = true; st = triviaEntry; break; } } if (!fl) continue; } var commentContents = st.ToString(); char[] delim = { ' ', '\n', '\t', '\r' }; var ar = commentContents.Split(delim, StringSplitOptions.RemoveEmptyEntries); if (ar.Length != 2 || ar[0] != "add") continue; var lineToAdd = TestEntryArgName + ".AddElement(" + ar[1] + ")"; var linelist = new List<ExpressionStatementSyntax>(); linelist.Add(SyntaxFactory.ExpressionStatement(SyntaxFactory.ParseExpression(lineToAdd))); var childlist = s.Parent.ChildNodes(); foreach (var si in childlist) { if (s != si) continue; if (before) newmethod = newmethod.InsertNodesBefore(si, linelist); else newmethod = newmethod.InsertNodesAfter(si, linelist); break; } var newTrvias = newmethod.DescendantTrivia().Where((t) => { if (t.Kind() != SyntaxKind.SingleLineDocumentationCommentTrivia) return false; var arr = t.ToString().Split(delim, StringSplitOptions.RemoveEmptyEntries); return arr.Length == 2 && arr[0] == "add"; }); newmethod = newmethod.ReplaceTrivia(newTrvias.First(), SyntaxFactory.SyntaxTrivia(SyntaxKind.WhitespaceTrivia, " ")); triviaFound = true; break; } if (!triviaFound) break; } return newmethod; }
source share