public void Added_Additional_File() { var source = @" class C { } "; var parseOptions = TestOptions.Regular; Compilation compilation = CreateCompilation(source, options: TestOptions.DebugDll, parseOptions: parseOptions); compilation.VerifyDiagnostics(); Assert.Single(compilation.SyntaxTrees); AdditionalFileAddedGenerator testGenerator = new AdditionalFileAddedGenerator(); GeneratorDriver driver = new CSharpGeneratorDriver(parseOptions, ImmutableArray.Create <ISourceGenerator>(testGenerator), CompilerAnalyzerConfigOptionsProvider.Empty, ImmutableArray <AdditionalText> .Empty); // run initial generation pass driver = driver.RunFullGeneration(compilation, out var outputCompilation, out _); Assert.Single(outputCompilation.SyntaxTrees); // create an edit AdditionalFileAddedEdit edit = new AdditionalFileAddedEdit(new InMemoryAdditionalText("a\\file1.cs", "")); driver = driver.WithPendingEdits(ImmutableArray.Create <PendingEdit>(edit)); // now try apply edits driver = driver.TryApplyEdits(compilation, out outputCompilation, out var succeeded); Assert.True(succeeded); Assert.Equal(2, outputCompilation.SyntaxTrees.Count()); }
public void Failed_Edit_Does_Not_Change_Compilation() { var source = @" class C { } "; var parseOptions = TestOptions.Regular; Compilation compilation = CreateCompilation(source, options: TestOptions.DebugDll, parseOptions: parseOptions); compilation.VerifyDiagnostics(); Assert.Single(compilation.SyntaxTrees); AdditionalFileAddedGenerator testGenerator = new AdditionalFileAddedGenerator() { CanApplyChanges = false }; GeneratorDriver driver = new CSharpGeneratorDriver(parseOptions, ImmutableArray.Create <ISourceGenerator>(testGenerator), CompilerAnalyzerConfigOptionsProvider.Empty, ImmutableArray <AdditionalText> .Empty); driver.RunFullGeneration(compilation, out var outputCompilation, out _); Assert.Single(outputCompilation.SyntaxTrees); // create an edit AdditionalFileAddedEdit edit = new AdditionalFileAddedEdit(new InMemoryAdditionalText("a\\file2.cs", "")); driver = driver.WithPendingEdits(ImmutableArray.Create <PendingEdit>(edit)); // now try apply edits (which will fail) driver = driver.TryApplyEdits(compilation, out var editedCompilation, out var succeeded); Assert.False(succeeded); Assert.Single(editedCompilation.SyntaxTrees); Assert.Equal(compilation, editedCompilation); }
public void TryApply_Edits_Does_Nothing_When_Nothing_Pending() { var source = @" class C { } "; var parseOptions = TestOptions.Regular; Compilation compilation = CreateCompilation(source, options: TestOptions.DebugDll, parseOptions: parseOptions); compilation.VerifyDiagnostics(); Assert.Single(compilation.SyntaxTrees); AdditionalFileAddedGenerator testGenerator = new AdditionalFileAddedGenerator(); GeneratorDriver driver = new CSharpGeneratorDriver(parseOptions, ImmutableArray.Create <ISourceGenerator>(testGenerator), CompilerAnalyzerConfigOptionsProvider.Empty, ImmutableArray <AdditionalText> .Empty); // run an initial generation pass driver = driver.RunFullGeneration(compilation, out var outputCompilation, out _); Assert.Single(outputCompilation.SyntaxTrees); // now try apply edits (which should succeed, but do nothing) driver = driver.TryApplyEdits(compilation, out var editedCompilation, out var succeeded); Assert.True(succeeded); Assert.Equal(outputCompilation, editedCompilation); }
public void Added_Additional_File_With_Full_Generation() { var source = @" class C { } "; var parseOptions = TestOptions.Regular; Compilation compilation = CreateCompilation(source, options: TestOptions.DebugDll, parseOptions: parseOptions); compilation.VerifyDiagnostics(); Assert.Single(compilation.SyntaxTrees); AdditionalFileAddedGenerator testGenerator = new AdditionalFileAddedGenerator(); var text = new InMemoryAdditionalText("a\\file1.cs", ""); GeneratorDriver driver = new CSharpGeneratorDriver(parseOptions, generators: ImmutableArray.Create <ISourceGenerator>(testGenerator), optionsProvider: CompilerAnalyzerConfigOptionsProvider.Empty, additionalTexts: ImmutableArray.Create <AdditionalText>(new InMemoryAdditionalText("a\\file1.cs", ""))); driver = driver.RunFullGeneration(compilation, out var outputCompilation, out _); // we should have a single extra file for the additional texts Assert.Equal(2, outputCompilation.SyntaxTrees.Count()); // even if we run a full gen, or partial, nothing should change yet driver = driver.TryApplyEdits(outputCompilation, out var editedCompilation, out var succeeded); Assert.True(succeeded); Assert.Equal(2, editedCompilation.SyntaxTrees.Count()); driver = driver.RunFullGeneration(compilation, out outputCompilation, out _); Assert.Equal(2, outputCompilation.SyntaxTrees.Count()); // create an edit AdditionalFileAddedEdit edit = new AdditionalFileAddedEdit(new InMemoryAdditionalText("a\\file2.cs", "")); driver = driver.WithPendingEdits(ImmutableArray.Create <PendingEdit>(edit)); // now try apply edits driver = driver.TryApplyEdits(compilation, out editedCompilation, out succeeded); Assert.True(succeeded); Assert.Equal(3, editedCompilation.SyntaxTrees.Count()); // if we run a full compilation again, we should still get 3 syntax trees driver = driver.RunFullGeneration(compilation, out outputCompilation, out _); Assert.Equal(3, outputCompilation.SyntaxTrees.Count()); }
public void Multiple_Added_Additional_Files() { var source = @" class C { } "; var parseOptions = TestOptions.Regular; Compilation compilation = CreateCompilation(source, options: TestOptions.DebugDll, parseOptions: parseOptions); compilation.VerifyDiagnostics(); Assert.Single(compilation.SyntaxTrees); AdditionalFileAddedGenerator testGenerator = new AdditionalFileAddedGenerator(); GeneratorDriver driver = new CSharpGeneratorDriver(parseOptions, generators: ImmutableArray.Create <ISourceGenerator>(testGenerator), additionalTexts: ImmutableArray.Create <AdditionalText>(new InMemoryAdditionalText("a\\file1.cs", ""))); // run initial generation pass driver = driver.RunFullGeneration(compilation, out var outputCompilation, out _); Assert.Equal(2, outputCompilation.SyntaxTrees.Count()); // create an edit AdditionalFileAddedEdit edit = new AdditionalFileAddedEdit(new InMemoryAdditionalText("a\\file2.cs", "")); driver = driver.WithPendingEdits(ImmutableArray.Create <PendingEdit>(edit)); // now try apply edits driver = driver.TryApplyEdits(compilation, out var editedCompilation, out var succeeded); Assert.True(succeeded); Assert.Equal(3, editedCompilation.SyntaxTrees.Count()); // if we run a full compilation again, we should still get 3 syntax trees driver = driver.RunFullGeneration(compilation, out outputCompilation, out _); Assert.Equal(3, outputCompilation.SyntaxTrees.Count()); // lets add multiple edits driver = driver.WithPendingEdits(ImmutableArray.Create <PendingEdit>(new AdditionalFileAddedEdit(new InMemoryAdditionalText("a\\file3.cs", "")), new AdditionalFileAddedEdit(new InMemoryAdditionalText("a\\file4.cs", "")), new AdditionalFileAddedEdit(new InMemoryAdditionalText("a\\file5.cs", "")))); // now try apply edits driver = driver.TryApplyEdits(compilation, out editedCompilation, out succeeded); Assert.True(succeeded); Assert.Equal(6, editedCompilation.SyntaxTrees.Count()); }
public void Adding_Another_Generator_Makes_TryApplyEdits_Fail() { var source = @" class C { } "; var parseOptions = TestOptions.Regular; Compilation compilation = CreateCompilation(source, options: TestOptions.DebugDll, parseOptions: parseOptions); compilation.VerifyDiagnostics(); Assert.Single(compilation.SyntaxTrees); SingleFileTestGenerator testGenerator1 = new SingleFileTestGenerator("public class D { }"); SingleFileTestGenerator2 testGenerator2 = new SingleFileTestGenerator2("public class E { }"); GeneratorDriver driver = new CSharpGeneratorDriver(parseOptions, generators: ImmutableArray.Create <ISourceGenerator>(testGenerator1), optionsProvider: CompilerAnalyzerConfigOptionsProvider.Empty, additionalTexts: ImmutableArray <AdditionalText> .Empty); driver = driver.RunFullGeneration(compilation, out var outputCompilation, out _); Assert.Equal(2, outputCompilation.SyntaxTrees.Count()); // try apply edits driver = driver.TryApplyEdits(compilation, out _, out bool success); Assert.True(success); // add another generator driver = driver.AddGenerators(ImmutableArray.Create <ISourceGenerator>(testGenerator2)); // try apply changes should now fail driver = driver.TryApplyEdits(compilation, out _, out success); Assert.False(success); // full generation driver = driver.RunFullGeneration(compilation, out outputCompilation, out _); Assert.Equal(3, outputCompilation.SyntaxTrees.Count()); // try apply changes should now succeed driver.TryApplyEdits(compilation, out _, out success); Assert.True(success); }
public void TryApply_Edits_Fails_If_FullGeneration_Has_Not_Run() { var source = @" class C { } "; var parseOptions = TestOptions.Regular; Compilation compilation = CreateCompilation(source, options: TestOptions.DebugDll, parseOptions: parseOptions); compilation.VerifyDiagnostics(); Assert.Single(compilation.SyntaxTrees); AdditionalFileAddedGenerator testGenerator = new AdditionalFileAddedGenerator() { CanApplyChanges = false }; GeneratorDriver driver = new CSharpGeneratorDriver(parseOptions, ImmutableArray.Create <ISourceGenerator>(testGenerator), CompilerAnalyzerConfigOptionsProvider.Empty, ImmutableArray <AdditionalText> .Empty); // try apply edits should fail if we've not run a full compilation yet driver = driver.TryApplyEdits(compilation, out var outputCompilation, out var succeeded); Assert.False(succeeded); Assert.Equal(compilation, outputCompilation); }