コード例 #1
0
        private async Task <Document> FixClosuresAsync(Document document, IdentifierNameSyntax identifier, CancellationToken cancellationToken)
        {
            var sem = await document.GetSemanticModelAsync();

            var symbol = sem.GetSymbolInfo(identifier).Symbol;

            var forStatement = identifier.AncestorsAndSelf().OfType <ForStatementSyntax>().First(fss => fss.Declaration.Variables.Any(var => SymbolEqualityComparer.Default.Equals(sem.GetDeclaredSymbol(var), symbol)));

            var newIdentifier = SyntaxFactory.IdentifierName(identifier.Identifier.Text + "Closure");

            var newStatement = (StatementSyntax) new Replacer(symbol, sem, newIdentifier).Visit(forStatement.Statement);

            var body = newStatement;

            if (!body.IsKind(SyntaxKind.Block))
            {
                body = SyntaxFactory.Block(body);
            }

            var blockBody = (BlockSyntax)body;

            var closureVariableInitializer = SyntaxFactory
                                             .LocalDeclarationStatement(SyntaxFactory
                                                                        .VariableDeclaration(SyntaxFactory.IdentifierName("var"))
                                                                        .WithVariables(SyntaxFactory
                                                                                       .SingletonSeparatedList(SyntaxFactory
                                                                                                               .VariableDeclarator(newIdentifier.Identifier)
                                                                                                               .WithInitializer(SyntaxFactory
                                                                                                                                .EqualsValueClause(identifier)
                                                                                                                                )
                                                                                                               )
                                                                                       )
                                                                        )
                                             .WithAdditionalAnnotations(Microsoft.CodeAnalysis.Formatting.Formatter.Annotation);

            var newBlockBody = SyntaxFactory.Block(new[] { closureVariableInitializer }
                                                   .Concat(blockBody.Statements));

            var newForStatement = forStatement.WithStatement(newBlockBody);

            var root = await document.GetSyntaxRootAsync();

            var newRoot = root.ReplaceNode(forStatement, newForStatement);

            var newDocument = document.WithSyntaxRoot(newRoot);

            return(newDocument);
        }
コード例 #2
0
        private async Task <Document> RemoveMethodCall(Document document, IdentifierNameSyntax identifier, CancellationToken cancellationToken)
        {
            var root = await document.GetSyntaxRootAsync(cancellationToken);

            var awaitExpression = identifier.AncestorsAndSelf().OfType <AwaitExpressionSyntax>().First();
            var newExpression   =
                awaitExpression
                .Expression.Cast <InvocationExpressionSyntax>() // await fooBar.ConfigureAwait(false);
                .Expression.Cast <MemberAccessExpressionSyntax>()
                .Expression;                                    // fooBar

            // Need to remove a potential trailing new line.
            newExpression = newExpression.WithTrailingTrivia();
            var newAwaitExpression = awaitExpression.WithExpression(newExpression);
            var newRoot            = root.ReplaceNode(awaitExpression, newAwaitExpression);

            return(document.WithSyntaxRoot(newRoot));
        }