Skip to content

Commit 4f0006f

Browse files
committed
A MetadataReference can have multiple modules of interest.
1 parent 43d1011 commit 4f0006f

File tree

2 files changed

+26
-34
lines changed

2 files changed

+26
-34
lines changed

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

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Collections.Immutable;
22
using System.Diagnostics;
3-
using System.Diagnostics.CodeAnalysis;
43
using Microsoft.CodeAnalysis;
54
using Microsoft.CodeAnalysis.CSharp;
65
using Microsoft.CodeAnalysis.CSharp.Syntax;
@@ -24,43 +23,40 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
2423
.SelectMany(static (states, _) => states.Distinct());
2524

2625
var generators = context.GetMetadataReferencesProvider()
27-
.SelectMany(static (reference, _) => TryGetCodeGeneratorFactory(reference, out var factory)
28-
? ImmutableArray.Create(factory)
29-
: ImmutableArray<ICodeGeneratorFactory<EnumSourceGeneratorState>>.Empty)
26+
.SelectMany(static (reference, _) => GetCodeGeneratorFactories(reference))
3027
.Collect()
3128
.WithComparer(new SetComparer<ICodeGeneratorFactory<EnumSourceGeneratorState>>());
3229

3330
context.RegisterSourceOutput(candidates.Combine(generators), GenerateCode);
3431
}
3532

36-
private static bool TryGetCodeGeneratorFactory(
37-
MetadataReference reference,
38-
[MaybeNullWhen(false)] out ICodeGeneratorFactory<EnumSourceGeneratorState> factory)
33+
private static ImmutableArray<ICodeGeneratorFactory<EnumSourceGeneratorState>> GetCodeGeneratorFactories(MetadataReference reference)
3934
{
35+
var factories = ImmutableArray<ICodeGeneratorFactory<EnumSourceGeneratorState>>.Empty;
36+
4037
foreach (var module in reference.GetModules())
4138
{
4239
switch (module.Name)
4340
{
4441
case THINKTECTURE_RUNTIME_EXTENSIONS:
45-
factory = new SmartEnumCodeGeneratorFactory();
46-
return true;
42+
factories = factories.Add(new SmartEnumCodeGeneratorFactory());
43+
break;
4744

4845
case THINKTECTURE_RUNTIME_EXTENSIONS_JSON:
49-
factory = new JsonSmartEnumCodeGeneratorFactory();
50-
return true;
46+
factories = factories.Add(new JsonSmartEnumCodeGeneratorFactory());
47+
break;
5148

5249
case THINKTECTURE_RUNTIME_EXTENSIONS_NEWTONSOFT_JSON:
53-
factory = new NewtonsoftJsonSmartEnumCodeGeneratorFactory();
54-
return true;
50+
factories = factories.Add(new NewtonsoftJsonSmartEnumCodeGeneratorFactory());
51+
break;
5552

5653
case THINKTECTURE_RUNTIME_EXTENSIONS_MESSAGEPACK:
57-
factory = new MessagePackSmartEnumCodeGeneratorFactory();
58-
return true;
54+
factories = factories.Add(new MessagePackSmartEnumCodeGeneratorFactory());
55+
break;
5956
}
6057
}
6158

62-
factory = null;
63-
return false;
59+
return factories;
6460
}
6561

6662
private static bool IsCandidate(SyntaxNode syntaxNode, CancellationToken cancellationToken)

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

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Collections.Immutable;
22
using System.Diagnostics;
3-
using System.Diagnostics.CodeAnalysis;
43
using Microsoft.CodeAnalysis;
54
using Microsoft.CodeAnalysis.CSharp;
65
using Microsoft.CodeAnalysis.CSharp.Syntax;
@@ -24,43 +23,40 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
2423
.SelectMany(static (states, _) => states.Distinct());
2524

2625
var generators = context.GetMetadataReferencesProvider()
27-
.SelectMany(static (reference, _) => TryGetCodeGeneratorFactory(reference, out var factory)
28-
? ImmutableArray.Create(factory)
29-
: ImmutableArray<ICodeGeneratorFactory<ValueObjectSourceGeneratorState>>.Empty)
26+
.SelectMany(static (reference, _) => GetCodeGeneratorFactories(reference))
3027
.Collect()
3128
.WithComparer(new SetComparer<ICodeGeneratorFactory<ValueObjectSourceGeneratorState>>());
3229

3330
context.RegisterSourceOutput(candidates.Combine(generators), GenerateCode);
3431
}
3532

36-
private static bool TryGetCodeGeneratorFactory(
37-
MetadataReference reference,
38-
[MaybeNullWhen(false)] out ICodeGeneratorFactory<ValueObjectSourceGeneratorState> factory)
33+
private static ImmutableArray<ICodeGeneratorFactory<ValueObjectSourceGeneratorState>> GetCodeGeneratorFactories(MetadataReference reference)
3934
{
35+
var factories = ImmutableArray<ICodeGeneratorFactory<ValueObjectSourceGeneratorState>>.Empty;
36+
4037
foreach (var module in reference.GetModules())
4138
{
4239
switch (module.Name)
4340
{
4441
case THINKTECTURE_RUNTIME_EXTENSIONS:
45-
factory = new ValueObjectCodeGeneratorFactory();
46-
return true;
42+
factories = factories.Add(new ValueObjectCodeGeneratorFactory());
43+
break;
4744

4845
case THINKTECTURE_RUNTIME_EXTENSIONS_JSON:
49-
factory = new JsonValueObjectCodeGeneratorFactory();
50-
return true;
46+
factories = factories.Add(new JsonValueObjectCodeGeneratorFactory());
47+
break;
5148

5249
case THINKTECTURE_RUNTIME_EXTENSIONS_NEWTONSOFT_JSON:
53-
factory = new NewtonsoftJsonValueObjectCodeGeneratorFactory();
54-
return true;
50+
factories = factories.Add(new NewtonsoftJsonValueObjectCodeGeneratorFactory());
51+
break;
5552

5653
case THINKTECTURE_RUNTIME_EXTENSIONS_MESSAGEPACK:
57-
factory = new MessagePackValueObjectCodeGeneratorFactory();
58-
return true;
54+
factories = factories.Add(new MessagePackValueObjectCodeGeneratorFactory());
55+
break;
5956
}
6057
}
6158

62-
factory = null;
63-
return false;
59+
return factories;
6460
}
6561

6662
private static bool IsCandidate(SyntaxNode syntaxNode, CancellationToken cancellationToken)

0 commit comments

Comments
 (0)