Skip to content

Commit bb4e04b

Browse files
committed
fix: Fixed API generator to consider Aliases types
1 parent 0b01532 commit bb4e04b

File tree

13 files changed

+502
-174
lines changed

13 files changed

+502
-174
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace Tools.Generators.Web.Api.UnitTests.TestData.ADirectory;
2+
3+
public interface INestedAliasedDependency
4+
{
5+
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace Tools.Generators.Web.Api.UnitTests.TestData;
2+
3+
public class AnAliasedType
4+
{
5+
6+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
namespace Tools.Generators.Web.Api.UnitTests.TestData;
2+
3+
public interface IAliasedDependency
4+
{
5+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
</PropertyGroup>
6+
7+
</Project>

src/Framework/Tools/Tools.Generators.Web.Api.UnitTests/MinimalApiGeneratorSpec.cs

Lines changed: 209 additions & 21 deletions
Large diffs are not rendered by default.

src/Framework/Tools/Tools.Generators.Web.Api.UnitTests/Tools.Generators.Web.Api.UnitTests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
</PropertyGroup>
77

88
<ItemGroup>
9+
<ProjectReference Include="..\Tools.Generators.Web.Api.UnitTests.TestData\Tools.Generators.Web.Api.UnitTests.TestData.csproj" />
910
<ProjectReference Include="..\Tools.Generators.Web.Api\Tools.Generators.Web.Api.csproj" Aliases="Generators" />
1011
<ProjectReference Include="..\..\Testing\UnitTesting.CodeAnalysis.Common\UnitTesting.CodeAnalysis.Common.csproj" />
1112
</ItemGroup>

src/Framework/Tools/Tools.Generators.Web.Api.UnitTests/WebApiAssemblyVisitorSpec.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ public string AMethod(ARequest request)
403403
registration.Class.Constructors.First().MethodBody.Should().BeEmpty();
404404
registration.Class.TypeName.Name.Should().Be("AServiceClass");
405405
registration.Class.TypeName.Namespace.Should().Be("ANamespace");
406-
registration.Class.TypeName.FullName.Should().Be("ANamespace.AServiceClass");
406+
registration.Class.TypeName.FullName.Should().Be("global::ANamespace.AServiceClass");
407407
registration.Class.UsingNamespaces.Count().Should().Be(2);
408408
registration.MethodBody.Should().Be($" {{{Environment.NewLine}"
409409
+ $" return \"\";{Environment.NewLine}"
@@ -458,7 +458,7 @@ public string AMethod(ARequest request)
458458
registration.Class.Constructors.First().MethodBody.Should().BeEmpty();
459459
registration.Class.TypeName.Name.Should().Be("AServiceClass");
460460
registration.Class.TypeName.Namespace.Should().Be("ANamespace");
461-
registration.Class.TypeName.FullName.Should().Be("ANamespace.AServiceClass");
461+
registration.Class.TypeName.FullName.Should().Be("global::ANamespace.AServiceClass");
462462
registration.Class.UsingNamespaces.Count().Should().Be(2);
463463
registration.MethodBody.Should().Be($" {{{Environment.NewLine}"
464464
+ $" return \"\";{Environment.NewLine}"
@@ -515,7 +515,7 @@ public string AMethod(ARequest request)
515515
registration.Class.Constructors.First().MethodBody.Should().BeEmpty();
516516
registration.Class.TypeName.Name.Should().Be("AServiceClass");
517517
registration.Class.TypeName.Namespace.Should().Be("ANamespace");
518-
registration.Class.TypeName.FullName.Should().Be("ANamespace.AServiceClass");
518+
registration.Class.TypeName.FullName.Should().Be("global::ANamespace.AServiceClass");
519519
registration.Class.UsingNamespaces.Count().Should().Be(2);
520520
registration.MethodBody.Should().Be($" {{{Environment.NewLine}"
521521
+ $" return \"\";{Environment.NewLine}"

src/Framework/Tools/Tools.Generators.Web.Api/Extensions/SymbolExtensions.cs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using Common.Extensions;
12
using Microsoft.CodeAnalysis;
23
using Microsoft.CodeAnalysis.CSharp.Syntax;
34

@@ -43,17 +44,41 @@ public static IEnumerable<string> GetUsingNamespaces(this INamedTypeSymbol symbo
4344
: symbol.DeclaringSyntaxReferences.FirstOrDefault();
4445
if (syntaxReference is null)
4546
{
46-
return Enumerable.Empty<string>();
47+
return [];
4748
}
4849

49-
var usingSyntaxes = syntaxReference.SyntaxTree.GetRoot()
50+
var root = syntaxReference.SyntaxTree.GetRoot();
51+
var usingSyntaxes = root
5052
.DescendantNodes()
5153
.OfType<UsingDirectiveSyntax>();
52-
53-
return usingSyntaxes.Select(us => us.Name!.ToString())
54+
var aliasSyntaxes = root
55+
.DescendantNodes()
56+
.OfType<ExternAliasDirectiveSyntax>();
57+
58+
var usingDeclarations = usingSyntaxes
59+
.Select(uds =>
60+
{
61+
if (uds.Name is QualifiedNameSyntax qualifiedName)
62+
{
63+
if (uds.Alias.Exists())
64+
{
65+
return $"{uds.Alias.ToFullString()}{qualifiedName.ToFullString()}";
66+
}
67+
}
68+
69+
return uds.Name!.ToFullString();
70+
})
5471
.Distinct()
55-
.OrderByDescending(s => s)
72+
.OrderByDescending(s => s);
73+
var aliasDeclarations = aliasSyntaxes
74+
.Select(us => us.ToString())
75+
.Distinct()
76+
.OrderByDescending(s => s);
77+
var namespaces = usingDeclarations
78+
.Concat(aliasDeclarations)
5679
.ToList();
80+
81+
return namespaces;
5782
}
5883

5984
public static bool IsClass(this ITypeSymbol type)

src/Framework/Tools/Tools.Generators.Web.Api/MinimalApiGenerator.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,15 @@ private static string BuildUsingList(
8484
.SelectMany(registration => registration.Class.UsingNamespaces)
8585
.Concat(RequiredUsingNamespaces)
8686
.Distinct()
87-
.OrderByDescending(s => s)
87+
.Select(s => s.StartsWith("extern alias")
88+
? s
89+
: $"using {s};")
90+
.OrderByDescending(s => s.StartsWith("extern alias")) // extern aliases
91+
.ThenByDescending(s => !s.Contains(" = ")) // regular usings
92+
.ThenByDescending(s => s) // aliased usings
8893
.ToList();
8994

90-
allNamespaces.ForEach(@using => usingList.AppendLine($"using {@using};"));
95+
allNamespaces.ForEach(@using => usingList.AppendLine(@using));
9196

9297
return usingList.ToString();
9398
}
@@ -123,7 +128,7 @@ private static void BuildEndpointRegistrations(
123128
endpointRegistrations.AppendLine(
124129
$" {groupName}.{endPointMethodName}(\"{registration.RoutePath}\",");
125130
endpointRegistrations.AppendLine(
126-
$" async (global::System.IServiceProvider serviceProvider, global::{registration.RequestDto.FullName} request) =>");
131+
$" async (global::System.IServiceProvider serviceProvider, {registration.RequestDto.FullName} request) =>");
127132
endpointRegistrations.AppendLine(
128133
$" {methodBody})");
129134

@@ -268,7 +273,7 @@ private static string BuildHandlerBody(WebApiAssemblyVisitor.ServiceOperationReg
268273
handlerMethod.AppendLine(
269274
$" static async Task<global::Microsoft.AspNetCore.Http.IResult>"
270275
+ $" Handle(global::System.IServiceProvider services, "
271-
+ $"global::{registration.RequestDto.FullName} request, "
276+
+ $"{registration.RequestDto.FullName} request, "
272277
+ $"global::System.Threading.CancellationToken cancellationToken)");
273278
handlerMethod.AppendLine(" {");
274279

@@ -294,7 +299,7 @@ private static string BuildHandlerBody(WebApiAssemblyVisitor.ServiceOperationReg
294299
}
295300

296301
handlerMethod.AppendLine(
297-
$" var api = new global::{registration.Class.TypeName.FullName}({callingParameters});");
302+
$" var api = new {registration.Class.TypeName.FullName}({callingParameters});");
298303
var asyncAwait = registration.IsAsync
299304
? "await "
300305
: string.Empty;

src/Framework/Tools/Tools.Generators.Web.Api/Tools.Generators.Web.Api.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
<Compile Include="..\..\Common\Extensions\ObjectExtensions.cs">
3939
<Link>Reference\Common\Extensions\ObjectExtensions.cs</Link>
4040
</Compile>
41+
<Compile Include="..\..\Infrastructure\Infrastructure.Interfaces\ICallerContextFactory.cs">
42+
<Link>Reference\Infrastructure.Interfaces\ICallerContextFactory.cs</Link>
43+
</Compile>
4144
<Compile Include="..\..\Infrastructure\Infrastructure.Web.Api.Interfaces\IWebApiService.cs">
4245
<Link>Reference\Infrastructure.Web.Api.Interfaces\IWebApiService.cs</Link>
4346
</Compile>

0 commit comments

Comments
 (0)