Skip to content

Commit a1ed65a

Browse files
authored
[release/6.0-rc2] Rename and consolidate "DelegateEndpoint" types (#36578)
1 parent ba788d6 commit a1ed65a

23 files changed

+471
-489
lines changed

src/Framework/AspNetCoreAnalyzers/src/Analyzers/DetectMismatchedParameterOptionality.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
using Microsoft.CodeAnalysis.Diagnostics;
1010
using Microsoft.CodeAnalysis.Operations;
1111

12-
namespace Microsoft.AspNetCore.Analyzers.DelegateEndpoints;
12+
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
1313

14-
public partial class DelegateEndpointAnalyzer : DiagnosticAnalyzer
14+
public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
1515
{
1616
internal const string DetectMismatchedParameterOptionalityRuleId = "ASP0006";
1717

src/Framework/AspNetCoreAnalyzers/src/Analyzers/DetectMisplacedLambdaAttribute.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
using Microsoft.CodeAnalysis.Diagnostics;
88
using Microsoft.CodeAnalysis.Operations;
99

10-
namespace Microsoft.AspNetCore.Analyzers.DelegateEndpoints;
10+
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
1111

12-
public partial class DelegateEndpointAnalyzer : DiagnosticAnalyzer
12+
public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
1313
{
1414
private static void DetectMisplacedLambdaAttribute(
1515
in OperationAnalysisContext context,

src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,23 @@
33

44
using Microsoft.CodeAnalysis;
55

6-
namespace Microsoft.AspNetCore.Analyzers.DelegateEndpoints
6+
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers
77
{
88
[System.Diagnostics.CodeAnalysis.SuppressMessage("MicrosoftCodeAnalysisReleaseTracking", "RS2008:Enable analyzer release tracking")]
99
internal static class DiagnosticDescriptors
1010
{
11-
internal static readonly DiagnosticDescriptor DoNotUseModelBindingAttributesOnDelegateEndpointParameters = new(
11+
internal static readonly DiagnosticDescriptor DoNotUseModelBindingAttributesOnRouteHandlerParameters = new(
1212
"ASP0003",
13-
"Do not use model binding attributes with Map handlers",
13+
"Do not use model binding attributes with route handlers",
1414
"{0} should not be specified for a {1} Delegate parameter",
1515
"Usage",
1616
DiagnosticSeverity.Warning,
1717
isEnabledByDefault: true,
1818
helpLinkUri: "https://aka.ms/aspnet/analyzers");
1919

20-
internal static readonly DiagnosticDescriptor DoNotReturnActionResultsFromMapActions = new(
20+
internal static readonly DiagnosticDescriptor DoNotReturnActionResultsFromRouteHandlers = new(
2121
"ASP0004",
22-
"Do not use action results with Map actions",
22+
"Do not use action results with route handlers",
2323
"IActionResult instances should not be returned from a {0} Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.",
2424
"Usage",
2525
DiagnosticSeverity.Warning,
@@ -28,8 +28,8 @@ internal static class DiagnosticDescriptors
2828

2929
internal static readonly DiagnosticDescriptor DetectMisplacedLambdaAttribute = new(
3030
"ASP0005",
31-
"Do not place attribute on route handlers",
32-
"'{0}' should be placed on the endpoint delegate to be effective",
31+
"Do not place attribute on method called by route handler lambda",
32+
"'{0}' should be placed directly on the route handler lambda to be effective",
3333
"Usage",
3434
DiagnosticSeverity.Warning,
3535
isEnabledByDefault: true,

src/Framework/AspNetCoreAnalyzers/src/Analyzers/DisallowMvcBindArgumentsOnParameters.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
using Microsoft.CodeAnalysis.Diagnostics;
77
using Microsoft.CodeAnalysis.Operations;
88

9-
namespace Microsoft.AspNetCore.Analyzers.DelegateEndpoints;
9+
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
1010

11-
public partial class DelegateEndpointAnalyzer : DiagnosticAnalyzer
11+
public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
1212
{
1313
private static void DisallowMvcBindArgumentsOnParameters(
1414
in OperationAnalysisContext context,
@@ -33,7 +33,7 @@ private static void DisallowMvcBindArgumentsOnParameters(
3333
var methodName = invocation.TargetMethod.Name;
3434

3535
context.ReportDiagnostic(Diagnostic.Create(
36-
DiagnosticDescriptors.DoNotUseModelBindingAttributesOnDelegateEndpointParameters,
36+
DiagnosticDescriptors.DoNotUseModelBindingAttributesOnRouteHandlerParameters,
3737
location,
3838
modelBindingAttribute.AttributeClass.Name,
3939
methodName));

src/Framework/AspNetCoreAnalyzers/src/Analyzers/DisallowReturningActionResultFromMapMethods.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
using Microsoft.CodeAnalysis.Diagnostics;
77
using Microsoft.CodeAnalysis.Operations;
88

9-
namespace Microsoft.AspNetCore.Analyzers.DelegateEndpoints;
9+
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
1010

11-
public partial class DelegateEndpointAnalyzer : DiagnosticAnalyzer
11+
public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
1212
{
1313
private static void DisallowReturningActionResultFromMapMethods(
1414
in OperationAnalysisContext context,
@@ -40,7 +40,7 @@ private static void DisallowReturningActionResultFromMapMethods(
4040
{
4141
// if we don't have a method body, and the action is IResult or ActionResult<T> returning, produce diagnostics for the entire method.
4242
context.ReportDiagnostic(Diagnostic.Create(
43-
DiagnosticDescriptors.DoNotReturnActionResultsFromMapActions,
43+
DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers,
4444
invocationOperation.Arguments[2].Syntax.GetLocation(),
4545
invocationOperation.TargetMethod.Name));
4646
return;
@@ -74,7 +74,7 @@ private static void DisallowReturningActionResultFromMapMethods(
7474
if (wellKnownTypes.IActionResult.IsAssignableFrom(type))
7575
{
7676
context.ReportDiagnostic(Diagnostic.Create(
77-
DiagnosticDescriptors.DoNotReturnActionResultsFromMapActions,
77+
DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers,
7878
returnOperation.Syntax.GetLocation(),
7979
invocationOperation.TargetMethod.Name));
8080
}

src/Framework/AspNetCoreAnalyzers/src/Analyzers/DelegateEndpointAnalyzer.cs renamed to src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlerAnalyzer.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99
using Microsoft.CodeAnalysis.Diagnostics;
1010
using Microsoft.CodeAnalysis.Operations;
1111

12-
namespace Microsoft.AspNetCore.Analyzers.DelegateEndpoints;
12+
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
1313

1414
[DiagnosticAnalyzer(LanguageNames.CSharp)]
15-
public partial class DelegateEndpointAnalyzer : DiagnosticAnalyzer
15+
public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
1616
{
1717
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(new[]
1818
{
19-
DiagnosticDescriptors.DoNotUseModelBindingAttributesOnDelegateEndpointParameters,
20-
DiagnosticDescriptors.DoNotReturnActionResultsFromMapActions,
19+
DiagnosticDescriptors.DoNotUseModelBindingAttributesOnRouteHandlerParameters,
20+
DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers,
2121
DiagnosticDescriptors.DetectMisplacedLambdaAttribute,
2222
DiagnosticDescriptors.DetectMismatchedParameterOptionality
2323
});
@@ -40,7 +40,7 @@ public override void Initialize(AnalysisContext context)
4040
{
4141
var invocation = (IInvocationOperation)operationAnalysisContext.Operation;
4242
var targetMethod = invocation.TargetMethod;
43-
if (IsDelegateHandlerInvocation(wellKnownTypes, invocation, targetMethod))
43+
if (!IsRouteHandlerInvocation(wellKnownTypes, invocation, targetMethod))
4444
{
4545
return;
4646
}
@@ -109,13 +109,15 @@ public override void Initialize(AnalysisContext context)
109109
});
110110
}
111111

112-
private static bool IsDelegateHandlerInvocation(
112+
private static bool IsRouteHandlerInvocation(
113113
WellKnownTypes wellKnownTypes,
114114
IInvocationOperation invocation,
115115
IMethodSymbol targetMethod)
116116
{
117-
return !targetMethod.Name.StartsWith("Map", StringComparison.Ordinal) ||
118-
!SymbolEqualityComparer.Default.Equals(wellKnownTypes.DelegateEndpointRouteBuilderExtensions, targetMethod.ContainingType) ||
119-
invocation.Arguments.Length != 3;
117+
return targetMethod.Name.StartsWith("Map", StringComparison.Ordinal) &&
118+
SymbolEqualityComparer.Default.Equals(wellKnownTypes.EndpointRouteBuilderExtensions, targetMethod.ContainingType) &&
119+
invocation.Arguments.Length == 3 &&
120+
targetMethod.Parameters.Length == 3 &&
121+
SymbolEqualityComparer.Default.Equals(wellKnownTypes.Delegate, targetMethod.Parameters[2].Type);
120122
}
121123
}

src/Framework/AspNetCoreAnalyzers/src/Analyzers/WellKnownTypes.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,21 @@
44
using System.Diagnostics.CodeAnalysis;
55
using Microsoft.CodeAnalysis;
66

7-
namespace Microsoft.AspNetCore.Analyzers.DelegateEndpoints;
7+
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
88

99
internal sealed class WellKnownTypes
1010
{
1111
public static bool TryCreate(Compilation compilation, [NotNullWhen(true)] out WellKnownTypes? wellKnownTypes)
1212
{
1313
wellKnownTypes = default;
14-
const string DelegateEndpointRouteBuilderExtensions = "Microsoft.AspNetCore.Builder.DelegateEndpointRouteBuilderExtensions";
15-
if (compilation.GetTypeByMetadataName(DelegateEndpointRouteBuilderExtensions) is not { } delegateEndpointRouteBuilderExtensions)
14+
const string EndpointRouteBuilderExtensions = "Microsoft.AspNetCore.Builder.EndpointRouteBuilderExtensions";
15+
if (compilation.GetTypeByMetadataName(EndpointRouteBuilderExtensions) is not { } endpointRouteBuilderExtensions)
16+
{
17+
return false;
18+
}
19+
20+
const string Delegate = "System.Delegate";
21+
if (compilation.GetTypeByMetadataName(Delegate) is not { } @delegate)
1622
{
1723
return false;
1824
}
@@ -51,7 +57,8 @@ public static bool TryCreate(Compilation compilation, [NotNullWhen(true)] out We
5157

5258
wellKnownTypes = new WellKnownTypes
5359
{
54-
DelegateEndpointRouteBuilderExtensions = delegateEndpointRouteBuilderExtensions,
60+
EndpointRouteBuilderExtensions = endpointRouteBuilderExtensions,
61+
Delegate = @delegate,
5562
IBinderTypeProviderMetadata = ibinderTypeProviderMetadata,
5663
BindAttribute = bindAttribute,
5764
IResult = iResult,
@@ -62,7 +69,8 @@ public static bool TryCreate(Compilation compilation, [NotNullWhen(true)] out We
6269
return true;
6370
}
6471

65-
public ITypeSymbol DelegateEndpointRouteBuilderExtensions { get; private init; }
72+
public INamedTypeSymbol EndpointRouteBuilderExtensions { get; private init; }
73+
public INamedTypeSymbol Delegate { get; private init; }
6674
public INamedTypeSymbol IBinderTypeProviderMetadata { get; private init; }
6775
public INamedTypeSymbol BindAttribute { get; private init; }
6876
public INamedTypeSymbol IResult { get; private init; }

src/Framework/AspNetCoreAnalyzers/src/CodeFixes/DetectMismatchedParameterOptionalityFixer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
using System.Threading;
66
using System.Collections.Immutable;
77
using System.Threading.Tasks;
8-
using Microsoft.AspNetCore.Analyzers.DelegateEndpoints;
8+
using Microsoft.AspNetCore.Analyzers.RouteHandlers;
99
using Microsoft.CodeAnalysis;
1010
using Microsoft.CodeAnalysis.CSharp;
1111
using Microsoft.CodeAnalysis.CSharp.Syntax;
1212
using Microsoft.CodeAnalysis.CodeFixes;
1313
using Microsoft.CodeAnalysis.CodeActions;
1414
using Microsoft.CodeAnalysis.Editing;
1515

16-
namespace Microsoft.AspNetCore.Analyzers.DelegateEndpoints.Fixers;
16+
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers.Fixers;
1717

1818
public class DetectMismatchedParameterOptionalityFixer : CodeFixProvider
1919
{

src/Framework/AspNetCoreAnalyzers/test/MinimalActions/DetectMismatchedParameterOptionalityTest.cs renamed to src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DetectMismatchedParameterOptionalityTest.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33

44
using Microsoft.CodeAnalysis.Testing;
55
using Xunit;
6-
using VerifyCS = Microsoft.AspNetCore.Analyzers.DelegateEndpoints.CSharpDelegateEndpointsCodeFixVerifier<
7-
Microsoft.AspNetCore.Analyzers.DelegateEndpoints.DelegateEndpointAnalyzer,
8-
Microsoft.AspNetCore.Analyzers.DelegateEndpoints.Fixers.DetectMismatchedParameterOptionalityFixer>;
6+
using VerifyCS = Microsoft.AspNetCore.Analyzers.RouteHandlers.CSharpRouteHandlerCodeFixVerifier<
7+
Microsoft.AspNetCore.Analyzers.RouteHandlers.RouteHandlerAnalyzer,
8+
Microsoft.AspNetCore.Analyzers.RouteHandlers.Fixers.DetectMismatchedParameterOptionalityFixer>;
99

10-
namespace Microsoft.AspNetCore.Analyzers.DelegateEndpoints;
10+
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
1111

1212
public partial class DetectMismatchedParameterOptionalityTest
1313
{
@@ -377,7 +377,7 @@ public async Task MatchingRequiredOptionality_WithDisabledNullability()
377377
public void RouteTokenizer_Works_ForSimpleRouteTemplates(string template, string[] expectedNames, string[] expectedQualifiers)
378378
{
379379
// Arrange
380-
var tokenizer = new DelegateEndpointAnalyzer.RouteTokenEnumerator(template);
380+
var tokenizer = new RouteHandlerAnalyzer.RouteTokenEnumerator(template);
381381
var actualNames = new List<string>();
382382
var actualQualifiers = new List<string>();
383383

src/Framework/AspNetCoreAnalyzers/test/MinimalActions/DetectMisplacedLambdaAttributeTest.cs renamed to src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DetectMisplacedLambdaAttributeTest.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
using Microsoft.AspNetCore.Analyzer.Testing;
66
using Xunit;
77

8-
namespace Microsoft.AspNetCore.Analyzers.DelegateEndpoints;
8+
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
99

1010
public partial class DetectMisplacedLambdaAttributeTest
1111
{
12-
private TestDiagnosticAnalyzerRunner Runner { get; } = new(new DelegateEndpointAnalyzer());
12+
private TestDiagnosticAnalyzerRunner Runner { get; } = new(new RouteHandlerAnalyzer());
1313

1414
[Fact]
1515
public async Task MinimalAction_WithCorrectlyPlacedAttribute_Works()
@@ -48,7 +48,7 @@ void Hello() { }
4848
var diagnostic = Assert.Single(diagnostics);
4949
Assert.Same(DiagnosticDescriptors.DetectMisplacedLambdaAttribute, diagnostic.Descriptor);
5050
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
51-
Assert.Equal("'AuthorizeAttribute' should be placed on the endpoint delegate to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
51+
Assert.Equal("'AuthorizeAttribute' should be placed directly on the route handler lambda to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
5252
}
5353

5454
[Fact]
@@ -70,7 +70,7 @@ public async Task MinimalAction_WithMisplacedAttributeAndBlockSyntax_ProducesDia
7070
var diagnostic = Assert.Single(diagnostics);
7171
Assert.Same(DiagnosticDescriptors.DetectMisplacedLambdaAttribute, diagnostic.Descriptor);
7272
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
73-
Assert.Equal("'AuthorizeAttribute' should be placed on the endpoint delegate to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
73+
Assert.Equal("'AuthorizeAttribute' should be placed directly on the route handler lambda to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
7474
}
7575

7676
[Fact]
@@ -95,12 +95,12 @@ void Hello() { }
9595
diagnostic => {
9696
Assert.Same(DiagnosticDescriptors.DetectMisplacedLambdaAttribute, diagnostic.Descriptor);
9797
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
98-
Assert.Equal("'AuthorizeAttribute' should be placed on the endpoint delegate to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
98+
Assert.Equal("'AuthorizeAttribute' should be placed directly on the route handler lambda to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
9999
},
100100
diagnostic => {
101101
Assert.Same(DiagnosticDescriptors.DetectMisplacedLambdaAttribute, diagnostic.Descriptor);
102102
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
103-
Assert.Equal("'ProducesAttribute' should be placed on the endpoint delegate to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
103+
Assert.Equal("'ProducesAttribute' should be placed directly on the route handler lambda to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
104104
}
105105
);
106106
}
@@ -126,7 +126,7 @@ void Hello() { }
126126
diagnostic => {
127127
Assert.Same(DiagnosticDescriptors.DetectMisplacedLambdaAttribute, diagnostic.Descriptor);
128128
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
129-
Assert.Equal("'ProducesAttribute' should be placed on the endpoint delegate to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
129+
Assert.Equal("'ProducesAttribute' should be placed directly on the route handler lambda to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
130130
}
131131
);
132132
}
@@ -215,7 +215,7 @@ public static void Hello() { }
215215
var diagnostic = Assert.Single(diagnostics);
216216
Assert.Same(DiagnosticDescriptors.DetectMisplacedLambdaAttribute, diagnostic.Descriptor);
217217
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
218-
Assert.Equal("'AuthorizeAttribute' should be placed on the endpoint delegate to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
218+
Assert.Equal("'AuthorizeAttribute' should be placed directly on the route handler lambda to be effective", diagnostic.GetMessage(CultureInfo.InvariantCulture));
219219
}
220220

221221
[Fact]

src/Framework/AspNetCoreAnalyzers/test/MinimalActions/DisallowMvcBindArgumentsOnParametersTest.cs renamed to src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DisallowMvcBindArgumentsOnParametersTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
using Microsoft.AspNetCore.Analyzer.Testing;
66
using Xunit;
77

8-
namespace Microsoft.AspNetCore.Analyzers.DelegateEndpoints;
8+
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
99

1010
public partial class DisallowMvcBindArgumentsOnParametersTest
1111
{
12-
private TestDiagnosticAnalyzerRunner Runner { get; } = new(new DelegateEndpointAnalyzer());
12+
private TestDiagnosticAnalyzerRunner Runner { get; } = new(new RouteHandlerAnalyzer());
1313

1414
[Fact]
1515
public async Task MinimalAction_WithoutBindAttributes_Works()
@@ -59,7 +59,7 @@ public async Task MinimalAction_Lambda_WithBindAttributes_ProducesDiagnostics()
5959

6060
// Assert
6161
var diagnostic = Assert.Single(diagnostics);
62-
Assert.Same(DiagnosticDescriptors.DoNotUseModelBindingAttributesOnDelegateEndpointParameters, diagnostic.Descriptor);
62+
Assert.Same(DiagnosticDescriptors.DoNotUseModelBindingAttributesOnRouteHandlerParameters, diagnostic.Descriptor);
6363
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
6464
Assert.Equal("BindAttribute should not be specified for a MapGet Delegate parameter", diagnostic.GetMessage(CultureInfo.InvariantCulture));
6565
}
@@ -81,7 +81,7 @@ static void PostWithBind(/*MM*/[ModelBinder] string name) {}
8181

8282
// Assert
8383
var diagnostic = Assert.Single(diagnostics);
84-
Assert.Same(DiagnosticDescriptors.DoNotUseModelBindingAttributesOnDelegateEndpointParameters, diagnostic.Descriptor);
84+
Assert.Same(DiagnosticDescriptors.DoNotUseModelBindingAttributesOnRouteHandlerParameters, diagnostic.Descriptor);
8585
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
8686
Assert.Equal("ModelBinderAttribute should not be specified for a MapPost Delegate parameter", diagnostic.GetMessage(CultureInfo.InvariantCulture));
8787
}

0 commit comments

Comments
 (0)