Skip to content

Commit eb0198e

Browse files
committed
Adjusted code generator for "IParsable" so it can call explicitly implemented "IValueObjectFactory"
1 parent 0abb94d commit eb0198e

File tree

4 files changed

+173
-33
lines changed

4 files changed

+173
-33
lines changed

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

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,28 +25,40 @@ public void GenerateBaseTypes(StringBuilder sb, ParsableGeneratorState state)
2525

2626
public void GenerateImplementation(StringBuilder sb, ParsableGeneratorState state)
2727
{
28+
GenerateValidate(sb, state);
2829
GenerateParse(sb, state);
29-
3030
GenerateTryParse(sb, state);
3131
}
3232

33+
private static void GenerateValidate(StringBuilder sb, ParsableGeneratorState state)
34+
{
35+
var keyType = state.KeyMember?.IsString() == true || state.HasStringBasedValidateMethod ? "string" : state.KeyMember?.TypeFullyQualified;
36+
sb.Append(@"
37+
private static global::System.ComponentModel.DataAnnotations.ValidationResult? Validate<T>(").Append(keyType).Append(" key, global::System.IFormatProvider? provider, out ").Append(state.Type.TypeFullyQualifiedNullAnnotated).Append(@" result)
38+
where T : global::Thinktecture.IValueObjectFactory<").Append(state.Type.TypeFullyQualified).Append(", ").Append(keyType).Append(@">
39+
{
40+
return T.Validate(key, provider, out result);
41+
}");
42+
}
43+
3344
private void GenerateParse(StringBuilder sb, ParsableGeneratorState state)
3445
{
3546
sb.Append(@"
47+
3648
/// <inheritdoc />
3749
public static ").Append(state.Type.TypeFullyQualified).Append(@" Parse(string s, global::System.IFormatProvider? provider)
3850
{");
3951

4052
if (state.KeyMember?.IsString() == true || state.HasStringBasedValidateMethod)
4153
{
4254
sb.Append(@"
43-
var validationResult = ").Append(state.Type.TypeFullyQualified).Append(".Validate(s, provider, out var result);");
55+
var validationResult = Validate<").Append(state.Type.TypeFullyQualified).Append(">(s, provider, out var result);");
4456
}
4557
else if (state.KeyMember is not null)
4658
{
4759
sb.Append(@"
4860
var key = ").Append(state.KeyMember.TypeFullyQualified).Append(@".Parse(s, provider);
49-
var validationResult = ").Append(state.Type.TypeFullyQualified).Append(".Validate(key, provider, out var result);");
61+
var validationResult = Validate<").Append(state.Type.TypeFullyQualified).Append(">(key, provider, out var result);");
5062
}
5163

5264
if (_isForValidatableEnum)
@@ -87,7 +99,7 @@ public static bool TryParse(
8799
{
88100
sb.Append(@"
89101
90-
var validationResult = ").Append(state.Type.TypeFullyQualified).Append(".Validate(s, provider, out result!);");
102+
var validationResult = Validate<").Append(state.Type.TypeFullyQualified).Append(">(s, provider, out result!);");
91103
}
92104
else if (state.KeyMember is not null)
93105
{
@@ -99,7 +111,7 @@ public static bool TryParse(
99111
return false;
100112
}
101113
102-
var validationResult = ").Append(state.Type.TypeFullyQualified).Append(".Validate(key, provider, out result!);");
114+
var validationResult = Validate<").Append(state.Type.TypeFullyQualified).Append(">(key, provider, out result!);");
103115
}
104116

105117
if (_isForValidatableEnum)

test/Thinktecture.Runtime.Extensions.SourceGenerator.Tests/SourceGeneratorTests/EnumSourceGeneratorTests.cs

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -405,10 +405,16 @@ namespace Thinktecture.Tests;
405405
partial class TestEnum :
406406
global::System.IParsable<global::Thinktecture.Tests.TestEnum>
407407
{
408+
private static global::System.ComponentModel.DataAnnotations.ValidationResult? Validate<T>(string key, global::System.IFormatProvider? provider, out global::Thinktecture.Tests.TestEnum? result)
409+
where T : global::Thinktecture.IValueObjectFactory<global::Thinktecture.Tests.TestEnum, string>
410+
{
411+
return T.Validate(key, provider, out result);
412+
}
413+
408414
/// <inheritdoc />
409415
public static global::Thinktecture.Tests.TestEnum Parse(string s, global::System.IFormatProvider? provider)
410416
{
411-
var validationResult = global::Thinktecture.Tests.TestEnum.Validate(s, provider, out var result);
417+
var validationResult = Validate<global::Thinktecture.Tests.TestEnum>(s, provider, out var result);
412418

413419
if(validationResult is null)
414420
return result!;
@@ -428,7 +434,7 @@ public static bool TryParse(
428434
return false;
429435
}
430436

431-
var validationResult = global::Thinktecture.Tests.TestEnum.Validate(s, provider, out result!);
437+
var validationResult = Validate<global::Thinktecture.Tests.TestEnum>(s, provider, out result!);
432438
return validationResult is null;
433439
}
434440
}
@@ -631,10 +637,16 @@ namespace Thinktecture.Tests;
631637
partial class TestEnum :
632638
global::System.IParsable<global::Thinktecture.Tests.TestEnum>
633639
{
640+
private static global::System.ComponentModel.DataAnnotations.ValidationResult? Validate<T>(string key, global::System.IFormatProvider? provider, out global::Thinktecture.Tests.TestEnum? result)
641+
where T : global::Thinktecture.IValueObjectFactory<global::Thinktecture.Tests.TestEnum, string>
642+
{
643+
return T.Validate(key, provider, out result);
644+
}
645+
634646
/// <inheritdoc />
635647
public static global::Thinktecture.Tests.TestEnum Parse(string s, global::System.IFormatProvider? provider)
636648
{
637-
var validationResult = global::Thinktecture.Tests.TestEnum.Validate(s, provider, out var result);
649+
var validationResult = Validate<global::Thinktecture.Tests.TestEnum>(s, provider, out var result);
638650
return result!;
639651
}
640652

@@ -650,7 +662,7 @@ public static bool TryParse(
650662
return false;
651663
}
652664

653-
var validationResult = global::Thinktecture.Tests.TestEnum.Validate(s, provider, out result!);
665+
var validationResult = Validate<global::Thinktecture.Tests.TestEnum>(s, provider, out result!);
654666
return true;
655667
}
656668
}
@@ -665,11 +677,17 @@ namespace Thinktecture.Tests;
665677
partial class TestEnum :
666678
global::System.IParsable<global::Thinktecture.Tests.TestEnum>
667679
{
680+
private static global::System.ComponentModel.DataAnnotations.ValidationResult? Validate<T>(int key, global::System.IFormatProvider? provider, out global::Thinktecture.Tests.TestEnum? result)
681+
where T : global::Thinktecture.IValueObjectFactory<global::Thinktecture.Tests.TestEnum, int>
682+
{
683+
return T.Validate(key, provider, out result);
684+
}
685+
668686
/// <inheritdoc />
669687
public static global::Thinktecture.Tests.TestEnum Parse(string s, global::System.IFormatProvider? provider)
670688
{
671689
var key = int.Parse(s, provider);
672-
var validationResult = global::Thinktecture.Tests.TestEnum.Validate(key, provider, out var result);
690+
var validationResult = Validate<global::Thinktecture.Tests.TestEnum>(key, provider, out var result);
673691

674692
if(validationResult is null)
675693
return result!;
@@ -695,7 +713,7 @@ public static bool TryParse(
695713
return false;
696714
}
697715

698-
var validationResult = global::Thinktecture.Tests.TestEnum.Validate(key, provider, out result!);
716+
var validationResult = Validate<global::Thinktecture.Tests.TestEnum>(key, provider, out result!);
699717
return validationResult is null;
700718
}
701719
}
@@ -2251,10 +2269,16 @@ public int CompareTo(global::TestEnum? obj)
22512269
partial class TestEnum :
22522270
global::System.IParsable<global::TestEnum>
22532271
{
2272+
private static global::System.ComponentModel.DataAnnotations.ValidationResult? Validate<T>(string key, global::System.IFormatProvider? provider, out global::TestEnum? result)
2273+
where T : global::Thinktecture.IValueObjectFactory<global::TestEnum, string>
2274+
{
2275+
return T.Validate(key, provider, out result);
2276+
}
2277+
22542278
/// <inheritdoc />
22552279
public static global::TestEnum Parse(string s, global::System.IFormatProvider? provider)
22562280
{
2257-
var validationResult = global::TestEnum.Validate(s, provider, out var result);
2281+
var validationResult = Validate<global::TestEnum>(s, provider, out var result);
22582282

22592283
if(validationResult is null)
22602284
return result!;
@@ -2274,7 +2298,7 @@ public static bool TryParse(
22742298
return false;
22752299
}
22762300

2277-
var validationResult = global::TestEnum.Validate(s, provider, out result!);
2301+
var validationResult = Validate<global::TestEnum>(s, provider, out result!);
22782302
return validationResult is null;
22792303
}
22802304
}
@@ -3817,10 +3841,16 @@ namespace Thinktecture.Tests;
38173841
partial struct TestEnum :
38183842
global::System.IParsable<global::Thinktecture.Tests.TestEnum>
38193843
{
3844+
private static global::System.ComponentModel.DataAnnotations.ValidationResult? Validate<T>(string key, global::System.IFormatProvider? provider, out global::Thinktecture.Tests.TestEnum result)
3845+
where T : global::Thinktecture.IValueObjectFactory<global::Thinktecture.Tests.TestEnum, string>
3846+
{
3847+
return T.Validate(key, provider, out result);
3848+
}
3849+
38203850
/// <inheritdoc />
38213851
public static global::Thinktecture.Tests.TestEnum Parse(string s, global::System.IFormatProvider? provider)
38223852
{
3823-
var validationResult = global::Thinktecture.Tests.TestEnum.Validate(s, provider, out var result);
3853+
var validationResult = Validate<global::Thinktecture.Tests.TestEnum>(s, provider, out var result);
38243854
return result!;
38253855
}
38263856

@@ -3836,7 +3866,7 @@ public static bool TryParse(
38363866
return false;
38373867
}
38383868

3839-
var validationResult = global::Thinktecture.Tests.TestEnum.Validate(s, provider, out result!);
3869+
var validationResult = Validate<global::Thinktecture.Tests.TestEnum>(s, provider, out result!);
38403870
return true;
38413871
}
38423872
}

0 commit comments

Comments
 (0)