diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index 38596ff38f7a6462911af4b6569b046211a4022f..8a40a4c48116da42ea58d6260473e7431856351d 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -611,8 +611,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); }