Skip to content

fix break and continue inside sync try/catch blocks#1727

Open
pilaoda wants to merge 5 commits into
TypeScriptToLua:masterfrom
pilaoda:feat/sync-try-break-continue
Open

fix break and continue inside sync try/catch blocks#1727
pilaoda wants to merge 5 commits into
TypeScriptToLua:masterfrom
pilaoda:feat/sync-try-break-continue

Conversation

@pilaoda
Copy link
Copy Markdown
Contributor

@pilaoda pilaoda commented May 28, 2026

Depends on #1726

Summary

  • Convert break/continue inside pcall-wrapped try/catch into flag variables + return, then check flags after pcall to execute the actual control flow.
  • Unify duplicated findAsyncTryScopeBeforeLoop/findTryScopeBeforeLoop and asyncTryHasBreak/asyncTryHasContinue into shared helpers and fields.

…ly handle returns and re-throws

(test):
- enable previously skipped re-throw tests
- add tests for complex try-catch-finally return and throw scenarios
Copilot AI review requested due to automatic review settings May 28, 2026 13:37
Copy link
Copy Markdown

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

Note

Copilot was unable to run its full agentic suite in this review.

Refactors the TypeScript-to-Lua try/catch/finally transformation to correctly handle control flow (return/break/continue) across try, catch, and finally blocks. Previously, finally did not behave correctly with respect to control flow (see #1137), and break/continue inside try were only handled in async contexts.

Changes:

  • Rewrote transformTryStatement to wrap both try and catch in pcall, using a unified ____hasReturnOrError flag so finally can override returns and errors can be re-thrown after finally executes.
  • Generalized the try-scope break/continue flag handling (previously asyncTryHas*) to apply to all try/catch blocks, not just async ones; renamed findAsyncTryScopeBeforeLoopfindTryScopeBeforeLoop and asyncTryHas{Break,Continue}tryHas{Break,Continue}.
  • Added extensive unit tests covering returns from try/catch/finally, throws from finally, and break/continue inside try/catch with and without finally; un-skipped the re-throw test (#1137).

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
src/transformation/visitors/errors.ts Rewrote try transform with double-pcall pattern and propagated source nodes to emitted Lua nodes.
src/transformation/visitors/break-continue.ts Removed async-only gating; now uses the renamed findTryScopeBeforeLoop and tryHas{Break,Continue} flags.
src/transformation/utils/scope.ts Renamed scope fields and helper to drop the async prefix since they now apply to all try scopes.
test/unit/error.spec.ts Added many new tests for finally-overriding-return, throw-in-finally, and break/continue inside try/catch; enabled the previously-skipped re-throw test.

Comment thread src/transformation/visitors/errors.ts
Comment thread src/transformation/visitors/errors.ts Outdated
Comment thread src/transformation/visitors/errors.ts Outdated
@pilaoda pilaoda force-pushed the feat/sync-try-break-continue branch from 979e9eb to 6a384ec Compare May 28, 2026 13:50
@pilaoda pilaoda force-pushed the feat/sync-try-break-continue branch from 6a384ec to 3d34a67 Compare May 28, 2026 13:55
pilaoda and others added 2 commits May 28, 2026 22:17
Extract duplicated return-if-has-return-or-error into a module-level
helper. Expand the elseBranch ternary into an explicit if/else with
comments for each case (non-empty catch, no catch, empty catch).

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- implement break and continue support within try-catch-finally blocks
- generalize and rename async-specific try scope properties and helpers
(test): add tests for break and continue inside try-catch-finally blocks
@pilaoda pilaoda force-pushed the feat/sync-try-break-continue branch from 3d34a67 to 5f38c9a Compare May 28, 2026 14:21
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.

2 participants