private async Task <Document> ConvertBitwiseOperationToHasFlagCallAsync( Document document, BinaryExpressionSyntax equalsOrNotEquals, CancellationToken cancellationToken) { ExpressionSyntax left = equalsOrNotEquals.Left.WalkDownParentheses(); ExpressionSyntax right = equalsOrNotEquals.Right.WalkDownParentheses(); BinaryExpressionSyntax bitwiseAnd = (left.IsKind(SyntaxKind.BitwiseAndExpression)) ? (BinaryExpressionSyntax)left : (BinaryExpressionSyntax)right; ExpressionSyntax expression; ExpressionSyntax argumentExpression; SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); if (ConvertHasFlagCallToBitwiseOperationAnalysis.IsSuitableAsArgumentOfHasFlag(bitwiseAnd.Right, semanticModel, cancellationToken)) { expression = bitwiseAnd.Left; argumentExpression = bitwiseAnd.Right; } else { expression = bitwiseAnd.Right; argumentExpression = bitwiseAnd.Left; } ExpressionSyntax newExpression = SimpleMemberInvocationExpression( expression, IdentifierName("HasFlag"), ArgumentList(Argument(argumentExpression.WalkDownParentheses()))).Parenthesize(); if (equalsOrNotEquals.IsKind(SyntaxKind.EqualsExpression)) { newExpression = LogicalNotExpression(newExpression).Parenthesize(); } newExpression = newExpression.WithFormatterAnnotation(); return(await document.ReplaceNodeAsync(equalsOrNotEquals, newExpression, cancellationToken).ConfigureAwait(false)); }
public static async Task ComputeRefactoringsAsync(RefactoringContext context, InvocationExpressionSyntax invocationExpression) { if (context.IsAnyRefactoringEnabled( RefactoringIdentifiers.UseElementAccessInsteadOfEnumerableMethod, RefactoringIdentifiers.InvertLinqMethodCall, RefactoringIdentifiers.CallExtensionMethodAsInstanceMethod, RefactoringIdentifiers.CallIndexOfInsteadOfContains)) { ExpressionSyntax expression = invocationExpression.Expression; if (expression != null && invocationExpression.ArgumentList != null) { if (expression.IsKind(SyntaxKind.SimpleMemberAccessExpression) && ((MemberAccessExpressionSyntax)expression).Name?.Span.Contains(context.Span) == true) { if (context.IsRefactoringEnabled(RefactoringIdentifiers.UseElementAccessInsteadOfEnumerableMethod)) { await UseElementAccessRefactoring.ComputeRefactoringsAsync(context, invocationExpression).ConfigureAwait(false); } if (context.IsRefactoringEnabled(RefactoringIdentifiers.InvertLinqMethodCall)) { SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); InvertLinqMethodCallRefactoring.ComputeRefactoring(context, invocationExpression, semanticModel); } if (context.IsRefactoringEnabled(RefactoringIdentifiers.CallIndexOfInsteadOfContains)) { await CallIndexOfInsteadOfContainsRefactoring.ComputeRefactoringAsync(context, invocationExpression).ConfigureAwait(false); } } if (context.IsRefactoringEnabled(RefactoringIdentifiers.CallExtensionMethodAsInstanceMethod)) { SyntaxNodeOrToken nodeOrToken = CallExtensionMethodAsInstanceMethodAnalysis.GetNodeOrToken(expression); if (nodeOrToken.Span.Contains(context.Span)) { SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); CallExtensionMethodAsInstanceMethodAnalysisResult analysis = CallExtensionMethodAsInstanceMethodAnalysis.Analyze(invocationExpression, semanticModel, allowAnyExpression: true, cancellationToken: context.CancellationToken); if (analysis.Success) { context.RegisterRefactoring( CallExtensionMethodAsInstanceMethodRefactoring.Title, cancellationToken => { return(context.Document.ReplaceNodeAsync( analysis.InvocationExpression, analysis.NewInvocationExpression, cancellationToken)); }, RefactoringIdentifiers.CallExtensionMethodAsInstanceMethod); } } } } } if (context.IsRefactoringEnabled(RefactoringIdentifiers.ConvertStringFormatToInterpolatedString) && context.SupportsCSharp6) { await ConvertStringFormatToInterpolatedStringRefactoring.ComputeRefactoringsAsync(context, invocationExpression).ConfigureAwait(false); } if (context.IsRefactoringEnabled(RefactoringIdentifiers.ConvertHasFlagCallToBitwiseOperation)) { SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); if (ConvertHasFlagCallToBitwiseOperationAnalysis.IsFixable(invocationExpression, semanticModel, context.CancellationToken)) { context.RegisterRefactoring( ConvertHasFlagCallToBitwiseOperationRefactoring.Title, cancellationToken => { return(ConvertHasFlagCallToBitwiseOperationRefactoring.RefactorAsync( context.Document, invocationExpression, semanticModel, cancellationToken)); }, RefactoringIdentifiers.ConvertHasFlagCallToBitwiseOperation); } } if (context.IsRefactoringEnabled(RefactoringIdentifiers.InlineMethod)) { await InlineMethodRefactoring.ComputeRefactoringsAsync(context, invocationExpression).ConfigureAwait(false); } }