private static SyntaxNode GetRootWithAnnotatedElements(SyntaxNode root, Dictionary<SyntaxNodeOrToken, Diagnostic> elementDiagnosticPairs, BidirectionalDictionary<Diagnostic, SyntaxAnnotation> diagnosticAnnotationPairs) { var nodes = elementDiagnosticPairs.Keys.Where(k => k.IsNode).Select(k => k.AsNode()); var tokens = elementDiagnosticPairs.Keys.Where(k => k.IsToken).Select(k => k.AsToken()); return root.ReplaceSyntax( nodes, (original, rewritten) => { var annotation = diagnosticAnnotationPairs.GetByA(elementDiagnosticPairs[original]); return rewritten.WithAdditionalAnnotations(annotation); }, tokens, (original, rewritten) => { var annotation = diagnosticAnnotationPairs.GetByA(elementDiagnosticPairs[original]); return rewritten.WithAdditionalAnnotations(annotation); }, null, null); }
private static SyntaxNode ReformatStatementAndParent(Document document, SyntaxNode syntaxRoot, StatementSyntax statement) { var parentLastToken = statement.GetFirstToken().GetPreviousToken(); var parentEndLine = parentLastToken.GetEndLine(); var statementStartLine = statement.GetFirstToken().GetLine(); var newParentLastToken = parentLastToken; if (parentEndLine == statementStartLine) { var newTrailingTrivia = parentLastToken.TrailingTrivia .WithoutTrailingWhitespace() .Add(SyntaxFactory.CarriageReturnLineFeed); newParentLastToken = newParentLastToken.WithTrailingTrivia(newTrailingTrivia); } var parentNextToken = statement.GetLastToken().GetNextToken(); var nextTokenLine = parentNextToken.GetLine(); var statementCloseLine = statement.GetLastToken().GetEndLine(); var newParentNextToken = parentNextToken; if (nextTokenLine == statementCloseLine) { var indentationOptions = IndentationOptions.FromDocument(document); var parentIndentationLevel = IndentationHelper.GetIndentationSteps(indentationOptions, GetStatementParent(statement.Parent)); var indentationString = IndentationHelper.GenerateIndentationString(indentationOptions, parentIndentationLevel); newParentNextToken = newParentNextToken.WithLeadingTrivia(SyntaxFactory.Whitespace(indentationString)); } var newStatement = ReformatStatement(document, statement); var newSyntaxRoot = syntaxRoot.ReplaceSyntax( new[] { statement }, (originalNode, rewrittenNode) => originalNode == statement ? newStatement : rewrittenNode, new[] { parentLastToken, parentNextToken }, (originalToken, rewrittenToken) => { if (originalToken == parentLastToken) { return newParentLastToken; } else if (originalToken == parentNextToken) { return newParentNextToken; } else { return rewrittenToken; } }, Enumerable.Empty<SyntaxTrivia>(), (originalTrivia, rewrittenTrivia) => rewrittenTrivia); return newSyntaxRoot.WithoutFormatting(); }