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); }
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)); }