-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathIncrementalGeneratorTests.cs
155 lines (138 loc) · 4.35 KB
/
IncrementalGeneratorTests.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
using System.Reflection;
using AutoConstructor.Generator;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Xunit;
namespace AutoConstructor.Tests;
public class IncrementalGeneratorTests
{
[Theory]
[InlineData(@"
namespace Test
{
[AutoConstructor]
internal partial class Test
{
private readonly int _t;
}
}
", @"
namespace Test
{
[AutoConstructor]
internal partial class Test
{
// Test
private readonly int _t;
}
}
", IncrementalStepRunReason.Cached, IncrementalStepRunReason.Unchanged, IncrementalStepRunReason.Cached)]
[InlineData(@"
namespace Nested
{
internal partial class Outer<T1>
{
[AutoConstructor]
internal partial class Inner<T2>
{
private readonly T1 _t1;
private readonly T2 _t2;
}
}
}", @"
namespace Nested
{
internal partial class Outer<T1>
{
[AutoConstructor]
internal partial class Inner<T2>
{
// Some comment
private readonly T1 _t1;
private readonly T2 _t2;
}
}
}", IncrementalStepRunReason.Cached, IncrementalStepRunReason.Unchanged, IncrementalStepRunReason.Cached)]
[InlineData(@"
namespace Test
{
[AutoConstructor]
internal partial class Test
{
private readonly int _t;
}
}
", @"
namespace Test
{
[AutoConstructor]
internal partial class Test
{
private readonly int _toto;
}
}
", IncrementalStepRunReason.New, IncrementalStepRunReason.Modified, IncrementalStepRunReason.Modified)]
[InlineData(@"
namespace Test
{
[AutoConstructor]
internal partial class Test
{
private readonly int _t;
}
}
", @"
namespace Test
{
[AutoConstructor]
internal partial class Test
{
private readonly int _t;
private readonly int _toto = 2;
}
}
", IncrementalStepRunReason.Cached, IncrementalStepRunReason.Unchanged, IncrementalStepRunReason.Cached)]
public void CheckGeneratorIsIncremental(
string source,
string sourceUpdated,
IncrementalStepRunReason sourceStepReason,
IncrementalStepRunReason executeStepReason,
IncrementalStepRunReason combineStepReason)
{
SyntaxTree baseSyntaxTree = CSharpSyntaxTree.ParseText(AppendBaseCode(source));
Compilation compilation = CreateCompilation(baseSyntaxTree);
ISourceGenerator sourceGenerator = new AutoConstructorGenerator().AsSourceGenerator();
GeneratorDriver driver = CSharpGeneratorDriver.Create(
generators: [sourceGenerator],
driverOptions: new GeneratorDriverOptions(default, trackIncrementalGeneratorSteps: true));
// Run the generator
driver = driver.RunGenerators(compilation);
// Update the compilation and rerun the generator
compilation = compilation.ReplaceSyntaxTree(baseSyntaxTree, CSharpSyntaxTree.ParseText(AppendBaseCode(sourceUpdated)));
driver = driver.RunGenerators(compilation);
GeneratorRunResult result = driver.GetRunResult().Results.Single();
IEnumerable<(object Value, IncrementalStepRunReason Reason)> sourceOutputs =
result.TrackedOutputSteps.SelectMany(outputStep => outputStep.Value).SelectMany(output => output.Outputs);
// TODO: remove skip in v6
(_, IncrementalStepRunReason Reason) = Assert.Single(sourceOutputs.Skip(1));
Assert.Equal(sourceStepReason, Reason);
Assert.Equal(executeStepReason, result.TrackedSteps["Execute"].Single().Outputs[0].Reason);
Assert.Equal(combineStepReason, result.TrackedSteps["Combine"].Single().Outputs[0].Reason);
}
private static CSharpCompilation CreateCompilation(SyntaxTree syntaxTree)
{
return CSharpCompilation.Create("compilation",
[syntaxTree],
[MetadataReference.CreateFromFile(typeof(Binder).GetTypeInfo().Assembly.Location)],
new CSharpCompilationOptions(OutputKind.ConsoleApplication));
}
private static string AppendBaseCode(string value)
{
// Appends the attributes from the generator to the code to be compiled.
string valueWithCode = value;
valueWithCode += $"{Source.AttributeText}\n";
valueWithCode += $"{Source.IgnoreAttributeText}\n";
valueWithCode += $"{Source.InjectAttributeText}\n";
return valueWithCode;
}
}