protected override bool TryMatchPattern( IConditionalOperation ifOperation, ISymbol containingSymbol ) => UseConditionalExpressionForReturnHelpers.TryMatchPattern( GetSyntaxFacts(), ifOperation, containingSymbol, out _, out _, out _, out _ );
protected override async Task FixOneAsync( Document document, Diagnostic diagnostic, SyntaxEditor editor, CodeActionOptionsProvider fallbackOptions, CancellationToken cancellationToken) { var syntaxFacts = document.GetRequiredLanguageService <ISyntaxFactsService>(); var ifStatement = (TIfStatementSyntax)diagnostic.AdditionalLocations[0].FindNode(cancellationToken); var semanticModel = await document.GetRequiredSemanticModelAsync(cancellationToken).ConfigureAwait(false); var ifOperation = (IConditionalOperation)semanticModel.GetOperation(ifStatement, cancellationToken) !; var containingSymbol = semanticModel.GetRequiredEnclosingSymbol(ifStatement.SpanStart, cancellationToken); if (!UseConditionalExpressionForReturnHelpers.TryMatchPattern( syntaxFacts, ifOperation, containingSymbol, out var trueStatement, out var falseStatement, out var trueReturn, out var falseReturn)) { return; } var anyReturn = (trueReturn ?? falseReturn) !; var conditionalExpression = await CreateConditionalExpressionAsync( document, ifOperation, trueStatement, falseStatement, trueReturn?.ReturnedValue ?? trueStatement, falseReturn?.ReturnedValue ?? falseStatement, anyReturn.GetRefKind(containingSymbol) != RefKind.None, fallbackOptions, cancellationToken).ConfigureAwait(false); var generatorInternal = document.GetRequiredLanguageService <SyntaxGeneratorInternal>(); var returnStatement = anyReturn.Kind == OperationKind.YieldReturn ? (TStatementSyntax)generatorInternal.YieldReturnStatement(conditionalExpression) : (TStatementSyntax)editor.Generator.ReturnStatement(conditionalExpression); returnStatement = returnStatement.WithTriviaFrom(ifStatement); editor.ReplaceNode( ifStatement, WrapWithBlockIfAppropriate(ifStatement, returnStatement)); // if the if-statement had no 'else' clause, then we were using the following statement // as the 'false' statement. If so, remove it explicitly. if (ifOperation.WhenFalse == null) { editor.RemoveNode(falseStatement.Syntax, GetRemoveOptions(syntaxFacts, falseStatement.Syntax)); } }
protected override async Task FixOneAsync( Document document, Diagnostic diagnostic, SyntaxEditor editor, CancellationToken cancellationToken) { var syntaxFacts = document.GetLanguageService <ISyntaxFactsService>(); var ifStatement = (TIfStatementSyntax)diagnostic.AdditionalLocations[0].FindNode(cancellationToken); var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); var ifOperation = (IConditionalOperation)semanticModel.GetOperation(ifStatement); if (!UseConditionalExpressionForReturnHelpers.TryMatchPattern( syntaxFacts, ifOperation, out var trueReturn, out var falseReturn)) { return; } var conditionalExpression = await CreateConditionalExpressionAsync( document, ifOperation, trueReturn, falseReturn, trueReturn.ReturnedValue, falseReturn.ReturnedValue, IsRef(trueReturn), cancellationToken).ConfigureAwait(false); var returnStatement = trueReturn.Kind == OperationKind.YieldReturn ? (TStatementSyntax)editor.Generator.YieldReturnStatement(conditionalExpression) : (TStatementSyntax)editor.Generator.ReturnStatement(conditionalExpression); returnStatement = returnStatement.WithTriviaFrom(ifStatement); editor.ReplaceNode( ifStatement, WrapWithBlockIfAppropriate(ifStatement, returnStatement)); // if the if-statement had no 'else' clause, then we were using the following statement // as the 'false' statement. If so, remove it explicitly. if (ifOperation.WhenFalse == null) { editor.RemoveNode(falseReturn.Syntax, GetRemoveOptions(syntaxFacts, falseReturn.Syntax)); } }
protected override bool TryMatchPattern(IConditionalOperation ifOperation) => UseConditionalExpressionForReturnHelpers.TryMatchPattern( GetSyntaxFactsService(), ifOperation, out _, out _);