@@ -64,8 +64,10 @@ private static void DisallowNonParsableComplexTypesOnParameters(
64
64
location
65
65
) ) { continue ; }
66
66
67
+ var routeParameterName = ResolveRouteParameterName ( handlerDelegateParameter , wellKnownTypes ) ;
68
+
67
69
// Match handler parameter against route parameters. If it is a route parameter it needs to be parsable/bindable in some fashion.
68
- if ( routeUsage . RoutePattern . TryGetRouteParameter ( handlerDelegateParameter . Name , out var routeParameter ) )
70
+ if ( routeUsage . RoutePattern . TryGetRouteParameter ( routeParameterName , out var routeParameter ) )
69
71
{
70
72
var parsability = ParsabilityHelper . GetParsability ( parameterTypeSymbol , wellKnownTypes ) ;
71
73
var bindability = ParsabilityHelper . GetBindability ( parameterTypeSymbol , wellKnownTypes ) ;
@@ -77,7 +79,7 @@ private static void DisallowNonParsableComplexTypesOnParameters(
77
79
context . ReportDiagnostic ( Diagnostic . Create (
78
80
descriptor ,
79
81
location ,
80
- routeParameter . Name ,
82
+ handlerDelegateParameter . Name ,
81
83
parameterTypeSymbol . Name
82
84
) ) ;
83
85
}
@@ -86,10 +88,36 @@ private static void DisallowNonParsableComplexTypesOnParameters(
86
88
}
87
89
}
88
90
89
- static bool HasAttributeImplementingFromMetadataInterfaceType ( IParameterSymbol parameter , WellKnownType fromMetadataInterfaceType , WellKnownTypes wellKnownTypes )
91
+ static string ResolveRouteParameterName ( IParameterSymbol parameterSymbol , WellKnownTypes wellKnownTypes )
92
+ {
93
+ if ( ! TryGetFromMetadataInterfaceTypeAttributeData ( parameterSymbol , WellKnownType . Microsoft_AspNetCore_Http_Metadata_IFromRouteMetadata , wellKnownTypes , out var attributeData ) )
94
+ {
95
+ return parameterSymbol . Name ; // No route metadata attribute!
96
+ }
97
+
98
+ foreach ( var namedArgument in attributeData . NamedArguments )
99
+ {
100
+ if ( namedArgument . Key == "Name" )
101
+ {
102
+ var routeParameterNameConstant = namedArgument . Value ;
103
+ var routeParameterName = ( string ) routeParameterNameConstant . Value ! ;
104
+ return routeParameterName ; // Have attribute & name is specified.
105
+ }
106
+ }
107
+
108
+ return parameterSymbol . Name ; // We have the attribute, but name isn't specified!
109
+ }
110
+
111
+ static bool TryGetFromMetadataInterfaceTypeAttributeData ( IParameterSymbol parameterSymbol , WellKnownType fromMetadataInterfaceType , WellKnownTypes wellknowTypes , out AttributeData attributeData )
112
+ {
113
+ var fromMetadataInterfaceTypeSymbol = wellknowTypes . Get ( fromMetadataInterfaceType ) ;
114
+ attributeData = parameterSymbol . GetAttributes ( ) . SingleOrDefault ( ad => ad . AttributeClass . Implements ( fromMetadataInterfaceTypeSymbol ) ) ! ;
115
+ return attributeData != null ;
116
+ }
117
+
118
+ static bool HasAttributeImplementingFromMetadataInterfaceType ( IParameterSymbol parameterSymbol , WellKnownType fromMetadataInterfaceType , WellKnownTypes wellKnownTypes )
90
119
{
91
- var fromMetadataInterfaceTypeSymbol = wellKnownTypes . Get ( fromMetadataInterfaceType ) ;
92
- return parameter . GetAttributes ( ) . Any ( ad => ad . AttributeClass . Implements ( fromMetadataInterfaceTypeSymbol ) ) ;
120
+ return TryGetFromMetadataInterfaceTypeAttributeData ( parameterSymbol , fromMetadataInterfaceType , wellKnownTypes , out var _ ) ;
93
121
}
94
122
95
123
static bool ReportFromAttributeDiagnostic ( OperationAnalysisContext context , WellKnownType fromMetadataInterfaceType , WellKnownTypes wellKnownTypes , IParameterSymbol parameter , INamedTypeSymbol parameterTypeSymbol , Location location )
0 commit comments