Skip to content

Commit 6a38a69

Browse files
chloestefantsovaCommit Queue
authored and
Commit Queue
committed
[cfe] Support set/map disambiguation in pattern-for elements
Part of #49749 Change-Id: I7ee8fa434522d1361dad3f81a62412256f36089b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/284780 Commit-Queue: Chloe Stefantsova <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 624ff0b commit 6a38a69

13 files changed

+529
-267
lines changed

pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4188,28 +4188,31 @@ class BodyBuilder extends StackListenerImpl
41884188
assert(conditionStatement is EmptyStatement);
41894189
}
41904190
if (entry is MapLiteralEntry) {
4191-
TreeNode result;
4192-
ForMapEntry forMapEntry = result = forest.createForMapEntry(
4193-
offsetForToken(forToken), variables, condition, updates, entry);
4191+
ForMapEntry result;
41944192
if (variableOrExpression is PatternVariableDeclaration) {
4195-
result = forest.createPatternForMapEntry(
4196-
offsetForToken(forToken), variableOrExpression, forMapEntry);
4193+
result = forest.createPatternForMapEntry(offsetForToken(forToken),
4194+
variableOrExpression, variables, condition, updates, entry);
4195+
} else {
4196+
result = forest.createForMapEntry(
4197+
offsetForToken(forToken), variables, condition, updates, entry);
41974198
}
4198-
typeInferrer.assignedVariables.endNode(forMapEntry);
4199+
typeInferrer.assignedVariables.endNode(result);
41994200
push(result);
42004201
} else {
4201-
TreeNode result;
4202-
ForElement forElement = result = forest.createForElement(
4203-
offsetForToken(forToken),
4204-
variables,
4205-
condition,
4206-
updates,
4207-
toValue(entry));
4202+
ForElement result;
42084203
if (variableOrExpression is PatternVariableDeclaration) {
42094204
result = forest.createPatternForElement(
4210-
offsetForToken(forToken), variableOrExpression, forElement);
4205+
offsetForToken(forToken),
4206+
variableOrExpression,
4207+
variables,
4208+
condition,
4209+
updates,
4210+
toValue(entry));
4211+
} else {
4212+
result = forest.createForElement(offsetForToken(forToken), variables,
4213+
condition, updates, toValue(entry));
42114214
}
4212-
typeInferrer.assignedVariables.endNode(forElement);
4215+
typeInferrer.assignedVariables.endNode(result);
42134216
push(result);
42144217
}
42154218
}

pkg/front_end/lib/src/fasta/kernel/collections.dart

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,23 @@ class ForElement extends Expression with ControlFlowElement {
299299
}
300300

301301
@override
302-
void toTextInternal(AstPrinter state) {
303-
// TODO(johnniwinther): Implement this.
302+
void toTextInternal(AstPrinter printer) {
303+
printer.write('for (');
304+
for (int index = 0; index < variables.length; index++) {
305+
if (index > 0) {
306+
printer.write(', ');
307+
}
308+
printer.writeVariableDeclaration(variables[index],
309+
includeModifiersAndType: index == 0);
310+
}
311+
printer.write('; ');
312+
if (condition != null) {
313+
printer.writeExpression(condition!);
314+
}
315+
printer.write('; ');
316+
printer.writeExpressions(updates);
317+
printer.write(') ');
318+
printer.writeExpression(body);
304319
}
305320
}
306321

@@ -658,8 +673,23 @@ class ForMapEntry extends TreeNode with ControlFlowMapEntry {
658673
}
659674

660675
@override
661-
void toTextInternal(AstPrinter state) {
662-
// TODO(johnniwinther): Implement this.
676+
void toTextInternal(AstPrinter printer) {
677+
printer.write('for (');
678+
for (int index = 0; index < variables.length; index++) {
679+
if (index > 0) {
680+
printer.write(', ');
681+
}
682+
printer.writeVariableDeclaration(variables[index],
683+
includeModifiersAndType: index == 0);
684+
}
685+
printer.write('; ');
686+
if (condition != null) {
687+
printer.writeExpression(condition!);
688+
}
689+
printer.write('; ');
690+
printer.writeExpressions(updates);
691+
printer.write(') ');
692+
body.toTextInternal(printer);
663693
}
664694
}
665695

@@ -859,6 +889,9 @@ bool isConvertibleToMapEntry(Expression element) {
859889
if (element is ForElement) {
860890
return isConvertibleToMapEntry(element.body);
861891
}
892+
if (element is PatternForElement) {
893+
return isConvertibleToMapEntry(element.body);
894+
}
862895
if (element is ForInElement) {
863896
return isConvertibleToMapEntry(element.body);
864897
}
@@ -903,6 +936,17 @@ MapLiteralEntry convertToMapEntry(Expression element, InferenceHelper helper,
903936
return result;
904937
}
905938
if (element is ForElement) {
939+
if (element is PatternForElement) {
940+
PatternForMapEntry result = new PatternForMapEntry(
941+
element.patternVariableDeclaration,
942+
element.variables,
943+
element.condition,
944+
element.updates,
945+
convertToMapEntry(element.body, helper, onConvertElement))
946+
..fileOffset = element.fileOffset;
947+
onConvertElement(element, result);
948+
return result;
949+
}
906950
ForMapEntry result = new ForMapEntry(
907951
element.variables,
908952
element.condition,

pkg/front_end/lib/src/fasta/kernel/forest.dart

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,14 @@ class Forest {
313313
PatternForElement createPatternForElement(
314314
int fileOffset,
315315
PatternVariableDeclaration patternVariableDeclaration,
316-
ForElement forElement) {
316+
List<VariableDeclaration> variables,
317+
Expression? condition,
318+
List<Expression> updates,
319+
Expression body) {
317320
// ignore: unnecessary_null_comparison
318321
assert(fileOffset != null);
319-
return new PatternForElement(patternVariableDeclaration, forElement)
322+
return new PatternForElement(
323+
patternVariableDeclaration, variables, condition, updates, body)
320324
..fileOffset = fileOffset;
321325
}
322326

@@ -335,10 +339,14 @@ class Forest {
335339
PatternForMapEntry createPatternForMapEntry(
336340
int fileOffset,
337341
PatternVariableDeclaration patternVariableDeclaration,
338-
ForMapEntry forMapEntry) {
342+
List<VariableDeclaration> variables,
343+
Expression? condition,
344+
List<Expression> updates,
345+
MapLiteralEntry body) {
339346
// ignore: unnecessary_null_comparison
340347
assert(fileOffset != null);
341-
return new PatternForMapEntry(patternVariableDeclaration, forMapEntry)
348+
return new PatternForMapEntry(
349+
patternVariableDeclaration, variables, condition, updates, body)
342350
..fileOffset = fileOffset;
343351
}
344352

pkg/front_end/lib/src/fasta/kernel/internal_ast.dart

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4915,12 +4915,26 @@ class IfCaseMapEntry extends TreeNode
49154915
}
49164916
}
49174917

4918-
class PatternForElement extends InternalExpression with ControlFlowElement {
4918+
class PatternForElement extends InternalExpression
4919+
with ControlFlowElement
4920+
implements ForElement {
49194921
PatternVariableDeclaration patternVariableDeclaration;
4920-
ForElement forElement;
49214922
late List<Statement> replacement;
49224923

4923-
PatternForElement(this.patternVariableDeclaration, this.forElement);
4924+
@override
4925+
final List<VariableDeclaration> variables; // May be empty, but not null.
4926+
4927+
@override
4928+
Expression? condition; // May be null.
4929+
4930+
@override
4931+
final List<Expression> updates; // May be empty, but not null.
4932+
4933+
@override
4934+
Expression body;
4935+
4936+
PatternForElement(this.patternVariableDeclaration, this.variables,
4937+
this.condition, this.updates, this.body);
49244938

49254939
@override
49264940
ExpressionInferenceResult acceptInference(
@@ -4930,22 +4944,23 @@ class PatternForElement extends InternalExpression with ControlFlowElement {
49304944

49314945
@override
49324946
void toTextInternal(AstPrinter printer) {
4947+
patternVariableDeclaration.toTextInternal(printer);
49334948
printer.write('for (');
4934-
for (int index = 0; index < forElement.variables.length; index++) {
4949+
for (int index = 0; index < variables.length; index++) {
49354950
if (index > 0) {
49364951
printer.write(', ');
49374952
}
4938-
printer.writeVariableDeclaration(forElement.variables[index],
4953+
printer.writeVariableDeclaration(variables[index],
49394954
includeModifiersAndType: index == 0);
49404955
}
49414956
printer.write('; ');
4942-
if (forElement.condition != null) {
4943-
printer.writeExpression(forElement.condition!);
4957+
if (condition != null) {
4958+
printer.writeExpression(condition!);
49444959
}
49454960
printer.write('; ');
4946-
printer.writeExpressions(forElement.updates);
4961+
printer.writeExpressions(updates);
49474962
printer.write(') ');
4948-
printer.writeExpression(forElement.body);
4963+
printer.writeExpression(body);
49494964
}
49504965

49514966
@override
@@ -4961,12 +4976,25 @@ class PatternForElement extends InternalExpression with ControlFlowElement {
49614976
}
49624977

49634978
class PatternForMapEntry extends TreeNode
4964-
with InternalTreeNode, ControlFlowMapEntry {
4979+
with InternalTreeNode, ControlFlowMapEntry
4980+
implements ForMapEntry {
49654981
PatternVariableDeclaration patternVariableDeclaration;
4966-
ForMapEntry forMapEntry;
49674982
late List<Statement> replacement;
49684983

4969-
PatternForMapEntry(this.patternVariableDeclaration, this.forMapEntry);
4984+
@override
4985+
final List<VariableDeclaration> variables;
4986+
4987+
@override
4988+
Expression? condition;
4989+
4990+
@override
4991+
final List<Expression> updates;
4992+
4993+
@override
4994+
MapLiteralEntry body;
4995+
4996+
PatternForMapEntry(this.patternVariableDeclaration, this.variables,
4997+
this.condition, this.updates, this.body);
49704998

49714999
ExpressionInferenceResult acceptInference(
49725000
InferenceVisitorImpl visitor, DartType typeContext) {
@@ -4975,24 +5003,23 @@ class PatternForMapEntry extends TreeNode
49755003

49765004
@override
49775005
void toTextInternal(AstPrinter printer) {
5006+
patternVariableDeclaration.toTextInternal(printer);
49785007
printer.write('for (');
4979-
for (int index = 0; index < forMapEntry.variables.length; index++) {
5008+
for (int index = 0; index < variables.length; index++) {
49805009
if (index > 0) {
49815010
printer.write(', ');
49825011
}
4983-
printer.writeVariableDeclaration(forMapEntry.variables[index],
5012+
printer.writeVariableDeclaration(variables[index],
49845013
includeModifiersAndType: index == 0);
49855014
}
49865015
printer.write('; ');
4987-
if (forMapEntry.condition != null) {
4988-
printer.writeExpression(forMapEntry.condition!);
5016+
if (condition != null) {
5017+
printer.writeExpression(condition!);
49895018
}
49905019
printer.write('; ');
4991-
printer.writeExpressions(forMapEntry.updates);
5020+
printer.writeExpressions(updates);
49925021
printer.write(') ');
4993-
printer.writeExpression(forMapEntry.body.key);
4994-
printer.write(': ');
4995-
printer.writeExpression(forMapEntry.body.value);
5022+
body.toTextInternal(printer);
49965023
}
49975024

49985025
@override

0 commit comments

Comments
 (0)