public sealed override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) { Document document = context.Document; Microsoft.CodeAnalysis.Text.TextSpan textSpan = context.Span; CancellationToken cancellationToken = context.CancellationToken; SyntaxNode root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); SyntaxToken token = root.FindToken(textSpan.Start); // Only trigger if the text span is within the 'if' keyword token of an if-else statement. if (token.Kind() != SyntaxKind.IfKeyword || !token.Span.IntersectsWith(textSpan.Start) || !token.Span.IntersectsWith(textSpan.End)) { return; } if (!(token.Parent is IfStatementSyntax ifStatement) || ifStatement.Else == null) { return; } SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); if (ReturnConditionalAnalyzer.TryGetNewReturnStatement(ifStatement, semanticModel, out ReturnStatementSyntax returnStatement)) { ConvertToConditionalCodeAction action = new ConvertToConditionalCodeAction("Convert to conditional expression", (c) => Task.FromResult(ConvertToConditional(document, semanticModel, ifStatement, returnStatement, c))); context.RegisterRefactoring(action); } }
public static bool TryGetNewReturnStatement(IfStatementSyntax ifStatement, SemanticModel semanticModel, out ReturnStatementSyntax returnStatement) { returnStatement = null; ExpressionSyntax conditional = new ReturnConditionalAnalyzer(ifStatement, semanticModel).CreateConditional(); if (conditional == null) { return(false); } returnStatement = SyntaxFactory.ReturnStatement(conditional); return(true); }