Skip to content

Commit 604425a

Browse files
committed
Number of generics is part of the type hint name.
1 parent a45c39f commit 604425a

14 files changed

+343
-4
lines changed

src/Thinktecture.Runtime.Extensions.SourceGenerator/CodeAnalysis/AdHocUnions/AdHocUnionSourceGenState.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public sealed class AdHocUnionSourceGenState : ITypeInformation, IEquatable<AdHo
55
public string? Namespace { get; }
66
public string Name { get; }
77
public IReadOnlyList<ContainingTypeState> ContainingTypes { get; }
8+
89
public string TypeFullyQualified { get; }
910
public string TypeMinimallyQualified { get; }
1011
public bool IsReferenceType { get; }
@@ -14,6 +15,7 @@ public sealed class AdHocUnionSourceGenState : ITypeInformation, IEquatable<AdHo
1415
public bool IsEqualWithReferenceEquality => false;
1516

1617
public IReadOnlyList<AdHocUnionMemberTypeState> MemberTypes { get; }
18+
public IReadOnlyList<string> GenericsFullyQualified => [];
1719
public AdHocUnionSettings Settings { get; }
1820

1921
public AdHocUnionSourceGenState(

src/Thinktecture.Runtime.Extensions.SourceGenerator/CodeAnalysis/INamespaceAndName.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ public interface INamespaceAndName
55
string? Namespace { get; }
66
string Name { get; }
77
IReadOnlyList<ContainingTypeState> ContainingTypes { get; }
8+
IReadOnlyList<string> GenericsFullyQualified { get; }
89
}

src/Thinktecture.Runtime.Extensions.SourceGenerator/CodeAnalysis/KeyedSerializerGeneratorState.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace Thinktecture.CodeAnalysis;
99
public string? Namespace => Type.Namespace;
1010
public IReadOnlyList<ContainingTypeState> ContainingTypes => Type.ContainingTypes;
1111
public string Name => Type.Name;
12+
public IReadOnlyList<string> GenericsFullyQualified => [];
1213

1314
public KeyedSerializerGeneratorState(
1415
ITypeInformation type,

src/Thinktecture.Runtime.Extensions.SourceGenerator/CodeAnalysis/SmartEnums/EnumSourceGeneratorState.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public sealed class EnumSourceGeneratorState : ITypeInformation, IEquatable<Enum
88
public string TypeMinimallyQualified { get; }
99
public bool IsEqualWithReferenceEquality => !Settings.IsValidatable;
1010
public IReadOnlyList<ContainingTypeState> ContainingTypes { get; }
11+
public IReadOnlyList<string> GenericsFullyQualified => [];
1112

1213
public KeyMemberState? KeyMember { get; }
1314
public ValidationErrorState ValidationError { get; }

src/Thinktecture.Runtime.Extensions.SourceGenerator/CodeAnalysis/SmartEnums/SmartEnumDerivedTypes.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public sealed class SmartEnumDerivedTypes : INamespaceAndName, ITypeFullyQualifi
88
public bool IsReferenceType { get; }
99
public IReadOnlyList<ContainingTypeState> ContainingTypes { get; }
1010
public IReadOnlyList<string> DerivedTypesFullyQualified { get; }
11+
public IReadOnlyList<string> GenericsFullyQualified => [];
1112

1213
public SmartEnumDerivedTypes(
1314
string? ns,

src/Thinktecture.Runtime.Extensions.SourceGenerator/CodeAnalysis/ThinktectureSourceGeneratorBase.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ protected void InitializeFormattableCodeGenerator(
157157
state.Left.Type.Namespace,
158158
state.Left.Type.ContainingTypes,
159159
state.Left.Type.Name,
160+
state.Left.Type.GenericsFullyQualified.Count,
160161
new InterfaceCodeGeneratorState(state.Left.Type, state.Left.KeyMember, state.Left.CreateFactoryMethodName),
161162
state.Right,
162163
InterfaceCodeGeneratorFactory.Formattable));
@@ -180,6 +181,7 @@ protected void InitializeComparableCodeGenerator(
180181
state.Left.Type.Namespace,
181182
state.Left.Type.ContainingTypes,
182183
state.Left.Type.Name,
184+
state.Left.Type.GenericsFullyQualified.Count,
183185
new InterfaceCodeGeneratorState(state.Left.Type, state.Left.KeyMember, state.Left.CreateFactoryMethodName),
184186
state.Right,
185187
InterfaceCodeGeneratorFactory.Comparable(state.Left.ComparerAccessor)));
@@ -203,6 +205,7 @@ protected void InitializeParsableCodeGenerator(
203205
state.Left.Type.Namespace,
204206
state.Left.Type.ContainingTypes,
205207
state.Left.Type.Name,
208+
state.Left.Type.GenericsFullyQualified.Count,
206209
state.Left,
207210
state.Right,
208211
InterfaceCodeGeneratorFactory.Parsable(state.Left.IsEnum, state.Left.IsValidatableEnum)));
@@ -239,6 +242,7 @@ protected void InitializeComparisonOperatorsCodeGenerator(
239242
state.Type.Namespace,
240243
state.Type.ContainingTypes,
241244
state.Type.Name,
245+
state.Type.GenericsFullyQualified.Count,
242246
new InterfaceCodeGeneratorState(state.Type, state.KeyMember, state.CreateFactoryMethodName),
243247
tuple.Right,
244248
InterfaceCodeGeneratorFactory.Create(generator));
@@ -266,6 +270,7 @@ protected void InitializeEqualityComparisonOperatorsCodeGenerator(
266270
tuple.Left.Type.Namespace,
267271
tuple.Left.Type.ContainingTypes,
268272
tuple.Left.Type.Name,
273+
tuple.Left.Type.GenericsFullyQualified.Count,
269274
tuple.Left,
270275
tuple.Right,
271276
generator);
@@ -303,6 +308,7 @@ protected void InitializeOperatorsCodeGenerator(
303308
state.Type.Namespace,
304309
state.Type.ContainingTypes,
305310
state.Type.Name,
311+
state.Type.GenericsFullyQualified.Count,
306312
new InterfaceCodeGeneratorState(state.Type, state.KeyMember, state.CreateFactoryMethodName),
307313
tuple.Right,
308314
InterfaceCodeGeneratorFactory.Create(generator));
@@ -336,14 +342,15 @@ private void GenerateCode<TState>(
336342
StringBuilder stringBuilder)
337343
where TState : INamespaceAndName, IEquatable<TState>
338344
{
339-
GenerateCode(context, state.Namespace, state.ContainingTypes, state.Name, state, options, generatorFactory, stringBuilder);
345+
GenerateCode(context, state.Namespace, state.ContainingTypes, state.Name, state.GenericsFullyQualified.Count, state, options, generatorFactory, stringBuilder);
340346
}
341347

342348
private void GenerateCode<TState>(
343349
SourceProductionContext context,
344350
string? ns,
345351
IReadOnlyList<ContainingTypeState> containingTypes,
346352
string name,
353+
int numberOfGenerics,
347354
TState state,
348355
GeneratorOptions options,
349356
ICodeGeneratorFactory<TState> generatorFactory)
@@ -353,7 +360,7 @@ private void GenerateCode<TState>(
353360

354361
try
355362
{
356-
GenerateCode(context, ns, containingTypes, name, state, options, generatorFactory, stringBuilder);
363+
GenerateCode(context, ns, containingTypes, name, numberOfGenerics, state, options, generatorFactory, stringBuilder);
357364
}
358365
finally
359366
{
@@ -366,6 +373,7 @@ private void GenerateCode<TState>(
366373
string? ns,
367374
IReadOnlyList<ContainingTypeState> containingTypes,
368375
string name,
376+
int numberOfGenerics,
369377
TState state,
370378
GeneratorOptions options,
371379
ICodeGeneratorFactory<TState> generatorFactory,
@@ -396,7 +404,7 @@ private void GenerateCode<TState>(
396404

397405
var generatedCode = stringBuilder.ToString();
398406

399-
context.EmitFile(ns, containingTypes, name, generatedCode, generator.FileNameSuffix);
407+
context.EmitFile(ns, containingTypes, name, numberOfGenerics, generatedCode, generator.FileNameSuffix);
400408

401409
if (Logger.IsEnabled(LogLevel.Information))
402410
Logger.Log(LogLevel.Information, $"Code generator '{generator.CodeGeneratorName}' emitted code for '{ns}.{name}'.");

src/Thinktecture.Runtime.Extensions.SourceGenerator/CodeAnalysis/ValueObjects/ComplexSerializerGeneratorState.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace Thinktecture.CodeAnalysis.ValueObjects;
99
public string? Namespace => Type.Namespace;
1010
public IReadOnlyList<ContainingTypeState> ContainingTypes => Type.ContainingTypes;
1111
public string Name => Type.Name;
12+
public IReadOnlyList<string> GenericsFullyQualified => [];
1213

1314
public ComplexSerializerGeneratorState(
1415
ITypeInformation type,

src/Thinktecture.Runtime.Extensions.SourceGenerator/CodeAnalysis/ValueObjects/ComplexValueObjectSourceGeneratorState.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ public sealed class ComplexValueObjectSourceGeneratorState : ITypeInformation, I
66
public string TypeMinimallyQualified { get; }
77
public bool IsEqualWithReferenceEquality => false;
88
public IReadOnlyList<ContainingTypeState> ContainingTypes { get; }
9+
public IReadOnlyList<string> GenericsFullyQualified => [];
910

1011
public string? Namespace { get; }
1112
public string Name { get; }

src/Thinktecture.Runtime.Extensions.SourceGenerator/CodeAnalysis/ValueObjects/KeyedValueObjectSourceGeneratorState.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ public sealed class KeyedValueObjectSourceGeneratorState : ITypeInformation, IEq
66
public string TypeMinimallyQualified { get; }
77
public bool IsEqualWithReferenceEquality => false;
88
public IReadOnlyList<ContainingTypeState> ContainingTypes { get; }
9+
public IReadOnlyList<string> GenericsFullyQualified => [];
910

1011
public string? Namespace { get; }
1112
public string Name { get; }

src/Thinktecture.Runtime.Extensions.SourceGenerator/Extensions/SourceProductionContextExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ public static void EmitFile(
99
string? typeNamespace,
1010
IReadOnlyList<ContainingTypeState> containingTypes,
1111
string typeName,
12+
int numberOfGenerics,
1213
string? generatedCode,
1314
string? fileNameSuffix)
1415
{
1516
if (String.IsNullOrWhiteSpace(generatedCode))
1617
return;
1718

1819
var containingTypeNames = containingTypes.Count == 0 ? null : String.Join(".", containingTypes.Select(t => t.Name)) + ".";
19-
var hintName = $"{(typeNamespace is null ? null : $"{typeNamespace}.")}{containingTypeNames}{typeName}{fileNameSuffix}.g.cs";
20+
var hintName = $"{(typeNamespace is null ? null : $"{typeNamespace}.")}{containingTypeNames}{typeName}{(numberOfGenerics > 0 ? $"`{numberOfGenerics}" : null)}{fileNameSuffix}.g.cs";
2021
context.AddSource(hintName, generatedCode!);
2122
}
2223

0 commit comments

Comments
 (0)