-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathCSharpTestGenerator.cs
84 lines (72 loc) · 2.55 KB
/
CSharpTestGenerator.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
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using System.Collections.Immutable;
using System.Reflection;
namespace SourceGeneration.Reflection.SourceGenerator.Test;
public static class CSharpTestGenerator
{
public static GenerationResult Generate<T>(string source, params Assembly[] addReferences) where T : IIncrementalGenerator, new()
{
List<Assembly> assemblies = [typeof(T).Assembly];
if (addReferences != null)
{
assemblies.AddRange(addReferences);
}
var generator = new T();
var result = CSharpGeneratorDriver
.Create(generator)
.RunGeneratorsAndUpdateCompilation(
CreateLibrary(source, [.. assemblies]),
out var outputCompilation,
out var diagnostics)
.GetRunResult();
return new(result, outputCompilation, diagnostics);
}
private static readonly Assembly[] ImportantAssemblies =
[
typeof(object).Assembly,
typeof(MulticastDelegate).Assembly
];
private static Assembly[] AssemblyReferencesForCodegen =>
AppDomain.CurrentDomain
.GetAssemblies()
.Concat(ImportantAssemblies)
.Distinct()
.Where(a => !a.IsDynamic)
.ToArray();
private static CSharpCompilation CreateLibrary(string source, params Assembly[] addReferences)
{
var references = new List<MetadataReference>();
var assemblies = AssemblyReferencesForCodegen;
foreach (Assembly assembly in assemblies)
{
if (!assembly.IsDynamic)
{
references.Add(MetadataReference.CreateFromFile(assembly.Location));
}
}
if (addReferences != null)
{
foreach (var assembly in addReferences)
{
references.Add(MetadataReference.CreateFromFile(assembly.Location));
}
}
var compilation = CSharpCompilation.Create(
"compilation",
[CSharpSyntaxTree.ParseText(source)],
references,
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
);
return compilation;
}
}
public class GenerationResult(
GeneratorDriverRunResult runResult,
Compilation compilation,
ImmutableArray<Diagnostic> diagnostics)
{
public GeneratorDriverRunResult RunResult { get; } = runResult;
public Compilation Compilation { get; } = compilation;
public ImmutableArray<Diagnostic> Diagnostics { get; } = diagnostics;
}