diff --git a/src/ast/ExecutionContext.ts b/src/ast/ExecutionContext.ts index 041e8b66ed1..3be3d1937f2 100644 --- a/src/ast/ExecutionContext.ts +++ b/src/ast/ExecutionContext.ts @@ -3,8 +3,8 @@ import { PathTracker } from './utils/PathTracker'; import ThisVariable from './variables/ThisVariable'; interface ExecutionContextIgnore { - breakAndContinue: boolean; - breakStatements: boolean; + breaks: boolean; + continues: boolean; labels: Set; returnAwaitYield: boolean; } @@ -40,8 +40,8 @@ export function createHasEffectsContext(): HasEffectsContext { breakFlow: BREAKFLOW_NONE, called: new PathTracker(), ignore: { - breakAndContinue: false, - breakStatements: false, + breaks: false, + continues: false, labels: new Set(), returnAwaitYield: false }, diff --git a/src/ast/nodes/ArrowFunctionExpression.ts b/src/ast/nodes/ArrowFunctionExpression.ts index eac44039128..a687067dfbf 100644 --- a/src/ast/nodes/ArrowFunctionExpression.ts +++ b/src/ast/nodes/ArrowFunctionExpression.ts @@ -58,8 +58,8 @@ export default class ArrowFunctionExpression extends NodeBase { } const { ignore, breakFlow } = context; context.ignore = { - breakAndContinue: false, - breakStatements: false, + breaks: false, + continues: false, labels: new Set(), returnAwaitYield: true }; diff --git a/src/ast/nodes/BreakStatement.ts b/src/ast/nodes/BreakStatement.ts index c95f9975db3..7e3cc267d45 100644 --- a/src/ast/nodes/BreakStatement.ts +++ b/src/ast/nodes/BreakStatement.ts @@ -8,11 +8,7 @@ export default class BreakStatement extends StatementBase { type!: NodeType.tBreakStatement; hasEffects(context: HasEffectsContext) { - if ( - !(this.label - ? context.ignore.labels.has(this.label.name) - : context.ignore.breakStatements || context.ignore.breakAndContinue) - ) + if (!(this.label ? context.ignore.labels.has(this.label.name) : context.ignore.breaks)) return true; context.breakFlow = new Set([this.label && this.label.name]); return false; diff --git a/src/ast/nodes/ContinueStatement.ts b/src/ast/nodes/ContinueStatement.ts index 90e6d89f8e0..5db16a88b3d 100644 --- a/src/ast/nodes/ContinueStatement.ts +++ b/src/ast/nodes/ContinueStatement.ts @@ -8,9 +8,7 @@ export default class ContinueStatement extends StatementBase { type!: NodeType.tContinueStatement; hasEffects(context: HasEffectsContext) { - if ( - !(this.label ? context.ignore.labels.has(this.label.name) : context.ignore.breakAndContinue) - ) + if (!(this.label ? context.ignore.labels.has(this.label.name) : context.ignore.continues)) return true; context.breakFlow = new Set([this.label && this.label.name]); return false; diff --git a/src/ast/nodes/DoWhileStatement.ts b/src/ast/nodes/DoWhileStatement.ts index ec465737e87..b4c0228ebe3 100644 --- a/src/ast/nodes/DoWhileStatement.ts +++ b/src/ast/nodes/DoWhileStatement.ts @@ -11,11 +11,13 @@ export default class DoWhileStatement extends StatementBase { if (this.test.hasEffects(context)) return true; const { breakFlow, - ignore: { breakAndContinue } + ignore: { breaks, continues } } = context; - context.ignore.breakAndContinue = true; + context.ignore.breaks = true; + context.ignore.continues = true; if (this.body.hasEffects(context)) return true; - context.ignore.breakAndContinue = breakAndContinue; + context.ignore.breaks = breaks; + context.ignore.continues = continues; if (context.breakFlow instanceof Set && context.breakFlow.has(null)) { context.breakFlow = breakFlow; } diff --git a/src/ast/nodes/ForInStatement.ts b/src/ast/nodes/ForInStatement.ts index 4d46879a2ec..4962edc896b 100644 --- a/src/ast/nodes/ForInStatement.ts +++ b/src/ast/nodes/ForInStatement.ts @@ -36,11 +36,13 @@ export default class ForInStatement extends StatementBase { return true; const { breakFlow, - ignore: { breakAndContinue } + ignore: { breaks, continues } } = context; - context.ignore.breakAndContinue = true; + context.ignore.breaks = true; + context.ignore.continues = true; if (this.body.hasEffects(context)) return true; - context.ignore.breakAndContinue = breakAndContinue; + context.ignore.breaks = breaks; + context.ignore.continues = continues; context.breakFlow = breakFlow; return false; } diff --git a/src/ast/nodes/ForStatement.ts b/src/ast/nodes/ForStatement.ts index 285d711d72a..b033833a9cb 100644 --- a/src/ast/nodes/ForStatement.ts +++ b/src/ast/nodes/ForStatement.ts @@ -27,11 +27,13 @@ export default class ForStatement extends StatementBase { return true; const { breakFlow, - ignore: { breakAndContinue } + ignore: { breaks, continues } } = context; - context.ignore.breakAndContinue = true; + context.ignore.breaks = true; + context.ignore.continues = true; if (this.body.hasEffects(context)) return true; - context.ignore.breakAndContinue = breakAndContinue; + context.ignore.breaks = breaks; + context.ignore.continues = continues; context.breakFlow = breakFlow; return false; } diff --git a/src/ast/nodes/SwitchStatement.ts b/src/ast/nodes/SwitchStatement.ts index b64c0d7c192..49c820821a5 100644 --- a/src/ast/nodes/SwitchStatement.ts +++ b/src/ast/nodes/SwitchStatement.ts @@ -47,10 +47,10 @@ export default class SwitchStatement extends StatementBase { if (this.discriminant.hasEffects(context)) return true; const { breakFlow, - ignore: { breakStatements } + ignore: { breaks } } = context; let minBreakFlow: BreakFlow | false = BREAKFLOW_ERROR_RETURN; - context.ignore.breakStatements = true; + context.ignore.breaks = true; for (const switchCase of this.cases) { if (switchCase.hasEffects(context)) return true; minBreakFlow = getMinBreakflowAfterCase(minBreakFlow, context); @@ -59,7 +59,7 @@ export default class SwitchStatement extends StatementBase { if (this.defaultCase !== null && !(minBreakFlow instanceof Set && minBreakFlow.has(null))) { context.breakFlow = minBreakFlow; } - context.ignore.breakStatements = breakStatements; + context.ignore.breaks = breaks; return false; } @@ -78,7 +78,7 @@ export default class SwitchStatement extends StatementBase { } if (!isCaseIncluded) { const hasEffectsContext = createHasEffectsContext(); - hasEffectsContext.ignore.breakStatements = true; + hasEffectsContext.ignore.breaks = true; isCaseIncluded = switchCase.hasEffects(hasEffectsContext); } if (isCaseIncluded) { diff --git a/src/ast/nodes/WhileStatement.ts b/src/ast/nodes/WhileStatement.ts index 7a044349be4..ff9d1ad9ea9 100644 --- a/src/ast/nodes/WhileStatement.ts +++ b/src/ast/nodes/WhileStatement.ts @@ -11,11 +11,13 @@ export default class WhileStatement extends StatementBase { if (this.test.hasEffects(context)) return true; const { breakFlow, - ignore: { breakAndContinue } + ignore: { breaks, continues } } = context; - context.ignore.breakAndContinue = true; + context.ignore.breaks = true; + context.ignore.continues = true; if (this.body.hasEffects(context)) return true; - context.ignore.breakAndContinue = breakAndContinue; + context.ignore.breaks = breaks; + context.ignore.continues = continues; context.breakFlow = breakFlow; return false; } diff --git a/src/ast/nodes/shared/FunctionNode.ts b/src/ast/nodes/shared/FunctionNode.ts index 04e379caad0..0e17ad156ad 100644 --- a/src/ast/nodes/shared/FunctionNode.ts +++ b/src/ast/nodes/shared/FunctionNode.ts @@ -74,8 +74,8 @@ export default class FunctionNode extends NodeBase { ); const { breakFlow, ignore } = context; context.ignore = { - breakAndContinue: false, - breakStatements: false, + breaks: false, + continues: false, labels: new Set(), returnAwaitYield: true };