private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) { var ifStatement = (IfStatementSyntax)context.Node; ReduceIfNestingAnalysisResult analysis = ReduceIfNestingAnalysis.Analyze( ifStatement, context.SemanticModel, options: ReduceIfNestingOptions.None, cancellationToken: context.CancellationToken); if (!analysis.Success) { return; } DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.ReduceIfNesting, ifStatement.IfKeyword.GetLocation(), ImmutableDictionary.CreateRange(new KeyValuePair <string, string>[] { new KeyValuePair <string, string>("JumpKind", analysis.JumpKind.ToString()) })); }
public static async Task ComputeRefactoringsAsync(RefactoringContext context, IfStatementSyntax ifStatement) { SyntaxToken ifKeyword = ifStatement.IfKeyword; bool isTopmostIf = ifStatement.IsTopmostIf(); if (context.Span.IsEmptyAndContainedInSpan(ifKeyword) || context.Span.IsBetweenSpans(ifStatement)) { if (isTopmostIf && context.IsAnyRefactoringEnabled( RefactoringIdentifiers.UseCoalesceExpressionInsteadOfIf, RefactoringIdentifiers.UseConditionalExpressionInsteadOfIf, RefactoringIdentifiers.SimplifyIf)) { SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); IfAnalysisOptions options = GetIfAnalysisOptions(context); foreach (IfAnalysis analysis in IfAnalysis.Analyze(ifStatement, options, semanticModel, context.CancellationToken)) { string refactoringId = GetRefactoringIdentifier(analysis); if (context.IsRefactoringEnabled(refactoringId)) { context.RegisterRefactoring( analysis.Title, ct => IfRefactoring.RefactorAsync(context.Document, analysis, ct), refactoringId); } } } if (context.IsAnyRefactoringEnabled(RefactoringIdentifiers.InvertIf, RefactoringIdentifiers.InvertIfElse) && isTopmostIf && context.Span.IsEmptyAndContainedInSpan(ifKeyword)) { InvertIfRefactoring.ComputeRefactoring(context, ifStatement); } if (context.IsRefactoringEnabled(RefactoringIdentifiers.ReplaceIfWithSwitch) && isTopmostIf) { SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); ReplaceIfWithSwitchRefactoring.ComputeRefactoring(context, ifStatement, semanticModel); } if (context.IsRefactoringEnabled(RefactoringIdentifiers.SplitIfStatement)) { SplitIfStatementRefactoring.ComputeRefactoring(context, ifStatement); } if (context.IsRefactoringEnabled(RefactoringIdentifiers.MergeIfWithParentIf) && isTopmostIf && context.Span.IsEmptyAndContainedInSpan(ifKeyword)) { MergeIfWithParentIfRefactoring.ComputeRefactoring(context, ifStatement); } } if (context.IsRefactoringEnabled(RefactoringIdentifiers.InvertIf) && context.Span.IsEmptyAndContainedInSpan(ifKeyword)) { SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); ReduceIfNestingAnalysisResult analysis = ReduceIfNestingAnalysis.Analyze( ifStatement, semanticModel, options: ReduceIfNestingOptions.AllowNestedFix | ReduceIfNestingOptions.AllowIfInsideIfElse | ReduceIfNestingOptions.AllowLoop | ReduceIfNestingOptions.AllowSwitchSection, cancellationToken: context.CancellationToken); if (analysis.Success) { context.RegisterRefactoring( "Invert if", ct => ReduceIfNestingRefactoring.RefactorAsync(context.Document, ifStatement, analysis.JumpKind, false, ct), RefactoringIdentifiers.InvertIf); if (ReduceIfNestingAnalysis.IsFixableRecursively(ifStatement, analysis.JumpKind)) { context.RegisterRefactoring( "Invert if (recursively)", ct => ReduceIfNestingRefactoring.RefactorAsync(context.Document, ifStatement, analysis.JumpKind, true, ct), EquivalenceKey.Join(RefactoringIdentifiers.InvertIf, "Recursive")); } } } if (context.IsRefactoringEnabled(RefactoringIdentifiers.SplitIfElse) && context.Span.IsEmptyAndContainedInSpan(ifKeyword)) { SplitIfElseRefactoring.ComputeRefactoring(context, ifStatement); } }
public static async Task ComputeRefactoringsAsync(RefactoringContext context, IfStatementSyntax ifStatement) { if (ifStatement.IsTopmostIf() && (context.Span.IsEmptyAndContainedInSpan(ifStatement.IfKeyword) || context.Span.IsBetweenSpans(ifStatement))) { if (context.IsAnyRefactoringEnabled( RefactoringIdentifiers.UseCoalesceExpressionInsteadOfIf, RefactoringIdentifiers.UseConditionalExpressionInsteadOfIf, RefactoringIdentifiers.SimplifyIf)) { SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); var options = new IfAnalysisOptions( useCoalesceExpression: context.IsRefactoringEnabled(RefactoringIdentifiers.UseCoalesceExpressionInsteadOfIf), useConditionalExpression: context.IsRefactoringEnabled(RefactoringIdentifiers.UseConditionalExpressionInsteadOfIf), useBooleanExpression: context.IsRefactoringEnabled(RefactoringIdentifiers.SimplifyIf), useExpression: false); foreach (IfAnalysis analysis in IfAnalysis.Analyze(ifStatement, options, semanticModel, context.CancellationToken)) { context.RegisterRefactoring( analysis.Title, cancellationToken => IfRefactoring.RefactorAsync(context.Document, analysis, cancellationToken)); } } if (context.IsRefactoringEnabled(RefactoringIdentifiers.SwapIfElse)) { SwapIfElseRefactoring.ComputeRefactoring(context, ifStatement); } if (context.IsRefactoringEnabled(RefactoringIdentifiers.ReplaceIfWithSwitch)) { await ReplaceIfWithSwitchRefactoring.ComputeRefactoringAsync(context, ifStatement).ConfigureAwait(false); } if (context.IsRefactoringEnabled(RefactoringIdentifiers.SplitIfStatement)) { SplitIfStatementRefactoring.ComputeRefactoring(context, ifStatement); } if (context.IsRefactoringEnabled(RefactoringIdentifiers.MergeIfWithParentIf) && context.Span.IsEmptyAndContainedInSpan(ifStatement.IfKeyword)) { MergeIfWithParentIfRefactoring.ComputeRefactoring(context, ifStatement); } } if (context.IsRefactoringEnabled(RefactoringIdentifiers.ReduceIfNesting) && context.Span.IsEmptyAndContainedInSpanOrBetweenSpans(ifStatement.IfKeyword)) { SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); ReduceIfNestingAnalysisResult analysis = ReduceIfNestingAnalysis.Analyze( ifStatement, semanticModel, options: ReduceIfNestingOptions.AllowNestedFix | ReduceIfNestingOptions.AllowIfInsideIfElse | ReduceIfNestingOptions.AllowLoop | ReduceIfNestingOptions.AllowSwitchSection, taskSymbol: semanticModel.GetTypeByMetadataName(MetadataNames.System_Threading_Tasks_Task), cancellationToken: context.CancellationToken); if (analysis.Success) { context.RegisterRefactoring( "Reduce if nesting", cancellationToken => ReduceIfNestingRefactoring.RefactorAsync(context.Document, ifStatement, analysis.JumpKind, false, cancellationToken)); if (ReduceIfNestingAnalysis.IsFixableRecursively(ifStatement, analysis.JumpKind)) { context.RegisterRefactoring( "Reduce if nesting (recursively)", cancellationToken => ReduceIfNestingRefactoring.RefactorAsync(context.Document, ifStatement, analysis.JumpKind, true, cancellationToken)); } } } if (context.IsRefactoringEnabled(RefactoringIdentifiers.SplitIfElse) && context.Span.IsEmptyAndContainedInSpanOrBetweenSpans(ifStatement.IfKeyword)) { SplitIfElseRefactoring.ComputeRefactoring(context, ifStatement); } }