dotnet / roslyn

The Roslyn .NET compiler provides C# and Visual Basic languages with rich code analysis APIs.
https://docs.microsoft.com/dotnet/csharp/roslyn-sdk/
MIT License
18.96k stars 4.03k forks source link

Source Generators allow duplicate hintNames between postInit and Execute #54036

Open chsienki opened 3 years ago

chsienki commented 3 years ago

It is possible to collide hintNames by placing the same value in postInit as in execute.

        [Fact]
        public void PostInit_Source_HintName_Is_Not_Useable_During_Execute()
        {
            var source = @"
class C { }
";
            var parseOptions = TestOptions.Regular;
            Compilation compilation = CreateCompilation(source, options: TestOptions.DebugDll, parseOptions: parseOptions);
            compilation.VerifyDiagnostics();

            Assert.Single(compilation.SyntaxTrees);

            static void postInit(GeneratorPostInitializationContext context)
            {
                context.AddSource("postInit", "public class D {} ");
            }

            static void execute(GeneratorExecutionContext context)
            {
                context.AddSource("postInit", "public class E {} ");
            }

            var generator = new CallbackGenerator((ic) => ic.RegisterForPostInitialization(postInit), execute);

            GeneratorDriver driver = CSharpGeneratorDriver.Create(new[] { generator }, parseOptions: parseOptions);
            driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var outputCompilation, out _);

            var results = driver.GetRunResult();

            // BUG: should produce a diagnostic about colliding hint names
            outputCompilation.VerifyDiagnostics();
        }
chsienki commented 3 years ago

Note this is very technically a breaking change, but I think we should take it as its not possible to correctly author a generator that does this anyway.