private static PooledList <ParameterPair> GetPairs(UrlTemplate template, IMethodSymbol method) { var list = PooledList <ParameterPair> .Borrow(); foreach (var parameter in method.Parameters) { if (IsFromRoute(parameter)) { list.Add(template.Path.TrySingle(x => x.Parameter?.Name.Text == parameter.Name, out var templateParameter) ? new ParameterPair(templateParameter.Parameter, parameter) : new ParameterPair(null, parameter)); } } foreach (var component in template.Path) { if (component.Parameter is TemplateParameter templateParameter && list.All(x => x.Template != templateParameter)) { list.Add(new ParameterPair(templateParameter, null)); } } return(list); }
private static bool TryGetTemplate(AttributeSyntax attribute, SyntaxNodeAnalysisContext context, out UrlTemplate template) { if (attribute.ArgumentList is AttributeArgumentListSyntax argumentList && argumentList.Arguments.TrySingle(out var argument) && argument.Expression is LiteralExpressionSyntax literal && literal.IsKind(SyntaxKind.StringLiteralExpression) && (Attribute.IsType(attribute, KnownSymbol.HttpDeleteAttribute, context.SemanticModel, context.CancellationToken) || Attribute.IsType(attribute, KnownSymbol.HttpGetAttribute, context.SemanticModel, context.CancellationToken) || Attribute.IsType(attribute, KnownSymbol.HttpPatchAttribute, context.SemanticModel, context.CancellationToken) || Attribute.IsType(attribute, KnownSymbol.HttpPostAttribute, context.SemanticModel, context.CancellationToken) || Attribute.IsType(attribute, KnownSymbol.HttpPutAttribute, context.SemanticModel, context.CancellationToken)) && UrlTemplate.TryParse(literal, out template)) { return(true); } template = default(UrlTemplate); return(false); }
private static PooledList <ParameterPair> GetPairs(UrlTemplate template, IMethodSymbol method) { var list = PooledList <ParameterPair> .Borrow(); foreach (var parameter in method.Parameters) { if (IsFromRoute(parameter)) { list.Add(template.Path.TrySingle(x => x.Parameter?.Name.Equals(parameter.Name, StringComparison.Ordinal) == true, out var templateParameter) ? new ParameterPair(templateParameter.Parameter, parameter) : new ParameterPair(null, parameter)); } } foreach (var component in template.Path) { if (component.Parameter is TemplateParameter templateParameter && list.All(x => x.Route != templateParameter)) { list.Add(new ParameterPair(templateParameter, null)); } } return(list); bool IsFromRoute(IParameterSymbol p) { foreach (var attributeData in p.GetAttributes()) { if (attributeData.AttributeClass == KnownSymbol.FromRouteAttribute) { continue; } return(false); } return(true); } }