/
Helpers.cs
66 lines (62 loc) · 2.91 KB
/
Helpers.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
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using System.Collections.Immutable;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace DiagnosticTests
{
public sealed partial class UnitTesting
{
/// <summary>
/// CreateCompilation creates a CSharpCompilation
/// </summary>
/// <param name="source">string of source code</param>
/// <returns></returns>
private Compilation CreateCompilation(string source)
=> CSharpCompilation.Create(
assemblyName: "compilation",
syntaxTrees: new[] { CSharpSyntaxTree.ParseText(source, new CSharpParseOptions(LanguageVersion.Preview)) },
references: new[] { MetadataReference.CreateFromFile(typeof(Binder).GetTypeInfo().Assembly.Location) },
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
/// <summary>
/// CreateDriver makes a CSharpGeneratorDriver
/// </summary>
/// <param name="compilation"></param>
/// <param name="generators"></param>
/// <returns></returns>
private static GeneratorDriver CreateDriver(Compilation compilation, params ISourceGenerator[] generators)
=> CSharpGeneratorDriver.Create(
generators: ImmutableArray.Create(generators),
additionalTexts: ImmutableArray<AdditionalText>.Empty,
parseOptions: (CSharpParseOptions)compilation.SyntaxTrees.First().Options,
optionsProvider: null);
// todo: pass the CsWinRTComponent config option here so we don't have to comment out the check in the source generator
/// <summary>
/// RunGenerators makes a driver and applies the given generators to the compilation, storing diagnostics in an out param
/// </summary>
/// <param name="compilation"></param>
/// <param name="diagnostics"></param>
/// <param name="generators"></param>
/// <returns></returns>
private static Compilation RunGenerators(Compilation compilation, out ImmutableArray<Diagnostic> diagnostics, params ISourceGenerator[] generators)
{
CreateDriver(compilation, generators).RunGeneratorsAndUpdateCompilation(compilation, out var updatedCompilation, out diagnostics);
return updatedCompilation;
}
/// <summary>
/// Create a HashSet of DiagnosticDescriptor from the Array of Diagnostic
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
private HashSet<DiagnosticDescriptor> MakeDiagnosticSet(ImmutableArray<Diagnostic> arr)
{
HashSet<DiagnosticDescriptor> setSoFar = new HashSet<DiagnosticDescriptor>();
foreach (var d in arr)
{
setSoFar.Add(d.Descriptor);
}
return setSoFar;
}
}
}