From 9529446dbf940322df52a19d8b2b72040398d865 Mon Sep 17 00:00:00 2001 From: tpodolak Date: Sun, 2 Oct 2022 21:06:40 +0200 Subject: [PATCH] GH-153 - code fix providers clean-up --- ...ternalSetupSpecificationCodeFixProvider.cs | 22 ++++++++---- ...stituteForInternalMemberCodeFixProvider.cs | 4 +-- ...dInternalsVisibleToAttributeRefactoring.cs | 7 ++-- .../Refactorings/AddModifierRefactoring.cs | 5 +-- .../ReplaceModifierRefactoring.cs | 10 ++++-- ...torArgumentsForInterfaceCodeFixProvider.cs | 15 +++----- ...ternalSetupSpecificationCodeFixProvider.cs | 36 +++++++++++-------- ...teUsedForUnsupportedTypeCodeFixProvider.cs | 12 ++----- .../AbstractReEntrantSetupCodeFixProvider.cs | 12 ++----- ...eceivedInReceivedInOrderCodeFixProvider.cs | 16 ++++----- ...stituteForInternalMemberCodeFixProvider.cs | 12 ++----- ...tractSuppressDiagnosticsCodeFixProvider.cs | 18 ++++++---- ...tractSyncOverAsyncThrowsCodeFixProvider.cs | 12 ++----- ...ternalSetupSpecificationCodeFixProvider.cs | 22 ++++++++---- ...stituteForInternalMemberCodeFixProvider.cs | 4 +-- ...dInternalsVisibleToAttributeRefactoring.cs | 7 ++-- .../Refactorings/AddModifierRefactoring.cs | 9 +++-- .../ReplaceModifierRefactoring.cs | 10 ++++-- 18 files changed, 121 insertions(+), 112 deletions(-) diff --git a/src/NSubstitute.Analyzers.CSharp/CodeFixProviders/InternalSetupSpecificationCodeFixProvider.cs b/src/NSubstitute.Analyzers.CSharp/CodeFixProviders/InternalSetupSpecificationCodeFixProvider.cs index a8835395..a8f81c15 100644 --- a/src/NSubstitute.Analyzers.CSharp/CodeFixProviders/InternalSetupSpecificationCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.CSharp/CodeFixProviders/InternalSetupSpecificationCodeFixProvider.cs @@ -1,3 +1,4 @@ +using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeFixes; @@ -12,18 +13,27 @@ internal sealed class InternalSetupSpecificationCodeFixProvider : AbstractIntern { protected override string ReplaceModifierCodeFixTitle { get; } = "Replace internal with public modifier"; - protected override Task AddModifierRefactoring(Document document, SyntaxNode node, Accessibility accessibility) + protected override Task AddModifierRefactoring( + Document document, + SyntaxNode node, + Accessibility accessibility, + CancellationToken cancellationToken) { - return Refactorings.AddModifierRefactoring.RefactorAsync(document, node, accessibility); + return Refactorings.AddModifierRefactoring.RefactorAsync(document, node, accessibility, cancellationToken); } - protected override Task ReplaceModifierRefactoring(Document document, SyntaxNode node, Accessibility fromAccessibility, Accessibility toAccessibility) + protected override Task ReplaceModifierRefactoring( + Document document, + SyntaxNode node, + Accessibility fromAccessibility, + Accessibility toAccessibility, + CancellationToken cancellationToken) { - return Refactorings.ReplaceModifierRefactoring.RefactorAsync(document, node, fromAccessibility, toAccessibility); + return Refactorings.ReplaceModifierRefactoring.RefactorAsync(document, node, fromAccessibility, toAccessibility, cancellationToken); } - protected override void RegisterAddInternalsVisibleToAttributeCodeFix(CodeFixContext context, Diagnostic diagnostic, CompilationUnitSyntax compilationUnitSyntax) + protected override void RegisterAddInternalsVisibleToAttributeCodeFix(CodeFixContext context, CompilationUnitSyntax compilationUnitSyntax) { - AddInternalsVisibleToAttributeRefactoring.RegisterCodeFix(context, diagnostic, compilationUnitSyntax); + AddInternalsVisibleToAttributeRefactoring.RegisterCodeFix(context, compilationUnitSyntax); } } \ No newline at end of file diff --git a/src/NSubstitute.Analyzers.CSharp/CodeFixProviders/SubstituteForInternalMemberCodeFixProvider.cs b/src/NSubstitute.Analyzers.CSharp/CodeFixProviders/SubstituteForInternalMemberCodeFixProvider.cs index d5208f6d..f048e7d4 100644 --- a/src/NSubstitute.Analyzers.CSharp/CodeFixProviders/SubstituteForInternalMemberCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.CSharp/CodeFixProviders/SubstituteForInternalMemberCodeFixProvider.cs @@ -15,8 +15,8 @@ public SubstituteForInternalMemberCodeFixProvider() { } - protected override void RegisterCodeFix(CodeFixContext context, Diagnostic diagnostic, CompilationUnitSyntax compilationUnitSyntax) + protected override void RegisterCodeFix(CodeFixContext context, CompilationUnitSyntax compilationUnitSyntax) { - AddInternalsVisibleToAttributeRefactoring.RegisterCodeFix(context, diagnostic, compilationUnitSyntax); + AddInternalsVisibleToAttributeRefactoring.RegisterCodeFix(context, compilationUnitSyntax); } } \ No newline at end of file diff --git a/src/NSubstitute.Analyzers.CSharp/Refactorings/AddInternalsVisibleToAttributeRefactoring.cs b/src/NSubstitute.Analyzers.CSharp/Refactorings/AddInternalsVisibleToAttributeRefactoring.cs index f0c67fd2..387235a8 100644 --- a/src/NSubstitute.Analyzers.CSharp/Refactorings/AddInternalsVisibleToAttributeRefactoring.cs +++ b/src/NSubstitute.Analyzers.CSharp/Refactorings/AddInternalsVisibleToAttributeRefactoring.cs @@ -13,7 +13,7 @@ namespace NSubstitute.Analyzers.CSharp.Refactorings; internal static class AddInternalsVisibleToAttributeRefactoring { - public static Task RefactorAsync(Document document, CompilationUnitSyntax compilationUnitSyntax, CancellationToken cancellationToken = default) + public static Task RefactorAsync(Document document, CompilationUnitSyntax compilationUnitSyntax, CancellationToken cancellationToken) { var attributeList = GetGenerator(document) .InternalVisibleToDynamicProxyAttributeList() @@ -25,12 +25,11 @@ public static Task RefactorAsync(Document document, CompilationUnitSyn return document.ReplaceNodeAsync(compilationUnitSyntax, updatedCompilationUnitSyntax, cancellationToken); } - public static void RegisterCodeFix(CodeFixContext context, Diagnostic diagnostic, CompilationUnitSyntax compilationUnitSyntax) + public static void RegisterCodeFix(CodeFixContext context, CompilationUnitSyntax compilationUnitSyntax) { var codeAction = CodeAction.Create( "Add InternalsVisibleTo attribute", - cancellationToken => RefactorAsync(context.Document, compilationUnitSyntax, cancellationToken), - diagnostic.Id); + cancellationToken => RefactorAsync(context.Document, compilationUnitSyntax, cancellationToken)); context.RegisterCodeFix(codeAction, context.Diagnostics); } diff --git a/src/NSubstitute.Analyzers.CSharp/Refactorings/AddModifierRefactoring.cs b/src/NSubstitute.Analyzers.CSharp/Refactorings/AddModifierRefactoring.cs index 18c17dcf..67871d35 100644 --- a/src/NSubstitute.Analyzers.CSharp/Refactorings/AddModifierRefactoring.cs +++ b/src/NSubstitute.Analyzers.CSharp/Refactorings/AddModifierRefactoring.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; @@ -10,7 +11,7 @@ namespace NSubstitute.Analyzers.CSharp.Refactorings; internal static class AddModifierRefactoring { - public static Task RefactorAsync(Document document, SyntaxNode node, Accessibility accessibility) + public static Task RefactorAsync(Document document, SyntaxNode node, Accessibility accessibility, CancellationToken cancellationToken) { var syntaxKind = accessibility switch { @@ -20,7 +21,7 @@ public static Task RefactorAsync(Document document, SyntaxNode node, A var newNode = Insert(node, syntaxKind); - return document.ReplaceNodeAsync(node, newNode); + return document.ReplaceNodeAsync(node, newNode, cancellationToken: cancellationToken); } private static SyntaxNode Insert(SyntaxNode node, SyntaxKind syntaxKind) diff --git a/src/NSubstitute.Analyzers.CSharp/Refactorings/ReplaceModifierRefactoring.cs b/src/NSubstitute.Analyzers.CSharp/Refactorings/ReplaceModifierRefactoring.cs index 9bc6e64b..ffa98981 100644 --- a/src/NSubstitute.Analyzers.CSharp/Refactorings/ReplaceModifierRefactoring.cs +++ b/src/NSubstitute.Analyzers.CSharp/Refactorings/ReplaceModifierRefactoring.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; @@ -11,14 +12,19 @@ namespace NSubstitute.Analyzers.CSharp.Refactorings; internal class ReplaceModifierRefactoring { - public static Task RefactorAsync(Document document, SyntaxNode node, Accessibility fromAccessibility, Accessibility toAccessibility) + public static Task RefactorAsync( + Document document, + SyntaxNode node, + Accessibility fromAccessibility, + Accessibility toAccessibility, + CancellationToken cancellationToken) { var fromSyntaxKind = InferSyntaxKind(fromAccessibility); var toSyntaxKind = InferSyntaxKind(toAccessibility); var newNode = ReplaceModifier(node, fromSyntaxKind, toSyntaxKind); - return document.ReplaceNodeAsync(node, newNode); + return document.ReplaceNodeAsync(node, newNode, cancellationToken: cancellationToken); } private static SyntaxKind InferSyntaxKind(Accessibility fromAccessibility) diff --git a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractConstructorArgumentsForInterfaceCodeFixProvider.cs b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractConstructorArgumentsForInterfaceCodeFixProvider.cs index ae4ad0c1..ca16fdbc 100644 --- a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractConstructorArgumentsForInterfaceCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractConstructorArgumentsForInterfaceCodeFixProvider.cs @@ -20,18 +20,11 @@ internal abstract class AbstractConstructorArgumentsForInterfaceCodeFixProvider public override Task RegisterCodeFixesAsync(CodeFixContext context) { - var diagnostic = context.Diagnostics.FirstOrDefault(diag => - diag.Descriptor.Id == DiagnosticIdentifiers.SubstituteConstructorArgumentsForInterface); - if (diagnostic == null) - { - return Task.CompletedTask; - } - var codeAction = CodeAction.Create( "Remove constructor arguments", - ct => CreateChangedDocument(ct, context, diagnostic), + ct => CreateChangedDocument(context, ct), nameof(AbstractConstructorArgumentsForInterfaceCodeFixProvider)); - context.RegisterCodeFix(codeAction, diagnostic); + context.RegisterCodeFix(codeAction, context.Diagnostics); return Task.CompletedTask; } @@ -40,13 +33,13 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context) protected abstract SyntaxNode GetInvocationExpressionSyntaxWithNullConstructorArgument(IInvocationOperation invocationOperation); - private async Task CreateChangedDocument(CancellationToken cancellationToken, CodeFixContext context, Diagnostic diagnostic) + private async Task CreateChangedDocument(CodeFixContext context, CancellationToken cancellationToken) { var documentEditor = await DocumentEditor.CreateAsync(context.Document, cancellationToken); var root = await context.Document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); - var invocation = root.FindNode(diagnostic.Location.SourceSpan, getInnermostNodeForTie: true); + var invocation = root.FindNode(context.Span, getInnermostNodeForTie: true); var semanticModel = await context.Document.GetSemanticModelAsync(cancellationToken); if (semanticModel.GetOperation(invocation) is not IInvocationOperation invocationOperation) { diff --git a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractInternalSetupSpecificationCodeFixProvider.cs b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractInternalSetupSpecificationCodeFixProvider.cs index 338a1474..b9e8a90c 100644 --- a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractInternalSetupSpecificationCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractInternalSetupSpecificationCodeFixProvider.cs @@ -1,5 +1,6 @@ using System.Collections.Immutable; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeActions; @@ -16,16 +17,8 @@ internal abstract class AbstractInternalSetupSpecificationCodeFixProvider diag.Id == DiagnosticIdentifiers.InternalSetupSpecification); - - if (diagnostic == null) - { - return; - } - var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); - var invocationExpression = root.FindNode(diagnostic.Location.SourceSpan, getInnermostNodeForTie: true); + var invocationExpression = root.FindNode(context.Span, getInnermostNodeForTie: true); var syntaxReference = await GetDeclaringSyntaxReference(context, invocationExpression); if (syntaxReference == null) @@ -40,8 +33,12 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) return; } - context.RegisterCodeFix(CodeAction.Create("Add protected modifier", token => AddModifierRefactoring(context.Document, syntaxNode, Accessibility.Protected)), diagnostic); - context.RegisterCodeFix(CodeAction.Create(ReplaceModifierCodeFixTitle, token => ReplaceModifierRefactoring(context.Document, syntaxNode, Accessibility.Internal, Accessibility.Public)), diagnostic); + context.RegisterCodeFix( + CodeAction.Create("Add protected modifier", token => AddModifierRefactoring(context.Document, syntaxNode, Accessibility.Protected, token)), + context.Diagnostics); + context.RegisterCodeFix( + CodeAction.Create(ReplaceModifierCodeFixTitle, token => ReplaceModifierRefactoring(context.Document, syntaxNode, Accessibility.Internal, Accessibility.Public, token)), + context.Diagnostics); var compilationUnitSyntax = FindCompilationUnitSyntax(syntaxNode); @@ -50,14 +47,23 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) return; } - RegisterAddInternalsVisibleToAttributeCodeFix(context, diagnostic, compilationUnitSyntax); + RegisterAddInternalsVisibleToAttributeCodeFix(context, compilationUnitSyntax); } - protected abstract Task AddModifierRefactoring(Document document, SyntaxNode node, Accessibility accessibility); + protected abstract Task AddModifierRefactoring( + Document document, + SyntaxNode node, + Accessibility accessibility, + CancellationToken cancellationToken); - protected abstract Task ReplaceModifierRefactoring(Document document, SyntaxNode node, Accessibility fromAccessibility, Accessibility toAccessibility); + protected abstract Task ReplaceModifierRefactoring( + Document document, + SyntaxNode node, + Accessibility fromAccessibility, + Accessibility toAccessibility, + CancellationToken cancellationToken); - protected abstract void RegisterAddInternalsVisibleToAttributeCodeFix(CodeFixContext context, Diagnostic diagnostic, TCompilationUnitSyntax compilationUnitSyntax); + protected abstract void RegisterAddInternalsVisibleToAttributeCodeFix(CodeFixContext context, TCompilationUnitSyntax compilationUnitSyntax); private async Task GetDeclaringSyntaxReference(CodeFixContext context, SyntaxNode invocationExpression) { diff --git a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractPartialSubstituteUsedForUnsupportedTypeCodeFixProvider.cs b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractPartialSubstituteUsedForUnsupportedTypeCodeFixProvider.cs index 66b50d54..bb836a5a 100644 --- a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractPartialSubstituteUsedForUnsupportedTypeCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractPartialSubstituteUsedForUnsupportedTypeCodeFixProvider.cs @@ -1,5 +1,4 @@ using System.Collections.Immutable; -using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; @@ -19,15 +18,8 @@ internal abstract class AbstractPartialSubstituteUsedForUnsupportedTypeCodeFixPr public override async Task RegisterCodeFixesAsync(CodeFixContext context) { - var diagnostic = context.Diagnostics.FirstOrDefault(diag => - diag.Descriptor.Id == DiagnosticIdentifiers.PartialSubstituteForUnsupportedType); - if (diagnostic == null) - { - return; - } - var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); - var syntaxNode = root.FindNode(diagnostic.Location.SourceSpan, getInnermostNodeForTie: true); + var syntaxNode = root.FindNode(context.Span, getInnermostNodeForTie: true); var semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken); if (semanticModel.GetOperation(syntaxNode) is not IInvocationOperation invocationOperation) @@ -43,7 +35,7 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) title, ct => CreateChangedDocument(context, invocationOperation, ct), nameof(AbstractPartialSubstituteUsedForUnsupportedTypeCodeFixProvider)); - context.RegisterCodeFix(codeAction, diagnostic); + context.RegisterCodeFix(codeAction, context.Diagnostics); } protected abstract SyntaxNode UpdateInvocationExpression( diff --git a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractReEntrantSetupCodeFixProvider.cs b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractReEntrantSetupCodeFixProvider.cs index 74b37789..0bbd8718 100644 --- a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractReEntrantSetupCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractReEntrantSetupCodeFixProvider.cs @@ -20,17 +20,9 @@ internal abstract class AbstractReEntrantSetupCodeFixProvider : public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { - var diagnostic = context.Diagnostics.FirstOrDefault(diag => - diag.Descriptor.Id == DiagnosticIdentifiers.ReEntrantSubstituteCall); - - if (diagnostic == null) - { - return; - } - var semanticModel = await context.Document.GetSemanticModelAsync(); var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken); - var node = root.FindNode(diagnostic.Location.SourceSpan, getInnermostNodeForTie: true); + var node = root.FindNode(context.Span, getInnermostNodeForTie: true); if (semanticModel.GetOperation(node) is not { } nodeOperation) { @@ -59,7 +51,7 @@ public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) ct => CreateChangedDocument(context, semanticModel, invocationOperation, methodSymbol, ct), nameof(AbstractReEntrantSetupCodeFixProvider)); - context.RegisterCodeFix(codeAction, diagnostic); + context.RegisterCodeFix(codeAction, context.Diagnostics); } protected abstract string LambdaParameterName { get; } diff --git a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractReceivedInReceivedInOrderCodeFixProvider.cs b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractReceivedInReceivedInOrderCodeFixProvider.cs index ece0079f..d79ce447 100644 --- a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractReceivedInReceivedInOrderCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractReceivedInReceivedInOrderCodeFixProvider.cs @@ -18,21 +18,21 @@ internal abstract class AbstractReceivedInReceivedInOrderCodeFixProvider : CodeF public override Task RegisterCodeFixesAsync(CodeFixContext context) { - var diagnostic = context.Diagnostics.FirstOrDefault(diag => diag.Descriptor.Id == DiagnosticIdentifiers.ReceivedUsedInReceivedInOrder); - if (diagnostic != null) - { - var codeAction = CodeAction.Create("Remove redundant Received checks", ct => CreateChangedDocument(ct, context, diagnostic), nameof(AbstractReceivedInReceivedInOrderCodeFixProvider)); - context.RegisterCodeFix(codeAction, diagnostic); - } + var codeAction = CodeAction.Create( + "Remove redundant Received checks", + ct => CreateChangedDocument(ct, context), + nameof(AbstractReceivedInReceivedInOrderCodeFixProvider)); + + context.RegisterCodeFix(codeAction, context.Diagnostics); return Task.CompletedTask; } - private async Task CreateChangedDocument(CancellationToken cancellationToken, CodeFixContext context, Diagnostic diagnostic) + private async Task CreateChangedDocument(CancellationToken cancellationToken, CodeFixContext context) { var root = await context.Document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); - var invocation = root.FindNode(diagnostic.Location.SourceSpan, getInnermostNodeForTie: true); + var invocation = root.FindNode(context.Span, getInnermostNodeForTie: true); var semanticModel = await context.Document.GetSemanticModelAsync(cancellationToken); if (semanticModel.GetOperation(invocation) is not IInvocationOperation invocationOperation) diff --git a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSubstituteForInternalMemberCodeFixProvider.cs b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSubstituteForInternalMemberCodeFixProvider.cs index ba865025..7b127dbc 100644 --- a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSubstituteForInternalMemberCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSubstituteForInternalMemberCodeFixProvider.cs @@ -21,15 +21,9 @@ protected AbstractSubstituteForInternalMemberCodeFixProvider(ISubstituteProxyAna public override async Task RegisterCodeFixesAsync(CodeFixContext context) { - var diagnostic = context.Diagnostics.FirstOrDefault(diag => diag.Descriptor.Id == DiagnosticIdentifiers.SubstituteForInternalMember); - if (diagnostic == null) - { - return; - } - var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); - var invocationExpression = root.FindNode(diagnostic.Location.SourceSpan, getInnermostNodeForTie: true); + var invocationExpression = root.FindNode(context.Span, getInnermostNodeForTie: true); var semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken); if (semanticModel.GetOperation(invocationExpression) is not IInvocationOperation invocationOperation) @@ -52,10 +46,10 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) return; } - RegisterCodeFix(context, diagnostic, compilationUnitSyntax); + RegisterCodeFix(context, compilationUnitSyntax); } - protected abstract void RegisterCodeFix(CodeFixContext context, Diagnostic diagnostic, TCompilationUnitSyntax compilationUnitSyntax); + protected abstract void RegisterCodeFix(CodeFixContext context, TCompilationUnitSyntax compilationUnitSyntax); private SyntaxReference GetDeclaringSyntaxReference(IInvocationOperation invocationOperation) { diff --git a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSuppressDiagnosticsCodeFixProvider.cs b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSuppressDiagnosticsCodeFixProvider.cs index 22fe430b..aeff83ed 100644 --- a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSuppressDiagnosticsCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSuppressDiagnosticsCodeFixProvider.cs @@ -36,8 +36,7 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) var root = await context.Document.GetSyntaxRootAsync(); var model = await context.Document.GetSemanticModelAsync(); - foreach (var diagnostic in context.Diagnostics - .Where(diagnostic => FixableDiagnosticIds.Contains(diagnostic.Id))) + foreach (var diagnostic in context.Diagnostics) { var syntaxNode = root.FindNode(diagnostic.Location.SourceSpan, getInnermostNodeForTie: true); var symbolInfo = model.GetSymbolInfo(syntaxNode); @@ -47,7 +46,7 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) context.RegisterCodeFix( CodeAction.Create( CreateCodeFixTitle(diagnostic, innerSymbol), - cancellationToken => GetTransformedSolutionAsync(context, diagnostic, settingsFile, innerSymbol)), + cancellationToken => GetTransformedSolutionAsync(context, diagnostic, settingsFile, innerSymbol, cancellationToken)), diagnostic); } } @@ -93,7 +92,12 @@ private static string GetSymbolTitlePrefix(ISymbol innerSymbol) }; } - private Task GetTransformedSolutionAsync(CodeFixContext context, Diagnostic diagnostic, TextDocument settingsFile, ISymbol symbol) + private Task GetTransformedSolutionAsync( + CodeFixContext context, + Diagnostic diagnostic, + TextDocument settingsFile, + ISymbol symbol, + CancellationToken cancellationToken) { var project = context.Document.Project; var settingsFileId = settingsFile?.Id; @@ -106,7 +110,7 @@ private Task GetTransformedSolutionAsync(CodeFixContext context, Diagn settingsFileId = DocumentId.CreateNewId(project.Id); } - var options = GetUpdatedAnalyzersOptions(context, diagnostic, symbol); + var options = GetUpdatedAnalyzersOptions(context, diagnostic, symbol, cancellationToken); var solution = project.Solution; @@ -118,9 +122,9 @@ private Task GetTransformedSolutionAsync(CodeFixContext context, Diagn return Task.FromResult(solution); } - private static AnalyzersSettings GetUpdatedAnalyzersOptions(CodeFixContext context, Diagnostic diagnostic, ISymbol symbol) + private static AnalyzersSettings GetUpdatedAnalyzersOptions(CodeFixContext context, Diagnostic diagnostic, ISymbol symbol, CancellationToken cancellationToken) { - var options = context.Document.Project.AnalyzerOptions.GetSettings(default(CancellationToken)); + var options = context.Document.Project.AnalyzerOptions.GetSettings(cancellationToken); var target = CreateSuppressionTarget(symbol); options.Suppressions ??= new List(); diff --git a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSyncOverAsyncThrowsCodeFixProvider.cs b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSyncOverAsyncThrowsCodeFixProvider.cs index 25c83925..fd73d813 100644 --- a/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSyncOverAsyncThrowsCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.Shared/CodeFixProviders/AbstractSyncOverAsyncThrowsCodeFixProvider.cs @@ -28,17 +28,9 @@ protected AbstractSyncOverAsyncThrowsCodeFixProvider(ISubstitutionNodeFinder sub public override async Task RegisterCodeFixesAsync(CodeFixContext context) { - var diagnostic = - context.Diagnostics.FirstOrDefault(diag => diag.Descriptor.Id == DiagnosticIdentifiers.SyncOverAsyncThrows); - - if (diagnostic == null) - { - return; - } - var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); - if (root.FindNode(diagnostic.Location.SourceSpan, getInnermostNodeForTie: true) is not { } invocationExpression) + if (root.FindNode(context.Span, getInnermostNodeForTie: true) is not { } invocationExpression) { return; } @@ -63,7 +55,7 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) ct => CreateChangedDocument(context, semanticModel, invocationOperation, supportsThrowsAsync, ct), nameof(AbstractSyncOverAsyncThrowsCodeFixProvider)); - context.RegisterCodeFix(codeAction, diagnostic); + context.RegisterCodeFix(codeAction, context.Diagnostics); } protected abstract SyntaxNode UpdateMemberExpression(IInvocationOperation invocationOperation, SyntaxNode updatedNameSyntax); diff --git a/src/NSubstitute.Analyzers.VisualBasic/CodeFixProviders/InternalSetupSpecificationCodeFixProvider.cs b/src/NSubstitute.Analyzers.VisualBasic/CodeFixProviders/InternalSetupSpecificationCodeFixProvider.cs index a933ded7..04731097 100644 --- a/src/NSubstitute.Analyzers.VisualBasic/CodeFixProviders/InternalSetupSpecificationCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.VisualBasic/CodeFixProviders/InternalSetupSpecificationCodeFixProvider.cs @@ -1,3 +1,4 @@ +using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeFixes; @@ -12,18 +13,27 @@ internal sealed class InternalSetupSpecificationCodeFixProvider : AbstractIntern { protected override string ReplaceModifierCodeFixTitle { get; } = "Replace friend with public modifier"; - protected override Task AddModifierRefactoring(Document document, SyntaxNode node, Accessibility accessibility) + protected override Task AddModifierRefactoring( + Document document, + SyntaxNode node, + Accessibility accessibility, + CancellationToken cancellationToken) { - return Refactorings.AddModifierRefactoring.RefactorAsync(document, node, accessibility); + return Refactorings.AddModifierRefactoring.RefactorAsync(document, node, accessibility, cancellationToken); } - protected override Task ReplaceModifierRefactoring(Document document, SyntaxNode node, Accessibility fromAccessibility, Accessibility toAccessibility) + protected override Task ReplaceModifierRefactoring( + Document document, + SyntaxNode node, + Accessibility fromAccessibility, + Accessibility toAccessibility, + CancellationToken cancellationToken) { - return Refactorings.ReplaceModifierRefactoring.RefactorAsync(document, node, fromAccessibility, toAccessibility); + return Refactorings.ReplaceModifierRefactoring.RefactorAsync(document, node, fromAccessibility, toAccessibility, cancellationToken); } - protected override void RegisterAddInternalsVisibleToAttributeCodeFix(CodeFixContext context, Diagnostic diagnostic, CompilationUnitSyntax compilationUnitSyntax) + protected override void RegisterAddInternalsVisibleToAttributeCodeFix(CodeFixContext context, CompilationUnitSyntax compilationUnitSyntax) { - AddInternalsVisibleToAttributeRefactoring.RegisterCodeFix(context, diagnostic, compilationUnitSyntax); + AddInternalsVisibleToAttributeRefactoring.RegisterCodeFix(context, compilationUnitSyntax); } } \ No newline at end of file diff --git a/src/NSubstitute.Analyzers.VisualBasic/CodeFixProviders/SubstituteForInternalMemberCodeFixProvider.cs b/src/NSubstitute.Analyzers.VisualBasic/CodeFixProviders/SubstituteForInternalMemberCodeFixProvider.cs index 13456f8b..b9f97f41 100644 --- a/src/NSubstitute.Analyzers.VisualBasic/CodeFixProviders/SubstituteForInternalMemberCodeFixProvider.cs +++ b/src/NSubstitute.Analyzers.VisualBasic/CodeFixProviders/SubstituteForInternalMemberCodeFixProvider.cs @@ -15,8 +15,8 @@ public SubstituteForInternalMemberCodeFixProvider() { } - protected override void RegisterCodeFix(CodeFixContext context, Diagnostic diagnostic, CompilationUnitSyntax compilationUnitSyntax) + protected override void RegisterCodeFix(CodeFixContext context, CompilationUnitSyntax compilationUnitSyntax) { - AddInternalsVisibleToAttributeRefactoring.RegisterCodeFix(context, diagnostic, compilationUnitSyntax); + AddInternalsVisibleToAttributeRefactoring.RegisterCodeFix(context, compilationUnitSyntax); } } \ No newline at end of file diff --git a/src/NSubstitute.Analyzers.VisualBasic/Refactorings/AddInternalsVisibleToAttributeRefactoring.cs b/src/NSubstitute.Analyzers.VisualBasic/Refactorings/AddInternalsVisibleToAttributeRefactoring.cs index e3d61870..d86e301b 100644 --- a/src/NSubstitute.Analyzers.VisualBasic/Refactorings/AddInternalsVisibleToAttributeRefactoring.cs +++ b/src/NSubstitute.Analyzers.VisualBasic/Refactorings/AddInternalsVisibleToAttributeRefactoring.cs @@ -14,7 +14,7 @@ namespace NSubstitute.Analyzers.VisualBasic.Refactorings; internal static class AddInternalsVisibleToAttributeRefactoring { - public static Task RefactorAsync(Document document, CompilationUnitSyntax compilationUnitSyntax, CancellationToken cancellationToken = default) + public static Task RefactorAsync(Document document, CompilationUnitSyntax compilationUnitSyntax, CancellationToken cancellationToken) { var attributeList = GetGenerator(document) .InternalVisibleToDynamicProxyAttributeList() @@ -31,12 +31,11 @@ public static Task RefactorAsync(Document document, CompilationUnitSyn return document.ReplaceNodeAsync(compilationUnitSyntax, updatedCompilationUnitSyntax, cancellationToken); } - public static void RegisterCodeFix(CodeFixContext context, Diagnostic diagnostic, CompilationUnitSyntax compilationUnitSyntax) + public static void RegisterCodeFix(CodeFixContext context, CompilationUnitSyntax compilationUnitSyntax) { var codeAction = CodeAction.Create( "Add InternalsVisibleTo attribute", - cancellationToken => RefactorAsync(context.Document, compilationUnitSyntax, cancellationToken), - diagnostic.Id); + cancellationToken => RefactorAsync(context.Document, compilationUnitSyntax, cancellationToken)); context.RegisterCodeFix(codeAction, context.Diagnostics); } diff --git a/src/NSubstitute.Analyzers.VisualBasic/Refactorings/AddModifierRefactoring.cs b/src/NSubstitute.Analyzers.VisualBasic/Refactorings/AddModifierRefactoring.cs index 9f785ece..5d05de24 100644 --- a/src/NSubstitute.Analyzers.VisualBasic/Refactorings/AddModifierRefactoring.cs +++ b/src/NSubstitute.Analyzers.VisualBasic/Refactorings/AddModifierRefactoring.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.VisualBasic; @@ -10,7 +11,11 @@ namespace NSubstitute.Analyzers.VisualBasic.Refactorings; internal static class AddModifierRefactoring { - public static Task RefactorAsync(Document document, SyntaxNode node, Accessibility accessibility) + public static Task RefactorAsync( + Document document, + SyntaxNode node, + Accessibility accessibility, + CancellationToken cancellationToken) { var syntaxKind = accessibility switch { @@ -20,7 +25,7 @@ public static Task RefactorAsync(Document document, SyntaxNode node, A var newNode = Insert(node, syntaxKind); - return document.ReplaceNodeAsync(node, newNode); + return document.ReplaceNodeAsync(node, newNode, cancellationToken: cancellationToken); } private static SyntaxNode Insert(SyntaxNode node, SyntaxKind syntaxKind) diff --git a/src/NSubstitute.Analyzers.VisualBasic/Refactorings/ReplaceModifierRefactoring.cs b/src/NSubstitute.Analyzers.VisualBasic/Refactorings/ReplaceModifierRefactoring.cs index 535ece9c..aa2735d6 100644 --- a/src/NSubstitute.Analyzers.VisualBasic/Refactorings/ReplaceModifierRefactoring.cs +++ b/src/NSubstitute.Analyzers.VisualBasic/Refactorings/ReplaceModifierRefactoring.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.VisualBasic; @@ -11,14 +12,19 @@ namespace NSubstitute.Analyzers.VisualBasic.Refactorings; internal class ReplaceModifierRefactoring { - public static Task RefactorAsync(Document document, SyntaxNode node, Accessibility fromAccessibility, Accessibility toAccessibility) + public static Task RefactorAsync( + Document document, + SyntaxNode node, + Accessibility fromAccessibility, + Accessibility toAccessibility, + CancellationToken cancellationToken) { var fromSyntaxKind = InferSyntaxKind(fromAccessibility); var toSyntaxKind = InferSyntaxKind(toAccessibility); var newNode = ReplaceModifier(node, fromSyntaxKind, toSyntaxKind); - return document.ReplaceNodeAsync(node, newNode); + return document.ReplaceNodeAsync(node, newNode, cancellationToken: cancellationToken); } private static SyntaxKind InferSyntaxKind(Accessibility fromAccessibility)