diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index fcc8536e3665dbe5dce8a7feb01cddd381d9a792..6be3ca23eac561b2621eeb34f21ac042a2cf4611 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -609,8 +609,17 @@ export class Compiler { this.popLoopEnv(node, popTimes); break; } - // SwitchStatement & BlockStatement could also have break labelTarget which changes - // the control flow out of their inner env loop. We should pop Loop env with such cases either. + case ts.SyntaxKind.SwitchStatement: { + if (!isContinue) { + return; + } + this.popLoopEnv(node, loopEnvLevel); + break; + } + /** + * BlockStatement could also have break labelTarget which changes the control flow + * out of their inner env loop. We should pop Loop env with such cases either. + */ default: { this.popLoopEnv(node, loopEnvLevel); } diff --git a/ts2panda/src/statement/labelTarget.ts b/ts2panda/src/statement/labelTarget.ts index 889cb8c9476b07ae115b19ad10d1d24112f268d3..1c6cf17fa8277c965fe1714c926ba5dac3f23155 100644 --- a/ts2panda/src/statement/labelTarget.ts +++ b/ts2panda/src/statement/labelTarget.ts @@ -38,6 +38,10 @@ export class LabelTarget { this.tryStatement = TryStatement.getCurrentTryStatement(); } + containLoopEnv() { + return this.hasLoopEnv; + } + getBreakTargetLabel() { return this.breakTargetLabel; } @@ -73,7 +77,7 @@ export class LabelTarget { return false; } - private static getCloseLabelTarget(): LabelTarget | undefined { + static getCloseLabelTarget(): LabelTarget | undefined { if (!LabelTarget.isLabelTargetsEmpty()) { return LabelTarget.labelTargetStack[LabelTarget.labelTargetStack.length - 1]; } diff --git a/ts2panda/src/statement/switchStatement.ts b/ts2panda/src/statement/switchStatement.ts index 7c4213bafa1562519ca56bd2604c0712d20f20f1..438bf7b7a570b8b77ec70e5c80bfb7411cb3bae5 100644 --- a/ts2panda/src/statement/switchStatement.ts +++ b/ts2panda/src/statement/switchStatement.ts @@ -45,7 +45,10 @@ export class SwitchBase { * switchStatements doesn't have continue target * so we use the uplevel continue label as it's continue target. */ - let labelTarget = new LabelTarget(stmt, switchEndLabel, LabelTarget.getCloseContinueTarget()); + let continueLabel = LabelTarget.getCloseContinueTarget(); + let closeLabelTarget = LabelTarget.getCloseLabelTarget(); + let hasLoopEnv = closeLabelTarget ? closeLabelTarget.containLoopEnv() : false; + let labelTarget = new LabelTarget(stmt, switchEndLabel, continueLabel, hasLoopEnv); LabelTarget.pushLabelTarget(labelTarget); LabelTarget.updateName2LabelTarget(stmt.parent, labelTarget); }