Skip to content

Commit 57156d0

Browse files
committed
Remove compilation from Foundation
1 parent 0eb5f57 commit 57156d0

File tree

7 files changed

+163
-36
lines changed

7 files changed

+163
-36
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace Codelisk.GeneratorAttributes.WebAttributes.Dto
6+
{
7+
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
8+
public class DtoBaseAttribute : Attribute { }
9+
}

src/GeneratorHelper/Foundation.Crawler/Extensions/New/DtoExtensions.cs

+74-3
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ namespace Foundation.Crawler.Extensions.New
1616
{
1717
public static class DtoExtensions
1818
{
19-
public static IEnumerable<IPropertySymbol> DtoForeignProperties(
19+
public static IEnumerable<PropertyDeclarationSyntax> DtoForeignProperties(
2020
this RecordDeclarationSyntax dto,
21-
SemanticModel semanticModel
21+
IEnumerable<RecordDeclarationSyntax> baseDtos
2222
)
2323
{
24-
return dto.GetAllPropertiesWithBaseClass(semanticModel, true)
24+
return dto.DtoProperties(baseDtos)
2525
.Where(x => x.HasAttribute(AttributeNames.ForeignKey));
2626
}
2727

@@ -74,6 +74,46 @@ this IncrementalGeneratorInitializationContext context
7474
return combinedDtosProvider!;
7575
}
7676

77+
public static IncrementalValueProvider<ImmutableArray<RecordDeclarationSyntax>> BaseDtos(
78+
this IncrementalGeneratorInitializationContext context
79+
)
80+
{
81+
var dtos = context
82+
.SyntaxProvider.ForAttributeWithMetadataName(
83+
typeof(DtoBaseAttribute).FullName,
84+
static (n, _) => n is RecordDeclarationSyntax,
85+
static (context, cancellationToken) =>
86+
{
87+
RecordDeclarationSyntax classDeclarationSyntax = (RecordDeclarationSyntax)
88+
context.TargetNode;
89+
90+
return classDeclarationSyntax.HasAttribute<DtoBaseAttribute>()
91+
? classDeclarationSyntax
92+
: null;
93+
}
94+
)
95+
.Where(static typeDeclaration => typeDeclaration is not null)
96+
.Collect();
97+
98+
return dtos;
99+
}
100+
101+
public static IEnumerable<PropertyDeclarationSyntax> DtoProperties(
102+
this RecordDeclarationSyntax dto,
103+
IEnumerable<RecordDeclarationSyntax> baseDtos
104+
)
105+
{
106+
// Annahme: dto ist eine RecordDeclarationSyntax oder ClassDeclarationSyntax
107+
var allProperties = new List<PropertyDeclarationSyntax>();
108+
109+
// Füge die Properties der aktuellen Klasse (dto) hinzu
110+
allProperties.AddRange(dto.GetProperties());
111+
112+
// Extrahiere rekursiv die Properties der Basisklassen
113+
ExtractBaseProperties(dto.BaseList, baseDtos, allProperties);
114+
return allProperties;
115+
}
116+
77117
private static string GetNamespace(SyntaxNode node)
78118
{
79119
var nameSpace = string.Empty;
@@ -128,5 +168,36 @@ public static string GetEntityName(this RecordDeclarationSyntax dto, bool plural
128168
}
129169
return name;
130170
}
171+
172+
static void ExtractBaseProperties(
173+
BaseListSyntax baseList,
174+
IEnumerable<RecordDeclarationSyntax> baseDtos,
175+
List<PropertyDeclarationSyntax> properties
176+
)
177+
{
178+
if (baseList == null)
179+
return; // Keine Basisklasse vorhanden
180+
181+
foreach (var baseTypeSyntax in baseList.Types)
182+
{
183+
// Hole den Namen der Basisklasse
184+
var baseTypeName = baseTypeSyntax.Type.GetName();
185+
186+
if (!string.IsNullOrEmpty(baseTypeName))
187+
{
188+
// Suche nach der Basisklasse in den bekannten baseDtos
189+
var baseDto = baseDtos.FirstOrDefault(x => x.Identifier.Text == baseTypeName);
190+
191+
if (baseDto != null)
192+
{
193+
// Füge die Properties der Basisklasse hinzu
194+
properties.AddRange(baseDto.GetProperties());
195+
196+
// Rekursiv weitermachen, falls diese Basisklasse ebenfalls eine Basisklasse hat
197+
ExtractBaseProperties(baseDto.BaseList, baseDtos, properties);
198+
}
199+
}
200+
}
201+
}
131202
}
132203
}

src/GeneratorHelper/Generators.Base/Extensions/New/RecordDeclarationSyntax.cs

+20
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,26 @@ public static string GetNamespace(this RecordDeclarationSyntax RecordDeclaration
9696
return null;
9797
}
9898

99+
public static IEnumerable<PropertyDeclarationSyntax> GetProperties(
100+
this RecordDeclarationSyntax classSyntax
101+
)
102+
{
103+
return classSyntax.Members.OfType<PropertyDeclarationSyntax>();
104+
}
105+
106+
// Hilfsmethode, um eine Klasse im Syntaxbaum zu finden
107+
private static ClassDeclarationSyntax FindClassInSyntaxTree(
108+
string className,
109+
BaseTypeSyntax rootSyntax
110+
)
111+
{
112+
// Suche im Syntaxbaum nach der Klasse mit dem angegebenen Namen
113+
return rootSyntax
114+
.DescendantNodes()
115+
.OfType<ClassDeclarationSyntax>()
116+
.FirstOrDefault(c => c.Identifier.Text.Equals(className, StringComparison.Ordinal));
117+
}
118+
99119
public static IEnumerable<IPropertySymbol>? GetAllPropertiesWithBaseClass(
100120
this RecordDeclarationSyntax RecordDeclaration,
101121
SemanticModel semanticModel,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using Microsoft.CodeAnalysis.CSharp.Syntax;
5+
6+
namespace Generators.Base.Extensions.New
7+
{
8+
public static class TypeSyntaxExtensions
9+
{
10+
public static string GetName(this TypeSyntax typeSyntax)
11+
{
12+
// Überprüfe, ob es ein IdentifierNameSyntax ist
13+
if (typeSyntax is IdentifierNameSyntax identifierName)
14+
{
15+
return identifierName.Identifier.Text;
16+
}
17+
18+
// Überprüfe, ob es ein QualifiedNameSyntax ist (z.B. Namespace.Class)
19+
if (typeSyntax is QualifiedNameSyntax qualifiedName)
20+
{
21+
return qualifiedName.ToString(); // Oder qualifiedName.Right.Identifier.Text; je nach Anforderung
22+
}
23+
24+
// Überprüfe, ob es ein GenericNameSyntax ist (z.B. List<string>)
25+
if (typeSyntax is GenericNameSyntax genericName)
26+
{
27+
return genericName.Identifier.Text; // Der Name der generischen Klasse
28+
}
29+
30+
// Weitere Typen könnten hier hinzugefügt werden
31+
32+
return null; // Rückgabe, wenn kein passender Typ gefunden wurde
33+
}
34+
}
35+
}

src/Generators/Foundation/Codelisk.Foundation.Generator/Generators/EntityGenerator.cs

+10-10
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,18 @@ internal class EntityGenerator : BaseGenerator
2626
public override void Initialize(IncrementalGeneratorInitializationContext context)
2727
{
2828
var dtos = context.Dtos();
29-
var compilationAndClasses = context.CompilationProvider.Combine(dtos);
29+
var baseDtosAndClasses = context.BaseDtos().Combine(dtos);
3030
context.RegisterImplementationSourceOutput(
31-
compilationAndClasses,
32-
static (sourceProductionContext, compilationAndClasses) =>
31+
baseDtosAndClasses,
32+
static (sourceProductionContext, baseDtosAndClasses) =>
3333
{
34-
var dtos = compilationAndClasses.Right;
34+
var dtos = baseDtosAndClasses.Right;
3535
var result = new List<CodeBuilder?>();
3636
var nameSpace = dtos.First().GetNamespace();
3737
foreach (var dto in dtos)
3838
{
3939
var builder = CodeBuilder.Create(nameSpace);
40-
Class(builder, dto, compilationAndClasses.Left);
40+
Class(builder, dto, baseDtosAndClasses.Left);
4141
result.Add(builder);
4242
}
4343
var codeBuildersTuples = new List<(
@@ -57,7 +57,7 @@ public override void Initialize(IncrementalGeneratorInitializationContext contex
5757
private static IReadOnlyList<ClassBuilder> Class(
5858
CodeBuilder builder,
5959
RecordDeclarationSyntax dto,
60-
Compilation compilation
60+
IEnumerable<RecordDeclarationSyntax> baseDtos
6161
)
6262
{
6363
var result = builder
@@ -69,15 +69,15 @@ Compilation compilation
6969

7070
result.AddConstructor();
7171
var constructor = result.AddConstructor().AddParameter(dto.Identifier.Text);
72-
var semanticModel = compilation.GetSemanticModel(dto.SyntaxTree);
73-
var properties = dto.GetAllPropertiesWithBaseClass(semanticModel, true);
72+
73+
var allProperties = dto.DtoProperties(baseDtos);
7474

7575
constructor.WithBody(x =>
7676
{
77-
foreach (var property in properties)
77+
foreach (var property in allProperties)
7878
{
7979
x.AppendLine(
80-
$"this.{property.Name} = {dto.GetName().GetParameterName()}.{property.Name};"
80+
$"this.{property.GetPropertyName()} = {dto.GetName().GetParameterName()}.{property.GetPropertyName()};"
8181
);
8282
}
8383
});

src/Generators/Foundation/Codelisk.Foundation.Generator/Generators/ExtensionsGenerator.cs

+7-8
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ internal class ExtensionsGenerator : BaseGenerator
2121
public override void Initialize(IncrementalGeneratorInitializationContext context)
2222
{
2323
var dtos = context.Dtos();
24-
var compilationAndClasses = context.CompilationProvider.Combine(dtos);
24+
var baseDtosAndClasses = context.BaseDtos().Combine(dtos);
2525
context.RegisterImplementationSourceOutput(
26-
compilationAndClasses,
27-
static (sourceProductionContext, compilationAndClasses) =>
26+
baseDtosAndClasses,
27+
static (sourceProductionContext, baseDtosAndClasses) =>
2828
{
29-
var dtos = compilationAndClasses.Right;
29+
var dtos = baseDtosAndClasses.Right;
3030
var result = new List<CodeBuilder?>();
3131
var nameSpace = dtos.First().GetNamespace();
3232

3333
var builder = CodeBuilder.Create(nameSpace);
34-
Class(builder, dtos, compilationAndClasses.Left);
34+
Class(builder, dtos, baseDtosAndClasses.Left);
3535
result.Add(builder);
3636

3737
var codeBuildersTuples = new List<(
@@ -51,7 +51,7 @@ public override void Initialize(IncrementalGeneratorInitializationContext contex
5151
private static List<CodeBuilder?> Class(
5252
CodeBuilder builder,
5353
ImmutableArray<RecordDeclarationSyntax> dtos,
54-
Compilation compilation
54+
IEnumerable<RecordDeclarationSyntax> baseDtos
5555
)
5656
{
5757
var result = new List<CodeBuilder?>();
@@ -64,8 +64,7 @@ Compilation compilation
6464

6565
foreach (var dto in dtos)
6666
{
67-
var semanticModel = compilation.GetSemanticModel(dto.SyntaxTree);
68-
var properties = dto.GetAllPropertiesWithBaseClass(semanticModel, true);
67+
var properties = dto.DtoProperties(baseDtos);
6968
var dtoName = dto.GetName();
7069
var entityName = dto.GetEntityName();
7170
extensionsClass

src/Generators/Foundation/Codelisk.Foundation.Generator/Generators/FullModelGenerator.cs

+8-15
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,17 @@ public class FullModelGenerator : BaseGenerator
2222
public override void Initialize(IncrementalGeneratorInitializationContext context)
2323
{
2424
var dtos = context.Dtos();
25-
var compilationAndClasses = context.CompilationProvider.Combine(dtos);
25+
var baseDtosAndClasses = context.BaseDtos().Combine(dtos);
2626
context.RegisterImplementationSourceOutput(
27-
compilationAndClasses,
28-
static (sourceProductionContext, compilationAndClasses) =>
27+
baseDtosAndClasses,
28+
static (sourceProductionContext, baseDtosAndClasses) =>
2929
{
3030
var result = new List<CodeBuilder?>();
31-
var nameSpace = compilationAndClasses.Right.First().GetNamespace();
32-
foreach (var dto in compilationAndClasses.Right)
31+
var nameSpace = baseDtosAndClasses.Right.First().GetNamespace();
32+
foreach (var dto in baseDtosAndClasses.Right)
3333
{
3434
var builder = CodeBuilder.Create(nameSpace);
35-
Class(
36-
builder,
37-
dto,
38-
compilationAndClasses.Right,
39-
compilationAndClasses.Left
40-
);
35+
Class(builder, dto, baseDtosAndClasses.Right, baseDtosAndClasses.Left);
4136
result.Add(builder);
4237
}
4338
var codeBuildersTuples = new List<(
@@ -58,7 +53,7 @@ private static IReadOnlyList<ClassBuilder> Class(
5853
CodeBuilder builder,
5954
RecordDeclarationSyntax dto,
6055
ImmutableArray<RecordDeclarationSyntax> dtos,
61-
Compilation compilation
56+
IEnumerable<RecordDeclarationSyntax> baseDtos
6257
)
6358
{
6459
var result = builder
@@ -71,9 +66,7 @@ Compilation compilation
7166
.SetType(dto.GetName())
7267
.UseAutoProps();
7368

74-
//Removed for performance result.AddDtoUsing(context);
75-
var semanticModel = compilation.GetSemanticModel(dto.SyntaxTree);
76-
var dtoPropertiesWithForeignKey = dto.DtoForeignProperties(semanticModel);
69+
var dtoPropertiesWithForeignKey = dto.DtoForeignProperties(baseDtos);
7770

7871
foreach (var dtoProperty in dtoPropertiesWithForeignKey)
7972
{

0 commit comments

Comments
 (0)