Remove duplicate using statements

This commit is contained in:
2025-04-16 12:44:29 +02:00
parent 014bdc9372
commit eeadee069f
2 changed files with 21 additions and 31 deletions
@@ -2,24 +2,25 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<Version>0.8.22</Version> <Version>0.9.0</Version>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>Alexandru Macocian</Authors> <Authors>Alexandru Macocian</Authors>
<Description>Source generators extensions for Net.Sdk.Web. Generates mapping to be used in AOT projects.</Description> <Description>Source generators extensions for Net.Sdk.Web. Generates mapping to be used in AOT projects.</Description>
<EnableNETAnalyzers>true</EnableNETAnalyzers> <EnableNETAnalyzers>true</EnableNETAnalyzers>
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules> <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
<EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
<IsRoslynComponent>true</IsRoslynComponent> <IsRoslynComponent>true</IsRoslynComponent>
<IsRoslynAnalyzer>true</IsRoslynAnalyzer> <IsRoslynAnalyzer>true</IsRoslynAnalyzer>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4"> <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.9.0" PrivateAssets="all" /> <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.13.0" PrivateAssets="all" />
<PackageReference Include="Sybil" Version="0.8.4" PrivateAssets="all" /> <PackageReference Include="Sybil" Version="0.8.4" PrivateAssets="all" />
</ItemGroup> </ItemGroup>
@@ -2,12 +2,9 @@
using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Sybil; using Sybil;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices;
using System.Text; using System.Text;
namespace Net.Sdk.Web.Extensions.SourceGenerators; namespace Net.Sdk.Web.Extensions.SourceGenerators;
@@ -68,16 +65,17 @@ public class UseRoutesGenerator : IIncrementalGenerator
} }
var languageVersion = maybeLanguageVersion.Value; var languageVersion = maybeLanguageVersion.Value;
var builder = SyntaxBuilder.CreateCompilationUnit() var routeUsings = new HashSet<string>
.WithUsing(Constants.UsingSystemThreading) {
.WithUsing(Constants.UsingMicrosoftAspNetCoreRouting) Constants.UsingSystemThreading,
.WithUsing(Constants.UsingMicrosoftAspNetCoreHttp) Constants.UsingMicrosoftAspNetCoreRouting,
.WithUsing(Constants.UsingMicrosoftAspNetCoreBuilder) Constants.UsingMicrosoftAspNetCoreHttp,
.WithUsing(Constants.UsingMicrosoftAspNetCoreMvc) Constants.UsingMicrosoftAspNetCoreBuilder,
.WithUsing(Constants.UsingSystemRuntimeCompilerServices); Constants.UsingMicrosoftAspNetCoreMvc,
Constants.UsingSystemRuntimeCompilerServices
};
var routeUsings = new HashSet<string>(); var builder = SyntaxBuilder.CreateCompilationUnit();
var namespaceBuilder = languageVersion >= LanguageVersion.CSharp10 ? SyntaxBuilder.CreateFileScopedNamespace(Constants.Namespace) : SyntaxBuilder.CreateNamespace(Constants.Namespace); var namespaceBuilder = languageVersion >= LanguageVersion.CSharp10 ? SyntaxBuilder.CreateFileScopedNamespace(Constants.Namespace) : SyntaxBuilder.CreateNamespace(Constants.Namespace);
builder.WithNamespace(namespaceBuilder); builder.WithNamespace(namespaceBuilder);
var webAppBuilder = SyntaxBuilder.CreateClass(Constants.WebApplicationExtensionsName) var webAppBuilder = SyntaxBuilder.CreateClass(Constants.WebApplicationExtensionsName)
@@ -88,13 +86,7 @@ public class UseRoutesGenerator : IIncrementalGenerator
.WithModifiers($"{Constants.Public} {Constants.Static}") .WithModifiers($"{Constants.Public} {Constants.Static}")
.WithAttribute(SyntaxBuilder.CreateAttribute(Constants.MethodImplAttribute) .WithAttribute(SyntaxBuilder.CreateAttribute(Constants.MethodImplAttribute)
.WithRawArgument(Constants.MethodImplArgument)); .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(useRoutesWebAppMethodBuilder);
webAppBuilder.WithMethod(registerWebAppMethodBuilder);
var useRoutesWebAppBody = new StringBuilder(); var useRoutesWebAppBody = new StringBuilder();
foreach (var classToMethodMap in classToMethodMapping) foreach (var classToMethodMap in classToMethodMapping)
@@ -164,22 +156,22 @@ public class UseRoutesGenerator : IIncrementalGenerator
var innerPattern = $"/{pattern?.Trim('/')}"; var innerPattern = $"/{pattern?.Trim('/')}";
var finalPattern = $"{outerPattern}{innerPattern}".Replace("//", "/"); 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) GetMethodBodyByType("Get", finalPattern, classDeclarationSyntax, methodDeclarationSyntax, compilation, routeUsings) is string getMethodBody)
{ {
useRoutesWebAppBody.AppendLine(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) GetMethodBodyByType("Post", finalPattern, classDeclarationSyntax, methodDeclarationSyntax, compilation, routeUsings) is string postMethodBody)
{ {
useRoutesWebAppBody.AppendLine(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) GetMethodBodyByType("Put", finalPattern, classDeclarationSyntax, methodDeclarationSyntax, compilation, routeUsings) is string putMethodBoty)
{ {
useRoutesWebAppBody.AppendLine(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) GetMethodBodyByType("Delete", finalPattern, classDeclarationSyntax, methodDeclarationSyntax, compilation, routeUsings) is string deleteMethodBody)
{ {
useRoutesWebAppBody.AppendLine(deleteMethodBody); useRoutesWebAppBody.AppendLine(deleteMethodBody);
@@ -189,7 +181,6 @@ public class UseRoutesGenerator : IIncrementalGenerator
useRoutesWebAppBody.AppendLine("return builder;"); useRoutesWebAppBody.AppendLine("return builder;");
useRoutesWebAppMethodBuilder.WithBody(useRoutesWebAppBody.ToString()); useRoutesWebAppMethodBuilder.WithBody(useRoutesWebAppBody.ToString());
registerWebAppMethodBuilder.WithBody(useRoutesWebAppBody.ToString());
foreach (var classUsing in routeUsings) foreach (var classUsing in routeUsings)
{ {
builder.WithUsing(classUsing); builder.WithUsing(classUsing);
@@ -231,15 +222,13 @@ public class UseRoutesGenerator : IIncrementalGenerator
return true; return true;
})) }))
{ {
if (attribute.Name is not GenericNameSyntax genericNameSyntax || genericNameSyntax.TypeArgumentList.Arguments.Count != 1) if (attribute.Name is not GenericNameSyntax genericNameSyntax || genericNameSyntax.TypeArgumentList.Arguments.Count != 1)
{ {
continue; continue;
} }
var routeFilterTypeSyntax = genericNameSyntax.TypeArgumentList.Arguments[0]; var routeFilterTypeSyntax = genericNameSyntax.TypeArgumentList.Arguments[0];
var routeFilterTypeSymbol = semanticModel.GetSymbolInfo(routeFilterTypeSyntax).Symbol as ITypeSymbol; if (semanticModel.GetSymbolInfo(routeFilterTypeSyntax).Symbol is not ITypeSymbol routeFilterTypeSymbol)
if (routeFilterTypeSymbol is null)
{ {
continue; continue;
} }
@@ -273,10 +262,10 @@ public class UseRoutesGenerator : IIncrementalGenerator
return returnTypeSymbol?.ToDisplayString() switch return returnTypeSymbol?.ToDisplayString() switch
{ {
"System.Threading.Tasks.Task<Microsoft.AspNetCore.Http.IResult>" => @$" "System.Threading.Tasks.Task<Microsoft.AspNetCore.Http.IResult>" => @$"
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; var cancellationToken = httpContext.RequestAborted;
return route.{methodDeclarationSyntax.Identifier}({variables}); return await route.{methodDeclarationSyntax.Identifier}({variables});
}}){routeFilterSb};", }}){routeFilterSb};",
"Microsoft.AspNetCore.Http.IResult" => @$" "Microsoft.AspNetCore.Http.IResult" => @$"
builder.Map{type}(""{pattern}"", (HttpContext httpContext, {classDeclarationSyntax.Identifier} route{(parameters.Length > 0 ? $", {parameters}" : "")}) => builder.Map{type}(""{pattern}"", (HttpContext httpContext, {classDeclarationSyntax.Identifier} route{(parameters.Length > 0 ? $", {parameters}" : "")}) =>