Browse Source

Cleanup AspNetCoreAnalyzers (#42757)

* Cleanup AspNetCoreAnalyzers

* Fix typo

Co-authored-by: Safia Abdalla <[email protected]>
Youssef Victor 3 years ago
parent
commit
8ce81e9dac

+ 22 - 17
src/Framework/AspNetCoreAnalyzers/src/Analyzers/RenderTreeBuilder/RenderTreeBuilderAnalyzer.cs

@@ -12,48 +12,53 @@ namespace Microsoft.AspNetCore.Analyzers.RenderTreeBuilder;
 [DiagnosticAnalyzer(LanguageNames.CSharp)]
 [DiagnosticAnalyzer(LanguageNames.CSharp)]
 public partial class RenderTreeBuilderAnalyzer : DiagnosticAnalyzer
 public partial class RenderTreeBuilderAnalyzer : DiagnosticAnalyzer
 {
 {
-    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(new[]
-    {
-        DiagnosticDescriptors.DoNotUseNonLiteralSequenceNumbers,
-    });
+    private const int SequenceParameterOrdinal = 0;
+    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(DiagnosticDescriptors.DoNotUseNonLiteralSequenceNumbers);
 
 
     public override void Initialize(AnalysisContext context)
     public override void Initialize(AnalysisContext context)
     {
     {
         context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
         context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
         context.EnableConcurrentExecution();
         context.EnableConcurrentExecution();
-        context.RegisterCompilationStartAction(compilationStartAnalysisContext =>
+        context.RegisterCompilationStartAction(context =>
         {
         {
-            var compilation = compilationStartAnalysisContext.Compilation;
+            var compilation = context.Compilation;
 
 
             if (!WellKnownTypes.TryCreate(compilation, out var wellKnownTypes))
             if (!WellKnownTypes.TryCreate(compilation, out var wellKnownTypes))
             {
             {
                 return;
                 return;
             }
             }
 
 
-            compilationStartAnalysisContext.RegisterOperationAction(operationAnalysisContext =>
+            context.RegisterOperationAction(context =>
             {
             {
-                var invocation = (IInvocationOperation)operationAnalysisContext.Operation;
+                var invocation = (IInvocationOperation)context.Operation;
 
 
                 if (!IsRenderTreeBuilderMethodWithSequenceParameter(wellKnownTypes, invocation.TargetMethod))
                 if (!IsRenderTreeBuilderMethodWithSequenceParameter(wellKnownTypes, invocation.TargetMethod))
                 {
                 {
                     return;
                     return;
                 }
                 }
 
 
-                var sequenceArgument = invocation.Arguments[0];
-
-                if (!sequenceArgument.Value.Syntax.IsKind(SyntaxKind.NumericLiteralExpression))
+                foreach (var argument in invocation.Arguments)
                 {
                 {
-                    operationAnalysisContext.ReportDiagnostic(Diagnostic.Create(
-                        DiagnosticDescriptors.DoNotUseNonLiteralSequenceNumbers,
-                        sequenceArgument.Syntax.GetLocation(),
-                        sequenceArgument.Syntax.ToString()));
+                    if (argument.Parameter.Ordinal == SequenceParameterOrdinal)
+                    {
+                        if (!argument.Value.Syntax.IsKind(SyntaxKind.NumericLiteralExpression))
+                        {
+                            context.ReportDiagnostic(Diagnostic.Create(
+                                DiagnosticDescriptors.DoNotUseNonLiteralSequenceNumbers,
+                                argument.Syntax.GetLocation(),
+                                argument.Syntax.ToString()));
+                        }
+
+                        break;
+                    }
                 }
                 }
+
             }, OperationKind.Invocation);
             }, OperationKind.Invocation);
         });
         });
     }
     }
 
 
     private static bool IsRenderTreeBuilderMethodWithSequenceParameter(WellKnownTypes wellKnownTypes, IMethodSymbol targetMethod)
     private static bool IsRenderTreeBuilderMethodWithSequenceParameter(WellKnownTypes wellKnownTypes, IMethodSymbol targetMethod)
         => SymbolEqualityComparer.Default.Equals(wellKnownTypes.RenderTreeBuilder, targetMethod.ContainingType)
         => SymbolEqualityComparer.Default.Equals(wellKnownTypes.RenderTreeBuilder, targetMethod.ContainingType)
-        && targetMethod.Parameters.Length != 0
-        && targetMethod.Parameters[0].Name == "sequence";
+        && targetMethod.Parameters.Length > SequenceParameterOrdinal
+        && targetMethod.Parameters[SequenceParameterOrdinal].Name == "sequence";
 }
 }

+ 11 - 1
src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMismatchedParameterOptionality.cs

@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // The .NET Foundation licenses this file to you under the MIT license.
 
 
 using System;
 using System;
+using System.Diagnostics;
 using System.Linq;
 using System.Linq;
 using Microsoft.CodeAnalysis;
 using Microsoft.CodeAnalysis;
 using Microsoft.CodeAnalysis.Diagnostics;
 using Microsoft.CodeAnalysis.Diagnostics;
@@ -21,7 +22,16 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
             return;
             return;
         }
         }
 
 
-        var value = invocation.Arguments[1].Value;
+        IOperation? value = null;
+        foreach (var argument in invocation.Arguments)
+        {
+            if (argument.Parameter.Ordinal == 1)
+            {
+                value = argument.Value;
+            }
+        }
+
+        Debug.Assert(value is not null);
         if (value.ConstantValue is not { HasValue: true } constant ||
         if (value.ConstantValue is not { HasValue: true } constant ||
             constant.Value is not string routeTemplate)
             constant.Value is not string routeTemplate)
         {
         {

+ 3 - 12
src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMisplacedLambdaAttribute.cs

@@ -13,7 +13,6 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
 {
 {
     private static void DetectMisplacedLambdaAttribute(
     private static void DetectMisplacedLambdaAttribute(
         in OperationAnalysisContext context,
         in OperationAnalysisContext context,
-        IInvocationOperation invocation,
         IAnonymousFunctionOperation lambda)
         IAnonymousFunctionOperation lambda)
     {
     {
         // This analyzer will only process invocations that are immediate children of the
         // This analyzer will only process invocations that are immediate children of the
@@ -23,29 +22,21 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
         //    Hello();
         //    Hello();
         //    return "foo";
         //    return "foo";
         // }
         // }
-        InvocationExpressionSyntax? targetInvocation = null;
+        IMethodSymbol? methodSymbol = null;
 
 
         // () => Hello() has a single child which is a BlockOperation so we check to see if
         // () => Hello() has a single child which is a BlockOperation so we check to see if
         // expression associated with that operation is an invocation expression
         // expression associated with that operation is an invocation expression
         if (lambda.ChildOperations.FirstOrDefault().Syntax is InvocationExpressionSyntax innerInvocation)
         if (lambda.ChildOperations.FirstOrDefault().Syntax is InvocationExpressionSyntax innerInvocation)
         {
         {
-            targetInvocation = innerInvocation;
+            methodSymbol = lambda.Symbol;
         }
         }
 
 
         if (lambda.ChildOperations.FirstOrDefault().ChildOperations.FirstOrDefault() is IReturnOperation returnOperation
         if (lambda.ChildOperations.FirstOrDefault().ChildOperations.FirstOrDefault() is IReturnOperation returnOperation
             && returnOperation.ReturnedValue is IInvocationOperation returnedInvocation)
             && returnOperation.ReturnedValue is IInvocationOperation returnedInvocation)
         {
         {
-            targetInvocation = (InvocationExpressionSyntax)returnedInvocation.Syntax;
+            methodSymbol = returnedInvocation.TargetMethod;
         }
         }
 
 
-        if (targetInvocation is null)
-        {
-            return;
-        }
-
-        var methodOperation = invocation.SemanticModel.GetSymbolInfo(targetInvocation);
-        var methodSymbol = methodOperation.Symbol ?? methodOperation.CandidateSymbols.FirstOrDefault();
-
         // If no method definition was found for the lambda, then abort.
         // If no method definition was found for the lambda, then abort.
         if (methodSymbol is null)
         if (methodSymbol is null)
         {
         {

+ 6 - 4
src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowReturningActionResultFromMapMethods.cs

@@ -14,9 +14,10 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
         in OperationAnalysisContext context,
         in OperationAnalysisContext context,
         WellKnownTypes wellKnownTypes,
         WellKnownTypes wellKnownTypes,
         IInvocationOperation invocationOperation,
         IInvocationOperation invocationOperation,
-        IAnonymousFunctionOperation anonymousFunction)
+        IAnonymousFunctionOperation anonymousFunction,
+        SyntaxNode nodeForError)
     {
     {
-        DisallowReturningActionResultFromMapMethods(in context, wellKnownTypes, invocationOperation, anonymousFunction.Symbol, anonymousFunction.Body);
+        DisallowReturningActionResultFromMapMethods(in context, wellKnownTypes, invocationOperation, anonymousFunction.Symbol, anonymousFunction.Body, nodeForError);
     }
     }
 
 
     private static void DisallowReturningActionResultFromMapMethods(
     private static void DisallowReturningActionResultFromMapMethods(
@@ -24,7 +25,8 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
         WellKnownTypes wellKnownTypes,
         WellKnownTypes wellKnownTypes,
         IInvocationOperation invocationOperation,
         IInvocationOperation invocationOperation,
         IMethodSymbol methodSymbol,
         IMethodSymbol methodSymbol,
-        IBlockOperation? methodBody)
+        IBlockOperation? methodBody,
+        SyntaxNode nodeForError)
     {
     {
         var returnType = UnwrapPossibleAsyncReturnType(methodSymbol.ReturnType);
         var returnType = UnwrapPossibleAsyncReturnType(methodSymbol.ReturnType);
 
 
@@ -41,7 +43,7 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
             // if we don't have a method body, and the action is IResult or ActionResult<T> returning, produce diagnostics for the entire method.
             // if we don't have a method body, and the action is IResult or ActionResult<T> returning, produce diagnostics for the entire method.
             context.ReportDiagnostic(Diagnostic.Create(
             context.ReportDiagnostic(Diagnostic.Create(
                 DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers,
                 DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers,
-                invocationOperation.Arguments[2].Syntax.GetLocation(),
+                nodeForError.GetLocation(),
                 invocationOperation.TargetMethod.Name));
                 invocationOperation.TargetMethod.Name));
             return;
             return;
         }
         }

+ 35 - 23
src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/RouteHandlerAnalyzer.cs

@@ -14,38 +14,47 @@ namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
 [DiagnosticAnalyzer(LanguageNames.CSharp)]
 [DiagnosticAnalyzer(LanguageNames.CSharp)]
 public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
 public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
 {
 {
-    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(new[]
-    {
+    private const int DelegateParameterOrdinal = 2;
+    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(
         DiagnosticDescriptors.DoNotUseModelBindingAttributesOnRouteHandlerParameters,
         DiagnosticDescriptors.DoNotUseModelBindingAttributesOnRouteHandlerParameters,
         DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers,
         DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers,
         DiagnosticDescriptors.DetectMisplacedLambdaAttribute,
         DiagnosticDescriptors.DetectMisplacedLambdaAttribute,
         DiagnosticDescriptors.DetectMismatchedParameterOptionality
         DiagnosticDescriptors.DetectMismatchedParameterOptionality
-    });
+    );
 
 
     public override void Initialize(AnalysisContext context)
     public override void Initialize(AnalysisContext context)
     {
     {
         context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
         context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
         context.EnableConcurrentExecution();
         context.EnableConcurrentExecution();
 
 
-        context.RegisterCompilationStartAction(static compilationStartAnalysisContext =>
+        context.RegisterCompilationStartAction(static context =>
         {
         {
-            var compilation = compilationStartAnalysisContext.Compilation;
+            var compilation = context.Compilation;
             if (!WellKnownTypes.TryCreate(compilation, out var wellKnownTypes))
             if (!WellKnownTypes.TryCreate(compilation, out var wellKnownTypes))
             {
             {
                 Debug.Fail("One or more types could not be found. This usually means you are bad at spelling C# type names.");
                 Debug.Fail("One or more types could not be found. This usually means you are bad at spelling C# type names.");
                 return;
                 return;
             }
             }
 
 
-            compilationStartAnalysisContext.RegisterOperationAction(operationAnalysisContext =>
+            context.RegisterOperationAction(context =>
             {
             {
-                var invocation = (IInvocationOperation)operationAnalysisContext.Operation;
+                var invocation = (IInvocationOperation)context.Operation;
                 var targetMethod = invocation.TargetMethod;
                 var targetMethod = invocation.TargetMethod;
                 if (!IsRouteHandlerInvocation(wellKnownTypes, invocation, targetMethod))
                 if (!IsRouteHandlerInvocation(wellKnownTypes, invocation, targetMethod))
                 {
                 {
                     return;
                     return;
                 }
                 }
 
 
-                var delegateCreation = invocation.Arguments[2].Descendants().OfType<IDelegateCreationOperation>().FirstOrDefault();
+                IDelegateCreationOperation? delegateCreation = null;
+                foreach (var argument in invocation.Arguments)
+                {
+                    if (argument.Parameter.Ordinal == DelegateParameterOrdinal)
+                    {
+                        delegateCreation = argument.Descendants().OfType<IDelegateCreationOperation>().FirstOrDefault();
+                        break;
+                    }
+                }
+
                 if (delegateCreation is null)
                 if (delegateCreation is null)
                 {
                 {
                     return;
                     return;
@@ -53,42 +62,44 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
 
 
                 if (delegateCreation.Target.Kind == OperationKind.AnonymousFunction)
                 if (delegateCreation.Target.Kind == OperationKind.AnonymousFunction)
                 {
                 {
-                    var lambda = ((IAnonymousFunctionOperation)delegateCreation.Target);
-                    DisallowMvcBindArgumentsOnParameters(in operationAnalysisContext, wellKnownTypes, invocation, lambda.Symbol);
-                    DisallowReturningActionResultFromMapMethods(in operationAnalysisContext, wellKnownTypes, invocation, lambda);
-                    DetectMisplacedLambdaAttribute(operationAnalysisContext, invocation, lambda);
-                    DetectMismatchedParameterOptionality(in operationAnalysisContext, invocation, lambda.Symbol);
+                    var lambda = (IAnonymousFunctionOperation)delegateCreation.Target;
+                    DisallowMvcBindArgumentsOnParameters(in context, wellKnownTypes, invocation, lambda.Symbol);
+                    DisallowReturningActionResultFromMapMethods(in context, wellKnownTypes, invocation, lambda, delegateCreation.Syntax);
+                    DetectMisplacedLambdaAttribute(context, lambda);
+                    DetectMismatchedParameterOptionality(in context, invocation, lambda.Symbol);
                 }
                 }
                 else if (delegateCreation.Target.Kind == OperationKind.MethodReference)
                 else if (delegateCreation.Target.Kind == OperationKind.MethodReference)
                 {
                 {
                     var methodReference = (IMethodReferenceOperation)delegateCreation.Target;
                     var methodReference = (IMethodReferenceOperation)delegateCreation.Target;
-                    DisallowMvcBindArgumentsOnParameters(in operationAnalysisContext, wellKnownTypes, invocation, methodReference.Method);
-                    DetectMismatchedParameterOptionality(in operationAnalysisContext, invocation, methodReference.Method);
+                    DisallowMvcBindArgumentsOnParameters(in context, wellKnownTypes, invocation, methodReference.Method);
+                    DetectMismatchedParameterOptionality(in context, invocation, methodReference.Method);
 
 
                     var foundMethodReferenceBody = false;
                     var foundMethodReferenceBody = false;
                     if (!methodReference.Method.DeclaringSyntaxReferences.IsEmpty)
                     if (!methodReference.Method.DeclaringSyntaxReferences.IsEmpty)
                     {
                     {
                         var syntaxReference = methodReference.Method.DeclaringSyntaxReferences[0];
                         var syntaxReference = methodReference.Method.DeclaringSyntaxReferences[0];
-                        var methodOperation = invocation.SemanticModel.GetOperation(syntaxReference.GetSyntax(operationAnalysisContext.CancellationToken));
+                        var methodOperation = invocation.SemanticModel.GetOperation(syntaxReference.GetSyntax(context.CancellationToken));
                         if (methodOperation is ILocalFunctionOperation { Body: not null } localFunction)
                         if (methodOperation is ILocalFunctionOperation { Body: not null } localFunction)
                         {
                         {
                             foundMethodReferenceBody = true;
                             foundMethodReferenceBody = true;
                             DisallowReturningActionResultFromMapMethods(
                             DisallowReturningActionResultFromMapMethods(
-                                in operationAnalysisContext,
+                                in context,
                                 wellKnownTypes,
                                 wellKnownTypes,
                                 invocation,
                                 invocation,
                                 methodReference.Method,
                                 methodReference.Method,
-                                localFunction.Body);
+                                localFunction.Body,
+                                delegateCreation.Syntax);
                         }
                         }
                         else if (methodOperation is IMethodBodyOperation methodBody)
                         else if (methodOperation is IMethodBodyOperation methodBody)
                         {
                         {
                             foundMethodReferenceBody = true;
                             foundMethodReferenceBody = true;
                             DisallowReturningActionResultFromMapMethods(
                             DisallowReturningActionResultFromMapMethods(
-                                in operationAnalysisContext,
+                                in context,
                                 wellKnownTypes,
                                 wellKnownTypes,
                                 invocation,
                                 invocation,
                                 methodReference.Method,
                                 methodReference.Method,
-                                methodBody.BlockBody ?? methodBody.ExpressionBody);
+                                methodBody.BlockBody ?? methodBody.ExpressionBody,
+                                delegateCreation.Syntax);
                         }
                         }
                     }
                     }
 
 
@@ -97,11 +108,12 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
                         // it's possible we couldn't find the operation for the method reference. In this case,
                         // it's possible we couldn't find the operation for the method reference. In this case,
                         // try and provide less detailed diagnostics to the extent we can
                         // try and provide less detailed diagnostics to the extent we can
                         DisallowReturningActionResultFromMapMethods(
                         DisallowReturningActionResultFromMapMethods(
-                                in operationAnalysisContext,
+                                in context,
                                 wellKnownTypes,
                                 wellKnownTypes,
                                 invocation,
                                 invocation,
                                 methodReference.Method,
                                 methodReference.Method,
-                                methodBody: null);
+                                methodBody: null,
+                                delegateCreation.Syntax);
 
 
                     }
                     }
                 }
                 }
@@ -118,6 +130,6 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
             SymbolEqualityComparer.Default.Equals(wellKnownTypes.EndpointRouteBuilderExtensions, targetMethod.ContainingType) &&
             SymbolEqualityComparer.Default.Equals(wellKnownTypes.EndpointRouteBuilderExtensions, targetMethod.ContainingType) &&
             invocation.Arguments.Length == 3 &&
             invocation.Arguments.Length == 3 &&
             targetMethod.Parameters.Length == 3 &&
             targetMethod.Parameters.Length == 3 &&
-            SymbolEqualityComparer.Default.Equals(wellKnownTypes.Delegate, targetMethod.Parameters[2].Type);
+            SymbolEqualityComparer.Default.Equals(wellKnownTypes.Delegate, targetMethod.Parameters[DelegateParameterOrdinal].Type);
     }
     }
 }
 }

+ 26 - 27
src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs

@@ -16,24 +16,23 @@ namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder;
 [DiagnosticAnalyzer(LanguageNames.CSharp)]
 [DiagnosticAnalyzer(LanguageNames.CSharp)]
 public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
 public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
 {
 {
-    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(new[]
-    {
+    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(
         DiagnosticDescriptors.DoNotUseConfigureWebHostWithConfigureHostBuilder,
         DiagnosticDescriptors.DoNotUseConfigureWebHostWithConfigureHostBuilder,
         DiagnosticDescriptors.DoNotUseConfigureWithConfigureWebHostBuilder,
         DiagnosticDescriptors.DoNotUseConfigureWithConfigureWebHostBuilder,
         DiagnosticDescriptors.DoNotUseUseStartupWithConfigureWebHostBuilder,
         DiagnosticDescriptors.DoNotUseUseStartupWithConfigureWebHostBuilder,
         DiagnosticDescriptors.DoNotUseHostConfigureLogging,
         DiagnosticDescriptors.DoNotUseHostConfigureLogging,
         DiagnosticDescriptors.DoNotUseHostConfigureServices,
         DiagnosticDescriptors.DoNotUseHostConfigureServices,
         DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder
         DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder
-    });
+    );
 
 
     public override void Initialize(AnalysisContext context)
     public override void Initialize(AnalysisContext context)
     {
     {
         context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
         context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
         context.EnableConcurrentExecution();
         context.EnableConcurrentExecution();
 
 
-        context.RegisterCompilationStartAction(compilationStartAnalysisContext =>
+        context.RegisterCompilationStartAction(context =>
         {
         {
-            var compilation = compilationStartAnalysisContext.Compilation;
+            var compilation = context.Compilation;
             if (!WellKnownTypes.TryCreate(compilation, out var wellKnownTypes))
             if (!WellKnownTypes.TryCreate(compilation, out var wellKnownTypes))
             {
             {
                 Debug.Fail("One or more types could not be found. This usually means you are bad at spelling C# type names.");
                 Debug.Fail("One or more types could not be found. This usually means you are bad at spelling C# type names.");
@@ -66,22 +65,22 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
             };
             };
             INamedTypeSymbol[] configureHostTypes = { wellKnownTypes.ConfigureHostBuilder };
             INamedTypeSymbol[] configureHostTypes = { wellKnownTypes.ConfigureHostBuilder };
 
 
-            compilationStartAnalysisContext.RegisterOperationAction(operationAnalysisContext =>
+            context.RegisterOperationAction(context =>
             {
             {
-                var invocation = (IInvocationOperation)operationAnalysisContext.Operation;
+                var invocation = (IInvocationOperation)context.Operation;
                 var targetMethod = invocation.TargetMethod;
                 var targetMethod = invocation.TargetMethod;
 
 
                 // var builder = WebApplication.CreateBuilder();
                 // var builder = WebApplication.CreateBuilder();
                 // builder.Host.ConfigureWebHost(x => {});
                 // builder.Host.ConfigureWebHost(x => {});
                 if (IsDisallowedMethod(
                 if (IsDisallowedMethod(
-                        operationAnalysisContext,
+                        context,
                         invocation,
                         invocation,
                         targetMethod,
                         targetMethod,
                         wellKnownTypes.ConfigureHostBuilder,
                         wellKnownTypes.ConfigureHostBuilder,
                         "ConfigureWebHost",
                         "ConfigureWebHost",
                         configureWebHostTypes))
                         configureWebHostTypes))
                 {
                 {
-                    operationAnalysisContext.ReportDiagnostic(
+                    context.ReportDiagnostic(
                         CreateDiagnostic(
                         CreateDiagnostic(
                             DiagnosticDescriptors.DoNotUseConfigureWebHostWithConfigureHostBuilder,
                             DiagnosticDescriptors.DoNotUseConfigureWebHostWithConfigureHostBuilder,
                             invocation));
                             invocation));
@@ -90,14 +89,14 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
                 // var builder = WebApplication.CreateBuilder();
                 // var builder = WebApplication.CreateBuilder();
                 // builder.WebHost.Configure(x => {});
                 // builder.WebHost.Configure(x => {});
                 if (IsDisallowedMethod(
                 if (IsDisallowedMethod(
-                        operationAnalysisContext,
+                        context,
                         invocation,
                         invocation,
                         targetMethod,
                         targetMethod,
                         wellKnownTypes.ConfigureWebHostBuilder,
                         wellKnownTypes.ConfigureWebHostBuilder,
                         "Configure",
                         "Configure",
                         configureTypes))
                         configureTypes))
                 {
                 {
-                    operationAnalysisContext.ReportDiagnostic(
+                    context.ReportDiagnostic(
                         CreateDiagnostic(
                         CreateDiagnostic(
                             DiagnosticDescriptors.DoNotUseConfigureWithConfigureWebHostBuilder,
                             DiagnosticDescriptors.DoNotUseConfigureWithConfigureWebHostBuilder,
                             invocation));
                             invocation));
@@ -106,14 +105,14 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
                 // var builder = WebApplication.CreateBuilder();
                 // var builder = WebApplication.CreateBuilder();
                 // builder.WebHost.UseStartup<Startup>();
                 // builder.WebHost.UseStartup<Startup>();
                 if (IsDisallowedMethod(
                 if (IsDisallowedMethod(
-                        operationAnalysisContext,
+                        context,
                         invocation,
                         invocation,
                         targetMethod,
                         targetMethod,
                         wellKnownTypes.ConfigureWebHostBuilder,
                         wellKnownTypes.ConfigureWebHostBuilder,
                         "UseStartup",
                         "UseStartup",
                         userStartupTypes))
                         userStartupTypes))
                 {
                 {
-                    operationAnalysisContext.ReportDiagnostic(
+                    context.ReportDiagnostic(
                         CreateDiagnostic(
                         CreateDiagnostic(
                             DiagnosticDescriptors.DoNotUseUseStartupWithConfigureWebHostBuilder,
                             DiagnosticDescriptors.DoNotUseUseStartupWithConfigureWebHostBuilder,
                             invocation));
                             invocation));
@@ -122,14 +121,14 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
                 //var builder = WebApplication.CreateBuilder(args);
                 //var builder = WebApplication.CreateBuilder(args);
                 //builder.Host.ConfigureLogging(x => {})
                 //builder.Host.ConfigureLogging(x => {})
                 if (IsDisallowedMethod(
                 if (IsDisallowedMethod(
-                        operationAnalysisContext,
+                        context,
                         invocation,
                         invocation,
                         targetMethod,
                         targetMethod,
                         wellKnownTypes.ConfigureHostBuilder,
                         wellKnownTypes.ConfigureHostBuilder,
                         "ConfigureLogging",
                         "ConfigureLogging",
                         configureLoggingTypes))
                         configureLoggingTypes))
                 {
                 {
-                    operationAnalysisContext.ReportDiagnostic(
+                    context.ReportDiagnostic(
                         CreateDiagnostic(
                         CreateDiagnostic(
                             DiagnosticDescriptors.DoNotUseHostConfigureLogging,
                             DiagnosticDescriptors.DoNotUseHostConfigureLogging,
                             invocation));
                             invocation));
@@ -138,14 +137,14 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
                 //var builder = WebApplication.CreateBuilder(args);
                 //var builder = WebApplication.CreateBuilder(args);
                 //builder.WebHost.ConfigureLogging(x => {})
                 //builder.WebHost.ConfigureLogging(x => {})
                 if (IsDisallowedMethod(
                 if (IsDisallowedMethod(
-                        operationAnalysisContext,
+                        context,
                         invocation,
                         invocation,
                         targetMethod,
                         targetMethod,
                         wellKnownTypes.ConfigureWebHostBuilder,
                         wellKnownTypes.ConfigureWebHostBuilder,
                         "ConfigureLogging",
                         "ConfigureLogging",
                         configureLoggingTypes))
                         configureLoggingTypes))
                 {
                 {
-                    operationAnalysisContext.ReportDiagnostic(
+                    context.ReportDiagnostic(
                         CreateDiagnostic(
                         CreateDiagnostic(
                             DiagnosticDescriptors.DoNotUseHostConfigureLogging,
                             DiagnosticDescriptors.DoNotUseHostConfigureLogging,
                             invocation));
                             invocation));
@@ -154,14 +153,14 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
                 // var builder = WebApplication.CreateBuilder(args);
                 // var builder = WebApplication.CreateBuilder(args);
                 // builder.Host.ConfigureServices(x => {});
                 // builder.Host.ConfigureServices(x => {});
                 if (IsDisallowedMethod(
                 if (IsDisallowedMethod(
-                        operationAnalysisContext,
+                        context,
                         invocation,
                         invocation,
                         targetMethod,
                         targetMethod,
                         wellKnownTypes.ConfigureHostBuilder,
                         wellKnownTypes.ConfigureHostBuilder,
                         "ConfigureServices",
                         "ConfigureServices",
                         configureServicesTypes))
                         configureServicesTypes))
                 {
                 {
-                    operationAnalysisContext.ReportDiagnostic(
+                    context.ReportDiagnostic(
                         CreateDiagnostic(
                         CreateDiagnostic(
                             DiagnosticDescriptors.DoNotUseHostConfigureServices,
                             DiagnosticDescriptors.DoNotUseHostConfigureServices,
                             invocation));
                             invocation));
@@ -170,14 +169,14 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
                 // var builder = WebApplication.CreateBuilder(args);
                 // var builder = WebApplication.CreateBuilder(args);
                 // builder.WebHost.ConfigureServices(x => {});
                 // builder.WebHost.ConfigureServices(x => {});
                 if (IsDisallowedMethod(
                 if (IsDisallowedMethod(
-                        operationAnalysisContext,
+                        context,
                         invocation,
                         invocation,
                         targetMethod,
                         targetMethod,
                         wellKnownTypes.ConfigureWebHostBuilder,
                         wellKnownTypes.ConfigureWebHostBuilder,
                         "ConfigureServices",
                         "ConfigureServices",
                         configureServicesTypes))
                         configureServicesTypes))
                 {
                 {
-                    operationAnalysisContext.ReportDiagnostic(
+                    context.ReportDiagnostic(
                         CreateDiagnostic(
                         CreateDiagnostic(
                             DiagnosticDescriptors.DoNotUseHostConfigureServices,
                             DiagnosticDescriptors.DoNotUseHostConfigureServices,
                             invocation));
                             invocation));
@@ -186,14 +185,14 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
                 // var builder = WebApplication.CreateBuilder();
                 // var builder = WebApplication.CreateBuilder();
                 // builder.WebHost.ConfigureAppConfiguration(builder => {});
                 // builder.WebHost.ConfigureAppConfiguration(builder => {});
                 if (IsDisallowedMethod(
                 if (IsDisallowedMethod(
-                        operationAnalysisContext,
+                        context,
                         invocation,
                         invocation,
                         targetMethod,
                         targetMethod,
                         wellKnownTypes.ConfigureWebHostBuilder,
                         wellKnownTypes.ConfigureWebHostBuilder,
                         "ConfigureAppConfiguration",
                         "ConfigureAppConfiguration",
                         configureAppTypes))
                         configureAppTypes))
                 {
                 {
-                    operationAnalysisContext.ReportDiagnostic(
+                    context.ReportDiagnostic(
                         CreateDiagnostic(
                         CreateDiagnostic(
                             DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder,
                             DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder,
                             invocation));
                             invocation));
@@ -202,14 +201,14 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
                 // var builder = WebApplication.CreateBuilder();
                 // var builder = WebApplication.CreateBuilder();
                 // builder.Host.ConfigureAppConfiguration(builder => {});
                 // builder.Host.ConfigureAppConfiguration(builder => {});
                 if (IsDisallowedMethod(
                 if (IsDisallowedMethod(
-                        operationAnalysisContext,
+                        context,
                         invocation,
                         invocation,
                         targetMethod,
                         targetMethod,
                         wellKnownTypes.ConfigureHostBuilder,
                         wellKnownTypes.ConfigureHostBuilder,
                         "ConfigureAppConfiguration",
                         "ConfigureAppConfiguration",
                         configureAppTypes))
                         configureAppTypes))
                 {
                 {
-                    operationAnalysisContext.ReportDiagnostic(
+                    context.ReportDiagnostic(
                         CreateDiagnostic(
                         CreateDiagnostic(
                             DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder,
                             DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder,
                             invocation));
                             invocation));
@@ -218,14 +217,14 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
                 // var builder = WebApplication.CreateBuilder();
                 // var builder = WebApplication.CreateBuilder();
                 // builder.Host.ConfigureHostConfiguration(builder => {});
                 // builder.Host.ConfigureHostConfiguration(builder => {});
                 if (IsDisallowedMethod(
                 if (IsDisallowedMethod(
-                        operationAnalysisContext,
+                        context,
                         invocation,
                         invocation,
                         targetMethod,
                         targetMethod,
                         wellKnownTypes.ConfigureHostBuilder,
                         wellKnownTypes.ConfigureHostBuilder,
                         "ConfigureHostConfiguration",
                         "ConfigureHostConfiguration",
                         configureHostTypes))
                         configureHostTypes))
                 {
                 {
-                    operationAnalysisContext.ReportDiagnostic(
+                    context.ReportDiagnostic(
                         CreateDiagnostic(
                         CreateDiagnostic(
                             DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder,
                             DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder,
                             invocation));
                             invocation));

+ 4 - 3
src/Framework/AspNetCoreAnalyzers/src/CodeFixes/DetectMismatchedParameterOptionalityFixer.cs

@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // The .NET Foundation licenses this file to you under the MIT license.
 
 
 using System.Collections.Immutable;
 using System.Collections.Immutable;
+using System.Composition;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using Microsoft.CodeAnalysis;
 using Microsoft.CodeAnalysis;
@@ -13,6 +14,7 @@ using Microsoft.CodeAnalysis.Editing;
 
 
 namespace Microsoft.AspNetCore.Analyzers.RouteHandlers.Fixers;
 namespace Microsoft.AspNetCore.Analyzers.RouteHandlers.Fixers;
 
 
+[ExportCodeFixProvider(LanguageNames.CSharp), Shared]
 public class DetectMismatchedParameterOptionalityFixer : CodeFixProvider
 public class DetectMismatchedParameterOptionalityFixer : CodeFixProvider
 {
 {
     public override ImmutableArray<string> FixableDiagnosticIds { get; } = ImmutableArray.Create(DiagnosticDescriptors.DetectMismatchedParameterOptionality.Id);
     public override ImmutableArray<string> FixableDiagnosticIds { get; } = ImmutableArray.Create(DiagnosticDescriptors.DetectMismatchedParameterOptionality.Id);
@@ -35,7 +37,6 @@ public class DetectMismatchedParameterOptionalityFixer : CodeFixProvider
 
 
     private static async Task<Document> FixMismatchedParameterOptionality(Diagnostic diagnostic, Document document, CancellationToken cancellationToken)
     private static async Task<Document> FixMismatchedParameterOptionality(Diagnostic diagnostic, Document document, CancellationToken cancellationToken)
     {
     {
-        DocumentEditor editor = await DocumentEditor.CreateAsync(document, cancellationToken);
         var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
         var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
 
 
         if (root == null)
         if (root == null)
@@ -47,9 +48,9 @@ public class DetectMismatchedParameterOptionalityFixer : CodeFixProvider
         if (param is ParameterSyntax { Type: { } parameterType } parameterSyntax)
         if (param is ParameterSyntax { Type: { } parameterType } parameterSyntax)
         {
         {
             var newParam = parameterSyntax.WithType(SyntaxFactory.NullableType(parameterType));
             var newParam = parameterSyntax.WithType(SyntaxFactory.NullableType(parameterType));
-            editor.ReplaceNode(parameterSyntax, newParam);
+            return document.WithSyntaxRoot(root.ReplaceNode(parameterSyntax, newParam));
         }
         }
 
 
-        return editor.GetChangedDocument();
+        return document;
     }
     }
 }
 }