Skip to content

Commit 7b1306b

Browse files
committed
mitrage to IIncrementalGenerator
Uses IIncrementalGenerator (Source Generator V2). Now the generator can run in VS 17.0/.NET 6.0 or later.
1 parent c4a76d1 commit 7b1306b

4 files changed

Lines changed: 15 additions & 40 deletions

File tree

samples/StringLiteralCodeAnalysisSample/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ private static Compilation Compile(string source)
9393
options: copt);
9494

9595
// apply the source generator
96-
var driver = CSharpGeneratorDriver.Create(new[] { new Utf8StringLiteralGenerator() }, parseOptions: opt);
96+
var driver = CSharpGeneratorDriver.Create(new Utf8StringLiteralGenerator());
9797
driver.RunGeneratorsAndUpdateCompilation(compilation, out var resultCompilation, out _);
9898

9999
return resultCompilation;

src/StringLiteralGenerator/Utf8StringLiteralGenerator.Emitter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22
using Microsoft.CodeAnalysis.Text;
33
using System;
44
using System.Collections.Generic;
5+
using System.Collections.Immutable;
56
using System.Linq;
67
using System.Text;
78

89
namespace StringLiteralGenerator;
910

1011
public partial class Utf8StringLiteralGenerator
1112
{
12-
private static void Emit(GeneratorExecutionContext context, IEnumerable<Utf8LiteralMethod> methods)
13+
private static void Emit(SourceProductionContext context, ImmutableArray<Utf8LiteralMethod> methods)
1314
{
1415
var buffer = new StringBuilder();
1516

src/StringLiteralGenerator/Utf8StringLiteralGenerator.Init.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public Utf8Attribute(string s) { }
1919
}
2020
";
2121

22-
private static void AddAttribute(GeneratorPostInitializationContext context)
22+
private static void AddAttribute(IncrementalGeneratorPostInitializationContext context)
2323
{
2424
context.AddSource("Utf8Attribute", SourceText.From(attributeText, Encoding.UTF8));
2525
}
Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,23 @@
11
using Microsoft.CodeAnalysis;
22
using Microsoft.CodeAnalysis.CSharp.Syntax;
3-
using System.Collections.Generic;
43

54
namespace StringLiteralGenerator;
65

76
[Generator]
8-
public partial class Utf8StringLiteralGenerator : ISourceGenerator
7+
public partial class Utf8StringLiteralGenerator : IIncrementalGenerator
98
{
10-
public void Execute(GeneratorExecutionContext context)
9+
public void Initialize(IncrementalGeneratorInitializationContext context)
1110
{
12-
if (context.SyntaxReceiver is not SyntaxReceiver receiver) return;
11+
context.RegisterPostInitializationOutput(AddAttribute);
1312

14-
var compilation = context.Compilation;
13+
var provider = context.SyntaxProvider
14+
.CreateSyntaxProvider(
15+
static (node, _) => IsSyntaxTargetForGeneration(node),
16+
static (context, _) => GetSemanticTargetForGeneration(context.SemanticModel, (MethodDeclarationSyntax)context.Node)!
17+
)
18+
.Where(x => x is not null)
19+
.Collect();
1520

16-
Emit(context, enumerate());
17-
18-
IEnumerable<Utf8LiteralMethod> enumerate()
19-
{
20-
foreach (var m in receiver.CandidateMethods)
21-
{
22-
var model = compilation.GetSemanticModel(m.SyntaxTree);
23-
24-
if (GetSemanticTargetForGeneration(model, m) is { } t)
25-
yield return t;
26-
}
27-
}
28-
}
29-
30-
public void Initialize(GeneratorInitializationContext context)
31-
{
32-
context.RegisterForPostInitialization(AddAttribute);
33-
context.RegisterForSyntaxNotifications(() => new SyntaxReceiver());
34-
}
35-
36-
class SyntaxReceiver : ISyntaxReceiver
37-
{
38-
public List<MethodDeclarationSyntax> CandidateMethods { get; } = new List<MethodDeclarationSyntax>();
39-
40-
public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
41-
{
42-
// any field with at least one attribute is a candidate for property generation
43-
if (IsSyntaxTargetForGeneration(syntaxNode))
44-
{
45-
CandidateMethods.Add((MethodDeclarationSyntax)syntaxNode);
46-
}
47-
}
21+
context.RegisterSourceOutput(provider, Emit);
4822
}
4923
}

0 commit comments

Comments
 (0)