diff --git a/Net.Sdk.Web.Extensions.SourceGenerators/Net.Sdk.Web.Extensions.SourceGenerators.csproj b/Net.Sdk.Web.Extensions.SourceGenerators/Net.Sdk.Web.Extensions.SourceGenerators.csproj index c5fdfa7..1e04d7d 100644 --- a/Net.Sdk.Web.Extensions.SourceGenerators/Net.Sdk.Web.Extensions.SourceGenerators.csproj +++ b/Net.Sdk.Web.Extensions.SourceGenerators/Net.Sdk.Web.Extensions.SourceGenerators.csproj @@ -2,24 +2,25 @@ netstandard2.0 - 0.8.22 + 0.9.0 latest true Alexandru Macocian Source generators extensions for Net.Sdk.Web. Generates mapping to be used in AOT projects. true true + true true true true - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/Net.Sdk.Web.Extensions.SourceGenerators/UseRoutesGenerator.cs b/Net.Sdk.Web.Extensions.SourceGenerators/UseRoutesGenerator.cs index 65f2d89..782645e 100644 --- a/Net.Sdk.Web.Extensions.SourceGenerators/UseRoutesGenerator.cs +++ b/Net.Sdk.Web.Extensions.SourceGenerators/UseRoutesGenerator.cs @@ -2,12 +2,9 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Sybil; -using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Diagnostics; using System.Linq; -using System.Runtime.CompilerServices; using System.Text; namespace Net.Sdk.Web.Extensions.SourceGenerators; @@ -68,16 +65,17 @@ public class UseRoutesGenerator : IIncrementalGenerator } var languageVersion = maybeLanguageVersion.Value; - var builder = SyntaxBuilder.CreateCompilationUnit() - .WithUsing(Constants.UsingSystemThreading) - .WithUsing(Constants.UsingMicrosoftAspNetCoreRouting) - .WithUsing(Constants.UsingMicrosoftAspNetCoreHttp) - .WithUsing(Constants.UsingMicrosoftAspNetCoreBuilder) - .WithUsing(Constants.UsingMicrosoftAspNetCoreMvc) - .WithUsing(Constants.UsingSystemRuntimeCompilerServices); + var routeUsings = new HashSet + { + Constants.UsingSystemThreading, + Constants.UsingMicrosoftAspNetCoreRouting, + Constants.UsingMicrosoftAspNetCoreHttp, + Constants.UsingMicrosoftAspNetCoreBuilder, + Constants.UsingMicrosoftAspNetCoreMvc, + Constants.UsingSystemRuntimeCompilerServices + }; - var routeUsings = new HashSet(); - + var builder = SyntaxBuilder.CreateCompilationUnit(); var namespaceBuilder = languageVersion >= LanguageVersion.CSharp10 ? SyntaxBuilder.CreateFileScopedNamespace(Constants.Namespace) : SyntaxBuilder.CreateNamespace(Constants.Namespace); builder.WithNamespace(namespaceBuilder); var webAppBuilder = SyntaxBuilder.CreateClass(Constants.WebApplicationExtensionsName) @@ -88,13 +86,7 @@ public class UseRoutesGenerator : IIncrementalGenerator .WithModifiers($"{Constants.Public} {Constants.Static}") .WithAttribute(SyntaxBuilder.CreateAttribute(Constants.MethodImplAttribute) .WithRawArgument(Constants.MethodImplArgument)); - var registerWebAppMethodBuilder = SyntaxBuilder.CreateMethod(Constants.WebApplicationTypeName, Constants.RegisterRoutesMethodName) - .WithParameter(Constants.WebApplicationTypeName, Constants.BuilderParameterName) - .WithModifiers($"{Constants.Public} {Constants.Static}") - .WithAttribute(SyntaxBuilder.CreateAttribute(Constants.MethodImplAttribute) - .WithRawArgument(Constants.MethodImplArgument)); webAppBuilder.WithMethod(useRoutesWebAppMethodBuilder); - webAppBuilder.WithMethod(registerWebAppMethodBuilder); var useRoutesWebAppBody = new StringBuilder(); foreach (var classToMethodMap in classToMethodMapping) @@ -164,22 +156,22 @@ public class UseRoutesGenerator : IIncrementalGenerator var innerPattern = $"/{pattern?.Trim('/')}"; var finalPattern = $"{outerPattern}{innerPattern}".Replace("//", "/"); - if (methodAttributes.FirstOrDefault(a => a.Name.ToString() is Constants.GetAttributeName or Constants.GetAttributeShortName) is AttributeSyntax && + if (methodAttributes.FirstOrDefault(a => a.Name.ToString() is Constants.GetAttributeName or Constants.GetAttributeShortName) is not null && GetMethodBodyByType("Get", finalPattern, classDeclarationSyntax, methodDeclarationSyntax, compilation, routeUsings) is string getMethodBody) { useRoutesWebAppBody.AppendLine(getMethodBody); } - else if (methodAttributes.FirstOrDefault(a => a.Name.ToString() is Constants.PostAttributeName or Constants.PostAttributeShortName) is AttributeSyntax && + else if (methodAttributes.FirstOrDefault(a => a.Name.ToString() is Constants.PostAttributeName or Constants.PostAttributeShortName) is not null && GetMethodBodyByType("Post", finalPattern, classDeclarationSyntax, methodDeclarationSyntax, compilation, routeUsings) is string postMethodBody) { useRoutesWebAppBody.AppendLine(postMethodBody); } - else if (methodAttributes.FirstOrDefault(a => a.Name.ToString() is Constants.PutAttributeName or Constants.PutAttributeShortName) is AttributeSyntax && + else if (methodAttributes.FirstOrDefault(a => a.Name.ToString() is Constants.PutAttributeName or Constants.PutAttributeShortName) is not null && GetMethodBodyByType("Put", finalPattern, classDeclarationSyntax, methodDeclarationSyntax, compilation, routeUsings) is string putMethodBoty) { useRoutesWebAppBody.AppendLine(putMethodBoty); } - else if (methodAttributes.FirstOrDefault(a => a.Name.ToString() is Constants.DeleteAttributeName or Constants.DeleteAttributeShortName) is AttributeSyntax && + else if (methodAttributes.FirstOrDefault(a => a.Name.ToString() is Constants.DeleteAttributeName or Constants.DeleteAttributeShortName) is not null && GetMethodBodyByType("Delete", finalPattern, classDeclarationSyntax, methodDeclarationSyntax, compilation, routeUsings) is string deleteMethodBody) { useRoutesWebAppBody.AppendLine(deleteMethodBody); @@ -189,7 +181,6 @@ public class UseRoutesGenerator : IIncrementalGenerator useRoutesWebAppBody.AppendLine("return builder;"); useRoutesWebAppMethodBuilder.WithBody(useRoutesWebAppBody.ToString()); - registerWebAppMethodBuilder.WithBody(useRoutesWebAppBody.ToString()); foreach (var classUsing in routeUsings) { builder.WithUsing(classUsing); @@ -231,15 +222,13 @@ public class UseRoutesGenerator : IIncrementalGenerator return true; })) { - if (attribute.Name is not GenericNameSyntax genericNameSyntax || genericNameSyntax.TypeArgumentList.Arguments.Count != 1) { continue; } var routeFilterTypeSyntax = genericNameSyntax.TypeArgumentList.Arguments[0]; - var routeFilterTypeSymbol = semanticModel.GetSymbolInfo(routeFilterTypeSyntax).Symbol as ITypeSymbol; - if (routeFilterTypeSymbol is null) + if (semanticModel.GetSymbolInfo(routeFilterTypeSyntax).Symbol is not ITypeSymbol routeFilterTypeSymbol) { continue; } @@ -273,10 +262,10 @@ public class UseRoutesGenerator : IIncrementalGenerator return returnTypeSymbol?.ToDisplayString() switch { "System.Threading.Tasks.Task" => @$" - builder.Map{type}(""{pattern}"", (HttpContext httpContext, {classDeclarationSyntax.Identifier} route{(parameters.Length > 0 ? $", {parameters}" : "")}) => + builder.Map{type}(""{pattern}"", async (HttpContext httpContext, {classDeclarationSyntax.Identifier} route{(parameters.Length > 0 ? $", {parameters}" : "")}) => {{ var cancellationToken = httpContext.RequestAborted; - return route.{methodDeclarationSyntax.Identifier}({variables}); + return await route.{methodDeclarationSyntax.Identifier}({variables}); }}){routeFilterSb};", "Microsoft.AspNetCore.Http.IResult" => @$" builder.Map{type}(""{pattern}"", (HttpContext httpContext, {classDeclarationSyntax.Identifier} route{(parameters.Length > 0 ? $", {parameters}" : "")}) =>