using Microsoft.CodeAnalysis; | |
using Microsoft.CodeAnalysis.CSharp; | |
using System.Collections.Immutable; | |
using System.Linq; | |
using System.Reflection; | |
using Xunit; | |
namespace GeneratorTests.Tests | |
{ | |
public class GeneratorTests | |
{ | |
[Fact] | |
public void SimpleGeneratorTest() | |
{ | |
string userSource = @" | |
namespace MyCode | |
{ | |
public class Program | |
{ | |
public static void Main(string[] args) | |
{ | |
} | |
} | |
} | |
"; | |
Compilation comp = CreateCompilation(userSource); | |
var newComp = RunGenerators(comp, out var generatorDiags, new SimpleGenerator()); | |
Assert.Empty(generatorDiags); | |
Assert.Empty(newComp.GetDiagnostics()); | |
} | |
private static Compilation CreateCompilation(string source) | |
=> CSharpCompilation.Create("compilation", | |
new[] { CSharpSyntaxTree.ParseText(source, new CSharpParseOptions(LanguageVersion.Preview)) }, | |
new[] { MetadataReference.CreateFromFile(typeof(Binder).GetTypeInfo().Assembly.Location) }, | |
new CSharpCompilationOptions(OutputKind.ConsoleApplication)); | |
private static GeneratorDriver CreateDriver(Compilation c, params ISourceGenerator[] generators) | |
=> new CSharpGeneratorDriver(c.SyntaxTrees.First().Options, | |
ImmutableArray.Create(generators), | |
null, | |
ImmutableArray<AdditionalText>.Empty); | |
private static Compilation RunGenerators(Compilation c, out ImmutableArray<Diagnostic> diagnostics, params ISourceGenerator[] generators) | |
{ | |
CreateDriver(c, generators).RunGeneratorsAndUpdateCompilation(c, out var d, out diagnostics); | |
return d; | |
} | |
} | |
} |
Is anyone is interested here is a version that works for me (with all the notes above):
private static 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.ConsoleApplication)
);
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
);
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;
}
Would it be possible to pass AnalyzerConfigOptions using this model? I have a generator that depends on a project property being set, and to test it I am having to comment out the property check in the generator.
Would it be possible to pass AnalyzerConfigOptions using this model? I have a generator that depends on a project property being set, and to test it I am having to comment out the property check in the generator.
@sharwell Does the testing library supports passing .editorconfig
for generators? (it does for analyzers & codefixes, but not sure about generators)
@sharwell Does the testing library supports passing
.editorconfig
for generators? (it does for analyzers & codefixes, but not sure about generators)
Yes, you can add them to TestState.AnalyzerConfigFiles
.
Hi @chsienki
GeneratorDriver.RunFullGeneration
is now obsolete. It needs to be updated withRunGeneratorsAndUpdateCompilation
.CSharpGeneratorDriver
constructor is also obsolete. It needs to be updated withCSharpGeneratorDriver.Create
.Also,
ParseOptions
will need a cast toCSharpParseOptions
.