@@ -2402,8 +2402,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
2402
2402
exitLocalScope ();
2403
2403
push (block);
2404
2404
if (blockKind == BlockKind .tryStatement) {
2405
- // This is matched by the calls to [deferNode] and [endNode] in
2406
- // [endTryStatement].
2405
+ // This is matched by the call to [beginNode] in [beginBlock].
2407
2406
typeInferrer? .assignedVariables? .endNode (block);
2408
2407
}
2409
2408
}
@@ -2624,23 +2623,30 @@ class BodyBuilder extends ScopeListener<JumpTarget>
2624
2623
exitLocalScope ();
2625
2624
JumpTarget continueTarget = exitContinueTarget ();
2626
2625
JumpTarget breakTarget = exitBreakTarget ();
2626
+ List <BreakStatementImpl > continueStatements;
2627
2627
if (continueTarget.hasUsers) {
2628
2628
body = forest.createLabeledStatement (body);
2629
- continueTarget.resolveContinues (forest, body);
2629
+ continueStatements = continueTarget.resolveContinues (forest, body);
2630
2630
}
2631
2631
Expression condition;
2632
2632
if (conditionStatement is ExpressionStatement ) {
2633
2633
condition = conditionStatement.expression;
2634
2634
} else {
2635
2635
assert (conditionStatement is EmptyStatement );
2636
2636
}
2637
- Statement result = forest.createForStatement (
2637
+ Statement forStatement = forest.createForStatement (
2638
2638
offsetForToken (forKeyword), variables, condition, updates, body);
2639
2639
typeInferrer? .assignedVariables
2640
- ? .storeInfo (result, assignedVariablesNodeInfo);
2640
+ ? .storeInfo (forStatement, assignedVariablesNodeInfo);
2641
+ if (continueStatements != null ) {
2642
+ for (BreakStatementImpl continueStatement in continueStatements) {
2643
+ continueStatement.targetStatement = forStatement;
2644
+ }
2645
+ }
2646
+ Statement result = forStatement;
2641
2647
if (breakTarget.hasUsers) {
2642
2648
result = forest.createLabeledStatement (result);
2643
- breakTarget.resolveBreaks (forest, result);
2649
+ breakTarget.resolveBreaks (forest, result, forStatement );
2644
2650
}
2645
2651
if (variableOrExpression is ParserRecovery ) {
2646
2652
problemInLoopOrSwitch ?? = buildProblemStatement (
@@ -4397,17 +4403,24 @@ class BodyBuilder extends ScopeListener<JumpTarget>
4397
4403
Statement body = popStatement ();
4398
4404
JumpTarget continueTarget = exitContinueTarget ();
4399
4405
JumpTarget breakTarget = exitBreakTarget ();
4406
+ List <BreakStatementImpl > continueStatements;
4400
4407
if (continueTarget.hasUsers) {
4401
4408
body = forest.createLabeledStatement (body);
4402
- continueTarget.resolveContinues (forest, body);
4409
+ continueStatements = continueTarget.resolveContinues (forest, body);
4403
4410
}
4404
- Statement result =
4411
+ Statement doStatement =
4405
4412
forest.createDoStatement (offsetForToken (doKeyword), body, condition);
4406
4413
// This is matched by the [beginNode] call in [beginDoWhileStatement].
4407
- typeInferrer? .assignedVariables? .endNode (result);
4414
+ typeInferrer? .assignedVariables? .endNode (doStatement);
4415
+ if (continueStatements != null ) {
4416
+ for (BreakStatementImpl continueStatement in continueStatements) {
4417
+ continueStatement.targetStatement = doStatement;
4418
+ }
4419
+ }
4420
+ Statement result = doStatement;
4408
4421
if (breakTarget.hasUsers) {
4409
4422
result = forest.createLabeledStatement (result);
4410
- breakTarget.resolveBreaks (forest, result);
4423
+ breakTarget.resolveBreaks (forest, result, doStatement );
4411
4424
}
4412
4425
exitLoopOrSwitch (result);
4413
4426
}
@@ -4584,9 +4597,10 @@ class BodyBuilder extends ScopeListener<JumpTarget>
4584
4597
exitLocalScope ();
4585
4598
JumpTarget continueTarget = exitContinueTarget ();
4586
4599
JumpTarget breakTarget = exitBreakTarget ();
4600
+ List <BreakStatementImpl > continueStatements;
4587
4601
if (continueTarget.hasUsers) {
4588
4602
body = forest.createLabeledStatement (body);
4589
- continueTarget.resolveContinues (forest, body);
4603
+ continueStatements = continueTarget.resolveContinues (forest, body);
4590
4604
}
4591
4605
VariableDeclaration variable = buildForInVariable (forToken, lvalue);
4592
4606
Expression problem = checkForInVariable (lvalue, variable, forToken);
@@ -4605,15 +4619,21 @@ class BodyBuilder extends ScopeListener<JumpTarget>
4605
4619
body = combineStatements (prologue, body);
4606
4620
}
4607
4621
}
4608
- Statement result = new ForInStatement (variable, expression, body,
4622
+ Statement forInStatement = new ForInStatement (variable, expression, body,
4609
4623
isAsync: awaitToken != null )
4610
4624
..fileOffset = awaitToken? .charOffset ?? forToken.charOffset
4611
4625
..bodyOffset = body.fileOffset; // TODO(ahe): Isn't this redundant?
4612
4626
typeInferrer? .assignedVariables
4613
- ? .storeInfo (result, assignedVariablesNodeInfo);
4627
+ ? .storeInfo (forInStatement, assignedVariablesNodeInfo);
4628
+ if (continueStatements != null ) {
4629
+ for (BreakStatementImpl continueStatement in continueStatements) {
4630
+ continueStatement.targetStatement = forInStatement;
4631
+ }
4632
+ }
4633
+ Statement result = forInStatement;
4614
4634
if (breakTarget.hasUsers) {
4615
4635
result = forest.createLabeledStatement (result);
4616
- breakTarget.resolveBreaks (forest, result);
4636
+ breakTarget.resolveBreaks (forest, result, forInStatement );
4617
4637
}
4618
4638
if (problem != null ) {
4619
4639
result = combineStatements (
@@ -4661,8 +4681,14 @@ class BodyBuilder extends ScopeListener<JumpTarget>
4661
4681
if (statement is ! LabeledStatement ) {
4662
4682
statement = forest.createLabeledStatement (statement);
4663
4683
}
4664
- target.breakTarget.resolveBreaks (forest, statement);
4665
- target.continueTarget.resolveContinues (forest, statement);
4684
+ target.breakTarget.resolveBreaks (forest, statement, statement);
4685
+ List <BreakStatementImpl > continueStatements =
4686
+ target.continueTarget.resolveContinues (forest, statement);
4687
+ if (continueStatements != null ) {
4688
+ for (BreakStatementImpl continueStatement in continueStatements) {
4689
+ continueStatement.targetStatement = statement;
4690
+ }
4691
+ }
4666
4692
}
4667
4693
push (statement);
4668
4694
}
@@ -4700,16 +4726,22 @@ class BodyBuilder extends ScopeListener<JumpTarget>
4700
4726
Expression condition = popForValue ();
4701
4727
JumpTarget continueTarget = exitContinueTarget ();
4702
4728
JumpTarget breakTarget = exitBreakTarget ();
4729
+ List <BreakStatementImpl > continueStatements;
4703
4730
if (continueTarget.hasUsers) {
4704
4731
body = forest.createLabeledStatement (body);
4705
- continueTarget.resolveContinues (forest, body);
4732
+ continueStatements = continueTarget.resolveContinues (forest, body);
4706
4733
}
4707
4734
Statement whileStatement = forest.createWhileStatement (
4708
4735
offsetForToken (whileKeyword), condition, body);
4736
+ if (continueStatements != null ) {
4737
+ for (BreakStatementImpl continueStatement in continueStatements) {
4738
+ continueStatement.targetStatement = whileStatement;
4739
+ }
4740
+ }
4709
4741
Statement result = whileStatement;
4710
4742
if (breakTarget.hasUsers) {
4711
4743
result = forest.createLabeledStatement (result);
4712
- breakTarget.resolveBreaks (forest, result);
4744
+ breakTarget.resolveBreaks (forest, result, whileStatement );
4713
4745
}
4714
4746
exitLoopOrSwitch (result);
4715
4747
// This is matched by the [beginNode] call in [beginWhileStatement].
@@ -4899,7 +4931,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
4899
4931
Statement result = switchStatement;
4900
4932
if (target.hasUsers) {
4901
4933
result = forest.createLabeledStatement (result);
4902
- target.resolveBreaks (forest, result);
4934
+ target.resolveBreaks (forest, result, switchStatement );
4903
4935
}
4904
4936
exitLoopOrSwitch (result);
4905
4937
// This is matched by the [beginNode] call in [beginSwitchBlock].
@@ -5730,20 +5762,25 @@ class JumpTarget extends BuilderImpl {
5730
5762
users.add (statement);
5731
5763
}
5732
5764
5733
- void resolveBreaks (Forest forest, Statement target) {
5765
+ void resolveBreaks (
5766
+ Forest forest, Statement target, Statement targetStatement) {
5734
5767
assert (isBreakTarget);
5735
- for (BreakStatement user in users) {
5768
+ for (BreakStatementImpl user in users) {
5736
5769
user.target = target;
5770
+ user.targetStatement = targetStatement;
5737
5771
}
5738
5772
users.clear ();
5739
5773
}
5740
5774
5741
- void resolveContinues (Forest forest, Statement target) {
5775
+ List < BreakStatementImpl > resolveContinues (Forest forest, Statement target) {
5742
5776
assert (isContinueTarget);
5743
- for (BreakStatement user in users) {
5777
+ List <BreakStatementImpl > statements = < BreakStatementImpl > [];
5778
+ for (BreakStatementImpl user in users) {
5744
5779
user.target = target;
5780
+ statements.add (user);
5745
5781
}
5746
5782
users.clear ();
5783
+ return statements;
5747
5784
}
5748
5785
5749
5786
void resolveGotos (Forest forest, SwitchCase target) {
@@ -5804,12 +5841,13 @@ class LabelTarget extends BuilderImpl implements JumpTarget {
5804
5841
unsupported ("addGoto" , charOffset, fileUri);
5805
5842
}
5806
5843
5807
- void resolveBreaks (Forest forest, Statement target) {
5808
- breakTarget.resolveBreaks (forest, target);
5844
+ void resolveBreaks (
5845
+ Forest forest, Statement target, Statement targetStatement) {
5846
+ breakTarget.resolveBreaks (forest, target, targetStatement);
5809
5847
}
5810
5848
5811
- void resolveContinues (Forest forest, Statement target) {
5812
- continueTarget.resolveContinues (forest, target);
5849
+ List < BreakStatementImpl > resolveContinues (Forest forest, Statement target) {
5850
+ return continueTarget.resolveContinues (forest, target);
5813
5851
}
5814
5852
5815
5853
void resolveGotos (Forest forest, SwitchCase target) {
0 commit comments