Skip to content

Add YamlDotNet source generator infrastructure for Native AOT support#4688

Closed
Copilot wants to merge 5 commits intomainfrom
copilot/use-yamldotnet-source-generator
Closed

Add YamlDotNet source generator infrastructure for Native AOT support#4688
Copilot wants to merge 5 commits intomainfrom
copilot/use-yamldotnet-source-generator

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Oct 8, 2025

Overview

This PR adds the YamlDotNet source generator infrastructure to prepare GitVersion for Native AOT (Ahead-of-Time) compilation support, as outlined in Using the YamlDotNet Source Generator for Native AOT.

Changes

1. Source Generator Package

  • Added Vecc.YamlDotNet.Analyzers.StaticGenerator v16.3.0 package reference
  • Created GitVersionConfigurationStaticContext class with [YamlStaticContext] and [YamlSerializable] attributes for main configuration types

2. Property Accessor Updates

Changed internal init to internal set for all configuration properties to support source generator requirements:

  • BranchConfiguration (14 properties)
  • GitVersionConfiguration (21 properties)
  • IgnoreConfiguration (4 properties)
  • PreventIncrementConfiguration (3 properties)

This change maintains encapsulation (internal setters) while providing flexibility for serialization and future source generator use.

3. Updated Public API Surface

Added generated types to PublicAPI.Unshipped.txt:

  • GitVersionConfigurationStaticContext
  • StaticTypeInspector and related methods

Current Status

While the infrastructure is in place, the static serializer/deserializer is not actively used due to current limitations in YamlDotNet's source generator (v16.3.0):

  1. Custom Type Inspector Limitation: The generated StaticTypeInspector doesn't honor custom type inspectors, which GitVersion requires for JsonPropertyName attribute mapping
  2. Dynamic Type Support: No support for Dictionary<object, object?> used in override configurations
  3. Complex Type Handling: Issues with nested and record types

The ConfigurationSerializer currently uses regular DeserializerBuilder/SerializerBuilder with a comment explaining the situation. The static context is instantiated but kept ready for future use.

Testing

✅ All 82 configuration tests pass (net8.0 and net9.0)
✅ Full backward compatibility maintained
✅ No breaking changes to existing functionality

Documentation

Added YAMLDOTNET_SOURCE_GENERATOR.md documenting:

  • Current implementation status
  • Known limitations
  • Migration path for future improvements

Future Work

When YamlDotNet's source generator improves support for custom type inspectors and complex types, we can enable it in ConfigurationSerializer.cs by switching to StaticDeserializerBuilder/StaticSerializerBuilder.

Related

Fixes #[issue_number]

Original prompt

This section details on the original issue you should resolve

<issue_title>[ISSUE]: Use the YamlDotNet source generator</issue_title>
<issue_description>Check this Blog https://andrewlock.net/using-the-yamldotnet-source-generator-for-native-aot/</issue_description>

Comments on the Issue (you are @copilot in this section)

Fixes #4369

💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.

Copilot AI and others added 3 commits October 8, 2025 18:38
- Added Vecc.YamlDotNet.Analyzers.StaticGenerator package
- Changed init properties to set properties to support source generator
- Created GitVersionConfigurationStaticContext for AOT compatibility
- Updated ConfigurationSerializer to use static serializer/deserializer
- Updated PublicAPI.Unshipped.txt with generated API surface

Co-authored-by: arturcic <1760506+arturcic@users.noreply.github.com>
The YamlDotNet source generator has limitations:
- Doesn't honor custom type inspectors for property naming
- Limited support for dynamic types
- The static context is kept for future use when generator improves

All tests now pass with the regular serializers.

Co-authored-by: arturcic <1760506+arturcic@users.noreply.github.com>
Co-authored-by: arturcic <1760506+arturcic@users.noreply.github.com>
Copilot AI changed the title [WIP] Add support for YamlDotNet source generator Add YamlDotNet source generator infrastructure for Native AOT support Oct 8, 2025
Copilot AI requested a review from arturcic October 8, 2025 18:48
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud bot commented Oct 8, 2025

{
// Static context is defined for future AOT support but not currently used
// due to limitations with custom type inspectors and init properties
private static readonly GitVersionConfigurationStaticContext staticContext = new();
Copy link
Copy Markdown
Member

@arturcic arturcic Oct 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot I actually need to use the source generator version, and I will later check the AOT

@arturcic arturcic marked this pull request as ready for review October 8, 2025 19:09
Copilot AI review requested due to automatic review settings October 8, 2025 19:09
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR adds YamlDotNet source generator infrastructure to prepare GitVersion for Native AOT (Ahead-of-Time) compilation support. The infrastructure is implemented but not actively used due to current limitations in YamlDotNet's source generator capabilities.

  • Added Vecc.YamlDotNet.Analyzers.StaticGenerator v16.3.0 package reference and created GitVersionConfigurationStaticContext class
  • Changed property accessors from internal init to internal set across all configuration classes to support source generator requirements
  • Added documentation explaining current limitations and future migration path

Reviewed Changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated no comments.

Show a summary per file
File Description
YAMLDOTNET_SOURCE_GENERATOR.md Documents implementation status, limitations, and future migration path
PublicAPI.Unshipped.txt Adds generated types to public API surface
PreventIncrementConfiguration.cs Changes 3 properties from init to set for generator compatibility
IgnoreConfiguration.cs Changes 4 properties from init to set for generator compatibility
GitVersionConfigurationStaticContext.cs New static context class with YamlDotNet source generator attributes
GitVersionConfiguration.cs Changes 21 properties from init to set for generator compatibility
GitVersion.Configuration.csproj Adds source generator package reference
ConfigurationSerializer.cs Adds static context instance for future use
BranchConfiguration.cs Changes 14 properties from init to set for generator compatibility
Directory.Packages.props Adds version definition for source generator package

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Ensures correct handling of custom types and properties.
@arturcic arturcic marked this pull request as draft November 25, 2025 22:09
@sonarqubecloud
Copy link
Copy Markdown

@arturcic arturcic force-pushed the main branch 11 times, most recently from 860c000 to 143e2a8 Compare March 18, 2026 00:18
This was referenced Mar 24, 2026
corpo-iwillspeak pushed a commit to crispthinking/athena-dotnet-client that referenced this pull request Mar 30, 2026
Updated
[coverlet.collector](https://github.com/coverlet-coverage/coverlet) from
8.0.0 to 8.0.1.

<details>
<summary>Release notes</summary>

_Sourced from [coverlet.collector's
releases](https://github.com/coverlet-coverage/coverlet/releases)._

## 8.0.1

### Fixed
- Fix [BUG] TypeInitializationException when targeting .NET Framework
[#​1818](coverlet-coverage/coverlet#1818)
- Fix [BUG] coverlet.MTP build fails with CS0400 due to
developmentDependency=true
[#​1827](coverlet-coverage/coverlet#1827)

### Improvements
- Additional improvements needed for .NET Framework instrumentation type
import
[#​1825](coverlet-coverage/coverlet#1825)

[Diff between 8.0.0 and
8.0.1](coverlet-coverage/coverlet@v8.0.0...v8.0.1)


Commits viewable in [compare
view](coverlet-coverage/coverlet@v8.0.0...v8.0.1).
</details>

Updated [GitVersion.MsBuild](https://github.com/GitTools/GitVersion)
from 6.6.0 to 6.7.0.

<details>
<summary>Release notes</summary>

_Sourced from [GitVersion.MsBuild's
releases](https://github.com/GitTools/GitVersion/releases)._

## 6.7.0

As part of this release we had [46
commits](GitTools/GitVersion@6.6.2...6.7.0)
which resulted in [3
issues](https://github.com/GitTools/GitVersion/milestone/85?closed=1)
being closed.

__Features__

- [__#​4369__](GitTools/GitVersion#4369)
[FEATURE]: Modernize YAML configuration serialization strategy by
[arturcic](https://github.com/arturcic) resolved in
[__!4686__](GitTools/GitVersion#4686) by
[copilot-swe-agent](https://github.com/apps/copilot-swe-agent),
[__!4688__](GitTools/GitVersion#4688) by
[copilot-swe-agent](https://github.com/apps/copilot-swe-agent),
[__!4886__](GitTools/GitVersion#4886) by
[arturcic](https://github.com/arturcic)

__Improvements__

- [__#​4880__](GitTools/GitVersion#4880) CI/CD
workflow hardening and release-process observability by
[arturcic](https://github.com/arturcic) resolved in
[__!4881__](GitTools/GitVersion#4881) by
[arturcic](https://github.com/arturcic)
- [__#​4883__](GitTools/GitVersion#4883)
Support nuget.org Trusted Publishing by
[arturcic](https://github.com/arturcic) resolved in
[__!4884__](GitTools/GitVersion#4884) by
[copilot-swe-agent](https://github.com/apps/copilot-swe-agent)

__Contributors__

2 contributors made this release possible.

<a href="https://github.com/arturcic"><img
src="https://avatars.githubusercontent.com/u/1760506?v=4" alt="arturcic"
height="32" width="32"/></a> <a
href="https://github.com/apps/copilot-swe-agent"><img
src="https://avatars.githubusercontent.com/in/1143301?v=4"
alt="copilot-swe-agent" height="32" width="32"/></a>
### SHA256 Hashes of the release artifacts
- `180fd7cf40fdfacf2c251176a4b613a444db2b40af477fd07a7c6d4d6b355dc6 -
gitversion-linux-arm64-6.7.0.tar.gz`
- `254d1de40ac82af4c17771f996cb6656e6f3ba0f9cd2f6e94e07d983ac79595a -
gitversion-linux-musl-arm64-6.7.0.tar.gz`
- `d59557ebd5fcd036387cf1c7e6fb82df7fe71b5409ec1a69fd4a0ba614ccbcb7 -
gitversion-linux-musl-x64-6.7.0.tar.gz`
- `e2012abfb3392a6f0ccf5f82738173c291b15bfdb2d5e9197777ec3f41b88f76 -
gitversion-linux-x64-6.7.0.tar.gz`
- `429108e0d51f98815b6fbf4ebba84cf53812a4c71eee67180456e8771e9f4320 -
gitversion-osx-arm64-6.7.0.tar.gz`
- `02f6b9ac0d70a18d8bc2c0e3eaf183377a2417ecadd5df452ab3150b4404182c -
gitversion-osx-x64-6.7.0.tar.gz`
- `873cdc294068cbbda43717e6384b849599d2d0db0db6f7c2592074c8f9386116 -
gitversion-win-arm64-6.7.0.zip`
- `55b43a1c1e1d174675ca1500410e64a0ad9904425f2329fe6b35b5368a31f629 -
gitversion-win-x64-6.7.0.zip`



## 6.6.2

As part of this release we had [30
commits](GitTools/GitVersion@6.6.1...6.6.2)
which resulted in [2
issues](https://github.com/GitTools/GitVersion/milestone/84?closed=1)
being closed.

__Improvements__

- [__#​4873__](GitTools/GitVersion#4873)
[ISSUE]: Improve error message for unsupported keys in /overrideconfig
command line option by
[denisbredikhin](https://github.com/denisbredikhin) resolved in
[__!4874__](GitTools/GitVersion#4874) by
[denisbredikhin](https://github.com/denisbredikhin)
- [__#​4877__](GitTools/GitVersion#4877)
Define CI/CD publishing policy and secure token ownership boundaries by
[arturcic](https://github.com/arturcic) resolved in
[__!4876__](GitTools/GitVersion#4876) by
[arturcic](https://github.com/arturcic)

__Contributors__

2 contributors made this release possible.

<a href="https://github.com/denisbredikhin"><img
src="https://avatars.githubusercontent.com/u/11455823?v=4"
alt="denisbredikhin" height="32" width="32"/></a> <a
href="https://github.com/arturcic"><img
src="https://avatars.githubusercontent.com/u/1760506?v=4" alt="arturcic"
height="32" width="32"/></a>
### SHA256 Hashes of the release artifacts
- `4d0637a80cdf5b615b0b5426f4c8a670db3f44d696bb68c2935b3ab801698090 -
gitversion-linux-arm64-6.6.2.tar.gz`
- `11e0bd3daa1b40f63dc5f61192a41a9d59f76a2513ddefa28ec47ac65c34ee00 -
gitversion-linux-musl-arm64-6.6.2.tar.gz`
- `fa526a55aa10a80e53ab6e85896144e23350c7366d6307b0f353d9d2d8353e73 -
gitversion-linux-musl-x64-6.6.2.tar.gz`
- `1c436efca8063f936ef9144b71350e813ae1a0d6dcd8256ef85c5254ce00714c -
gitversion-linux-x64-6.6.2.tar.gz`
- `3c7c331999ff6a69ca4942f4dbc84a87998b5f278df509551be0160415f9e67e -
gitversion-osx-arm64-6.6.2.tar.gz`
- `fb4d8c16e64360e9fb7df1c507d30c5a959fc0c41e0db2bc2dbcc55808b6d24b -
gitversion-osx-x64-6.6.2.tar.gz`
- `d0dfba1cdec96efcf5742173aa249fcd8cd866bd0cc519539976c0eaf49556f6 -
gitversion-win-arm64-6.6.2.zip`
- `8013cc3422d26ef014c903554be8be6a1b835514e8064f0ec6a63ca52c7f3729 -
gitversion-win-x64-6.6.2.zip`



## 6.6.1

As part of this release we had [67
commits](GitTools/GitVersion@6.6.0...6.6.1)
which resulted in [2
issues](https://github.com/GitTools/GitVersion/milestone/83?closed=1)
being closed.

__Improvements__

- [__#​4839__](GitTools/GitVersion#4839)
[ISSUE]: Refactor help and version command handling by
[arturcic](https://github.com/arturcic) resolved in
[__!4838__](GitTools/GitVersion#4838) by
[arturcic](https://github.com/arturcic)

__Contributors__

1 contributors made this release possible.

<a href="https://github.com/arturcic"><img
src="https://avatars.githubusercontent.com/u/1760506?v=4" alt="arturcic"
height="32" width="32"/></a>
### SHA256 Hashes of the release artifacts
- `abd80a77ebb3f4750255378f222076bef6884be46b07ee5bb35d84a5c2d5b6fb -
gitversion-linux-arm64-6.6.1.tar.gz`
- `37cf7184e9f94de20d1dfd80f5d94a20c74327cab241ba90116531559630a9df -
gitversion-linux-musl-arm64-6.6.1.tar.gz`
- `bdd393d9ab7a37811bc04a9b92687e99de6b5c0162be416aa6db0dbb9dae51ec -
gitversion-linux-musl-x64-6.6.1.tar.gz`
- `613b1247794aaf541b3060d5d5d6ef53e6b7a5779b0bf446f7549ebf935a1d38 -
gitversion-linux-x64-6.6.1.tar.gz`
- `2c19105a672c0da445c6998429cd6034b864b707bcd830bb5d4e9862572cc3e2 -
gitversion-osx-arm64-6.6.1.tar.gz`
- `ee07876b25cd5c53a4500ac94373dd07e207db64fca67201daaa4a78397aba20 -
gitversion-osx-x64-6.6.1.tar.gz`
- `d333202ff9c95131644a1d093c8e75fd4e29277168d3bdd72342d95c11b9ef08 -
gitversion-win-arm64-6.6.1.zip`
- `9a4deffb3c8ad25276577d3a6b8a69d80c3b6a0cb8f0b9c3a933fac7a2c46bbc -
gitversion-win-x64-6.6.1.zip`



Commits viewable in [compare
view](GitTools/GitVersion@6.6.0...6.7.0).
</details>

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE]: Modernize YAML configuration serialization strategy

3 participants