Skip to content

Fix numeric suffix added to interface method names in ByTag mode#914

Merged
christianhelle merged 4 commits into
mainfrom
copilot/fix-interface-method-naming
Mar 5, 2026
Merged

Fix numeric suffix added to interface method names in ByTag mode#914
christianhelle merged 4 commits into
mainfrom
copilot/fix-interface-method-naming

Conversation

Copilot AI commented Mar 2, 2026

Copy link
Copy Markdown
Contributor

Description:

When multipleInterfaces: ByTag is set, method names were receiving unnecessary global numeric suffixes (e.g., InfoGET2Async, InfoGET3Async) even though the names were unique within their respective interfaces. Uniqueness should be enforced per-interface, not across the entire spec.

Root cause: generator.GenerateFile() auto-populates NSwag OperationId values with globally unique names (e.g., infoGET, infoGET2, infoGET3). Since the interface generator was constructed after this call, CheckForDuplicateOperationIds() found no duplicates and kept the MultipleClientsFromOperationIdOperationNameGenerator, which used these globally-suffixed names verbatim.

A secondary bug: interfaceName was null! for the 2nd+ operations in each tag group, breaking per-interface deduplication via IdentifierUtils.Counted.

Changes

  • RefitGenerator – Construct the interface generator before GenerateFile() so CheckForDuplicateOperationIds() sees original null OperationIds and correctly switches to MultipleClientsFromFirstTagAndPathSegmentsOperationNameGenerator
  • RefitMultipleInterfaceByTagGenerator – Fix null! interfaceName for 2nd+ operations per group so IdentifierUtils.Counted deduplicates correctly at the interface level
  • RefitInterfaceGenerator – Add IdentifierUtils.Counted deduplication to guard against path-segment collisions within a single interface (e.g., two operations at different paths sharing the same last segment and HTTP method)
  • IdentifierUtils.Sanitize – Guard against empty string input that previously threw InvalidOperationException
  • OperationNameGenerator.SupportsMultipleClients – Delegate to defaultGenerator instead of throwing NotImplementedException, required now that the generator is set before GenerateFile() is called

Example OpenAPI Specifications:

openapi: '3.0.0'
info:
  title: Test API
  version: '1.0'
paths:
  /api/manage/info:
    get:
      tags: [Manage]
      responses: { '200': { description: ok } }
    post:
      tags: [Manage]
      responses: { '200': { description: ok } }
  /api/account/info:
    get:
      tags: [Account]
      responses: { '200': { description: ok } }
  /api/user/info:
    get:
      tags: [User]
      responses: { '200': { description: ok } }

Example generated Refit interface

Before (buggy — IAccountApi and IUserApi got global suffixes):

public partial interface IManageApi
{
    [Get("/api/manage/info")]
    Task InfoGET();
    [Post("/api/manage/info")]
    Task InfoPOST();
}
public partial interface IAccountApi
{
    [Get("/api/account/info")]
    Task InfoGET2();   // unnecessary suffix
}
public partial interface IUserApi
{
    [Get("/api/user/info")]
    Task InfoGET3();   // unnecessary suffix
}

After (fixed — names are unique per-interface):

public partial interface IManageApi
{
    [Get("/api/manage/info")]
    Task InfoGet();
    [Post("/api/manage/info")]
    Task InfoPost();
}
public partial interface IAccountApi
{
    [Get("/api/account/info")]
    Task Info();
}
public partial interface IUserApi
{
    [Get("/api/user/info")]
    Task Info();
}

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • collector.exceptionless.io
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/441dc2a7085145ae89517c0309aa5f71 get --global ls credential.usern/usr/bin/md5sum (dns block)
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/8fbc23b60083492b9b8f25ae4fe344f5 de8d07a4bb684a0d3e608ac7172/Project.csproj --global ndor/bin/bash user.email (dns block)
    • Triggering command: /usr/bin/dotnet dotnet /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests.dll --maximum-parallel-tests 1 /var/lib/dpkg/info/libheif-plugin-aomdec:amd64.list /var/lib/dpkg/info/landscape-common.list /var/lib/dpkg/info/libksba8:amd64.list /var/lib/dpkg/info/libsubid4:amd64.list /var/lib/dpkg/info/libldap2:amd64.list /var/lib/dpkg/info/base-passwd.list /var/lib/dpkg/info/libvulkan1:amd64.list /var/lib/dpkg/info/sysstat.list --no�� se/net10.0/123d477f0c5c4f7a85b590cfcc679888/Project.csproj (dns block)
  • config.exceptionless.io
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/441dc2a7085145ae89517c0309aa5f71 get --global ls credential.usern/usr/bin/md5sum (dns block)
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/8fbc23b60083492b9b8f25ae4fe344f5 de8d07a4bb684a0d3e608ac7172/Project.csproj --global ndor/bin/bash user.email (dns block)
    • Triggering command: /usr/bin/dotnet dotnet /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests.dll /var/lib/dpkg/info/libsensors-config.list /var/lib/dpkg/info/ruby-webrick.list /var/lib/dpkg/info/mysql-client-8.0.list /var/lib/dpkg/info/pastebinit.list /var/lib/dpkg/info/libllvm16t64:amd64.list /var/lib/dpkg/info/php-pear.list /var/lib/dpkg/info/libmecab2:amd64.list /var/lib/dpkg/info/libice6:amd64.list /var/lib/dpkg/info/tmux.list /var/lib/dpkg/info/mysql-common.list --no�� se/net10.0/1ee87/usr/share/dotnet/dotnet (dns block)
  • developers.intellihr.io
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/441dc2a7085145ae89517c0309aa5f71 get --global ls credential.usern/usr/bin/md5sum (dns block)
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/8fbc23b60083492b9b8f25ae4fe344f5 de8d07a4bb684a0d3e608ac7172/Project.csproj --global ndor/bin/bash user.email (dns block)
    • Triggering command: /usr/bin/dotnet dotnet /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests.dll /var/lib/dpkg/info/libsensors-config.list /var/lib/dpkg/info/ruby-webrick.list /var/lib/dpkg/info/mysql-client-8.0.list /var/lib/dpkg/info/pastebinit.list /var/lib/dpkg/info/libllvm16t64:amd64.list /var/lib/dpkg/info/php-pear.list /var/lib/dpkg/info/libmecab2:amd64.list /var/lib/dpkg/info/libice6:amd64.list /var/lib/dpkg/info/tmux.list /var/lib/dpkg/info/mysql-common.list --no�� se/net10.0/1ee87/usr/share/dotnet/dotnet (dns block)
  • heartbeat.exceptionless.io
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/441dc2a7085145ae89517c0309aa5f71 get --global ls credential.usern/usr/bin/md5sum (dns block)
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/8fbc23b60083492b9b8f25ae4fe344f5 de8d07a4bb684a0d3e608ac7172/Project.csproj --global ndor/bin/bash user.email (dns block)
    • Triggering command: /usr/bin/dotnet dotnet /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests.dll --maximum-parallel-tests 1 /var/lib/dpkg/info/libheif-plugin-aomdec:amd64.list /var/lib/dpkg/info/landscape-common.list /var/lib/dpkg/info/libksba8:amd64.list /var/lib/dpkg/info/libsubid4:amd64.list /var/lib/dpkg/info/libldap2:amd64.list /var/lib/dpkg/info/base-passwd.list /var/lib/dpkg/info/libvulkan1:amd64.list /var/lib/dpkg/info/sysstat.list --no�� se/net10.0/123d477f0c5c4f7a85b590cfcc679888/Project.csproj (dns block)
  • petstore.swagger.io
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/441dc2a7085145ae89517c0309aa5f71 get --global ls credential.usern/usr/bin/md5sum (dns block)
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/8fbc23b60083492b9b8f25ae4fe344f5 de8d07a4bb684a0d3e608ac7172/Project.csproj --global ndor/bin/bash user.email (dns block)
    • Triggering command: /usr/bin/dotnet dotnet /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests.dll /var/lib/dpkg/info/libsensors-config.list /var/lib/dpkg/info/ruby-webrick.list /var/lib/dpkg/info/mysql-client-8.0.list /var/lib/dpkg/info/pastebinit.list /var/lib/dpkg/info/libllvm16t64:amd64.list /var/lib/dpkg/info/php-pear.list /var/lib/dpkg/info/libmecab2:amd64.list /var/lib/dpkg/info/libice6:amd64.list /var/lib/dpkg/info/tmux.list /var/lib/dpkg/info/mysql-common.list --no�� se/net10.0/1ee87/usr/share/dotnet/dotnet (dns block)
  • petstore3.swagger.io
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/441dc2a7085145ae89517c0309aa5f71 get --global ls credential.usern/usr/bin/md5sum (dns block)
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests --server dotnettestcli --dotnet-test-pipe /tmp/8fbc23b60083492b9b8f25ae4fe344f5 de8d07a4bb684a0d3e608ac7172/Project.csproj --global ndor/bin/bash user.email (dns block)
    • Triggering command: /usr/bin/dotnet dotnet /home/REDACTED/work/refitter/refitter/src/Refitter.Tests/bin/Release/net10.0/Refitter.Tests.dll /var/lib/dpkg/info/libsensors-config.list /var/lib/dpkg/info/ruby-webrick.list /var/lib/dpkg/info/mysql-client-8.0.list /var/lib/dpkg/info/pastebinit.list /var/lib/dpkg/info/libllvm16t64:amd64.list /var/lib/dpkg/info/php-pear.list /var/lib/dpkg/info/libmecab2:amd64.list /var/lib/dpkg/info/libice6:amd64.list /var/lib/dpkg/info/tmux.list /var/lib/dpkg/info/mysql-common.list --no�� se/net10.0/1ee87/usr/share/dotnet/dotnet (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

This section details on the original issue you should resolve

<issue_title>Code Generator adds numeric suffix to Interface method name when not needed</issue_title>
<issue_description>Describe the bug
When the flag "multipleInterfaces" is set to "ByTag", the method names are still being renamed to have numerical suffixes even though the names are unique within the Interface (e.g. InfoGET3Async).

The check for method name uniqueness should be performed at the interface level, and not at the OpenAPI specification level.

    public partial interface IManageApi
    {
        [Headers("Accept: text/plain, application/json, text/json")]
        [Post("/api/manage/2fa")]
        Task<IApiResponse> _2faAsync([Body] TwoFactorRequest? body = default, CancellationToken cancellationToken = default);

        [Headers("Accept: text/plain, application/json, text/json")]
        [Get("/api/manage/info")]
        Task<IApiResponse> InfoGET3Async(CancellationToken cancellationToken = default);

        [Headers("Accept: text/plain, application/json, text/json")]
        [Post("/api/manage/info")]
        Task<IApiResponse> InfoPOSTAsync([Body] InfoRequest? body = default, [Header("confirmEmail")] string? confirmEmail = default, CancellationToken cancellationToken = default);
    }

Support Key: 7l7irxz

OpenAPI Specifications
n/a

</issue_description>

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

@christianhelle Thanks for taking the time to report this @dammitjanet

For the best code generation experience, I think that specifying the operationId at the OpenAPI specification level is best. Code generators, like mine, would try to do best guess attempts on how to name methods for each operation and one of the ways this is done is by looking at things like the verbs, path segments, and tags

You can maybe experiment with the --operation-name-generator CLI tool argument to try out different naming styles. Possible values for --operation-name-generator are documented here. The operation name generator options are taken directly from NSwag, the tool I use to parse the OpenAPI spec and generate models</comment_new>
<comment_new>@christianhelle
We could look into implementing some sort of "last line of defense" that checks if the generated method name will compile and if not, make a naive attempt to replace invalid characters with "something else". Something like this would never be perfect but it could save someone like @dammitjanet time and avoid changing the OpenAPI spec itself to get the generated code to work</comment_new>
<comment_new>@christianhelle
I thought this was fixed 2 years ago. I'll investigate this myself later and see what I can do. For now I'll assign CoPilot to the issue and hopefully it can point what could be wrong</comment_new>


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

Copilot AI and others added 2 commits March 2, 2026 08:02
- Move interface generator construction before GenerateFile() so
  OperationNameGenerator.CheckForDuplicateOperationIds() sees original
  (pre-generation) operation IDs, preventing NSwag auto-generated IDs
  with global numeric suffixes from being used as method names
- Fix null interfaceName bug in RefitMultipleInterfaceByTagGenerator
  ensuring per-interface deduplication via IdentifierUtils.Counted
- Add IdentifierUtils.Counted deduplication to RefitInterfaceGenerator
  to handle edge cases where path segments produce duplicate names
- Fix IdentifierUtils.Sanitize to handle empty strings gracefully
- Fix OperationNameGenerator.SupportsMultipleClients to delegate to
  defaultGenerator instead of throwing NotImplementedException
- Add regression tests for the ByTag numeric suffix issue

Co-authored-by: christianhelle <710400+christianhelle@users.noreply.github.com>
Co-authored-by: christianhelle <710400+christianhelle@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix numeric suffix in Interface method names when not needed Fix numeric suffix added to interface method names in ByTag mode Mar 2, 2026
@codecov

codecov Bot commented Mar 2, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.64%. Comparing base (bbdab25) to head (5697bed).
⚠️ Report is 40 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #914      +/-   ##
==========================================
+ Coverage   93.26%   93.64%   +0.38%     
==========================================
  Files          23       23              
  Lines        2063     1433     -630     
==========================================
- Hits         1924     1342     -582     
+ Misses         39       38       -1     
+ Partials      100       53      -47     
Flag Coverage Δ
unittests 93.64% <100.00%> (+0.38%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@christianhelle christianhelle added enhancement New feature, bug fix, or request .NET Pull requests that contain changes to .NET code labels Mar 4, 2026
@christianhelle
christianhelle marked this pull request as ready for review March 5, 2026 06:15
Copilot AI review requested due to automatic review settings March 5, 2026 06:15

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Fixes method-name numeric suffixing when generating multiple Refit interfaces in MultipleInterfaces.ByTag mode by ensuring operation-name uniqueness is evaluated per interface (not globally across the spec) and by hardening identifier generation.

Changes:

  • Construct the interface generator before NSwag DTO generation so operation-name generator selection happens before NSwag auto-populates globally-unique OperationIds.
  • Fix per-tag interface name tracking so per-interface deduplication (IdentifierUtils.Counted) works across all operations in a tag group.
  • Add additional identifier guards/deduplication (IdentifierUtils.Sanitize empty input guard; per-interface operation-name dedup in RefitInterfaceGenerator) and add a regression test.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
src/Refitter.Tests/Examples/MultipleInterfacesByTagsWithSamePathSegmentTests.cs New regression test for ByTag cross-interface suffixing
src/Refitter.Core/RefitMultipleInterfaceByTagGenerator.cs Fixes interfaceName being null! for subsequent ops in a tag group
src/Refitter.Core/RefitInterfaceGenerator.cs Adds per-interface operation-name deduplication using IdentifierUtils.Counted
src/Refitter.Core/RefitGenerator.cs Moves interface generator creation before GenerateFile() to avoid NSwag global OperationId suffixing side effects
src/Refitter.Core/OperationNameGenerator.cs Implements SupportsMultipleClients by delegating to the wrapped generator
src/Refitter.Core/IdentifierUtils.cs Prevents Sanitize() from throwing on empty input
Comments suppressed due to low confidence (1)

src/Refitter.Core/RefitMultipleInterfaceByTagGenerator.cs:69

  • In ByTag mode, dynamic querystring parameter helper types are named from the operation name only (e.g., "InfoQueryParams"). Now that method names are intentionally allowed to repeat across different interfaces, two interfaces can easily produce the same type name when UseDynamicQuerystringParameters is enabled (>=2 query params), causing a compile-time duplicate type error. Consider including the interface name (or group key) in the generated dynamicQuerystringParameterType to keep these helper type names unique across all generated interfaces.
                var operationName = GetOperationName(interfaceName, op.PathItem.Key, operations.Key, operation);
                var dynamicQuerystringParameterType = operationName + "QueryParams";
                var operationModel = generator.CreateOperationModel(operation);

You can also share your feedback on Copilot code review. Take the survey.

Comment thread src/Refitter.Tests/Examples/MultipleInterfacesByTagsWithSamePathSegmentTests.cs Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@christianhelle
christianhelle merged commit 3184be5 into main Mar 5, 2026
6 of 8 checks passed
@christianhelle
christianhelle deleted the copilot/fix-interface-method-naming branch March 5, 2026 06:24
@sonarqubecloud

sonarqubecloud Bot commented Mar 5, 2026

Copy link
Copy Markdown

hwinther pushed a commit to hwinther/test that referenced this pull request May 6, 2026
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>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=refitter&package-manager=nuget&previous-version=1.7.1&new-version=2.0.0)](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>
vgmello pushed a commit to vgmello/momentum that referenced this pull request May 10, 2026
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>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Refitter.MSBuild&package-manager=nuget&previous-version=1.7.3&new-version=2.0.0)](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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature, bug fix, or request .NET Pull requests that contain changes to .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Code Generator adds numeric suffix to Interface method name when not needed

3 participants