Skip to content

Fix string escaping, null safety, and numeric literals in optional parameter default values#804

Merged
christianhelle merged 5 commits into
mainfrom
copilot/sub-pr-803
Nov 11, 2025
Merged

Fix string escaping, null safety, and numeric literals in optional parameter default values#804
christianhelle merged 5 commits into
mainfrom
copilot/sub-pr-803

Conversation

Copilot AI commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

Description:

Addresses code review feedback for optional parameter default value generation. Three critical issues prevented correct code generation when OpenAPI specs contained default values with special characters, null type references, or floating-point numbers. Additionally, fixes two SonarCloud code quality issues related to performance and null reference warnings, and adds comprehensive test coverage for all edge cases.

Changes:

  • String escaping: Added EscapeString() to handle quotes, backslashes, newlines, carriage returns, tabs, and additional escape sequences (form feed, vertical tab, backspace, null character) in default string values. Optimized implementation using StringBuilder with conservative memory allocation (value.Length + 10) for better performance.
  • Null safety: Added type null check before accessing parameterModel.Type to prevent NullReferenceException. Restructured conditional logic to eliminate CS8602 compiler warning about possible null dereference.
  • Numeric literals: Added FormatNumericValue() to append type suffixes:
    • f suffix for float/Single types
    • m suffix for decimal/Decimal types
    • L suffix for long/Int64 types (for values exceeding int.MaxValue)
    • UL suffix for ulong/UInt64 types
    • .0 appended to double/Double types with integer values to ensure proper type inference
  • Test coverage: Added 17 comprehensive tests covering all escape characters, numeric types (float, decimal, int, long, ulong, double), boolean formatting, empty strings, mixed escape sequences, and both regular and dynamic query string parameter scenarios

SonarCloud Issues Fixed:

  1. Performance: Replaced multiple string.Replace() calls with StringBuilder for efficient string manipulation
  2. Null Reference Warning (CS8602): Restructured null check using if statement instead of ternary operator to satisfy compiler flow analysis

Code Review Improvements:

  1. StringBuilder Optimization: Reduced initial capacity from value.Length * 2 to value.Length + 10 for more conservative memory allocation
  2. Additional Escape Sequences: Added support for \f (form feed), \v (vertical tab), \b (backspace), and \0 (null character)
  3. Double Literal Formatting: Added FormatDoubleLiteral() method to ensure integer values in double types are formatted with .0 (e.g., 10.0 instead of 10)
  4. Long Integer Suffixes: Added L and UL suffixes for long and ulong types to prevent compilation errors with large integer values

Tests Added:

  • OptionalParametersWithDefaultValuesEdgeCasesTests (11 tests): All escape characters, integer types, double values with decimal point formatting, boolean lowercase formatting, empty string handling, mixed escape sequences, long/ulong suffixes
  • DynamicQueryStringParametersEdgeCasesTests (10 tests): Escaped strings in dynamic query string classes, all escape characters in properties, float/decimal with suffixes, boolean lowercase in properties, integer types in properties, long/ulong suffixes, double integer value formatting, build validation

Example OpenAPI Specifications:

{
  "openapi": "3.0.1",
  "paths": {
    "/api/test": {
      "get": {
        "parameters": [
          {
            "name": "message",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "path\\to\\file with \"quotes\""
            }
          },
          {
            "name": "ratio",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "format": "float",
              "default": 1.5
            }
          },
          {
            "name": "price",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "format": "decimal",
              "default": 99.99
            }
          },
          {
            "name": "count",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int64",
              "default": 3000000000
            }
          },
          {
            "name": "threshold",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "format": "double",
              "default": 10
            }
          }
        ],
        "responses": {
          "200": { "description": "Success" }
        }
      }
    }
  }
}

Example generated Refit interface

public partial interface ITestAPI
{
    [Headers("Accept: application/json")]
    [Get("/api/test")]
    Task Test(
        [Query] string? message = "path\\to\\file with \"quotes\"",
        [Query] float? ratio = 1.5f,
        [Query] decimal? price = 99.99m,
        [Query] long? count = 3000000000L,
        [Query] double? threshold = 10.0);
}

💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@coderabbitai

coderabbitai Bot commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.


Comment @coderabbitai help to get the list of available commands and usage tips.

Co-authored-by: christianhelle <710400+christianhelle@users.noreply.github.com>
@sonarqubecloud

sonarqubecloud Bot commented Nov 7, 2025

Copy link
Copy Markdown

Copilot AI changed the title [WIP] Improve optional parameters with default values Fix string escaping, null safety, and numeric literals in optional parameter default values Nov 7, 2025
Copilot AI requested a review from christianhelle November 7, 2025 14:09
@codecov

codecov Bot commented Nov 9, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 65.11628% with 15 lines in your changes missing coverage. Please review.
✅ Project coverage is 95.23%. Comparing base (284bdc8) to head (c7ca8f8).
⚠️ Report is 37 commits behind head on main.

Files with missing lines Patch % Lines
src/Refitter.Core/ParameterExtractor.cs 65.11% 9 Missing and 6 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #804      +/-   ##
==========================================
- Coverage   95.83%   95.23%   -0.60%     
==========================================
  Files          23       23              
  Lines        1871     1909      +38     
  Branches      306      311       +5     
==========================================
+ Hits         1793     1818      +25     
- Misses         39       48       +9     
- Partials       39       43       +4     
Flag Coverage Δ
unittests 95.23% <65.11%> (-0.60%) ⬇️

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.

Base automatically changed from optional-parameters to main November 9, 2025 09:19
@christianhelle

Copy link
Copy Markdown
Owner

@copilot the changes here introduced 2 new issues detected by SonarCloud

Details found in https://sonarcloud.io/project/issues?id=christianhelle_refitter&pullRequest=804&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true

Fix them

…e warning

Co-authored-by: christianhelle <710400+christianhelle@users.noreply.github.com>

Copilot AI commented Nov 9, 2025

Copy link
Copy Markdown
Contributor Author

@copilot the changes here introduced 2 new issues detected by SonarCloud

Details found in https://sonarcloud.io/project/issues?id=christianhelle_refitter&pullRequest=804&issueStatuses=OPEN,CONFIRME...

Fixed both SonarCloud issues:

  1. Performance: Replaced chained string.Replace() calls with StringBuilder in EscapeString() method for better performance
  2. Null safety: Restructured null check in GetDefaultValueForParameter() to eliminate CS8602 warning about possible null dereference

All tests pass. Commit: e17d732

@christianhelle
christianhelle marked this pull request as ready for review November 9, 2025 09:45
Copilot AI review requested due to automatic review settings November 9, 2025 09:45
@christianhelle

Copy link
Copy Markdown
Owner

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

This PR adds edge case handling for optional parameters with default values, specifically addressing proper escaping of special characters in string defaults and adding type suffixes for numeric literals (float, decimal).

Key Changes:

  • Implemented string escaping logic to handle quotes, backslashes, newlines, carriage returns, and tabs in default parameter values
  • Added numeric value formatting with appropriate type suffixes ('f' for float, 'm' for decimal)
  • Created comprehensive test suite to validate string escaping and numeric formatting behavior

Reviewed Changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 5 comments.

File Description
src/Refitter.Tests/Examples/OptionalParametersWithDefaultValuesEdgeCasesTests.cs New test file with 4 test methods covering string escaping edge cases, float/decimal type suffixes, and build validation
src/Refitter.Core/ParameterExtractor.cs Enhanced parameter default value formatting with EscapeString() method for string literals and FormatNumericValue() method for numeric type suffixes

Comment thread src/Refitter.Core/ParameterExtractor.cs Outdated
Comment on lines +210 to +214
"decimal" or "Decimal" => $"{numericString}m",
_ => numericString
};
}

Copilot AI Nov 9, 2025

Copy link

Choose a reason for hiding this comment

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

The FormatNumericValue method doesn't handle the double type suffix. While doubles don't require a suffix in most cases, if the numeric value is an integer (e.g., 1, 10), it will be treated as int by default in C# unless explicitly cast. For double types with integer values, you should append .0 to ensure the literal is treated as a double. For example, double? value = 10 should be double? value = 10.0 or double? value = 10d.

Suggested change
"decimal" or "Decimal" => $"{numericString}m",
_ => numericString
};
}
"decimal" or "Decimal" => $"{numericString}m",
"double" or "Double" => FormatDoubleLiteral(numericString),
_ => numericString
};
}
// Ensures that double literals are formatted with .0 if integer, or as-is if already floating-point
private static string FormatDoubleLiteral(string numericString)
{
// If the string already contains a decimal point or exponent, return as-is
if (numericString.Contains('.') || numericString.Contains('e') || numericString.Contains('E'))
return numericString;
// Otherwise, append .0 to make it a double literal
return numericString + ".0";
}

Copilot uses AI. Check for mistakes.
Comment on lines +171 to +199
private static string EscapeString(string value)
{
var sb = new StringBuilder(value.Length * 2);
foreach (var c in value)
{
switch (c)
{
case '\\':
sb.Append("\\\\");
break;
case '"':
sb.Append("\\\"");
break;
case '\n':
sb.Append("\\n");
break;
case '\r':
sb.Append("\\r");
break;
case '\t':
sb.Append("\\t");
break;
default:
sb.Append(c);
break;
}
}
return sb.ToString();
}

Copilot AI Nov 9, 2025

Copy link

Choose a reason for hiding this comment

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

The EscapeString method should handle additional escape sequences for completeness. Consider adding cases for:

  • Form feed (\f\\f)
  • Vertical tab (\v\\v)
  • Backspace (\b\\b)

While these are less common in API parameters, handling them ensures robustness when dealing with various string defaults.

Copilot uses AI. Check for mistakes.
return type switch
{
"float" or "Single" => $"{numericString}f",
"decimal" or "Decimal" => $"{numericString}m",

Copilot AI Nov 9, 2025

Copy link

Choose a reason for hiding this comment

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

The FormatNumericValue method doesn't handle long and ulong type suffixes. In C#, large integer values that exceed int.MaxValue (2,147,483,647) must have an L suffix to be treated as long literals. Without the suffix, values like long? value = 3000000000 will cause a compilation error. Add cases for:

  • "long" or "Int64" → append L
  • "ulong" or "UInt64" → append UL

Additionally, consider appending U for uint types to be explicit, though this is optional for values within int range.

Suggested change
"decimal" or "Decimal" => $"{numericString}m",
"decimal" or "Decimal" => $"{numericString}m",
"long" or "Int64" => $"{numericString}L",
"ulong" or "UInt64" => $"{numericString}UL",
"uint" or "UInt32" => $"{numericString}U",

Copilot uses AI. Check for mistakes.
Comment on lines +171 to +199
private static string EscapeString(string value)
{
var sb = new StringBuilder(value.Length * 2);
foreach (var c in value)
{
switch (c)
{
case '\\':
sb.Append("\\\\");
break;
case '"':
sb.Append("\\\"");
break;
case '\n':
sb.Append("\\n");
break;
case '\r':
sb.Append("\\r");
break;
case '\t':
sb.Append("\\t");
break;
default:
sb.Append(c);
break;
}
}
return sb.ToString();
}

Copilot AI Nov 9, 2025

Copy link

Choose a reason for hiding this comment

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

The EscapeString method does not handle the null character (\0) which can appear in string defaults. If a string contains \0, it should be escaped as \\0 to be valid in C# string literals. Consider adding a case for '\0' that appends "\\0".

Copilot uses AI. Check for mistakes.
…al formatting

Co-authored-by: christianhelle <710400+christianhelle@users.noreply.github.com>

Copilot AI commented Nov 9, 2025

Copy link
Copy Markdown
Contributor Author

@copilot The new code lacks code coverage. Add tests to cover them. Codecov detected missing coverage, details available here: https://app.codecov.io/gh/christianhelle/refitter/pull/804?dropdown=cove...

Added comprehensive test coverage for the new code. Created 12 new tests across two test files:

OptionalParametersWithDefaultValuesEdgeCasesTests (6 new tests):

  • All escape characters (\r, \t, \n, \, ")
  • Integer types (int32, int64) without suffixes
  • Double values without suffixes
  • Boolean lowercase formatting
  • Empty string handling

DynamicQueryStringParametersEdgeCasesTests (6 new tests):

  • Escaped strings in dynamic query string classes
  • All escape characters in properties
  • Float/decimal with suffixes
  • Boolean lowercase in properties
  • Integer types in properties
  • Build validation

All 16 tests pass and generated code compiles. Commit: 7402111

@christianhelle

Copy link
Copy Markdown
Owner

@copilot apply changes based on the comments in this thread

…al formatting

Co-authored-by: christianhelle <710400+christianhelle@users.noreply.github.com>
@sonarqubecloud

Copy link
Copy Markdown

Please retry analysis of this Pull-Request directly on SonarQube Cloud

@sonarqubecloud

Copy link
Copy Markdown

Copilot AI commented Nov 11, 2025

Copy link
Copy Markdown
Contributor Author

@copilot apply changes based on the comments in this thread

Applied all changes from the review thread:

  1. StringBuilder capacity: Changed from value.Length * 2 to value.Length + 10
  2. Additional escape sequences: Added \f, \v, \b, \0 support
  3. Double literal formatting: Added FormatDoubleLiteral() to append .0 for integer values
  4. Long/ULong suffixes: Added L and UL suffixes for large integers
  5. Comprehensive tests: Added 5 new tests covering all edge cases

All 21 edge case tests pass. Commit: c7ca8f8

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/bin/Release/net9.0/refitter /tmp/test_uint.json --output /tmp/test_uint.cs --namespace TestNS (dns block)
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter/bin/Release/net9.0/refitter /tmp/test_ulong.json --output /tmp/test_ulong.cs --namespace TestNS (dns block)
  • heartbeat.exceptionless.io
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter/bin/Release/net9.0/refitter /tmp/test_uint.json --output /tmp/test_uint.cs --namespace TestNS (dns block)
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter/bin/Release/net9.0/refitter /tmp/test_ulong.json --output /tmp/test_ulong.cs --namespace TestNS (dns block)
  • westeurope-5.in.applicationinsights.azure.com
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter/bin/Release/net9.0/refitter /tmp/test_uint.json --output /tmp/test_uint.cs --namespace TestNS (dns block)
    • Triggering command: /home/REDACTED/work/refitter/refitter/src/Refitter/bin/Release/net9.0/refitter /tmp/test_ulong.json --output /tmp/test_ulong.cs --namespace TestNS (dns block)

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

@christianhelle
christianhelle merged commit 67e3045 into main Nov 11, 2025
13 of 16 checks passed
@christianhelle
christianhelle deleted the copilot/sub-pr-803 branch November 11, 2025 22:48
hwinther pushed a commit to hwinther/test that referenced this pull request Dec 18, 2025
Updated [refitter](https://github.com/christianhelle/refitter) from
1.7.0 to 1.7.1.

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

_Sourced from [refitter's
releases](https://github.com/christianhelle/refitter/releases)._

## 1.7.1

### Implemented enhancements

- Improved handling of optional parameters
[\#​448](christianhelle/refitter#448) by
@​christianhelle
- Allow omitting certain operation headers \#​840
[\#​841](christianhelle/refitter#841) by
@​kmc059000
- Migrate unit tests from xUnit to TUnit
[\#​830](christianhelle/refitter#830) by
@​christianhelle
- Refit v9.0.2
[\#​829](christianhelle/refitter#829)
- Add .NET 10 support
[\#​822](christianhelle/refitter#822)
([christianhelle](https://github.com/christianhelle))
- Fix missing XML doc for CancellationToken
[\#​819](christianhelle/refitter#819) by
@​christianhelle
- Fix incorrect casing on multi-part form data parameters
[\#​806](christianhelle/refitter#806) by
@​christianhelle
- Optional parameters with default values
[\#​803](christianhelle/refitter#803) by
@​christianhelle
- Asana API specs strange naming
[\#​364](christianhelle/refitter#364) by
@​christianhelle

### Fixed bugs

- Using cancellation tokens with xml doc comments plus
TreatWarningsAsErrors and documentation file
[\#​817](christianhelle/refitter#817)
- Multipart form data parameters wrong casing
[\#​805](christianhelle/refitter#805)
- Use of non generic `JsonStringEnumConverter` prohibits usage of
Json-SourceGenerationContext
[\#​778](christianhelle/refitter#778)
- SourceGenerator 1.5 and newer causes build error with Visual Studio
2022 [\#​627](christianhelle/refitter#627)
- Fix string escaping, null safety, and numeric literals in optional
parameter default values
[\#​804](christianhelle/refitter#804)
- Fix typo in class name and Spectre.Console markup escaping issue
[\#​828](christianhelle/refitter#828)

### Merged pull requests

- docs: add kmc059000 as a contributor for ideas, and code
[\#​842](christianhelle/refitter#842)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- Bump actions/upload-artifact from 5 to 6
[\#​838](christianhelle/refitter#838)
([dependabot[bot]](https://github.com/apps/dependabot))
- Update dependency TUnit to 1.5.37
[\#​836](christianhelle/refitter#836)
([renovate[bot]](https://github.com/apps/renovate))
- Update dotnet monorepo
[\#​834](christianhelle/refitter#834)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency TUnit to 1.5.6
[\#​833](christianhelle/refitter#833)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency TUnit to 1.5.0
[\#​832](christianhelle/refitter#832)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency spectre.console.cli to 0.53.1
[\#​827](christianhelle/refitter#827)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency polly to 8.6.5
[\#​826](christianhelle/refitter#826)
([renovate[bot]](https://github.com/apps/renovate))
- Bump actions/checkout from 5 to 6
[\#​825](christianhelle/refitter#825)
([dependabot[bot]](https://github.com/apps/dependabot))
- chore\(deps\): update nswag monorepo to 14.6.3
[\#​824](christianhelle/refitter#824)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency microsoft.build.utilities.core to v18
[\#​821](christianhelle/refitter#821)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency swashbuckle.aspnetcore to 10.0.1
[\#​820](christianhelle/refitter#820)
([renovate[bot]](https://github.com/apps/renovate))
- docs: add karoberts as a contributor for bug
[\#​818](christianhelle/refitter#818)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- chore\(deps\): update dependency swashbuckle.aspnetcore to v10
[\#​816](christianhelle/refitter#816)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency microsoft.extensions.http.resilience
to v10 [\#​815](christianhelle/refitter#815)
([renovate[bot]](https://github.com/apps/renovate))
- Update Spectre.Console.Cli to 0.53.0
[\#​814](christianhelle/refitter#814)
([Copilot](https://github.com/apps/copilot-swe-agent))
- chore\(deps\): update dotnet monorepo to v10 \(major\)
[\#​813](christianhelle/refitter#813)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency microsoft.net.test.sdk to 18.0.1
[\#​808](christianhelle/refitter#808)
([renovate[bot]](https://github.com/apps/renovate))
- docs: add mhartmair-cubido as a contributor for bug
[\#​807](christianhelle/refitter#807)
([allcontributors[bot]](https://github.com/apps/allcontributors))

### New Contributors
* @​kmc059000 made their first contribution in
christianhelle/refitter#841

Full Changelog:
christianhelle/refitter@1.7.0...1.7.1

Commits viewable in [compare
view](christianhelle/refitter@1.7.0...1.7.1).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=refitter&package-manager=nuget&previous-version=1.7.0&new-version=1.7.1)](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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
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.

3 participants