Skip to content

Detect unmatched brackets in multi-line input - #15451

Open
bniladridas wants to merge 1 commit into
ipython:mainfrom
bniladridas:fix/indentationerror-unmatched-brackets
Open

bniladridas wants to merge 1 commit into
ipython:mainfrom
bniladridas:fix/indentationerror-unmatched-brackets

Conversation

@bniladridas

@bniladridas bniladridas commented Oct 26, 2026 •

Copy link
Copy Markdown

Fixes #13099

Summary

Extend the sunken-bracket check in check_complete from single-line to multi-line input. Previously, only single-line input was checked for more closing brackets than opening ones. Multi-line input relied on compile_command to catch unmatched brackets, but an IndentationError from a later line could be raised first and mask the underlying SyntaxError.

Track cumulative bracket balance across all tokenized lines. If the balance drops below zero at any point, return "invalid" immediately, ensuring unmatched closing brackets are reported as SyntaxError rather than being hidden by a subsequent IndentationError.

Removes the now-unused has_sunken_brackets helper.

Test Plan

Added a regression test case to tests/test_inputtransformer2.py covering the gh-13099 scenario: multi-line input with an unmatched closing bracket on an early line.

Full test suite passes:

  • test_inputtransformer2.py: 54 passed
  • test_inputtransformer2_line.py + test_interactivshell.py: 36 passed

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review 🔄 Running since 2026-10-26T01:31:12.631402Z 82973a7 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

Extend the sunken-bracket check in check_complete from single-line to
multi-line input. Previously, only single-line input was checked for
more closing brackets than opening ones. Multi-line input relied on
compile_command to catch unmatched brackets, but an IndentationError
from a later line could be raised first and mask the underlying
SyntaxError.

Track cumulative bracket balance across all tokenized lines. On Python
>= 3.12, where the tokenizer rejects unmatched closing brackets, the
check runs on all lines so an unmatched bracket on an early line is
caught before a later IndentationError masks it. On Python < 3.12,
only single-line input is checked, preserving existing behaviour.

Removes the now-unused has_sunken_brackets helper.

Adds a regression test covering the ipythongh-13099 scenario: multi-line input
with an unmatched closing bracket on an early line.

Fixes ipython#13099

Signed-off-by: Niladri Das <125604915+bniladridas@users.noreply.github.com>
@bniladridas
bniladridas force-pushed the fix/indentationerror-unmatched-brackets branch from 7352e02 to 26344e3 Compare October 26, 2026 02:09

This branch has not been deployed

No deployments
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.

IndentationError can hide unmatched ')'

1 participant