-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCompilationBuilder.cs
57 lines (49 loc) · 2.51 KB
/
CompilationBuilder.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
using BenchmarkDotNet.Attributes;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
namespace InterfacePerfTest
{
internal static class CompilationBuilder
{
public static Compilation CreateCompilation(IEnumerable<string> sourceTexts)
{
var syntaxTrees = sourceTexts
.Select(source => CSharpSyntaxTree.ParseText(source))
.ToArray();
var coreLibReference = MetadataReference.CreateFromFile(typeof(Binder).GetTypeInfo().Assembly.Location);
var netstandardReference = MetadataReference.CreateFromFile(Assembly.Load("netstandard, Version=2.0.0.0").Location);
var runtimeReference = MetadataReference.CreateFromFile(Assembly.Load("System.Runtime, Version=6.0.0.0").Location);
var systemReference = MetadataReference.CreateFromFile(typeof(Console).GetTypeInfo().Assembly.Location);
var benchmarkReference = MetadataReference.CreateFromFile(typeof(BenchmarkAttribute).GetTypeInfo().Assembly.Location);
var inProcessReference = MetadataReference.CreateFromFile(typeof(InProcessAttribute).GetTypeInfo().Assembly.Location);
var additionalReferences = new[] {
coreLibReference,
netstandardReference,
runtimeReference,
systemReference,
benchmarkReference,
inProcessReference,
};
var optimizationLevel = OptimizationLevel.Release;
var compilation = CSharpCompilation.Create(
assemblyName: "compilation",
syntaxTrees: syntaxTrees,
references: additionalReferences,
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
.WithOptimizationLevel(optimizationLevel));
// Require that no errors occurred during compilation
IEnumerable<Diagnostic> failures = compilation.GetDiagnostics();
foreach (Diagnostic diagnostic in failures)
{
Debug.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage());
}
if (failures.Any()) throw new Exception("One or more errors occurred during compilation.");
return compilation;
}
}
}