private SyntaxRemoveOptions CreateSyntaxRemoveOptions(TLocalDeclarationStatement localDeclaration, ISyntaxFactsService syntaxFacts) { var removeOptions = SyntaxGenerator.DefaultRemoveOptions; if (localDeclaration != null) { if (localDeclaration.GetLeadingTrivia().Contains(t => t.IsDirective)) { removeOptions |= SyntaxRemoveOptions.KeepLeadingTrivia; } else { var statementParent = localDeclaration.Parent; if (syntaxFacts.IsExecutableBlock(statementParent)) { var siblings = syntaxFacts.GetExecutableBlockStatements(statementParent); var localDeclarationIndex = siblings.IndexOf(localDeclaration); if (localDeclarationIndex != 0) { // if we're removing the first statement in a block, then we // want to have the elastic marker on it so that the next statement // properly formats with the space left behind. But if it's // not the first statement then just keep the trivia as is // so that the statement before and after it stay appropriately // spaced apart. removeOptions &= ~SyntaxRemoveOptions.AddElasticMarker; } } } } return(removeOptions); }
protected static IReadOnlyList <SyntaxNode> WalkDownScopeBlocks( ISyntaxFactsService syntaxFacts, IReadOnlyList <SyntaxNode> statements) { // If our statements only contain a single block, walk down the block and any subsequent nested blocks // to get the real statements inside. while (statements.Count == 1 && syntaxFacts.IsScopeBlock(statements[0])) { statements = syntaxFacts.GetExecutableBlockStatements(statements[0]); } return(statements); }
private static bool TryGetSiblingStatement( ISyntaxFactsService syntaxFacts, SyntaxNode ifOrElseIf, int relativeIndex, out SyntaxNode statement) { if (syntaxFacts.IsExecutableStatement(ifOrElseIf) && syntaxFacts.IsExecutableBlock(ifOrElseIf.Parent)) { var blockStatements = syntaxFacts.GetExecutableBlockStatements(ifOrElseIf.Parent); statement = blockStatements.ElementAtOrDefault(blockStatements.IndexOf(ifOrElseIf) + relativeIndex); return(statement != null); } statement = null; return(false); }
protected static IReadOnlyList <SyntaxNode> WalkUpScopeBlocks( ISyntaxFactsService syntaxFacts, IReadOnlyList <SyntaxNode> statements) { // If our statements are inside a block, walk up the block and any subsequent nested blocks that contain // no other statements to get the topmost block. The last check is necessary to make sure we stop // walking upwards if there are other statements next to our current block: // { // { // <original statements> // } // AnotherStatement(); // } while (statements.Count > 0 && statements[0].Parent is var parent && syntaxFacts.IsScopeBlock(parent) && syntaxFacts.GetExecutableBlockStatements(parent).Count == statements.Count) { statements = ImmutableArray.Create(parent); } return(statements); }