private static SyntaxTriviaList GetLeadingTrivia(BlockSyntax block, StatementSyntax statement)
        {
            switch (statement.Kind())
            {
            case SyntaxKind.ReturnStatement:
            {
                var returnStatement = (ReturnStatementSyntax)statement;

                return(block.GetLeadingTrivia()
                       .AddRange(block.OpenBraceToken.TrailingTrivia)
                       .AddRange(returnStatement.ReturnKeyword.GetLeadingAndTrailingTrivia())
                       .AddRange(returnStatement.Expression.GetLeadingTrivia())
                       .TrimLeadingWhitespace());
            }

            case SyntaxKind.ExpressionStatement:
            {
                var expressionStatement = (ExpressionStatementSyntax)statement;

                return(block.GetLeadingTrivia()
                       .AddRange(block.OpenBraceToken.TrailingTrivia)
                       .AddRange(expressionStatement.GetLeadingTrivia())
                       .AddRange(expressionStatement.Expression.GetLeadingTrivia())
                       .TrimLeadingWhitespace());
            }
            }

            return(SyntaxTriviaList.Empty);
        }
Пример #2
0
 public override SyntaxNode VisitBlock(BlockSyntax node)
 {
     if (RemoveTestTriviaAnnotation(node.GetLeadingTrivia()))
     {
         return(null);
     }
     return(base.VisitBlock(node));
 }
Пример #3
0
        protected bool ExpandWithStatements(SyntaxList <StatementSyntax> statements, out SyntaxList <StatementSyntax> newStatements)
        {
            //check if list contains "with" syntax
            if (!statements.Where(p => (p.Kind == SyntaxKind.WithStatement)).Any())
            {
                newStatements = statements;
                return(false);
            }

            //collect new list of statements
            List <StatementSyntax> newStatementsList = new List <StatementSyntax>();

            foreach (StatementSyntax statementSyntax in statements)
            {
                if (statementSyntax.Kind == SyntaxKind.WithStatement)
                {
                    SyntaxNode newWithNode = this.Visit(statementSyntax);
                    if (newWithNode.Kind == SyntaxKind.Block)
                    {
                        BlockSyntax newWithBlock = (BlockSyntax)newWithNode;

                        if (newWithBlock.Statements.Count > 0)
                        {
                            int newStartIdx = newStatementsList.Count;
                            newStatementsList.AddRange(newWithBlock.Statements);

                            //copy leading and trailing trivia from block to the first and last block statements
                            //as they might contain important information
                            newStatementsList[newStartIdx] = newStatementsList[newStartIdx]
                                                             .WithLeadingTrivia(
                                newWithBlock.GetLeadingTrivia()
                                .AddRange(newStatementsList[newStartIdx].GetLeadingTrivia())
                                .NormalizeSyntaxTriviaList());
                            int newEndIdx = newStatementsList.Count - 1;

                            newStatementsList[newEndIdx] = newStatementsList[newEndIdx]
                                                           .WithTrailingTrivia(
                                newStatementsList[newEndIdx].GetTrailingTrivia()
                                .AddRange(newWithBlock.EndKeywordToken.LeadingTrivia)
                                .AddRange(newWithBlock.GetTrailingTrivia())
                                .NormalizeSyntaxTriviaList());
                        }
                    }
                    else
                    {
                        newStatementsList.Add((StatementSyntax)newWithNode);
                    }
                }
                else
                {
                    newStatementsList.Add(statementSyntax);
                }
            }

            newStatements = SyntaxFactory.List <StatementSyntax>(newStatementsList);
            return(true);
        }
Пример #4
0
        public static BlockSyntax RemoveUnsafeContext(UnsafeStatementSyntax unsafeStatement)
        {
            SyntaxToken keyword = unsafeStatement.UnsafeKeyword;

            BlockSyntax block = unsafeStatement.Block;

            SyntaxTriviaList leadingTrivia = keyword.LeadingTrivia
                                             .AddRange(keyword.TrailingTrivia.EmptyIfWhitespace())
                                             .AddRange(block.GetLeadingTrivia().EmptyIfWhitespace());

            return(block.WithLeadingTrivia(leadingTrivia));
        }
        public static Task <Document> RefactorAsync(
            Document document,
            BlockSyntax block,
            CancellationToken cancellationToken)
        {
            StatementSyntax statement = block
                                        .Statements[0]
                                        .TrimTrivia()
                                        .PrependToLeadingTrivia(block.GetLeadingTrivia())
                                        .AppendToTrailingTrivia(block.GetTrailingTrivia())
                                        .WithFormatterAnnotation();

            return(document.ReplaceNodeAsync(block, statement, cancellationToken));
        }
Пример #6
0
        public static Task <Document> RefactorAsync(
            Document document,
            UnsafeStatementSyntax unsafeStatement,
            CancellationToken cancellationToken)
        {
            SyntaxToken keyword = unsafeStatement.UnsafeKeyword;

            BlockSyntax block = unsafeStatement.Block;

            IEnumerable <SyntaxTrivia> leadingTrivia = keyword.LeadingTrivia
                                                       .AddRange(keyword.TrailingTrivia.EmptyIfWhitespace())
                                                       .AddRange(block.GetLeadingTrivia().EmptyIfWhitespace());

            BlockSyntax newBlock = block.WithLeadingTrivia(leadingTrivia);

            return(document.ReplaceNodeAsync(unsafeStatement, newBlock, cancellationToken));
        }
Пример #7
0
        public static Task <Document> RefactorAsync(
            Document document,
            UnsafeStatementSyntax unsafeStatement,
            SyntaxNode containingNode,
            CancellationToken cancellationToken)
        {
            SyntaxToken keyword = unsafeStatement.UnsafeKeyword;

            BlockSyntax block = unsafeStatement.Block;

            SyntaxList <StatementSyntax> statements = block.Statements;

            SyntaxNode newNode = null;

            int count = statements.Count;

            if (count == 0)
            {
                newNode = containingNode.RemoveNode(unsafeStatement);
            }
            else
            {
                StatementSyntax first = statements.First();
                StatementSyntax last  = statements.Last();

                SyntaxTriviaList leadingTrivia = keyword.LeadingTrivia
                                                 .AddRange(keyword.TrailingTrivia.EmptyIfWhitespace())
                                                 .AddRange(block.GetLeadingTrivia().EmptyIfWhitespace())
                                                 .AddRange(block.OpenBraceToken.TrailingTrivia.EmptyIfWhitespace())
                                                 .AddRange(first.GetLeadingTrivia().EmptyIfWhitespace());

                SyntaxTriviaList trailingTrivia = last.GetTrailingTrivia().EmptyIfWhitespace()
                                                  .AddRange(block.CloseBraceToken.LeadingTrivia.EmptyIfWhitespace())
                                                  .AddRange(block.GetTrailingTrivia());

                statements = statements
                             .ReplaceAt(0, first.WithLeadingTrivia(leadingTrivia))
                             .ReplaceAt(count - 1, last.WithTrailingTrivia(trailingTrivia));

                newNode = containingNode.ReplaceNode(unsafeStatement, statements.Select(f => f.WithFormatterAnnotation()));
            }

            newNode = newNode.InsertModifier(SyntaxKind.UnsafeKeyword);

            return(document.ReplaceNodeAsync(containingNode, newNode, cancellationToken));
        }
 public static BlockSyntax Trivia(this BlockSyntax node, BlockSyntax that)
 {
     return node.WithLeadingTrivia(that.GetLeadingTrivia()).WithTrailingTrivia(that.GetTrailingTrivia());
 }