Skip to content

Commit 1ab519c

Browse files
authored
Address feedback from code review
1 parent 3b1a92b commit 1ab519c

File tree

7 files changed

+241
-226
lines changed

7 files changed

+241
-226
lines changed

src/Framework/Analyzer/src/DelegateEndpoints/DelegateEndpointFixer.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@ public partial class DelegateEndpointFixer : CodeFixProvider
1818
{
1919
public override ImmutableArray<string> FixableDiagnosticIds { get; } = ImmutableArray.Create(DiagnosticDescriptors.DetectMismatchedParameterOptionality.Id);
2020

21-
public sealed override FixAllProvider GetFixAllProvider()
22-
{
23-
return WellKnownFixAllProviders.BatchFixer;
24-
}
21+
public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;
2522

2623
public sealed override Task RegisterCodeFixesAsync(CodeFixContext context)
2724
{

src/Framework/Analyzer/src/DelegateEndpoints/DetectMismatchedParameterOptionality.cs

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,47 +20,51 @@ private static void DetectMismatchedParameterOptionality(
2020
IInvocationOperation invocation,
2121
IMethodSymbol methodSymbol)
2222
{
23+
if (invocation.Arguments.Length < 2)
24+
{
25+
return;
26+
}
27+
2328
var value = invocation.Arguments[1].Value;
2429
if (value.ConstantValue is not { HasValue: true } constant ||
2530
constant.Value is not string routeTemplate)
2631
{
2732
return;
2833
}
2934

30-
var parametersInArguments = methodSymbol.Parameters;
31-
var parametersInRoute = GetParametersFromRoute(routeTemplate);
32-
33-
foreach (var parameter in parametersInArguments)
35+
var allDeclarations = methodSymbol.GetAllMethodSymbolsOfPartialParts();
36+
foreach (var method in allDeclarations)
3437
{
35-
var isOptional = parameter.IsOptional || parameter.NullableAnnotation != NullableAnnotation.NotAnnotated;
36-
var location = parameter.DeclaringSyntaxReferences.SingleOrDefault()?.GetSyntax().GetLocation();
37-
var paramName = parameter.Name;
38-
var parameterFound = parametersInRoute.TryGetValue(paramName, out var routeParam);
38+
var parametersInArguments = method.Parameters;
39+
var enumerator = new RouteTokenEnumerator(routeTemplate);
3940

40-
if (!isOptional && parameterFound && routeParam.IsOptional)
41+
while (enumerator.MoveNext())
4142
{
42-
context.ReportDiagnostic(Diagnostic.Create(
43-
DiagnosticDescriptors.DetectMismatchedParameterOptionality,
44-
location,
45-
paramName));
43+
foreach (var parameter in parametersInArguments)
44+
{
45+
var paramName = parameter.Name;
46+
// If this is not the methpd parameter associated with the route
47+
// parameter then continue looking for it in the list
48+
if (!enumerator.CurrentName.Equals(paramName.AsSpan(), StringComparison.OrdinalIgnoreCase))
49+
{
50+
continue;
51+
}
52+
var argumentIsOptional = parameter.IsOptional || parameter.NullableAnnotation != NullableAnnotation.NotAnnotated;
53+
var location = parameter.DeclaringSyntaxReferences.SingleOrDefault()?.GetSyntax().GetLocation();
54+
var routeParamIsOptional = enumerator.CurrentQualifiers.IndexOf('?') > -1;
55+
56+
if (!argumentIsOptional && routeParamIsOptional)
57+
{
58+
context.ReportDiagnostic(Diagnostic.Create(
59+
DiagnosticDescriptors.DetectMismatchedParameterOptionality,
60+
location,
61+
paramName));
62+
}
63+
}
4664
}
4765
}
4866
}
4967

50-
private static IDictionary<string, RouteParameter> GetParametersFromRoute(string routeTemplate)
51-
{
52-
var enumerator = new RouteTokenEnumerator(routeTemplate);
53-
Dictionary<string, RouteParameter> result = new(StringComparer.OrdinalIgnoreCase);
54-
while (enumerator.MoveNext())
55-
{
56-
var isOptional = enumerator.CurrentQualifiers.IndexOf('?') > -1;
57-
result.Add(
58-
enumerator.CurrentName.ToString(),
59-
new RouteParameter(enumerator.CurrentName.ToString(), isOptional));
60-
}
61-
return result;
62-
}
63-
6468
internal ref struct RouteTokenEnumerator
6569
{
6670
private ReadOnlySpan<char> _routeTemplate;
@@ -132,6 +136,4 @@ private static int IndexOf(ReadOnlySpan<char> span, int startIndex, char c)
132136

133137
return -1;
134138
}
135-
136-
internal record RouteParameter(string Name, bool IsOptional);
137139
}

src/Framework/Analyzer/src/DelegateEndpoints/DiagnosticDescriptors.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ internal static class DiagnosticDescriptors
3737

3838
internal static readonly DiagnosticDescriptor DetectMismatchedParameterOptionality = new(
3939
"ASP0006",
40-
"Parameter optionality is mismatched",
41-
"'{0}' argument should be annotated as optional to match route parameter",
40+
"Route parameter and argument optionality is mismatched",
41+
"'{0}' argument should be annotated as optional or nullable to match route parameter",
4242
"Usage",
4343
DiagnosticSeverity.Warning,
4444
isEnabledByDefault: true,

0 commit comments

Comments
 (0)