Skip to content

fix(core): preserve backslashes before newlines in unescaping logic#27002

Open
cocosheng-g wants to merge 1 commit into
mainfrom
issue-18469-repro
Open

fix(core): preserve backslashes before newlines in unescaping logic#27002
cocosheng-g wants to merge 1 commit into
mainfrom
issue-18469-repro

Conversation

@cocosheng-g
Copy link
Copy Markdown
Contributor

@cocosheng-g cocosheng-g commented May 13, 2026

Summary

Fixes issue #18469 where backslashes in C-macros were being stripped during file writes.

Details

The unescapeStringForGeminiBug function in editCorrector.ts was incorrectly matching and stripping backslashes when they preceded a literal newline character (\n). This is common in C macros for line continuation. The regex was updated to exclude \n from the "escapable" set while still allowing the fix for LLM-escaped characters like \\n.

Risk Analysis (Low Risk)

This change is considered low risk for several reasons:

  • Surgical Regex Update: The modification only removes the literal newline character (\n) from the matched set. It does not affect the handling of the literal letter n, meaning the critical fix for \\n (double-escaped newline artifacts from LLMs) is fully preserved.
  • Limited Scope: This unescaping logic is primarily active when aggressiveUnescape is enabled, which by default is only for non-Gemini 3 models. Modern Gemini 3 models are unaffected by default.
  • Extensive Test Coverage: I have updated the unit tests to explicitly verify both the fix (preserving \\\n) and the non-regression (correctly unescaping \\n, \\t, etc.). All 19 tests in the affected area pass.

Related Issues

Fixes #18469

How to Validate

Run npx vitest packages/core/src/utils/editCorrector.test.ts. Verified that \\\n is preserved and \\n is still unescaped to \n.

Pre-Merge Checklist

  • Updated relevant documentation and README (if needed)
  • Added/updated tests (if needed)
  • Validated on required platforms/methods:
    • MacOS
      • npm run

@cocosheng-g cocosheng-g requested a review from a team as a code owner May 13, 2026 17:43
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 13, 2026

Size Change: -207 B (0%)

Total Size: 34.1 MB

Filename Size Change
./bundle/chunk-F7SJDP32.js 0 B -19.5 kB (removed) 🏆
./bundle/chunk-GPQAQNSB.js 0 B -12.5 kB (removed) 🏆
./bundle/chunk-HQ67HG4Q.js 0 B -3.8 kB (removed) 🏆
./bundle/chunk-HSQDAIDC.js 0 B -14.8 MB (removed) 🏆
./bundle/chunk-K3EKFGC4.js 0 B -659 kB (removed) 🏆
./bundle/chunk-O4N4S6KV.js 0 B -49.2 kB (removed) 🏆
./bundle/chunk-QBE4AOJ2.js 0 B -2.79 MB (removed) 🏆
./bundle/chunk-YCGITTQZ.js 0 B -3.43 kB (removed) 🏆
./bundle/core-NNGYAOPO.js 0 B -49.3 kB (removed) 🏆
./bundle/devtoolsService-Y2FRTIIP.js 0 B -28 kB (removed) 🏆
./bundle/gemini-LH33L3AV.js 0 B -587 kB (removed) 🏆
./bundle/interactiveCli-7A23GFAO.js 0 B -1.3 MB (removed) 🏆
./bundle/liteRtServerManager-CLDWH3VV.js 0 B -2.11 kB (removed) 🏆
./bundle/oauth2-provider-HGIIAULL.js 0 B -9.16 kB (removed) 🏆
./bundle/chunk-7MPIYJYF.js 3.43 kB +3.43 kB (new file) 🆕
./bundle/chunk-ADVKUSJ6.js 2.79 MB +2.79 MB (new file) 🆕
./bundle/chunk-BE7NGFPY.js 12.5 kB +12.5 kB (new file) 🆕
./bundle/chunk-BEQXPJV5.js 49.2 kB +49.2 kB (new file) 🆕
./bundle/chunk-CM5GDHI6.js 659 kB +659 kB (new file) 🆕
./bundle/chunk-J4G7GS2C.js 19.5 kB +19.5 kB (new file) 🆕
./bundle/chunk-LH357DPY.js 3.8 kB +3.8 kB (new file) 🆕
./bundle/chunk-OU5JE2UE.js 14.8 MB +14.8 MB (new file) 🆕
./bundle/core-LGCERP4S.js 49.3 kB +49.3 kB (new file) 🆕
./bundle/devtoolsService-ATT7DAVS.js 28 kB +28 kB (new file) 🆕
./bundle/gemini-2CX7K55U.js 587 kB +587 kB (new file) 🆕
./bundle/interactiveCli-XUZCW4FZ.js 1.3 MB +1.3 MB (new file) 🆕
./bundle/liteRtServerManager-5MR35DKJ.js 2.11 kB +2.11 kB (new file) 🆕
./bundle/oauth2-provider-EDWEOCDL.js 9.16 kB +9.16 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size Change
./bundle/bundled/third_party/index.js 8 MB 0 B
./bundle/chunk-2C3Y3D3A.js 1.98 MB 0 B
./bundle/chunk-34MYV7JD.js 2.45 kB 0 B
./bundle/chunk-5AUYMPVF.js 858 B 0 B
./bundle/chunk-5PS3AYFU.js 1.18 kB 0 B
./bundle/chunk-664ZODQF.js 124 kB 0 B
./bundle/chunk-DAHVX5MI.js 206 kB 0 B
./bundle/chunk-IUUIT4SU.js 56.5 kB 0 B
./bundle/chunk-RJTRUG2J.js 39.8 kB 0 B
./bundle/cleanup-XG3NKPRN.js 0 B -932 B (removed) 🏆
./bundle/devtools-36NN55EP.js 696 kB 0 B
./bundle/dist-T73EYRDX.js 356 B 0 B
./bundle/events-XB7DADIJ.js 418 B 0 B
./bundle/examples/hooks/scripts/on-start.js 188 B 0 B
./bundle/examples/mcp-server/example.js 1.43 kB 0 B
./bundle/gemini.js 5.1 kB 0 B
./bundle/getMachineId-bsd-TXG52NKR.js 1.55 kB 0 B
./bundle/getMachineId-darwin-7OE4DDZ6.js 1.55 kB 0 B
./bundle/getMachineId-linux-SHIFKOOX.js 1.34 kB 0 B
./bundle/getMachineId-unsupported-5U5DOEYY.js 1.06 kB 0 B
./bundle/getMachineId-win-6KLLGOI4.js 1.72 kB 0 B
./bundle/memoryDiscovery-C42VB5N5.js 980 B 0 B
./bundle/multipart-parser-KPBZEGQU.js 11.7 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/client/main.js 222 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/_client-assets.js 229 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/index.js 13.4 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/types.js 132 B 0 B
./bundle/sandbox-macos-permissive-open.sb 890 B 0 B
./bundle/sandbox-macos-permissive-proxied.sb 1.31 kB 0 B
./bundle/sandbox-macos-restrictive-open.sb 3.36 kB 0 B
./bundle/sandbox-macos-restrictive-proxied.sb 3.56 kB 0 B
./bundle/sandbox-macos-strict-open.sb 4.82 kB 0 B
./bundle/sandbox-macos-strict-proxied.sb 5.02 kB 0 B
./bundle/src-QVCVGIUX.js 47 kB 0 B
./bundle/start-WR52RUV3.js 0 B -652 B (removed) 🏆
./bundle/tree-sitter-7U6MW5PS.js 274 kB 0 B
./bundle/tree-sitter-bash-34ZGLXVX.js 1.84 MB 0 B
./bundle/cleanup-NI7IXHYN.js 932 B +932 B (new file) 🆕
./bundle/start-WOBJD64P.js 652 B +652 B (new file) 🆕

compressed-size-action

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses an issue where backslashes were being incorrectly stripped from file content during processing. By refining the unescaping logic to treat backslashes before newlines as literal characters rather than escape sequences, the change ensures that syntax like C-style macro line continuations remains intact.

Highlights

  • Regex Update: Updated the regex in unescapeStringForGeminiBug to exclude newline characters from the set of escapable characters, preventing unintended stripping of backslashes.
  • Logic Refinement: Removed the specific case handling for newlines in the unescaping logic to ensure that backslashes preceding newlines are preserved, which is critical for C-style macros.
  • Test Coverage: Added and updated test cases in editCorrector.test.ts and fileUtils.test.ts to verify that backslashes are correctly preserved in C-style macros.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request modifies the unescapeStringForGeminiBug utility to prevent the removal of backslashes when they precede an actual newline character. This change addresses issue #18469, ensuring that constructs like C-style macros with line continuations are correctly preserved. The update includes modifications to the regex and switch logic in editCorrector.ts, along with updated and new test cases in editCorrector.test.ts and fileUtils.test.ts. I have no feedback to provide as there were no review comments.

Fixes #18469 by updating the unescapeStringForGeminiBug regex to exclude literal newlines. This ensures C-macros with backslash-newline continuations are not corrupted during file processing.
@gemini-cli gemini-cli Bot added priority/p2 Important but can be addressed in a future release. area/core Issues related to User Interface, OS Support, Core Functionality area/agent Issues related to Core Agent, Tools, Memory, Sub-Agents, Hooks, Agent Quality labels May 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/agent Issues related to Core Agent, Tools, Memory, Sub-Agents, Hooks, Agent Quality area/core Issues related to User Interface, OS Support, Core Functionality priority/p2 Important but can be addressed in a future release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

When a C File has backslashes, Gemini CLI ignores them.

1 participant