From 6252c9d756ae0c855f135bb97902b7ddb273f71f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Mar 2026 12:35:06 +0000 Subject: [PATCH 1/4] Initial plan From 345dec898e452effad0968a8590125c4ef7b3d8c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Mar 2026 12:39:56 +0000 Subject: [PATCH 2/4] Preserve compilation output kind for generator execution and add top-level statements regression test Co-authored-by: dex3r <3155725+dex3r@users.noreply.github.com> --- .../GeneratesMethodExecutionRuntimeTests.cs | 40 ++++++++++++++++++- .../GeneratesMethodExecutionRuntime.cs | 5 ++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/EasySourceGenerators.GeneratorTests/GeneratesMethodExecutionRuntimeTests.cs b/EasySourceGenerators.GeneratorTests/GeneratesMethodExecutionRuntimeTests.cs index cbaf263..dd849c4 100644 --- a/EasySourceGenerators.GeneratorTests/GeneratesMethodExecutionRuntimeTests.cs +++ b/EasySourceGenerators.GeneratorTests/GeneratesMethodExecutionRuntimeTests.cs @@ -57,6 +57,39 @@ public static class GenHost Assert.That(result.value, Is.EqualTo("hello")); } + [Test] + public void ExecuteSimpleGeneratorMethod_ExecutesWhenCompilationHasTopLevelStatements() + { + CSharpCompilation compilation = CreateCompilation(""" + using System; + + Console.WriteLine("warmup"); + + namespace TestNamespace + { + public partial class Target + { + public partial string GetValue(); + } + + public static class GenHost + { + public static string Generate() => "hello"; + } + } + """, + outputKind: OutputKind.ConsoleApplication); + + IMethodSymbol generatorMethod = GetMethodSymbol(compilation, "TestNamespace.GenHost", "Generate"); + IMethodSymbol partialMethod = GetMethodSymbol(compilation, "TestNamespace.Target", "GetValue"); + + (string? value, string? error) result = + GeneratesMethodExecutionRuntime.ExecuteSimpleGeneratorMethod(generatorMethod, partialMethod, compilation); + + Assert.That(result.error, Is.Null); + Assert.That(result.value, Is.EqualTo("hello")); + } + [Test] public void ExecuteGeneratorMethodWithArgs_ConvertsArgumentsToMethodParameterType() { @@ -253,14 +286,17 @@ public static string Generate() Assert.That(result.error, Does.StartWith("Compilation failed:")); } - private static CSharpCompilation CreateCompilation(string source, string assemblyName = "TestAssembly") + private static CSharpCompilation CreateCompilation( + string source, + string assemblyName = "TestAssembly", + OutputKind outputKind = OutputKind.DynamicallyLinkedLibrary) { SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(source); CSharpCompilation compilation = CSharpCompilation.Create( assemblyName: assemblyName, syntaxTrees: new[] { syntaxTree }, references: GetMetadataReferences(), - options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + options: new CSharpCompilationOptions(outputKind)); return compilation; } diff --git a/EasySourceGenerators.Generators/GeneratesMethodExecutionRuntime.cs b/EasySourceGenerators.Generators/GeneratesMethodExecutionRuntime.cs index 723a93a..75afa8d 100644 --- a/EasySourceGenerators.Generators/GeneratesMethodExecutionRuntime.cs +++ b/EasySourceGenerators.Generators/GeneratesMethodExecutionRuntime.cs @@ -344,8 +344,9 @@ private static CSharpCompilation BuildExecutionCompilation( CSharpParseOptions parseOptions = compilation.SyntaxTrees.FirstOrDefault()?.Options as CSharpParseOptions ?? CSharpParseOptions.Default; - return (CSharpCompilation)compilation - .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)) + CSharpCompilation cSharpCompilation = (CSharpCompilation)compilation; + + return cSharpCompilation .AddSyntaxTrees( CSharpSyntaxTree.ParseText(dummySource, parseOptions), CSharpSyntaxTree.ParseText(methodBuilderSource, parseOptions), From bc034b2ea85811d5c4fa6fc0cef2bbe8d14f9164 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Mar 2026 12:42:18 +0000 Subject: [PATCH 3/4] Apply review cleanup and finalize executable output-kind fix Co-authored-by: dex3r <3155725+dex3r@users.noreply.github.com> --- .../GeneratesMethodExecutionRuntime.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/EasySourceGenerators.Generators/GeneratesMethodExecutionRuntime.cs b/EasySourceGenerators.Generators/GeneratesMethodExecutionRuntime.cs index 75afa8d..8efb3fa 100644 --- a/EasySourceGenerators.Generators/GeneratesMethodExecutionRuntime.cs +++ b/EasySourceGenerators.Generators/GeneratesMethodExecutionRuntime.cs @@ -344,9 +344,7 @@ private static CSharpCompilation BuildExecutionCompilation( CSharpParseOptions parseOptions = compilation.SyntaxTrees.FirstOrDefault()?.Options as CSharpParseOptions ?? CSharpParseOptions.Default; - CSharpCompilation cSharpCompilation = (CSharpCompilation)compilation; - - return cSharpCompilation + return (CSharpCompilation)compilation .AddSyntaxTrees( CSharpSyntaxTree.ParseText(dummySource, parseOptions), CSharpSyntaxTree.ParseText(methodBuilderSource, parseOptions), From 3ce68ee7bbd080bfc4b190c25efc87050d21eb50 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Mar 2026 12:51:12 +0000 Subject: [PATCH 4/4] Add explicit System.Console metadata reference in runtime regression tests Co-authored-by: dex3r <3155725+dex3r@users.noreply.github.com> --- .../GeneratesMethodExecutionRuntimeTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/EasySourceGenerators.GeneratorTests/GeneratesMethodExecutionRuntimeTests.cs b/EasySourceGenerators.GeneratorTests/GeneratesMethodExecutionRuntimeTests.cs index dd849c4..2da4545 100644 --- a/EasySourceGenerators.GeneratorTests/GeneratesMethodExecutionRuntimeTests.cs +++ b/EasySourceGenerators.GeneratorTests/GeneratesMethodExecutionRuntimeTests.cs @@ -309,6 +309,7 @@ private static ImmutableArray GetMetadataReferences() MetadataReference.CreateFromFile(Path.Combine(dotnetDirectory, "System.Runtime.dll")), MetadataReference.CreateFromFile(Path.Combine(dotnetDirectory, "System.Collections.dll")), MetadataReference.CreateFromFile(Path.Combine(dotnetDirectory, "System.Linq.dll")), + MetadataReference.CreateFromFile(Path.Combine(dotnetDirectory, "System.Console.dll")), MetadataReference.CreateFromFile(Path.Combine(dotnetDirectory, "netstandard.dll")), MetadataReference.CreateFromFile(typeof(Generate).Assembly.Location), MetadataReference.CreateFromFile(typeof(GeneratesMethodExecutionRuntime).Assembly.Location)