diff --git a/packages/codegen/src-js/print/expression.ts b/packages/codegen/src-js/print/expression.ts index d68742b592..5a67f66c14 100644 --- a/packages/codegen/src-js/print/expression.ts +++ b/packages/codegen/src-js/print/expression.ts @@ -178,7 +178,7 @@ export function printExpression( printAwaitExpression(node, state, precedence, ctx); break; case "YieldExpression": - printYieldExpression(node, state, precedence); + printYieldExpression(node, state, precedence, ctx); break; case "ImportExpression": printImportExpression(node, state, precedence, ctx); @@ -922,8 +922,10 @@ function printYieldExpression( node: ESTree.YieldExpression, state: State, precedence: number, + ctx: number, ): void { const wrap = precedence >= PREC_ASSIGN; + const argumentCtx = wrap ? CTX_NONE : ctx & CTX_FORBID_IN; if (wrap) write(state, "(", CAT_OTHER); printSpaceBeforeIdentifier(state); @@ -933,7 +935,7 @@ function printYieldExpression( if (node.argument != null) { write(state, " ", CAT_OTHER); - printExpression(node.argument, state, PREC_YIELD, CTX_NONE); + printExpression(node.argument, state, PREC_YIELD, argumentCtx); } if (wrap) write(state, ")", CAT_CLOSE_BRACKET); diff --git a/packages/codegen/test/fixtures/yield-forbid-in.js b/packages/codegen/test/fixtures/yield-forbid-in.js new file mode 100644 index 0000000000..2e13b6697f --- /dev/null +++ b/packages/codegen/test/fixtures/yield-forbid-in.js @@ -0,0 +1,15 @@ +function* g(o) { + for (yield (1 in o); false;); + for (x = yield (1 in o); false;); + for (yield yield (1 in o); false;); + for (yield (x = (1 in o)); false;); + for ((yield (1 in o)) + 1; false;); + yield (1 in o); + + for (yield* (1 in o); false;); + for (x = yield* (1 in o); false;); + for (yield* yield (1 in o); false;); + for (yield* (x = (1 in o)); false;); + for ((yield* (1 in o)) + 1; false;); + yield* (1 in o); +}