private static void ReformatStatement(IndentationSettings indentationSettings, StatementSyntax statement, Dictionary <SyntaxToken, SyntaxToken> tokenReplaceMap) { var indentationLevel = DetermineIndentationLevel(indentationSettings, tokenReplaceMap, statement); // use one additional step of indentation for lambdas / anonymous methods switch (statement.Parent.Kind()) { case SyntaxKind.AnonymousMethodExpression: case SyntaxKind.SimpleLambdaExpression: case SyntaxKind.ParenthesizedLambdaExpression: indentationLevel++; break; } var statementIndentationTrivia = IndentationHelper.GenerateWhitespaceTrivia(indentationSettings, indentationLevel + 1); var newFirstTokenLeadingTrivia = statement.GetFirstToken().LeadingTrivia .WithoutTrailingWhitespace() .Add(statementIndentationTrivia); var newLastTokenTrailingTrivia = statement.GetLastToken().TrailingTrivia .WithoutTrailingWhitespace() .Add(SyntaxFactory.CarriageReturnLineFeed); AddToReplaceMap(tokenReplaceMap, statement.GetFirstToken(), statement.GetFirstToken().WithLeadingTrivia(newFirstTokenLeadingTrivia)); AddToReplaceMap(tokenReplaceMap, statement.GetLastToken(), statement.GetLastToken().WithTrailingTrivia(newLastTokenTrailingTrivia)); }
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()); }
/// <summary> /// Move <paramref name="toMove"></paramref> before <paramref name="statement">.</paramref>. /// </summary> /// <param name="editor">The <see cref="DocumentEditor"/>.</param> /// <param name="toMove">The <see cref="StatementSyntax"/> to move.</param> /// <param name="statement">The <see cref="StatementSyntax"/>.</param> /// <returns>The <see cref="DocumentEditor"/> that was passed in.</returns> public static DocumentEditor MoveAfter(this DocumentEditor editor, StatementSyntax toMove, StatementSyntax statement) { if (editor is null) { throw new ArgumentNullException(nameof(editor)); } if (toMove is null) { throw new ArgumentNullException(nameof(toMove)); } if (statement is null) { throw new ArgumentNullException(nameof(statement)); } editor.RemoveNode(toMove); editor.InsertAfter(statement, ToMove()); return(editor); StatementSyntax ToMove() { if (statement.GetLastToken().IsKind(SyntaxKind.CloseBraceToken)) { return(toMove.WithLeadingLineFeed()); } return(toMove); } }
private static StatementSyntax ReformatStatement(Document document, StatementSyntax statement) { var indentationOptions = IndentationOptions.FromDocument(document); var parentIndentationLevel = IndentationHelper.GetIndentationSteps(indentationOptions, GetStatementParent(statement.Parent)); // use one additional step of indentation for lambdas / anonymous methods switch (statement.Parent.Kind()) { case SyntaxKind.AnonymousMethodExpression: case SyntaxKind.SimpleLambdaExpression: case SyntaxKind.ParenthesizedLambdaExpression: parentIndentationLevel++; break; } var statementIndentationString = IndentationHelper.GenerateIndentationString(indentationOptions, parentIndentationLevel + 1); var newFirstTokenLeadingTrivia = statement.GetFirstToken().LeadingTrivia .WithoutTrailingWhitespace() .Add(SyntaxFactory.Whitespace(statementIndentationString)); var newLastTokenTrailingTrivia = statement.GetLastToken().TrailingTrivia .WithoutTrailingWhitespace() .Add(SyntaxFactory.CarriageReturnLineFeed); var firstToken = statement.GetFirstToken().WithLeadingTrivia(newFirstTokenLeadingTrivia); var lastToken = statement.GetLastToken().WithTrailingTrivia(newLastTokenTrailingTrivia); return(statement.ReplaceTokens( new[] { statement.GetFirstToken(), statement.GetLastToken() }, (originalToken, rewrittenToken) => { if (originalToken == statement.GetFirstToken()) { return firstToken; } else if (originalToken == statement.GetLastToken()) { return lastToken; } else { return rewrittenToken; } })); }
private static void ReformatStatementAndSurroundings(StatementSyntax statement, IndentationSettings indentationSettings, Dictionary <SyntaxToken, SyntaxToken> tokenReplaceMap) { var block = statement as BlockSyntax; var previousToken = statement.GetFirstToken().GetPreviousToken(); var previousTokenEndLine = previousToken.GetEndLine(); var statementStartLine = statement.GetFirstToken().GetLine(); if (previousTokenEndLine == statementStartLine) { var newTrailingTrivia = previousToken.TrailingTrivia .WithoutTrailingWhitespace() .Add(SyntaxFactory.CarriageReturnLineFeed); AddToReplaceMap(tokenReplaceMap, previousToken, previousToken.WithTrailingTrivia(newTrailingTrivia)); } if (block != null) { ReformatBlock(indentationSettings, block, tokenReplaceMap); } else { ReformatStatement(indentationSettings, statement, tokenReplaceMap); } var nextToken = statement.GetLastToken().GetNextToken(); if ((block != null) && nextToken.IsKind(SyntaxKind.SemicolonToken)) { // skip trailing semicolon tokens for blocks nextToken = nextToken.GetNextToken(); } var nextTokenStartLine = nextToken.GetLine(); var statementEndLine = statement.GetLastToken().GetEndLine(); if (nextTokenStartLine == statementEndLine) { var indentationLevel = DetermineIndentationLevel(indentationSettings, tokenReplaceMap, statement); var indentationTrivia = IndentationHelper.GenerateWhitespaceTrivia(indentationSettings, indentationLevel); AddToReplaceMap(tokenReplaceMap, nextToken, nextToken.WithLeadingTrivia(indentationTrivia)); } }
public static StatementSyntax GetNextStatement(this StatementSyntax statement) { if (statement != null) { var nextToken = statement.GetLastToken().GetNextToken(); return(nextToken.GetAncestors <StatementSyntax>().FirstOrDefault(s => s.Parent == statement.Parent || AreInSiblingTopLevelStatements(s, statement))); } return(null);
private void AddEmbeddedStatementsIndentationOperation(List <IndentBlockOperation> list, StatementSyntax statement) { var firstToken = statement.GetFirstToken(includeZeroWidth: true); var lastToken = statement.GetLastToken(includeZeroWidth: true); if (lastToken.IsMissing) { // embedded statement is not done, consider following as part of embedded statement AddIndentBlockOperation(list, firstToken, lastToken); } else { // embedded statement is done AddIndentBlockOperation(list, firstToken, lastToken, TextSpan.FromBounds(firstToken.FullSpan.Start, lastToken.FullSpan.End)); } }
private static bool IsLastTokenMissing(StatementSyntax previousStatement) { return previousStatement.GetLastToken(includeZeroWidth: true, includeSkipped: true).IsMissing; }
private static bool IsLastTokenMissing(StatementSyntax previousStatement) { return(previousStatement.GetLastToken(includeZeroWidth: true, includeSkipped: true).IsMissing); }
private void AddEmbeddedStatementsIndentationOperation(List<IndentBlockOperation> list, StatementSyntax statement) { var firstToken = statement.GetFirstToken(includeZeroWidth: true); var lastToken = statement.GetLastToken(includeZeroWidth: true); if (lastToken.IsMissing) { // embedded statement is not done, consider following as part of embedded statement AddIndentBlockOperation(list, firstToken, lastToken); } else { // embedded statement is done AddIndentBlockOperation(list, firstToken, lastToken, TextSpan.FromBounds(firstToken.FullSpan.Start, lastToken.FullSpan.End)); } }
private static StatementSyntax ReformatStatement(Document document, StatementSyntax statement) { var indentationOptions = IndentationOptions.FromDocument(document); var parentIndentationLevel = IndentationHelper.GetIndentationSteps(indentationOptions, GetStatementParent(statement.Parent)); // use one additional step of indentation for lambdas / anonymous methods switch (statement.Parent.Kind()) { case SyntaxKind.AnonymousMethodExpression: case SyntaxKind.SimpleLambdaExpression: case SyntaxKind.ParenthesizedLambdaExpression: parentIndentationLevel++; break; } var statementIndentationString = IndentationHelper.GenerateIndentationString(indentationOptions, parentIndentationLevel + 1); var newFirstTokenLeadingTrivia = statement.GetFirstToken().LeadingTrivia .WithoutTrailingWhitespace() .Add(SyntaxFactory.Whitespace(statementIndentationString)); var newLastTokenTrailingTrivia = statement.GetLastToken().TrailingTrivia .WithoutTrailingWhitespace() .Add(SyntaxFactory.CarriageReturnLineFeed); var firstToken = statement.GetFirstToken().WithLeadingTrivia(newFirstTokenLeadingTrivia); var lastToken = statement.GetLastToken().WithTrailingTrivia(newLastTokenTrailingTrivia); return statement.ReplaceTokens( new[] { statement.GetFirstToken(), statement.GetLastToken() }, (originalToken, rewrittenToken) => { if (originalToken == statement.GetFirstToken()) { return firstToken; } else if (originalToken == statement.GetLastToken()) { return lastToken; } else { return rewrittenToken; } }); }
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(); }