Skip to content

fix(codegen-deno): async-context IIFE wrappers (Refs #122)#126

Merged
hyperpolymath merged 1 commit into
mainfrom
fix/async-iife-context
May 16, 2026
Merged

fix(codegen-deno): async-context IIFE wrappers (Refs #122)#126
hyperpolymath merged 1 commit into
mainfrom
fix/async-iife-context

Conversation

@hyperpolymath
Copy link
Copy Markdown
Owner

fix(codegen-deno): async-context IIFE wrappers (Refs #122)

Synthesised class methods are async and an associated cross-method
call lowers to (await this.m(...)). But the expression-position IIFE
wrappers (block / try / match / let / return) were always plain
(() => { ... })() — so a contained await produced
SyntaxError: Unexpected reserved word (hit by ubicity's
loadAllExperiences: a try whose body await this.ensureDirectories()).

Add ctx.in_async (set while emitting a synthesised async method
body) and an iife helper: in async context the wrapper is
(await (async () => { ... })()), otherwise the plain form. Applied to
gen_block_expr / gen_try / gen_match / ExprLet / ExprReturn /
ExprUnsafe. Free functions, constructors and module top-level stay
non-async (they never emit an awaited associated call).

Verified: affinescript dune build clean, dune runtest 214 tests /
same 2 pre-existing E2E Node-CJS vscode failures (zero regressions),
5 Deno-ESM harnesses green; the regenerated ubicity src/storage.js now
parses and deno task test is 44 passed / 0 failed (the full suite,
incl. the .test.js variants that import the migrated storage.js via
mapper/privacy/export).

Refs #122 (follow-up to #123/#125; completes the ubicity#30 consumer).

Co-Authored-By: Claude Opus 4.7 noreply@anthropic.com

Synthesised class methods are `async` and an associated cross-method
call lowers to `(await this.m(...))`. But the expression-position IIFE
wrappers (block / try / match / let / return) were always plain
`(() => { ... })()` — so a contained `await` produced
`SyntaxError: Unexpected reserved word` (hit by ubicity's
`loadAllExperiences`: a try whose body `await this.ensureDirectories()`).

Add `ctx.in_async` (set while emitting a synthesised `async` method
body) and an `iife` helper: in async context the wrapper is
`(await (async () => { ... })())`, otherwise the plain form. Applied to
gen_block_expr / gen_try / gen_match / ExprLet / ExprReturn /
ExprUnsafe. Free functions, constructors and module top-level stay
non-async (they never emit an awaited associated call).

Verified: affinescript `dune build` clean, `dune runtest` 214 tests /
same 2 pre-existing E2E Node-CJS vscode failures (zero regressions),
5 Deno-ESM harnesses green; the regenerated ubicity src/storage.js now
parses and `deno task test` is **44 passed / 0 failed** (the full suite,
incl. the .test.js variants that import the migrated storage.js via
mapper/privacy/export).

Refs #122 (follow-up to #123/#125; completes the ubicity#30 consumer).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@hyperpolymath hyperpolymath merged commit fdc7ba3 into main May 16, 2026
20 of 21 checks passed
@hyperpolymath hyperpolymath deleted the fix/async-iife-context branch May 16, 2026 15:30
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.

1 participant