private void AnalyzeConditionalExpression(SyntaxNodeAnalysisContext context) { if (GeneratedCodeAnalyzer?.IsGeneratedCode(context) == true) { return; } var conditionalExpression = (ConditionalExpressionSyntax)context.Node; if (conditionalExpression.Condition?.IsKind(SyntaxKind.ParenthesizedExpression) == false) { context.ReportDiagnostic( DiagnosticDescriptors.WrapConditionalExpressionConditionInParentheses, conditionalExpression.Condition.GetLocation()); } if (conditionalExpression.Condition?.IsMissing == false && CanBeConvertedToCoalesceExpression(conditionalExpression) && conditionalExpression .DescendantTrivia(conditionalExpression.Span) .All(f => f.IsWhitespaceOrEndOfLineTrivia())) { context.ReportDiagnostic( DiagnosticDescriptors.ReplaceConditionalExpressionWithCoalesceExpression, conditionalExpression.GetLocation()); } if (SimplifyConditionalExpressionRefactoring.CanRefactor(conditionalExpression, context.SemanticModel, context.CancellationToken) && !conditionalExpression.SpanContainsDirectives()) { context.ReportDiagnostic( DiagnosticDescriptors.SimplifyConditionalExpression, conditionalExpression.GetLocation()); } }
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { SyntaxNode root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); ConditionalExpressionSyntax conditionalExpression = root .FindNode(context.Span, getInnermostNodeForTie: true)? .FirstAncestorOrSelf <ConditionalExpressionSyntax>(); foreach (Diagnostic diagnostic in context.Diagnostics) { switch (diagnostic.Id) { case DiagnosticIdentifiers.ParenthesizeConditionInConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Wrap condition in parentheses", cancellationToken => ParenthesizeConditionInConditionalExpressionRefactoring.RefactorAsync(context.Document, conditionalExpression, cancellationToken), diagnostic.Id + EquivalenceKeySuffix); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.ReplaceConditionalExpressionWithCoalesceExpression: { CodeAction codeAction = CodeAction.Create( "Replace ?: with ??", cancellationToken => { return(ReplaceConditionalExpressionWithCoalesceExpressionRefactoring.RefactorAsync( context.Document, conditionalExpression, cancellationToken)); }, diagnostic.Id + EquivalenceKeySuffix); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.SimplifyConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Simplify conditional expression", cancellationToken => { return(SimplifyConditionalExpressionRefactoring.RefactorAsync( context.Document, conditionalExpression, cancellationToken)); }, diagnostic.Id + EquivalenceKeySuffix); context.RegisterCodeFix(codeAction, diagnostic); break; } } } }
private void AnalyzeConditionalExpression(SyntaxNodeAnalysisContext context) { var conditionalExpression = (ConditionalExpressionSyntax)context.Node; ParenthesizeConditionInConditionalExpressionRefactoring.Analyze(context, conditionalExpression); SimplifyConditionalExpressionRefactoring.Analyze(context, conditionalExpression); }
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { SyntaxNode root = await context.GetSyntaxRootAsync().ConfigureAwait(false); if (!TryFindFirstAncestorOrSelf(root, context.Span, out ConditionalExpressionSyntax conditionalExpression)) { return; } foreach (Diagnostic diagnostic in context.Diagnostics) { switch (diagnostic.Id) { case DiagnosticIdentifiers.ParenthesizeConditionInConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Wrap condition in parentheses", cancellationToken => ParenthesizeConditionInConditionalExpressionRefactoring.RefactorAsync(context.Document, conditionalExpression, cancellationToken), GetEquivalenceKey(diagnostic)); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.UseCoalesceExpressionInsteadOfConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Use coalesce expression", cancellationToken => { return(UseCoalesceExpressionInsteadOfConditionalExpressionRefactoring.RefactorAsync( context.Document, conditionalExpression, cancellationToken)); }, GetEquivalenceKey(diagnostic)); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.SimplifyConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Simplify conditional expression", cancellationToken => { return(SimplifyConditionalExpressionRefactoring.RefactorAsync( context.Document, conditionalExpression, cancellationToken)); }, GetEquivalenceKey(diagnostic)); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.FormatConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Format ? and : on next line", cancellationToken => { return(FormatConditionalExpressionRefactoring.RefactorAsync( context.Document, conditionalExpression, cancellationToken)); }, GetEquivalenceKey(diagnostic)); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.UseConditionalAccessInsteadOfConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Use conditional access", cancellationToken => { return(UseConditionalAccessRefactoring.RefactorAsync( context.Document, conditionalExpression, cancellationToken)); }, GetEquivalenceKey(diagnostic)); context.RegisterCodeFix(codeAction, diagnostic); break; } } } }
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { SyntaxNode root = await context.GetSyntaxRootAsync().ConfigureAwait(false); if (!TryFindFirstAncestorOrSelf(root, context.Span, out ConditionalExpressionSyntax conditionalExpression)) { return; } Document document = context.Document; foreach (Diagnostic diagnostic in context.Diagnostics) { switch (diagnostic.Id) { case DiagnosticIdentifiers.ParenthesizeConditionInConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Wrap condition in parentheses", cancellationToken => ParenthesizeConditionInConditionalExpressionRefactoring.RefactorAsync(document, conditionalExpression, cancellationToken), GetEquivalenceKey(diagnostic)); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.UseCoalesceExpressionInsteadOfConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Use coalesce expression", cancellationToken => { return(SimplifyNullCheckRefactoring.RefactorAsync( document, conditionalExpression, cancellationToken)); }, GetEquivalenceKey(diagnostic)); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.SimplifyConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Simplify conditional expression", cancellationToken => { return(SimplifyConditionalExpressionRefactoring.RefactorAsync( document, conditionalExpression, cancellationToken)); }, GetEquivalenceKey(diagnostic)); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.FormatConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Format ? and : on next line", cancellationToken => { return(FormatConditionalExpressionRefactoring.RefactorAsync( document, conditionalExpression, cancellationToken)); }, GetEquivalenceKey(diagnostic)); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.UseConditionalAccessInsteadOfConditionalExpression: { CodeAction codeAction = CodeAction.Create( "Use conditional access", cancellationToken => { return(SimplifyNullCheckRefactoring.RefactorAsync( document, conditionalExpression, cancellationToken)); }, GetEquivalenceKey(diagnostic)); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.AvoidNestedConditionalOperators: { SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); (CodeAction codeAction, CodeAction recursiveCodeAction) = ConvertConditionalOperatorToIfElseRefactoring.ComputeRefactoring( document, conditionalExpression, data: default, recursiveData: new CodeActionData(ConvertConditionalOperatorToIfElseRefactoring.Title, GetEquivalenceKey(diagnostic)), semanticModel, context.CancellationToken); if (recursiveCodeAction != null) { context.RegisterCodeFix(recursiveCodeAction, diagnostic); } break; } } }