Ejemplo n.º 1
0
        private void ProcessMethod(IMethodSymbol methodSymbol, RoutingAttributesAnalyzer routingAttributesAnalyzer, StringBuilder methodSourceBuilder)
        {
            string route;
            var    requestAttribute = routingAttributesAnalyzer.GetGetMethodAttribute(methodSymbol, out route);

            if (requestAttribute == null)
            {
                requestAttribute = routingAttributesAnalyzer.GetPostMethodAttribute(methodSymbol, out route);
            }
            if (requestAttribute == null)
            {
                requestAttribute = routingAttributesAnalyzer.GetPutMethodAttribute(methodSymbol, out route);
            }
            if (requestAttribute == null)
            {
                requestAttribute = routingAttributesAnalyzer.GetDeleteMethodAttribute(methodSymbol, out route);
            }
            if (requestAttribute == null)
            {
                requestAttribute = routingAttributesAnalyzer.GetPatchMethodAttribute(methodSymbol, out route);
            }
            if (requestAttribute == null)
            {
                requestAttribute = routingAttributesAnalyzer.GetOptionsMethodAttribute(methodSymbol, out route);
            }
            if (requestAttribute == null)
            {
                requestAttribute = routingAttributesAnalyzer.GetHeadMethodAttribute(methodSymbol, out route);
            }

            if (requestAttribute != null)
            {
                var returnType = methodSymbol.ReturnType.ToDisplayString(NullableFlowState.None, SymbolDisplayFormat.FullyQualifiedFormat);
                methodSourceBuilder.Append($@"
		{requestAttribute ?? ""}
		{returnType} {methodSymbol.Name}("        );

                var delimeter = "";
                foreach (var parameterSymbol in methodSymbol.Parameters)
                {
                    methodSourceBuilder.Append(delimeter);
                    ProcessMethodParameter(parameterSymbol, route, routingAttributesAnalyzer, methodSourceBuilder);
                    delimeter = ", ";
                }
                methodSourceBuilder.AppendLine(");");
            }
        }
Ejemplo n.º 2
0
        public void Execute(GeneratorExecutionContext context)
        {
            if (!(context.SyntaxReceiver is SyntaxReceiver receiver))
            {
                return;
            }

            var baseControllerSymbol      = context.Compilation.GetTypeByMetadataName("Microsoft.AspNetCore.Mvc.ControllerBase");
            var routingAttributesAnalyzer = new RoutingAttributesAnalyzer(context);

            foreach (var controllerDeclaration in receiver.Controllers)
            {
                var semanticModel   = context.Compilation.GetSemanticModel(controllerDeclaration.SyntaxTree);
                var namedTypeSymbol = semanticModel.GetDeclaredSymbol(controllerDeclaration) as INamedTypeSymbol;
                if (namedTypeSymbol.InheritsFrom(baseControllerSymbol))
                {
                    ProcessController(context, namedTypeSymbol, routingAttributesAnalyzer);
                }
            }
        }
Ejemplo n.º 3
0
        private void ProcessController(GeneratorExecutionContext context, INamedTypeSymbol controllerClassSymbol, RoutingAttributesAnalyzer routingAttributesAnalyzer)
        {
            var namespaceName = controllerClassSymbol.ContainingNamespace.ToDisplayString();
            var interfaceName = $"I{controllerClassSymbol.Name}";

            var basePathAttribute = routingAttributesAnalyzer.GetBasePathAttribute(controllerClassSymbol);

            var interfaceSourceBuilder = new StringBuilder($@"
using RestEase;

namespace {namespaceName}
{{
	{ basePathAttribute ?? "" }
	public interface {interfaceName}
	{{
");

            foreach (var methodSymbol in controllerClassSymbol.GetMembers().OfType <IMethodSymbol>().Where(m => m.MethodKind == MethodKind.Ordinary && m.DeclaredAccessibility == Accessibility.Public))
            {
                ProcessMethod(methodSymbol, routingAttributesAnalyzer, interfaceSourceBuilder);
            }
            interfaceSourceBuilder.Append(@"
	} 
}");
#if DEBUG && LAUNCH_DEBUGGER
            System.Diagnostics.Debugger.Launch();
#endif
            context.AddSource($"{interfaceName}.generated.cs", SourceText.From(interfaceSourceBuilder.ToString(), Encoding.UTF8));
        }
Ejemplo n.º 4
0
        private void ProcessMethodParameter(IParameterSymbol parameterSymbol, string route, RoutingAttributesAnalyzer routingAttributesAnalyzer, StringBuilder parameterSourceBuilder)
        {
            var bodyParameterAttribute   = routingAttributesAnalyzer.GetBodyParameterAttribute(parameterSymbol);
            var headerParameterAttribute = routingAttributesAnalyzer.GetHeaderParameterAttribute(parameterSymbol);
            var queryParameterAttribute  = routingAttributesAnalyzer.GetQueryParameterAttribute(parameterSymbol);
            var pathParameterAttribute   = routingAttributesAnalyzer.GetPathParameterAttribute(parameterSymbol, route);

            if (bodyParameterAttribute != null)
            {
                parameterSourceBuilder.Append(bodyParameterAttribute).Append(" ");
            }
            else if (headerParameterAttribute != null)
            {
                parameterSourceBuilder.Append(headerParameterAttribute).Append(" ");
            }
            else if (queryParameterAttribute != null)
            {
                parameterSourceBuilder.Append(queryParameterAttribute).Append(" ");
            }
            else if (pathParameterAttribute != null)
            {
                parameterSourceBuilder.Append(pathParameterAttribute).Append(" ");
            }

            parameterSourceBuilder.Append(parameterSymbol.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat))
            .Append(" ").Append(parameterSymbol.Name);
        }