From a4c94716ba71f0968e2bfcdbdd11b94206faf52c Mon Sep 17 00:00:00 2001 From: Chloe Stefantsova Date: Fri, 28 Jun 2024 09:49:30 +0000 Subject: [PATCH] [analyzer][cfe] Introduce parsing for null-aware elements Part of https://github.com/dart-lang/sdk/issues/55949 Closes https://github.com/dart-lang/sdk/issues/55954 Change-Id: I885772f292f6d70425d6eba15bad8b0c6dc86a1f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/370240 Reviewed-by: Keerti Parthasarathy Commit-Queue: Chloe Stefantsova Reviewed-by: Johnni Winther --- .../lib/src/parser/forwarding_listener.dart | 12 +- .../lib/src/parser/listener.dart | 15 +- .../lib/src/parser/literal_entry_info.dart | 2 + .../src/parser/literal_entry_info_impl.dart | 38 + .../lib/src/parser/parser_impl.dart | 30 +- pkg/analyzer/lib/src/fasta/ast_builder.dart | 29 +- .../lib/src/kernel/body_builder.dart | 40 +- .../src/kernel/macro/annotation_parser.dart | 8 +- .../lib/src/util/parser_ast_helper.dart | 45 +- .../error_recovery/issue_45251.dart.expect | 8 +- .../issue_45251.dart.intertwined.expect | 8 +- .../issue_45251_const.dart.expect | 8 +- .../issue_45251_const.dart.intertwined.expect | 8 +- .../issue_45251_new.dart.expect | 8 +- .../issue_45251_new.dart.intertwined.expect | 8 +- ...tion_reference_following_token.dart.expect | 2 +- ...ce_following_token.dart.intertwined.expect | 2 +- .../nnbd/issue_49132_not_nullable.dart.expect | 4 +- ...49132_not_nullable.dart.intertwined.expect | 4 +- .../nnbd/issue_49678.dart.expect | 2 +- .../nnbd/issue_49678.dart.intertwined.expect | 2 +- .../nnbd/issue_49678_prime.dart.expect | 2 +- .../issue_49678_prime.dart.intertwined.expect | 2 +- .../null_aware_elements/simple_positive.dart | 11 + .../simple_positive.dart.expect | 529 +++++++++ .../simple_positive.dart.intertwined.expect | 1045 +++++++++++++++++ .../simple_positive.dart.parser.expect | 27 + .../simple_positive.dart.scanner.expect | 25 + .../constant_map_typed_insideCase.dart.expect | 2 +- ...p_typed_insideCase.dart.intertwined.expect | 2 +- .../constant_map_typed_insideCast.dart.expect | 2 +- ...p_typed_insideCast.dart.intertwined.expect | 2 +- ...onstant_map_typed_insideIfCase.dart.expect | 2 +- ...typed_insideIfCase.dart.intertwined.expect | 2 +- ...ant_map_typed_insideNullAssert.dart.expect | 2 +- ...d_insideNullAssert.dart.intertwined.expect | 2 +- ...tant_map_typed_insideNullCheck.dart.expect | 2 +- ...ed_insideNullCheck.dart.intertwined.expect | 2 +- ...onstant_map_untyped_insideCase.dart.expect | 2 +- ...untyped_insideCase.dart.intertwined.expect | 2 +- ...onstant_map_untyped_insideCast.dart.expect | 2 +- ...untyped_insideCast.dart.intertwined.expect | 2 +- ...stant_map_untyped_insideIfCase.dart.expect | 2 +- ...typed_insideIfCase.dart.intertwined.expect | 2 +- ...t_map_untyped_insideNullAssert.dart.expect | 2 +- ...d_insideNullAssert.dart.intertwined.expect | 2 +- ...nt_map_untyped_insideNullCheck.dart.expect | 2 +- ...ed_insideNullCheck.dart.intertwined.expect | 2 +- .../test/coverage_suite_expected.dart | 30 +- .../fasta/parser/literal_entry_info_test.dart | 3 +- pkg/front_end/test/parser_test_listener.dart | 17 +- .../null_aware_elements/folder.options | 1 + .../null_aware_elements/simple_positive.dart | 16 + .../simple_positive.dart.strong.expect | 90 ++ ...simple_positive.dart.strong.modular.expect | 90 ++ ...simple_positive.dart.strong.outline.expect | 26 + ...le_positive.dart.strong.transformed.expect | 102 ++ ...imple_positive.dart.textual_outline.expect | 21 + ...itive.dart.textual_outline_modelled.expect | 21 + .../simple_positive.dart.weak.expect | 127 ++ ...mple_positive.dart.weak.transformed.expect | 139 +++ 61 files changed, 2561 insertions(+), 86 deletions(-) create mode 100644 pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart create mode 100644 pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.expect create mode 100644 pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.intertwined.expect create mode 100644 pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.parser.expect create mode 100644 pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.scanner.expect create mode 100644 pkg/front_end/testcases/null_aware_elements/folder.options create mode 100644 pkg/front_end/testcases/null_aware_elements/simple_positive.dart create mode 100644 pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.expect create mode 100644 pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/null_aware_elements/simple_positive.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/null_aware_elements/simple_positive.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/null_aware_elements/simple_positive.dart.weak.expect create mode 100644 pkg/front_end/testcases/null_aware_elements/simple_positive.dart.weak.transformed.expect diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart index 2801ba2aa42d..e7bdfb1b245a 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart @@ -1649,8 +1649,11 @@ class ForwardingListener implements Listener { } @override - void handleLiteralMapEntry(Token colon, Token endToken) { - listener?.handleLiteralMapEntry(colon, endToken); + void handleLiteralMapEntry(Token colon, Token endToken, + {Token? nullAwareKeyToken, Token? nullAwareValueToken}) { + listener?.handleLiteralMapEntry(colon, endToken, + nullAwareKeyToken: nullAwareKeyToken, + nullAwareValueToken: nullAwareValueToken); } @override @@ -1909,6 +1912,11 @@ class ForwardingListener implements Listener { listener?.endConstantPattern(constKeyword); } + @override + void handleNullAwareElement(Token nullAwareToken) { + listener?.handleNullAwareElement(nullAwareToken); + } + @override void handleObjectPattern( Token firstIdentifier, Token? dot, Token? secondIdentifier) { diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart index 8889dbf3794c..642824e41d4d 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart @@ -1113,8 +1113,14 @@ class Listener implements UnescapeErrorListener { logEvent("LibraryName"); } + /// Called after parsing a map entry. Either the key or the value or both can + /// start with the null-aware token `?`. In that case, [nullAwareKeyToken] and + /// [nullAwareValueToken] are set appropriately. Substructures: + /// - expression + /// - expression // TODO(jensj): Should this have a `beginToken`? - void handleLiteralMapEntry(Token colon, Token endToken) { + void handleLiteralMapEntry(Token colon, Token endToken, + {Token? nullAwareKeyToken, Token? nullAwareValueToken}) { logEvent("LiteralMapEntry"); } @@ -1882,6 +1888,13 @@ class Listener implements UnescapeErrorListener { logEvent("SpreadExpression"); } + /// Called after parsing a list or set element that starts with the null-aware + /// token `?`. Substructures: + /// - expression + void handleNullAwareElement(Token nullAwareToken) { + logEvent("NullAwareElement"); + } + /// Called after parsing an element of a list or map pattern that starts with /// `...`. Substructures: /// - pattern (if hasSubPattern is `true`) diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/literal_entry_info.dart b/pkg/_fe_analyzer_shared/lib/src/parser/literal_entry_info.dart index 8b5b93a07906..9c81f2592af9 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/literal_entry_info.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/literal_entry_info.dart @@ -63,6 +63,8 @@ LiteralEntryInfo computeLiteralEntry(Token token) { return new ForCondition(); } else if (optional('...', next) || optional('...?', next)) { return spreadOperator; + } else if (optional('?', next)) { + return nullAwareEntry; } return simpleEntry; } diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/literal_entry_info_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/literal_entry_info_impl.dart index 02621b4edb91..a8add655db0c 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/literal_entry_info_impl.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/literal_entry_info_impl.dart @@ -15,6 +15,12 @@ const LiteralEntryInfo ifCondition = const IfCondition(); /// preceded by a '...' spread operator. const LiteralEntryInfo spreadOperator = const SpreadOperator(); +/// [nullAwareEntry] is for parsing a null-aware element in a literal list or +/// set, preceded by the `?` null-aware marker, or a null-aware map entry in a +/// map literal, where either the key or the value is preceded by the `?` +/// null-aware marker. +const NullAwareEntry nullAwareEntry = const NullAwareEntry(); + /// The first step when processing a `for` control flow collection entry. class ForCondition extends LiteralEntryInfo { bool _inStyle = false; @@ -86,6 +92,9 @@ class ForCondition extends LiteralEntryInfo { ); } else if (optional('...', next) || optional('...?', next)) { return _inStyle ? const ForInSpread() : const ForSpread(); + } else if (optional('?', next)) { + return new Nested(nullAwareEntry, + _inStyle ? const ForInComplete() : const ForComplete()); } return _inStyle ? const ForInEntry() : const ForEntry(); } @@ -180,6 +189,8 @@ class IfCondition extends LiteralEntryInfo { return new Nested(ifCondition, const IfComplete()); } else if (optional('...', next) || optional('...?', next)) { return const IfSpread(); + } else if (optional('?', next)) { + return new Nested(nullAwareEntry, const IfComplete()); } return const IfEntry(); } @@ -308,3 +319,30 @@ class Nested extends LiteralEntryInfo { return nestedStep != null ? this : lastStep; } } + +class NullAwareEntry extends LiteralEntryInfo { + const NullAwareEntry() : super(false, 0); + + @override + Token parse(Token token, Parser parser) { + final Token entryNullAwareToken = token.next!; + assert(optional('?', entryNullAwareToken)); + token = parser.parseExpression(entryNullAwareToken); + if (optional(':', token.next!)) { + Token colon = token.next!; + Token next = colon.next!; + if (optional('?', next)) { + token = parser.parseExpression(next); + parser.listener.handleLiteralMapEntry(colon, token, + nullAwareKeyToken: entryNullAwareToken, nullAwareValueToken: next); + } else { + token = parser.parseExpression(colon); + parser.listener.handleLiteralMapEntry(colon, token, + nullAwareKeyToken: entryNullAwareToken, nullAwareValueToken: null); + } + } else { + parser.listener.handleNullAwareElement(entryNullAwareToken); + } + return token; + } +} diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart index 88c0fc6237c6..f0fd748a84eb 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart @@ -6991,8 +6991,19 @@ class Parser { hasSetEntry ??= !isMapEntry; if (isMapEntry) { Token colon = token.next!; - token = parseExpression(colon); - listener.handleLiteralMapEntry(colon, token.next!); + Token next = colon.next!; + if (optional('?', next)) { + // Null-aware value. For example: + // { x: ?y } + token = parseExpression(next); + listener.handleLiteralMapEntry(colon, token, + nullAwareKeyToken: null, nullAwareValueToken: next); + } else { + // Non null-aware entry. For example: + // { x: y } + token = parseExpression(colon); + listener.handleLiteralMapEntry(colon, token.next!); + } } } else { while (info != null) { @@ -7000,8 +7011,19 @@ class Parser { token = parseExpression(token); if (optional(':', token.next!)) { Token colon = token.next!; - token = parseExpression(colon); - listener.handleLiteralMapEntry(colon, token.next!); + Token next = colon.next!; + if (optional('?', next)) { + token = parseExpression(next); + // Null-aware value. For example: + // { if (b) x: ?y } + listener.handleLiteralMapEntry(colon, token, + nullAwareKeyToken: null, nullAwareValueToken: next); + } else { + // Non null-aware entry. For example: + // { if (b) x : y } + token = parseExpression(colon); + listener.handleLiteralMapEntry(colon, token.next!); + } } } else { token = info.parse(token, this); diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart index 29d41d1f8926..bb98c103b9a9 100644 --- a/pkg/analyzer/lib/src/fasta/ast_builder.dart +++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart @@ -147,6 +147,9 @@ class AstBuilder extends StackListener { /// `true` if class-modifiers is enabled final bool enableClassModifiers; + /// `true` if null-aware elements is enabled + final bool enableNullAwareElements; + final FeatureSet _featureSet; final LineInfo _lineInfo; @@ -174,6 +177,8 @@ class AstBuilder extends StackListener { enableInlineClass = _featureSet.isEnabled(Feature.inline_class), enableSealedClass = _featureSet.isEnabled(Feature.sealed_class), enableClassModifiers = _featureSet.isEnabled(Feature.class_modifiers), + enableNullAwareElements = + _featureSet.isEnabled(Feature.null_aware_elements), uri = uri ?? fileUri; @override @@ -4746,10 +4751,20 @@ class AstBuilder extends StackListener { } @override - void handleLiteralMapEntry(Token colon, Token endToken) { + void handleLiteralMapEntry(Token colon, Token endToken, + {Token? nullAwareKeyToken, Token? nullAwareValueToken}) { assert(optional(':', colon)); debugEvent("LiteralMapEntry"); + // TODO(cstefantsova): Handle null-aware map entries. + if (!enableNullAwareElements && + (nullAwareKeyToken != null || nullAwareValueToken != null)) { + _reportFeatureNotEnabled( + feature: ExperimentalFeatures.null_aware_elements, + startToken: nullAwareKeyToken ?? nullAwareValueToken!, + ); + } + var value = pop() as ExpressionImpl; var key = pop() as ExpressionImpl; push( @@ -5036,6 +5051,18 @@ class AstBuilder extends StackListener { ); } + @override + void handleNullAwareElement(Token nullAwareElement) { + debugEvent('NullAwareElement'); + // TODO(cstefantsova): Handle null-aware elements. + if (!enableNullAwareElements) { + _reportFeatureNotEnabled( + feature: ExperimentalFeatures.null_aware_elements, + startToken: nullAwareElement, + ); + } + } + @override void handleNullCheckPattern(Token question) { debugEvent('NullCheckPattern'); diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart index 394d84839cd5..3399d8e94051 100644 --- a/pkg/front_end/lib/src/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/kernel/body_builder.dart @@ -4995,11 +4995,29 @@ class BodyBuilder extends StackListenerImpl } @override - void handleLiteralMapEntry(Token colon, Token endToken) { + void handleLiteralMapEntry(Token colon, Token endToken, + {Token? nullAwareKeyToken, Token? nullAwareValueToken}) { debugEvent("LiteralMapEntry"); Expression value = popForValue(); Expression key = popForValue(); - push(forest.createMapEntry(offsetForToken(colon), key, value)); + if (nullAwareKeyToken == null && nullAwareValueToken == null) { + push(forest.createMapEntry(offsetForToken(colon), key, value)); + } else { + if (!libraryFeatures.nullAwareElements.isEnabled) { + addProblem( + templateExperimentNotEnabledOffByDefault + .withArguments(ExperimentalFlag.nullAwareElements.name), + (nullAwareKeyToken ?? nullAwareValueToken!).offset, + noLength); + } + // TODO(cstefantsova): Replace the following no-op with the node for + // handling null-aware elements. + push(forest.createSpreadElement( + offsetForToken(nullAwareKeyToken ?? nullAwareValueToken!), + forest.createNullLiteral( + offsetForToken(nullAwareKeyToken ?? nullAwareValueToken!)), + isNullAware: true)); + } } String symbolPartToString(name) { @@ -7129,6 +7147,24 @@ class BodyBuilder extends StackListenerImpl typeInferrer.assignedVariables.storeInfo(node, assignedVariablesInfo); } + @override + void handleNullAwareElement(Token nullAwareElement) { + debugEvent("NullAwareElement"); + // TODO(cstefantsova): Replace the following no-op with the node for + // handling null-aware elements. + if (!libraryFeatures.nullAwareElements.isEnabled) { + addProblem( + templateExperimentNotEnabledOffByDefault + .withArguments(ExperimentalFlag.nullAwareElements.name), + nullAwareElement.offset, + noLength); + } + pop(); // Expression. + push(forest.createSpreadElement(offsetForToken(nullAwareElement), + forest.createNullLiteral(offsetForToken(nullAwareElement)), + isNullAware: true)); + } + @override void handleSpreadExpression(Token spreadToken) { debugEvent("SpreadExpression"); diff --git a/pkg/front_end/lib/src/kernel/macro/annotation_parser.dart b/pkg/front_end/lib/src/kernel/macro/annotation_parser.dart index dc7e7f615a95..0de702328c7a 100644 --- a/pkg/front_end/lib/src/kernel/macro/annotation_parser.dart +++ b/pkg/front_end/lib/src/kernel/macro/annotation_parser.dart @@ -1967,7 +1967,8 @@ class _MacroListener implements Listener { } @override - void handleLiteralMapEntry(Token colon, Token endToken) { + void handleLiteralMapEntry(Token colon, Token endToken, + {Token? nullAwareKeyToken, Token? nullAwareValueToken}) { _unhandled('map entry'); } @@ -2188,6 +2189,11 @@ class _MacroListener implements Listener { _unsupported(); } + @override + void handleNullAwareElement(Token spreadToken) { + _unsupported(); + } + @override void handleObjectPattern( Token firstIdentifier, Token? dot, Token? secondIdentifier) { diff --git a/pkg/front_end/lib/src/util/parser_ast_helper.dart b/pkg/front_end/lib/src/util/parser_ast_helper.dart index 58bb32fb30c2..b9e5d3350ff4 100644 --- a/pkg/front_end/lib/src/util/parser_ast_helper.dart +++ b/pkg/front_end/lib/src/util/parser_ast_helper.dart @@ -1449,9 +1449,13 @@ abstract class AbstractParserAstListener implements Listener { } @override - void handleLiteralMapEntry(Token colon, Token endToken) { + void handleLiteralMapEntry(Token colon, Token endToken, + {Token? nullAwareKeyToken, Token? nullAwareValueToken}) { LiteralMapEntryHandle data = new LiteralMapEntryHandle(ParserAstType.HANDLE, - colon: colon, endToken: endToken); + colon: colon, + endToken: endToken, + nullAwareKeyToken: nullAwareKeyToken, + nullAwareValueToken: nullAwareValueToken); seen(data); } @@ -2453,6 +2457,14 @@ abstract class AbstractParserAstListener implements Listener { seen(data); } + @override + void handleNullAwareElement(Token nullAwareToken) { + NullAwareElementHandle data = new NullAwareElementHandle( + ParserAstType.HANDLE, + nullAwareToken: nullAwareToken); + seen(data); + } + @override void handleRestPattern(Token dots, {required bool hasSubPattern}) { RestPatternHandle data = new RestPatternHandle(ParserAstType.HANDLE, @@ -6234,15 +6246,22 @@ class LibraryNameEnd extends ParserAstNode { class LiteralMapEntryHandle extends ParserAstNode { final Token colon; final Token endToken; + final Token? nullAwareKeyToken; + final Token? nullAwareValueToken; LiteralMapEntryHandle(ParserAstType type, - {required this.colon, required this.endToken}) + {required this.colon, + required this.endToken, + this.nullAwareKeyToken, + this.nullAwareValueToken}) : super("LiteralMapEntry", type); @override Map get deprecatedArguments => { "colon": colon, "endToken": endToken, + "nullAwareKeyToken": nullAwareKeyToken, + "nullAwareValueToken": nullAwareValueToken, }; @override @@ -8481,6 +8500,21 @@ class SpreadExpressionHandle extends ParserAstNode { R accept(ParserAstVisitor v) => v.visitSpreadExpressionHandle(this); } +class NullAwareElementHandle extends ParserAstNode { + final Token nullAwareToken; + + NullAwareElementHandle(ParserAstType type, {required this.nullAwareToken}) + : super("NullAwareElement", type); + + @override + Map get deprecatedArguments => { + "nullAwareToken": nullAwareToken, + }; + + @override + R accept(ParserAstVisitor v) => v.visitNullAwareElementHandle(this); +} + class RestPatternHandle extends ParserAstNode { final Token dots; final bool hasSubPattern; @@ -10281,6 +10315,7 @@ abstract class ParserAstVisitor { R visitIfControlFlowEnd(IfControlFlowEnd node); R visitIfElseControlFlowEnd(IfElseControlFlowEnd node); R visitSpreadExpressionHandle(SpreadExpressionHandle node); + R visitNullAwareElementHandle(NullAwareElementHandle node); R visitRestPatternHandle(RestPatternHandle node); R visitFunctionTypedFormalParameterBegin( FunctionTypedFormalParameterBegin node); @@ -11442,6 +11477,10 @@ class RecursiveParserAstVisitor implements ParserAstVisitor { void visitSpreadExpressionHandle(SpreadExpressionHandle node) => node.visitChildren(this); + @override + void visitNullAwareElementHandle(NullAwareElementHandle node) => + node.visitChildren(this); + @override void visitRestPatternHandle(RestPatternHandle node) => node.visitChildren(this); diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect index d67b321ad8df..4114b55d431a 100644 --- a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect +++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect @@ -207,7 +207,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endFieldInitializer(=, }) endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -233,7 +233,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endFieldInitializer(=, }) endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -269,7 +269,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endFieldInitializer(=, }) endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -294,7 +294,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endFieldInitializer(=, }) endClassFields(null, null, null, null, null, null, final, 1, final, ;) diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect index 84fc530c2f81..7ac869fd8a32 100644 --- a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect @@ -330,7 +330,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endFieldInitializer(=, }) listener: endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -386,7 +386,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endFieldInitializer(=, }) listener: endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -448,7 +448,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endFieldInitializer(=, }) listener: endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -498,7 +498,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endFieldInitializer(=, }) listener: endClassFields(null, null, null, null, null, null, final, 1, final, ;) diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect index 66f052093267..85fe115ed9fb 100644 --- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect +++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect @@ -222,7 +222,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, const, }, false) endConstLiteral(}) endFieldInitializer(=, }) @@ -250,7 +250,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, const, }, false) endConstLiteral(}) endFieldInitializer(=, }) @@ -288,7 +288,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, const, }, false) endConstLiteral(}) endFieldInitializer(=, }) @@ -315,7 +315,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, const, }, false) endConstLiteral(}) endFieldInitializer(=, }) diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect index 96fe89b80269..b501898cd1e3 100644 --- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect @@ -333,7 +333,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, const, }, false) listener: endConstLiteral(}) listener: endFieldInitializer(=, }) @@ -388,7 +388,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, const, }, false) listener: endConstLiteral(}) listener: endFieldInitializer(=, }) @@ -453,7 +453,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, const, }, false) listener: endConstLiteral(}) listener: endFieldInitializer(=, }) @@ -506,7 +506,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, const, }, false) listener: endConstLiteral(}) listener: endFieldInitializer(=, }) diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect index 5ad14746c629..55c8bf1c9321 100644 --- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect +++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect @@ -228,7 +228,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endFieldInitializer(=, }) endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -254,7 +254,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endFieldInitializer(=, }) endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -291,7 +291,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endFieldInitializer(=, }) endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -317,7 +317,7 @@ beginCompilationUnit(class) beginLiteralString("a") endLiteralString(0, :) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endFieldInitializer(=, }) endClassFields(null, null, null, null, null, null, final, 1, final, ;) diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect index 3903b5a84945..a284668cffe6 100644 --- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect @@ -338,7 +338,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endFieldInitializer(=, }) listener: endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -393,7 +393,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endFieldInitializer(=, }) listener: endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -460,7 +460,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endFieldInitializer(=, }) listener: endClassFields(null, null, null, null, null, null, final, 1, final, ;) @@ -515,7 +515,7 @@ parseUnit(class) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endFieldInitializer(=, }) listener: endClassFields(null, null, null, null, null, null, final, 1, final, ;) diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect index 63227f5e7633..288192f5b141 100644 --- a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect +++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect @@ -181,7 +181,7 @@ beginCompilationUnit(var) endTypeArguments(2, <, >) handleTypeArgumentApplication(<) handleLiteralNull(null) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endFieldInitializer(=, }) endTopLevelFields(null, null, null, null, null, var, 1, var, ;) diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect index 82294b816156..458ab58dbd0b 100644 --- a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect @@ -202,7 +202,7 @@ parseUnit(var) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralNull(:) listener: handleLiteralNull(null) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endFieldInitializer(=, }) listener: endTopLevelFields(null, null, null, null, null, var, 1, var, ;) diff --git a/pkg/front_end/parser_testcases/nnbd/issue_49132_not_nullable.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_49132_not_nullable.dart.expect index c1189bd0ac95..379d9a025a5b 100644 --- a/pkg/front_end/parser_testcases/nnbd/issue_49132_not_nullable.dart.expect +++ b/pkg/front_end/parser_testcases/nnbd/issue_49132_not_nullable.dart.expect @@ -115,7 +115,7 @@ beginCompilationUnit(class) endLiteralString(0, :) beginLiteralString("b") endLiteralString(0, }) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) handleConditionalExpressionColon() handleNoTypeArguments([) @@ -226,7 +226,7 @@ beginCompilationUnit(class) endLiteralString(0, :) beginLiteralString("b") endLiteralString(0, }) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) handleConditionalExpressionColon() handleNoTypeArguments([) diff --git a/pkg/front_end/parser_testcases/nnbd/issue_49132_not_nullable.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_49132_not_nullable.dart.intertwined.expect index 1798655c2f34..4ec4fe58530f 100644 --- a/pkg/front_end/parser_testcases/nnbd/issue_49132_not_nullable.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/nnbd/issue_49132_not_nullable.dart.intertwined.expect @@ -302,7 +302,7 @@ parseUnit(class) parseSingleLiteralString(:) listener: beginLiteralString("b") listener: endLiteralString(0, }) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) ensureColon(}) listener: handleConditionalExpressionColon() @@ -603,7 +603,7 @@ parseUnit(class) parseSingleLiteralString(:) listener: beginLiteralString("b") listener: endLiteralString(0, }) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) ensureColon(}) listener: handleConditionalExpressionColon() diff --git a/pkg/front_end/parser_testcases/nnbd/issue_49678.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_49678.dart.expect index 0f14de890a72..1fb80459b3cb 100644 --- a/pkg/front_end/parser_testcases/nnbd/issue_49678.dart.expect +++ b/pkg/front_end/parser_testcases/nnbd/issue_49678.dart.expect @@ -40,7 +40,7 @@ beginCompilationUnit(dynamic) handleNoTypeArguments({) handleLiteralInt(0) handleLiteralInt(1) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endVariableInitializer(=) endInitializedIdentifier(m) diff --git a/pkg/front_end/parser_testcases/nnbd/issue_49678.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_49678.dart.intertwined.expect index c963c6f5df6b..295f06dadbf8 100644 --- a/pkg/front_end/parser_testcases/nnbd/issue_49678.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/nnbd/issue_49678.dart.intertwined.expect @@ -83,7 +83,7 @@ parseUnit(dynamic) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(1) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endVariableInitializer(=) listener: endInitializedIdentifier(m) diff --git a/pkg/front_end/parser_testcases/nnbd/issue_49678_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_49678_prime.dart.expect index 05488bef1e64..a6680efff415 100644 --- a/pkg/front_end/parser_testcases/nnbd/issue_49678_prime.dart.expect +++ b/pkg/front_end/parser_testcases/nnbd/issue_49678_prime.dart.expect @@ -40,7 +40,7 @@ beginCompilationUnit(dynamic) handleNoTypeArguments({) handleLiteralInt(0) handleLiteralInt(1) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endVariableInitializer(=) endInitializedIdentifier(m) diff --git a/pkg/front_end/parser_testcases/nnbd/issue_49678_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_49678_prime.dart.intertwined.expect index 2016417a4c9b..24e4922440b7 100644 --- a/pkg/front_end/parser_testcases/nnbd/issue_49678_prime.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/nnbd/issue_49678_prime.dart.intertwined.expect @@ -83,7 +83,7 @@ parseUnit(dynamic) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(1) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endVariableInitializer(=) listener: endInitializedIdentifier(m) diff --git a/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart new file mode 100644 index 000000000000..28d9df00ea67 --- /dev/null +++ b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart @@ -0,0 +1,11 @@ +foo1(int? x) => [?x]; +foo2(String? x) => {?x}; +foo3(bool? x, num y) => {?x: y}; +bar1(int? x) => [?x]; +bar2(int? x, bool b) => { if (b) ?x }; +bar3(int? x) => { for (var _ in []) ?x }; +bar4(String x, bool? y) => {x: ?y}; +bar5(int? x, num y) => {?x: y}; +bar6(double? x, Symbol? y) => {?x: ?y}; +bar7(num? x, double? y, bool b) => { if (b) ?x: ?y }; +bar8(num? x, double? y) => { for (var _ in []) ?x: ?y }; diff --git a/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.expect b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.expect new file mode 100644 index 000000000000..57766648ede6 --- /dev/null +++ b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.expect @@ -0,0 +1,529 @@ +beginCompilationUnit(foo1) + beginMetadataStar(foo1) + endMetadataStar(0) + beginTopLevelMember(foo1) + beginTopLevelMethod(, null, null) + handleNoType() + handleIdentifier(foo1, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(?) + handleType(int, ?) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + endFormalParameters(1, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginTypeArguments(<) + handleIdentifier(int, typeReference) + handleNoTypeArguments(>) + handleType(int, null) + endTypeArguments(1, <, >) + handleIdentifier(x, expression) + handleNoTypeArguments(]) + handleNoArguments(]) + handleSend(x, ]) + handleNullAwareElement(?) + handleLiteralList(1, [, null, ]) + handleExpressionFunctionBody(=>, ;) + endTopLevelMethod(foo1, null, ;) + endTopLevelDeclaration(;) + beginMetadataStar(foo2) + endMetadataStar(0) + beginTopLevelMember(foo2) + beginTopLevelMethod(;, null, null) + handleNoType(;) + handleIdentifier(foo2, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + beginMetadataStar(String) + endMetadataStar(0) + beginFormalParameter(String, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(String, typeReference) + handleNoTypeArguments(?) + handleType(String, ?) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + endFormalParameters(1, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginTypeArguments(<) + handleIdentifier(String, typeReference) + handleNoTypeArguments(>) + handleType(String, null) + endTypeArguments(1, <, >) + handleIdentifier(x, expression) + handleNoTypeArguments(}) + handleNoArguments(}) + handleSend(x, }) + handleNullAwareElement(?) + handleLiteralSetOrMap(1, {, null, }, false) + handleExpressionFunctionBody(=>, ;) + endTopLevelMethod(foo2, null, ;) + endTopLevelDeclaration(;) + beginMetadataStar(foo3) + endMetadataStar(0) + beginTopLevelMember(foo3) + beginTopLevelMethod(;, null, null) + handleNoType(;) + handleIdentifier(foo3, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + beginMetadataStar(bool) + endMetadataStar(0) + beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(bool, typeReference) + handleNoTypeArguments(?) + handleType(bool, ?) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue(,) + endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + beginMetadataStar(num) + endMetadataStar(0) + beginFormalParameter(num, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(num, typeReference) + handleNoTypeArguments(y) + handleType(num, null) + handleIdentifier(y, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginTypeArguments(<) + handleIdentifier(bool, typeReference) + handleNoTypeArguments(,) + handleType(bool, null) + handleIdentifier(num, typeReference) + handleNoTypeArguments(>) + handleType(num, null) + endTypeArguments(2, <, >) + handleIdentifier(x, expression) + handleNoTypeArguments(:) + handleNoArguments(:) + handleSend(x, :) + handleIdentifier(y, expression) + handleNoTypeArguments(}) + handleNoArguments(}) + handleSend(y, }) + handleLiteralMapEntry(:, y, ?, null) + handleLiteralSetOrMap(1, {, null, }, false) + handleExpressionFunctionBody(=>, ;) + endTopLevelMethod(foo3, null, ;) + endTopLevelDeclaration(;) + beginMetadataStar(bar1) + endMetadataStar(0) + beginTopLevelMember(bar1) + beginTopLevelMethod(;, null, null) + handleNoType(;) + handleIdentifier(bar1, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(?) + handleType(int, ?) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + endFormalParameters(1, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginTypeArguments(<) + handleIdentifier(int, typeReference) + handleNoTypeArguments(>) + handleType(int, null) + endTypeArguments(1, <, >) + handleIdentifier(x, expression) + handleNoTypeArguments(]) + handleNoArguments(]) + handleSend(x, ]) + handleNullAwareElement(?) + handleLiteralList(1, [, null, ]) + handleExpressionFunctionBody(=>, ;) + endTopLevelMethod(bar1, null, ;) + endTopLevelDeclaration(;) + beginMetadataStar(bar2) + endMetadataStar(0) + beginTopLevelMember(bar2) + beginTopLevelMethod(;, null, null) + handleNoType(;) + handleIdentifier(bar2, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(?) + handleType(int, ?) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue(,) + endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + beginMetadataStar(bool) + endMetadataStar(0) + beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(bool, typeReference) + handleNoTypeArguments(b) + handleType(bool, null) + handleIdentifier(b, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, b, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginTypeArguments(<) + handleIdentifier(int, typeReference) + handleNoTypeArguments(>) + handleType(int, null) + endTypeArguments(1, <, >) + beginIfControlFlow(if) + handleIdentifier(b, expression) + handleNoTypeArguments()) + handleNoArguments()) + handleSend(b, )) + handleParenthesizedCondition((, null, null) + handleThenControlFlow()) + handleIdentifier(x, expression) + handleNoTypeArguments(}) + handleNoArguments(}) + handleSend(x, }) + handleNullAwareElement(?) + endIfControlFlow(x) + handleLiteralSetOrMap(1, {, null, }, false) + handleExpressionFunctionBody(=>, ;) + endTopLevelMethod(bar2, null, ;) + endTopLevelDeclaration(;) + beginMetadataStar(bar3) + endMetadataStar(0) + beginTopLevelMember(bar3) + beginTopLevelMethod(;, null, null) + handleNoType(;) + handleIdentifier(bar3, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(?) + handleType(int, ?) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + endFormalParameters(1, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginTypeArguments(<) + handleIdentifier(int, typeReference) + handleNoTypeArguments(>) + handleType(int, null) + endTypeArguments(1, <, >) + beginForControlFlow(null, for) + beginMetadataStar(var) + endMetadataStar(0) + handleNoType(var) + beginVariablesDeclaration(_, null, var) + handleIdentifier(_, localVariableDeclaration) + beginInitializedIdentifier(_) + handleNoVariableInitializer(_) + endInitializedIdentifier(_) + endVariablesDeclaration(1, null) + handleForInitializerLocalVariableDeclaration(_, true) + beginForInExpression([]) + handleNoTypeArguments([]) + handleLiteralList(0, [, null, ]) + endForInExpression()) + handleForInLoopParts(null, for, (, null, in) + handleIdentifier(x, expression) + handleNoTypeArguments(}) + handleNoArguments(}) + handleSend(x, }) + handleNullAwareElement(?) + endForInControlFlow(x) + handleLiteralSetOrMap(1, {, null, }, false) + handleExpressionFunctionBody(=>, ;) + endTopLevelMethod(bar3, null, ;) + endTopLevelDeclaration(;) + beginMetadataStar(bar4) + endMetadataStar(0) + beginTopLevelMember(bar4) + beginTopLevelMethod(;, null, null) + handleNoType(;) + handleIdentifier(bar4, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + beginMetadataStar(String) + endMetadataStar(0) + beginFormalParameter(String, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(String, typeReference) + handleNoTypeArguments(x) + handleType(String, null) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue(,) + endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + beginMetadataStar(bool) + endMetadataStar(0) + beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(bool, typeReference) + handleNoTypeArguments(?) + handleType(bool, ?) + handleIdentifier(y, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginTypeArguments(<) + handleIdentifier(String, typeReference) + handleNoTypeArguments(,) + handleType(String, null) + handleIdentifier(bool, typeReference) + handleNoTypeArguments(>) + handleType(bool, null) + endTypeArguments(2, <, >) + handleIdentifier(x, expression) + handleNoTypeArguments(:) + handleNoArguments(:) + handleSend(x, :) + handleIdentifier(y, expression) + handleNoTypeArguments(}) + handleNoArguments(}) + handleSend(y, }) + handleLiteralMapEntry(:, y, null, ?) + handleLiteralSetOrMap(1, {, null, }, false) + handleExpressionFunctionBody(=>, ;) + endTopLevelMethod(bar4, null, ;) + endTopLevelDeclaration(;) + beginMetadataStar(bar5) + endMetadataStar(0) + beginTopLevelMember(bar5) + beginTopLevelMethod(;, null, null) + handleNoType(;) + handleIdentifier(bar5, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(?) + handleType(int, ?) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue(,) + endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + beginMetadataStar(num) + endMetadataStar(0) + beginFormalParameter(num, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(num, typeReference) + handleNoTypeArguments(y) + handleType(num, null) + handleIdentifier(y, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginTypeArguments(<) + handleIdentifier(int, typeReference) + handleNoTypeArguments(,) + handleType(int, null) + handleIdentifier(num, typeReference) + handleNoTypeArguments(>) + handleType(num, null) + endTypeArguments(2, <, >) + handleIdentifier(x, expression) + handleNoTypeArguments(:) + handleNoArguments(:) + handleSend(x, :) + handleIdentifier(y, expression) + handleNoTypeArguments(}) + handleNoArguments(}) + handleSend(y, }) + handleLiteralMapEntry(:, y, ?, null) + handleLiteralSetOrMap(1, {, null, }, false) + handleExpressionFunctionBody(=>, ;) + endTopLevelMethod(bar5, null, ;) + endTopLevelDeclaration(;) + beginMetadataStar(bar6) + endMetadataStar(0) + beginTopLevelMember(bar6) + beginTopLevelMethod(;, null, null) + handleNoType(;) + handleIdentifier(bar6, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + beginMetadataStar(double) + endMetadataStar(0) + beginFormalParameter(double, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(double, typeReference) + handleNoTypeArguments(?) + handleType(double, ?) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue(,) + endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + beginMetadataStar(Symbol) + endMetadataStar(0) + beginFormalParameter(Symbol, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(Symbol, typeReference) + handleNoTypeArguments(?) + handleType(Symbol, ?) + handleIdentifier(y, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginTypeArguments(<) + handleIdentifier(double, typeReference) + handleNoTypeArguments(,) + handleType(double, null) + handleIdentifier(Symbol, typeReference) + handleNoTypeArguments(>) + handleType(Symbol, null) + endTypeArguments(2, <, >) + handleIdentifier(x, expression) + handleNoTypeArguments(:) + handleNoArguments(:) + handleSend(x, :) + handleIdentifier(y, expression) + handleNoTypeArguments(}) + handleNoArguments(}) + handleSend(y, }) + handleLiteralMapEntry(:, y, ?, ?) + handleLiteralSetOrMap(1, {, null, }, false) + handleExpressionFunctionBody(=>, ;) + endTopLevelMethod(bar6, null, ;) + endTopLevelDeclaration(;) + beginMetadataStar(bar7) + endMetadataStar(0) + beginTopLevelMember(bar7) + beginTopLevelMethod(;, null, null) + handleNoType(;) + handleIdentifier(bar7, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + beginMetadataStar(num) + endMetadataStar(0) + beginFormalParameter(num, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(num, typeReference) + handleNoTypeArguments(?) + handleType(num, ?) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue(,) + endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + beginMetadataStar(double) + endMetadataStar(0) + beginFormalParameter(double, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(double, typeReference) + handleNoTypeArguments(?) + handleType(double, ?) + handleIdentifier(y, formalParameterDeclaration) + handleFormalParameterWithoutValue(,) + endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + beginMetadataStar(bool) + endMetadataStar(0) + beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(bool, typeReference) + handleNoTypeArguments(b) + handleType(bool, null) + handleIdentifier(b, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, b, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + endFormalParameters(3, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginTypeArguments(<) + handleIdentifier(num, typeReference) + handleNoTypeArguments(,) + handleType(num, null) + handleIdentifier(double, typeReference) + handleNoTypeArguments(>) + handleType(double, null) + endTypeArguments(2, <, >) + beginIfControlFlow(if) + handleIdentifier(b, expression) + handleNoTypeArguments()) + handleNoArguments()) + handleSend(b, )) + handleParenthesizedCondition((, null, null) + handleThenControlFlow()) + handleIdentifier(x, expression) + handleNoTypeArguments(:) + handleNoArguments(:) + handleSend(x, :) + handleIdentifier(y, expression) + handleNoTypeArguments(}) + handleNoArguments(}) + handleSend(y, }) + handleLiteralMapEntry(:, y, ?, ?) + endIfControlFlow(y) + handleLiteralSetOrMap(1, {, null, }, false) + handleExpressionFunctionBody(=>, ;) + endTopLevelMethod(bar7, null, ;) + endTopLevelDeclaration(;) + beginMetadataStar(bar8) + endMetadataStar(0) + beginTopLevelMember(bar8) + beginTopLevelMethod(;, null, null) + handleNoType(;) + handleIdentifier(bar8, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + beginMetadataStar(num) + endMetadataStar(0) + beginFormalParameter(num, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(num, typeReference) + handleNoTypeArguments(?) + handleType(num, ?) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue(,) + endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + beginMetadataStar(double) + endMetadataStar(0) + beginFormalParameter(double, MemberKind.TopLevelMethod, null, null, null) + handleIdentifier(double, typeReference) + handleNoTypeArguments(?) + handleType(double, ?) + handleIdentifier(y, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginTypeArguments(<) + handleIdentifier(num, typeReference) + handleNoTypeArguments(,) + handleType(num, null) + handleIdentifier(double, typeReference) + handleNoTypeArguments(>) + handleType(double, null) + endTypeArguments(2, <, >) + beginForControlFlow(null, for) + beginMetadataStar(var) + endMetadataStar(0) + handleNoType(var) + beginVariablesDeclaration(_, null, var) + handleIdentifier(_, localVariableDeclaration) + beginInitializedIdentifier(_) + handleNoVariableInitializer(_) + endInitializedIdentifier(_) + endVariablesDeclaration(1, null) + handleForInitializerLocalVariableDeclaration(_, true) + beginForInExpression([]) + handleNoTypeArguments([]) + handleLiteralList(0, [, null, ]) + endForInExpression()) + handleForInLoopParts(null, for, (, null, in) + handleIdentifier(x, expression) + handleNoTypeArguments(:) + handleNoArguments(:) + handleSend(x, :) + handleIdentifier(y, expression) + handleNoTypeArguments(}) + handleNoArguments(}) + handleSend(y, }) + handleLiteralMapEntry(:, y, ?, ?) + endForInControlFlow(y) + handleLiteralSetOrMap(1, {, null, }, false) + handleExpressionFunctionBody(=>, ;) + endTopLevelMethod(bar8, null, ;) + endTopLevelDeclaration(;) +endCompilationUnit(11, ) diff --git a/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.intertwined.expect b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.intertwined.expect new file mode 100644 index 000000000000..a937d85da334 --- /dev/null +++ b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.intertwined.expect @@ -0,0 +1,1045 @@ +parseUnit(foo1) + skipErrorTokens(foo1) + listener: beginCompilationUnit(foo1) + syntheticPreviousToken(foo1) + parseTopLevelDeclarationImpl(, DirectiveContext(DirectiveState.Unknown)) + parseMetadataStar() + listener: beginMetadataStar(foo1) + listener: endMetadataStar(0) + parseTopLevelMemberImpl() + listener: beginTopLevelMember(foo1) + isReservedKeyword(() + parseTopLevelMethod(, null, null, , NoType(), null, foo1, false) + listener: beginTopLevelMethod(, null, null) + listener: handleNoType() + ensureIdentifierPotentiallyRecovered(, topLevelFunctionDeclaration, false) + listener: handleIdentifier(foo1, topLevelFunctionDeclaration) + parseMethodTypeVar(foo1) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(foo1, foo1, false, MemberKind.TopLevelMethod) + parseFormalParameters(foo1, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(int, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + parseExpressionFunctionBody(=>, false) + parseExpression(=>) + parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=>, true, ConstantPatternContext.none) + parsePrimary(=>, expression, ConstantPatternContext.none) + parseLiteralListSetMapOrFunction(=>, null) + listener: beginTypeArguments(<) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(>) + listener: handleType(int, null) + listener: endTypeArguments(1, <, >) + parseLiteralListSuffix(>, null) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(]) + parseArgumentsOpt(x) + listener: handleNoArguments(]) + listener: handleSend(x, ]) + listener: handleNullAwareElement(?) + listener: handleLiteralList(1, [, null, ]) + ensureSemicolon(]) + listener: handleExpressionFunctionBody(=>, ;) + inGenerator() + listener: endTopLevelMethod(foo1, null, ;) + listener: endTopLevelDeclaration(;) + parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(;) + listener: beginMetadataStar(foo2) + listener: endMetadataStar(0) + parseTopLevelMemberImpl(;) + listener: beginTopLevelMember(foo2) + isReservedKeyword(() + parseTopLevelMethod(;, null, null, ;, NoType(), null, foo2, false) + listener: beginTopLevelMethod(;, null, null) + listener: handleNoType(;) + ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false) + listener: handleIdentifier(foo2, topLevelFunctionDeclaration) + parseMethodTypeVar(foo2) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(foo2, foo2, false, MemberKind.TopLevelMethod) + parseFormalParameters(foo2, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(() + listener: beginMetadataStar(String) + listener: endMetadataStar(0) + listener: beginFormalParameter(String, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(String, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(String, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + parseExpressionFunctionBody(=>, false) + parseExpression(=>) + parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=>, true, ConstantPatternContext.none) + parsePrimary(=>, expression, ConstantPatternContext.none) + parseLiteralListSetMapOrFunction(=>, null) + listener: beginTypeArguments(<) + listener: handleIdentifier(String, typeReference) + listener: handleNoTypeArguments(>) + listener: handleType(String, null) + listener: endTypeArguments(1, <, >) + parseLiteralSetOrMapSuffix(>, null) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(}) + parseArgumentsOpt(x) + listener: handleNoArguments(}) + listener: handleSend(x, }) + listener: handleNullAwareElement(?) + listener: handleLiteralSetOrMap(1, {, null, }, false) + ensureSemicolon(}) + listener: handleExpressionFunctionBody(=>, ;) + inGenerator() + listener: endTopLevelMethod(foo2, null, ;) + listener: endTopLevelDeclaration(;) + parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(;) + listener: beginMetadataStar(foo3) + listener: endMetadataStar(0) + parseTopLevelMemberImpl(;) + listener: beginTopLevelMember(foo3) + isReservedKeyword(() + parseTopLevelMethod(;, null, null, ;, NoType(), null, foo3, false) + listener: beginTopLevelMethod(;, null, null) + listener: handleNoType(;) + ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false) + listener: handleIdentifier(foo3, topLevelFunctionDeclaration) + parseMethodTypeVar(foo3) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(foo3, foo3, false, MemberKind.TopLevelMethod) + parseFormalParameters(foo3, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(() + listener: beginMetadataStar(bool) + listener: endMetadataStar(0) + listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(bool, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(bool, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue(,) + listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseFormalParameter(,, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(,) + listener: beginMetadataStar(num) + listener: endMetadataStar(0) + listener: beginFormalParameter(num, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(num, typeReference) + listener: handleNoTypeArguments(y) + listener: handleType(num, null) + ensureIdentifier(num, formalParameterDeclaration) + listener: handleIdentifier(y, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + parseExpressionFunctionBody(=>, false) + parseExpression(=>) + parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=>, true, ConstantPatternContext.none) + parsePrimary(=>, expression, ConstantPatternContext.none) + parseLiteralListSetMapOrFunction(=>, null) + listener: beginTypeArguments(<) + listener: handleIdentifier(bool, typeReference) + listener: handleNoTypeArguments(,) + listener: handleType(bool, null) + listener: handleIdentifier(num, typeReference) + listener: handleNoTypeArguments(>) + listener: handleType(num, null) + listener: endTypeArguments(2, <, >) + parseLiteralSetOrMapSuffix(>, null) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(:) + parseArgumentsOpt(x) + listener: handleNoArguments(:) + listener: handleSend(x, :) + parseExpression(:) + parsePrecedenceExpression(:, 1, true, ConstantPatternContext.none) + parseUnaryExpression(:, true, ConstantPatternContext.none) + parsePrimary(:, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(:, expression, ConstantPatternContext.none) + parseSend(:, expression, ConstantPatternContext.none) + isNextIdentifier(:) + ensureIdentifier(:, expression) + listener: handleIdentifier(y, expression) + listener: handleNoTypeArguments(}) + parseArgumentsOpt(y) + listener: handleNoArguments(}) + listener: handleSend(y, }) + listener: handleLiteralMapEntry(:, y, ?, null) + listener: handleLiteralSetOrMap(1, {, null, }, false) + ensureSemicolon(}) + listener: handleExpressionFunctionBody(=>, ;) + inGenerator() + listener: endTopLevelMethod(foo3, null, ;) + listener: endTopLevelDeclaration(;) + parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(;) + listener: beginMetadataStar(bar1) + listener: endMetadataStar(0) + parseTopLevelMemberImpl(;) + listener: beginTopLevelMember(bar1) + isReservedKeyword(() + parseTopLevelMethod(;, null, null, ;, NoType(), null, bar1, false) + listener: beginTopLevelMethod(;, null, null) + listener: handleNoType(;) + ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false) + listener: handleIdentifier(bar1, topLevelFunctionDeclaration) + parseMethodTypeVar(bar1) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(bar1, bar1, false, MemberKind.TopLevelMethod) + parseFormalParameters(bar1, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(int, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + parseExpressionFunctionBody(=>, false) + parseExpression(=>) + parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=>, true, ConstantPatternContext.none) + parsePrimary(=>, expression, ConstantPatternContext.none) + parseLiteralListSetMapOrFunction(=>, null) + listener: beginTypeArguments(<) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(>) + listener: handleType(int, null) + listener: endTypeArguments(1, <, >) + parseLiteralListSuffix(>, null) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(]) + parseArgumentsOpt(x) + listener: handleNoArguments(]) + listener: handleSend(x, ]) + listener: handleNullAwareElement(?) + listener: handleLiteralList(1, [, null, ]) + ensureSemicolon(]) + listener: handleExpressionFunctionBody(=>, ;) + inGenerator() + listener: endTopLevelMethod(bar1, null, ;) + listener: endTopLevelDeclaration(;) + parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(;) + listener: beginMetadataStar(bar2) + listener: endMetadataStar(0) + parseTopLevelMemberImpl(;) + listener: beginTopLevelMember(bar2) + isReservedKeyword(() + parseTopLevelMethod(;, null, null, ;, NoType(), null, bar2, false) + listener: beginTopLevelMethod(;, null, null) + listener: handleNoType(;) + ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false) + listener: handleIdentifier(bar2, topLevelFunctionDeclaration) + parseMethodTypeVar(bar2) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(bar2, bar2, false, MemberKind.TopLevelMethod) + parseFormalParameters(bar2, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(int, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue(,) + listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseFormalParameter(,, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(,) + listener: beginMetadataStar(bool) + listener: endMetadataStar(0) + listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(bool, typeReference) + listener: handleNoTypeArguments(b) + listener: handleType(bool, null) + ensureIdentifier(bool, formalParameterDeclaration) + listener: handleIdentifier(b, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + parseExpressionFunctionBody(=>, false) + parseExpression(=>) + parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=>, true, ConstantPatternContext.none) + parsePrimary(=>, expression, ConstantPatternContext.none) + parseLiteralListSetMapOrFunction(=>, null) + listener: beginTypeArguments(<) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(>) + listener: handleType(int, null) + listener: endTypeArguments(1, <, >) + parseLiteralSetOrMapSuffix(>, null) + listener: beginIfControlFlow(if) + ensureParenthesizedCondition(if, allowCase: false) + parseExpressionInParenthesisRest((, allowCase: false) + parseExpression(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) + parseSend((, expression, ConstantPatternContext.none) + isNextIdentifier(() + ensureIdentifier((, expression) + listener: handleIdentifier(b, expression) + listener: handleNoTypeArguments()) + parseArgumentsOpt(b) + listener: handleNoArguments()) + listener: handleSend(b, )) + ensureCloseParen(b, () + listener: handleParenthesizedCondition((, null, null) + listener: handleThenControlFlow()) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(}) + parseArgumentsOpt(x) + listener: handleNoArguments(}) + listener: handleSend(x, }) + listener: handleNullAwareElement(?) + listener: endIfControlFlow(x) + listener: handleLiteralSetOrMap(1, {, null, }, false) + ensureSemicolon(}) + listener: handleExpressionFunctionBody(=>, ;) + inGenerator() + listener: endTopLevelMethod(bar2, null, ;) + listener: endTopLevelDeclaration(;) + parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(;) + listener: beginMetadataStar(bar3) + listener: endMetadataStar(0) + parseTopLevelMemberImpl(;) + listener: beginTopLevelMember(bar3) + isReservedKeyword(() + parseTopLevelMethod(;, null, null, ;, NoType(), null, bar3, false) + listener: beginTopLevelMethod(;, null, null) + listener: handleNoType(;) + ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false) + listener: handleIdentifier(bar3, topLevelFunctionDeclaration) + parseMethodTypeVar(bar3) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(bar3, bar3, false, MemberKind.TopLevelMethod) + parseFormalParameters(bar3, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(int, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + parseExpressionFunctionBody(=>, false) + parseExpression(=>) + parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=>, true, ConstantPatternContext.none) + parsePrimary(=>, expression, ConstantPatternContext.none) + parseLiteralListSetMapOrFunction(=>, null) + listener: beginTypeArguments(<) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(>) + listener: handleType(int, null) + listener: endTypeArguments(1, <, >) + parseLiteralSetOrMapSuffix(>, null) + listener: beginForControlFlow(null, for) + parseForLoopPartsStart(null, for, ForPartsContext(null)) + parseExpressionStatementOrDeclaration((, ForPartsContext(null)) + parseExpressionStatementOrDeclarationAfterModifiers(var, (, null, var, null, ForPartsContext(null)) + listener: beginMetadataStar(var) + listener: endMetadataStar(0) + listener: handleNoType(var) + listener: beginVariablesDeclaration(_, null, var) + parseForLoopPartsMid(var, null, for) + parseVariablesDeclarationRest(var, false) + parseOptionallyInitializedIdentifier(var) + ensureIdentifier(var, localVariableDeclaration) + listener: handleIdentifier(_, localVariableDeclaration) + listener: beginInitializedIdentifier(_) + parseVariableInitializerOpt(_) + listener: handleNoVariableInitializer(_) + listener: endInitializedIdentifier(_) + listener: endVariablesDeclaration(1, null) + listener: handleForInitializerLocalVariableDeclaration(_, true) + parseForInLoopPartsRest(_, null, for, null, _) + listener: beginForInExpression([]) + parseExpression(in) + parsePrecedenceExpression(in, 1, true, ConstantPatternContext.none) + parseUnaryExpression(in, true, ConstantPatternContext.none) + parsePrimary(in, expression, ConstantPatternContext.none) + listener: handleNoTypeArguments([]) + parseLiteralListSuffix(in, null) + rewriteSquareBrackets(in) + link([, ]) + rewriter() + listener: handleLiteralList(0, [, null, ]) + ensureCloseParen(], () + listener: endForInExpression()) + listener: handleForInLoopParts(null, for, (, null, in) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(}) + parseArgumentsOpt(x) + listener: handleNoArguments(}) + listener: handleSend(x, }) + listener: handleNullAwareElement(?) + listener: endForInControlFlow(x) + listener: handleLiteralSetOrMap(1, {, null, }, false) + ensureSemicolon(}) + listener: handleExpressionFunctionBody(=>, ;) + inGenerator() + listener: endTopLevelMethod(bar3, null, ;) + listener: endTopLevelDeclaration(;) + parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(;) + listener: beginMetadataStar(bar4) + listener: endMetadataStar(0) + parseTopLevelMemberImpl(;) + listener: beginTopLevelMember(bar4) + isReservedKeyword(() + parseTopLevelMethod(;, null, null, ;, NoType(), null, bar4, false) + listener: beginTopLevelMethod(;, null, null) + listener: handleNoType(;) + ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false) + listener: handleIdentifier(bar4, topLevelFunctionDeclaration) + parseMethodTypeVar(bar4) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(bar4, bar4, false, MemberKind.TopLevelMethod) + parseFormalParameters(bar4, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(() + listener: beginMetadataStar(String) + listener: endMetadataStar(0) + listener: beginFormalParameter(String, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(String, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(String, null) + ensureIdentifier(String, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue(,) + listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseFormalParameter(,, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(,) + listener: beginMetadataStar(bool) + listener: endMetadataStar(0) + listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(bool, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(bool, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(y, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + parseExpressionFunctionBody(=>, false) + parseExpression(=>) + parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=>, true, ConstantPatternContext.none) + parsePrimary(=>, expression, ConstantPatternContext.none) + parseLiteralListSetMapOrFunction(=>, null) + listener: beginTypeArguments(<) + listener: handleIdentifier(String, typeReference) + listener: handleNoTypeArguments(,) + listener: handleType(String, null) + listener: handleIdentifier(bool, typeReference) + listener: handleNoTypeArguments(>) + listener: handleType(bool, null) + listener: endTypeArguments(2, <, >) + parseLiteralSetOrMapSuffix(>, null) + parseExpression({) + parsePrecedenceExpression({, 1, true, ConstantPatternContext.none) + parseUnaryExpression({, true, ConstantPatternContext.none) + parsePrimary({, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral({, expression, ConstantPatternContext.none) + parseSend({, expression, ConstantPatternContext.none) + isNextIdentifier({) + ensureIdentifier({, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(:) + parseArgumentsOpt(x) + listener: handleNoArguments(:) + listener: handleSend(x, :) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(y, expression) + listener: handleNoTypeArguments(}) + parseArgumentsOpt(y) + listener: handleNoArguments(}) + listener: handleSend(y, }) + listener: handleLiteralMapEntry(:, y, null, ?) + listener: handleLiteralSetOrMap(1, {, null, }, false) + ensureSemicolon(}) + listener: handleExpressionFunctionBody(=>, ;) + inGenerator() + listener: endTopLevelMethod(bar4, null, ;) + listener: endTopLevelDeclaration(;) + parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(;) + listener: beginMetadataStar(bar5) + listener: endMetadataStar(0) + parseTopLevelMemberImpl(;) + listener: beginTopLevelMember(bar5) + isReservedKeyword(() + parseTopLevelMethod(;, null, null, ;, NoType(), null, bar5, false) + listener: beginTopLevelMethod(;, null, null) + listener: handleNoType(;) + ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false) + listener: handleIdentifier(bar5, topLevelFunctionDeclaration) + parseMethodTypeVar(bar5) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(bar5, bar5, false, MemberKind.TopLevelMethod) + parseFormalParameters(bar5, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(int, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue(,) + listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseFormalParameter(,, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(,) + listener: beginMetadataStar(num) + listener: endMetadataStar(0) + listener: beginFormalParameter(num, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(num, typeReference) + listener: handleNoTypeArguments(y) + listener: handleType(num, null) + ensureIdentifier(num, formalParameterDeclaration) + listener: handleIdentifier(y, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + parseExpressionFunctionBody(=>, false) + parseExpression(=>) + parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=>, true, ConstantPatternContext.none) + parsePrimary(=>, expression, ConstantPatternContext.none) + parseLiteralListSetMapOrFunction(=>, null) + listener: beginTypeArguments(<) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(,) + listener: handleType(int, null) + listener: handleIdentifier(num, typeReference) + listener: handleNoTypeArguments(>) + listener: handleType(num, null) + listener: endTypeArguments(2, <, >) + parseLiteralSetOrMapSuffix(>, null) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(:) + parseArgumentsOpt(x) + listener: handleNoArguments(:) + listener: handleSend(x, :) + parseExpression(:) + parsePrecedenceExpression(:, 1, true, ConstantPatternContext.none) + parseUnaryExpression(:, true, ConstantPatternContext.none) + parsePrimary(:, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(:, expression, ConstantPatternContext.none) + parseSend(:, expression, ConstantPatternContext.none) + isNextIdentifier(:) + ensureIdentifier(:, expression) + listener: handleIdentifier(y, expression) + listener: handleNoTypeArguments(}) + parseArgumentsOpt(y) + listener: handleNoArguments(}) + listener: handleSend(y, }) + listener: handleLiteralMapEntry(:, y, ?, null) + listener: handleLiteralSetOrMap(1, {, null, }, false) + ensureSemicolon(}) + listener: handleExpressionFunctionBody(=>, ;) + inGenerator() + listener: endTopLevelMethod(bar5, null, ;) + listener: endTopLevelDeclaration(;) + parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(;) + listener: beginMetadataStar(bar6) + listener: endMetadataStar(0) + parseTopLevelMemberImpl(;) + listener: beginTopLevelMember(bar6) + isReservedKeyword(() + parseTopLevelMethod(;, null, null, ;, NoType(), null, bar6, false) + listener: beginTopLevelMethod(;, null, null) + listener: handleNoType(;) + ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false) + listener: handleIdentifier(bar6, topLevelFunctionDeclaration) + parseMethodTypeVar(bar6) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(bar6, bar6, false, MemberKind.TopLevelMethod) + parseFormalParameters(bar6, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(() + listener: beginMetadataStar(double) + listener: endMetadataStar(0) + listener: beginFormalParameter(double, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(double, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(double, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue(,) + listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseFormalParameter(,, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(,) + listener: beginMetadataStar(Symbol) + listener: endMetadataStar(0) + listener: beginFormalParameter(Symbol, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(Symbol, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(Symbol, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(y, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + parseExpressionFunctionBody(=>, false) + parseExpression(=>) + parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=>, true, ConstantPatternContext.none) + parsePrimary(=>, expression, ConstantPatternContext.none) + parseLiteralListSetMapOrFunction(=>, null) + listener: beginTypeArguments(<) + listener: handleIdentifier(double, typeReference) + listener: handleNoTypeArguments(,) + listener: handleType(double, null) + listener: handleIdentifier(Symbol, typeReference) + listener: handleNoTypeArguments(>) + listener: handleType(Symbol, null) + listener: endTypeArguments(2, <, >) + parseLiteralSetOrMapSuffix(>, null) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(:) + parseArgumentsOpt(x) + listener: handleNoArguments(:) + listener: handleSend(x, :) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(y, expression) + listener: handleNoTypeArguments(}) + parseArgumentsOpt(y) + listener: handleNoArguments(}) + listener: handleSend(y, }) + listener: handleLiteralMapEntry(:, y, ?, ?) + listener: handleLiteralSetOrMap(1, {, null, }, false) + ensureSemicolon(}) + listener: handleExpressionFunctionBody(=>, ;) + inGenerator() + listener: endTopLevelMethod(bar6, null, ;) + listener: endTopLevelDeclaration(;) + parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(;) + listener: beginMetadataStar(bar7) + listener: endMetadataStar(0) + parseTopLevelMemberImpl(;) + listener: beginTopLevelMember(bar7) + isReservedKeyword(() + parseTopLevelMethod(;, null, null, ;, NoType(), null, bar7, false) + listener: beginTopLevelMethod(;, null, null) + listener: handleNoType(;) + ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false) + listener: handleIdentifier(bar7, topLevelFunctionDeclaration) + parseMethodTypeVar(bar7) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(bar7, bar7, false, MemberKind.TopLevelMethod) + parseFormalParameters(bar7, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(() + listener: beginMetadataStar(num) + listener: endMetadataStar(0) + listener: beginFormalParameter(num, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(num, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(num, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue(,) + listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseFormalParameter(,, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(,) + listener: beginMetadataStar(double) + listener: endMetadataStar(0) + listener: beginFormalParameter(double, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(double, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(double, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(y, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue(,) + listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseFormalParameter(,, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(,) + listener: beginMetadataStar(bool) + listener: endMetadataStar(0) + listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(bool, typeReference) + listener: handleNoTypeArguments(b) + listener: handleType(bool, null) + ensureIdentifier(bool, formalParameterDeclaration) + listener: handleIdentifier(b, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + parseExpressionFunctionBody(=>, false) + parseExpression(=>) + parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=>, true, ConstantPatternContext.none) + parsePrimary(=>, expression, ConstantPatternContext.none) + parseLiteralListSetMapOrFunction(=>, null) + listener: beginTypeArguments(<) + listener: handleIdentifier(num, typeReference) + listener: handleNoTypeArguments(,) + listener: handleType(num, null) + listener: handleIdentifier(double, typeReference) + listener: handleNoTypeArguments(>) + listener: handleType(double, null) + listener: endTypeArguments(2, <, >) + parseLiteralSetOrMapSuffix(>, null) + listener: beginIfControlFlow(if) + ensureParenthesizedCondition(if, allowCase: false) + parseExpressionInParenthesisRest((, allowCase: false) + parseExpression(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) + parseSend((, expression, ConstantPatternContext.none) + isNextIdentifier(() + ensureIdentifier((, expression) + listener: handleIdentifier(b, expression) + listener: handleNoTypeArguments()) + parseArgumentsOpt(b) + listener: handleNoArguments()) + listener: handleSend(b, )) + ensureCloseParen(b, () + listener: handleParenthesizedCondition((, null, null) + listener: handleThenControlFlow()) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(:) + parseArgumentsOpt(x) + listener: handleNoArguments(:) + listener: handleSend(x, :) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(y, expression) + listener: handleNoTypeArguments(}) + parseArgumentsOpt(y) + listener: handleNoArguments(}) + listener: handleSend(y, }) + listener: handleLiteralMapEntry(:, y, ?, ?) + listener: endIfControlFlow(y) + listener: handleLiteralSetOrMap(1, {, null, }, false) + ensureSemicolon(}) + listener: handleExpressionFunctionBody(=>, ;) + inGenerator() + listener: endTopLevelMethod(bar7, null, ;) + listener: endTopLevelDeclaration(;) + parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(;) + listener: beginMetadataStar(bar8) + listener: endMetadataStar(0) + parseTopLevelMemberImpl(;) + listener: beginTopLevelMember(bar8) + isReservedKeyword(() + parseTopLevelMethod(;, null, null, ;, NoType(), null, bar8, false) + listener: beginTopLevelMethod(;, null, null) + listener: handleNoType(;) + ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false) + listener: handleIdentifier(bar8, topLevelFunctionDeclaration) + parseMethodTypeVar(bar8) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(bar8, bar8, false, MemberKind.TopLevelMethod) + parseFormalParameters(bar8, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(() + listener: beginMetadataStar(num) + listener: endMetadataStar(0) + listener: beginFormalParameter(num, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(num, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(num, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue(,) + listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseFormalParameter(,, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + parseMetadataStar(,) + listener: beginMetadataStar(double) + listener: endMetadataStar(0) + listener: beginFormalParameter(double, MemberKind.TopLevelMethod, null, null, null) + listener: handleIdentifier(double, typeReference) + listener: handleNoTypeArguments(?) + listener: handleType(double, ?) + ensureIdentifier(?, formalParameterDeclaration) + listener: handleIdentifier(y, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod) + listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + parseExpressionFunctionBody(=>, false) + parseExpression(=>) + parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=>, true, ConstantPatternContext.none) + parsePrimary(=>, expression, ConstantPatternContext.none) + parseLiteralListSetMapOrFunction(=>, null) + listener: beginTypeArguments(<) + listener: handleIdentifier(num, typeReference) + listener: handleNoTypeArguments(,) + listener: handleType(num, null) + listener: handleIdentifier(double, typeReference) + listener: handleNoTypeArguments(>) + listener: handleType(double, null) + listener: endTypeArguments(2, <, >) + parseLiteralSetOrMapSuffix(>, null) + listener: beginForControlFlow(null, for) + parseForLoopPartsStart(null, for, ForPartsContext(null)) + parseExpressionStatementOrDeclaration((, ForPartsContext(null)) + parseExpressionStatementOrDeclarationAfterModifiers(var, (, null, var, null, ForPartsContext(null)) + listener: beginMetadataStar(var) + listener: endMetadataStar(0) + listener: handleNoType(var) + listener: beginVariablesDeclaration(_, null, var) + parseForLoopPartsMid(var, null, for) + parseVariablesDeclarationRest(var, false) + parseOptionallyInitializedIdentifier(var) + ensureIdentifier(var, localVariableDeclaration) + listener: handleIdentifier(_, localVariableDeclaration) + listener: beginInitializedIdentifier(_) + parseVariableInitializerOpt(_) + listener: handleNoVariableInitializer(_) + listener: endInitializedIdentifier(_) + listener: endVariablesDeclaration(1, null) + listener: handleForInitializerLocalVariableDeclaration(_, true) + parseForInLoopPartsRest(_, null, for, null, _) + listener: beginForInExpression([]) + parseExpression(in) + parsePrecedenceExpression(in, 1, true, ConstantPatternContext.none) + parseUnaryExpression(in, true, ConstantPatternContext.none) + parsePrimary(in, expression, ConstantPatternContext.none) + listener: handleNoTypeArguments([]) + parseLiteralListSuffix(in, null) + rewriteSquareBrackets(in) + link([, ]) + rewriter() + listener: handleLiteralList(0, [, null, ]) + ensureCloseParen(], () + listener: endForInExpression()) + listener: handleForInLoopParts(null, for, (, null, in) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(:) + parseArgumentsOpt(x) + listener: handleNoArguments(:) + listener: handleSend(x, :) + parseExpression(?) + parsePrecedenceExpression(?, 1, true, ConstantPatternContext.none) + parseUnaryExpression(?, true, ConstantPatternContext.none) + parsePrimary(?, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral(?, expression, ConstantPatternContext.none) + parseSend(?, expression, ConstantPatternContext.none) + isNextIdentifier(?) + ensureIdentifier(?, expression) + listener: handleIdentifier(y, expression) + listener: handleNoTypeArguments(}) + parseArgumentsOpt(y) + listener: handleNoArguments(}) + listener: handleSend(y, }) + listener: handleLiteralMapEntry(:, y, ?, ?) + listener: endForInControlFlow(y) + listener: handleLiteralSetOrMap(1, {, null, }, false) + ensureSemicolon(}) + listener: handleExpressionFunctionBody(=>, ;) + inGenerator() + listener: endTopLevelMethod(bar8, null, ;) + listener: endTopLevelDeclaration(;) + reportAllErrorTokens(foo1) + listener: endCompilationUnit(11, ) diff --git a/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.parser.expect b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.parser.expect new file mode 100644 index 000000000000..c1a1abd11000 --- /dev/null +++ b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.parser.expect @@ -0,0 +1,27 @@ +NOTICE: Stream was rewritten by parser! + +foo1(int? x) => [?x]; +foo2(String? x) => {?x}; +foo3(bool? x, num y) => {?x: y}; +bar1(int? x) => [?x]; +bar2(int? x, bool b) => { if (b) ?x }; +bar3(int? x) => { for (var _ in []) ?x }; +bar4(String x, bool? y) => {x: ?y}; +bar5(int? x, num y) => {?x: y}; +bar6(double? x, Symbol? y) => {?x: ?y}; +bar7(num? x, double? y, bool b) => { if (b) ?x: ?y }; +bar8(num? x, double? y) => { for (var _ in []) ?x: ?y }; + + +foo1[StringToken]([BeginToken]int[StringToken]?[SimpleToken] x[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]int[StringToken]>[SimpleToken][[BeginToken]?[SimpleToken]x[StringToken]][SimpleToken];[SimpleToken] +foo2[StringToken]([BeginToken]String[StringToken]?[SimpleToken] x[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]String[StringToken]>[SimpleToken]{[BeginToken]?[SimpleToken]x[StringToken]}[SimpleToken];[SimpleToken] +foo3[StringToken]([BeginToken]bool[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] num[StringToken] y[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]bool[StringToken],[SimpleToken] num[StringToken]>[SimpleToken]{[BeginToken]?[SimpleToken]x[StringToken]:[SimpleToken] y[StringToken]}[SimpleToken];[SimpleToken] +bar1[StringToken]([BeginToken]int[StringToken]?[SimpleToken] x[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]int[StringToken]>[SimpleToken][[BeginToken]?[SimpleToken]x[StringToken]][SimpleToken];[SimpleToken] +bar2[StringToken]([BeginToken]int[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] bool[StringToken] b[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]int[StringToken]>[SimpleToken]{[BeginToken] if[KeywordToken] ([BeginToken]b[StringToken])[SimpleToken] ?[SimpleToken]x[StringToken] }[SimpleToken];[SimpleToken] +bar3[StringToken]([BeginToken]int[StringToken]?[SimpleToken] x[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]int[StringToken]>[SimpleToken]{[BeginToken] for[KeywordToken] ([BeginToken]var[KeywordToken] _[StringToken] in[KeywordToken] [[BeginToken]][SimpleToken])[SimpleToken] ?[SimpleToken]x[StringToken] }[SimpleToken];[SimpleToken] +bar4[StringToken]([BeginToken]String[StringToken] x[StringToken],[SimpleToken] bool[StringToken]?[SimpleToken] y[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]String[StringToken],[SimpleToken] bool[StringToken]>[SimpleToken]{[BeginToken]x[StringToken]:[SimpleToken] ?[SimpleToken]y[StringToken]}[SimpleToken];[SimpleToken] +bar5[StringToken]([BeginToken]int[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] num[StringToken] y[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]int[StringToken],[SimpleToken] num[StringToken]>[SimpleToken]{[BeginToken]?[SimpleToken]x[StringToken]:[SimpleToken] y[StringToken]}[SimpleToken];[SimpleToken] +bar6[StringToken]([BeginToken]double[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] Symbol[StringToken]?[SimpleToken] y[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]double[StringToken],[SimpleToken] Symbol[StringToken]>[SimpleToken]{[BeginToken]?[SimpleToken]x[StringToken]:[SimpleToken] ?[SimpleToken]y[StringToken]}[SimpleToken];[SimpleToken] +bar7[StringToken]([BeginToken]num[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] double[StringToken]?[SimpleToken] y[StringToken],[SimpleToken] bool[StringToken] b[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]num[StringToken],[SimpleToken] double[StringToken]>[SimpleToken]{[BeginToken] if[KeywordToken] ([BeginToken]b[StringToken])[SimpleToken] ?[SimpleToken]x[StringToken]:[SimpleToken] ?[SimpleToken]y[StringToken] }[SimpleToken];[SimpleToken] +bar8[StringToken]([BeginToken]num[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] double[StringToken]?[SimpleToken] y[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]num[StringToken],[SimpleToken] double[StringToken]>[SimpleToken]{[BeginToken] for[KeywordToken] ([BeginToken]var[KeywordToken] _[StringToken] in[KeywordToken] [[BeginToken]][SimpleToken])[SimpleToken] ?[SimpleToken]x[StringToken]:[SimpleToken] ?[SimpleToken]y[StringToken] }[SimpleToken];[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.scanner.expect b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.scanner.expect new file mode 100644 index 000000000000..57d6ae82069f --- /dev/null +++ b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.scanner.expect @@ -0,0 +1,25 @@ +foo1(int? x) => [?x]; +foo2(String? x) => {?x}; +foo3(bool? x, num y) => {?x: y}; +bar1(int? x) => [?x]; +bar2(int? x, bool b) => { if (b) ?x }; +bar3(int? x) => { for (var _ in []) ?x }; +bar4(String x, bool? y) => {x: ?y}; +bar5(int? x, num y) => {?x: y}; +bar6(double? x, Symbol? y) => {?x: ?y}; +bar7(num? x, double? y, bool b) => { if (b) ?x: ?y }; +bar8(num? x, double? y) => { for (var _ in []) ?x: ?y }; + + +foo1[StringToken]([BeginToken]int[StringToken]?[SimpleToken] x[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]int[StringToken]>[SimpleToken][[BeginToken]?[SimpleToken]x[StringToken]][SimpleToken];[SimpleToken] +foo2[StringToken]([BeginToken]String[StringToken]?[SimpleToken] x[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]String[StringToken]>[SimpleToken]{[BeginToken]?[SimpleToken]x[StringToken]}[SimpleToken];[SimpleToken] +foo3[StringToken]([BeginToken]bool[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] num[StringToken] y[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]bool[StringToken],[SimpleToken] num[StringToken]>[SimpleToken]{[BeginToken]?[SimpleToken]x[StringToken]:[SimpleToken] y[StringToken]}[SimpleToken];[SimpleToken] +bar1[StringToken]([BeginToken]int[StringToken]?[SimpleToken] x[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]int[StringToken]>[SimpleToken][[BeginToken]?[SimpleToken]x[StringToken]][SimpleToken];[SimpleToken] +bar2[StringToken]([BeginToken]int[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] bool[StringToken] b[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]int[StringToken]>[SimpleToken]{[BeginToken] if[KeywordToken] ([BeginToken]b[StringToken])[SimpleToken] ?[SimpleToken]x[StringToken] }[SimpleToken];[SimpleToken] +bar3[StringToken]([BeginToken]int[StringToken]?[SimpleToken] x[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]int[StringToken]>[SimpleToken]{[BeginToken] for[KeywordToken] ([BeginToken]var[KeywordToken] _[StringToken] in[KeywordToken] [][SimpleToken])[SimpleToken] ?[SimpleToken]x[StringToken] }[SimpleToken];[SimpleToken] +bar4[StringToken]([BeginToken]String[StringToken] x[StringToken],[SimpleToken] bool[StringToken]?[SimpleToken] y[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]String[StringToken],[SimpleToken] bool[StringToken]>[SimpleToken]{[BeginToken]x[StringToken]:[SimpleToken] ?[SimpleToken]y[StringToken]}[SimpleToken];[SimpleToken] +bar5[StringToken]([BeginToken]int[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] num[StringToken] y[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]int[StringToken],[SimpleToken] num[StringToken]>[SimpleToken]{[BeginToken]?[SimpleToken]x[StringToken]:[SimpleToken] y[StringToken]}[SimpleToken];[SimpleToken] +bar6[StringToken]([BeginToken]double[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] Symbol[StringToken]?[SimpleToken] y[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]double[StringToken],[SimpleToken] Symbol[StringToken]>[SimpleToken]{[BeginToken]?[SimpleToken]x[StringToken]:[SimpleToken] ?[SimpleToken]y[StringToken]}[SimpleToken];[SimpleToken] +bar7[StringToken]([BeginToken]num[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] double[StringToken]?[SimpleToken] y[StringToken],[SimpleToken] bool[StringToken] b[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]num[StringToken],[SimpleToken] double[StringToken]>[SimpleToken]{[BeginToken] if[KeywordToken] ([BeginToken]b[StringToken])[SimpleToken] ?[SimpleToken]x[StringToken]:[SimpleToken] ?[SimpleToken]y[StringToken] }[SimpleToken];[SimpleToken] +bar8[StringToken]([BeginToken]num[StringToken]?[SimpleToken] x[StringToken],[SimpleToken] double[StringToken]?[SimpleToken] y[StringToken])[SimpleToken] =>[SimpleToken] <[BeginToken]num[StringToken],[SimpleToken] double[StringToken]>[SimpleToken]{[BeginToken] for[KeywordToken] ([BeginToken]var[KeywordToken] _[StringToken] in[KeywordToken] [][SimpleToken])[SimpleToken] ?[SimpleToken]x[StringToken]:[SimpleToken] ?[SimpleToken]y[StringToken] }[SimpleToken];[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.expect index 5069152e0a52..c0dbd6c5be0b 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.expect @@ -39,7 +39,7 @@ beginCompilationUnit(test) endTypeArguments(2, <, >) handleLiteralInt(1) handleLiteralInt(2) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endConstantPattern(const) endPattern(}) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.intertwined.expect index 8865451ed4f9..471814ee2d4b 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.intertwined.expect @@ -102,7 +102,7 @@ parseUnit(test) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(2) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endConstantPattern(const) listener: endPattern(}) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.expect index 1c0958628b04..7017a2787f6c 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.expect @@ -39,7 +39,7 @@ beginCompilationUnit(test) endTypeArguments(2, <, >) handleLiteralInt(1) handleLiteralInt(2) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endConstantPattern(const) beginAsOperatorType(as) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.intertwined.expect index 3db49f848ee8..104ceea92183 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.intertwined.expect @@ -102,7 +102,7 @@ parseUnit(test) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(2) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endConstantPattern(const) listener: beginAsOperatorType(as) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.expect index 210ac8cd56c1..84f360ea2989 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.expect @@ -36,7 +36,7 @@ beginCompilationUnit(test) endTypeArguments(2, <, >) handleLiteralInt(1) handleLiteralInt(2) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endConstantPattern(const) endPattern(}) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.intertwined.expect index e1ad0656f662..c5043256a44c 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.intertwined.expect @@ -94,7 +94,7 @@ parseUnit(test) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(2) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endConstantPattern(const) listener: endPattern(}) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.expect index 62714084deb1..433fb229c95c 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.expect @@ -39,7 +39,7 @@ beginCompilationUnit(test) endTypeArguments(2, <, >) handleLiteralInt(1) handleLiteralInt(2) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endConstantPattern(const) handleNullAssertPattern(!) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.intertwined.expect index 1568696fb53c..82b314244ebe 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.intertwined.expect @@ -102,7 +102,7 @@ parseUnit(test) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(2) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endConstantPattern(const) listener: handleNullAssertPattern(!) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.expect index 850ac5497494..94fb1650d67e 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.expect @@ -39,7 +39,7 @@ beginCompilationUnit(test) endTypeArguments(2, <, >) handleLiteralInt(1) handleLiteralInt(2) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endConstantPattern(const) handleNullCheckPattern(?) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.intertwined.expect index 1749691c1f31..8645c4b2b1a2 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.intertwined.expect @@ -102,7 +102,7 @@ parseUnit(test) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(2) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endConstantPattern(const) listener: handleNullCheckPattern(?) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.expect index 1a873225a999..ff87c2d6d9a8 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.expect @@ -32,7 +32,7 @@ beginCompilationUnit(test) handleNoTypeArguments({) handleLiteralInt(1) handleLiteralInt(2) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endConstantPattern(const) endPattern(}) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.intertwined.expect index f6be17daa544..9a970baaf90b 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.intertwined.expect @@ -94,7 +94,7 @@ parseUnit(test) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(2) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endConstantPattern(const) listener: endPattern(}) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.expect index a042c0ba5d2b..9f16f792aa15 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.expect @@ -32,7 +32,7 @@ beginCompilationUnit(test) handleNoTypeArguments({) handleLiteralInt(1) handleLiteralInt(2) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endConstantPattern(const) beginAsOperatorType(as) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.intertwined.expect index eead9ff34cbb..73cd2c96e854 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.intertwined.expect @@ -94,7 +94,7 @@ parseUnit(test) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(2) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endConstantPattern(const) listener: beginAsOperatorType(as) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.expect index 6ddf3aa7df33..34f0da06e305 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.expect @@ -29,7 +29,7 @@ beginCompilationUnit(test) handleNoTypeArguments({) handleLiteralInt(1) handleLiteralInt(2) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endConstantPattern(const) endPattern(}) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.intertwined.expect index faba8117465a..9cc807d6a761 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.intertwined.expect @@ -86,7 +86,7 @@ parseUnit(test) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(2) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endConstantPattern(const) listener: endPattern(}) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.expect index b67114c2e564..afbc9d16b5b2 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.expect @@ -32,7 +32,7 @@ beginCompilationUnit(test) handleNoTypeArguments({) handleLiteralInt(1) handleLiteralInt(2) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endConstantPattern(const) handleNullAssertPattern(!) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.intertwined.expect index ff359ae0c896..e016a2dfb8b2 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.intertwined.expect @@ -94,7 +94,7 @@ parseUnit(test) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(2) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endConstantPattern(const) listener: handleNullAssertPattern(!) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.expect index ddb519bc8b7d..1eddc22fb817 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.expect @@ -32,7 +32,7 @@ beginCompilationUnit(test) handleNoTypeArguments({) handleLiteralInt(1) handleLiteralInt(2) - handleLiteralMapEntry(:, }) + handleLiteralMapEntry(:, }, null, null) handleLiteralSetOrMap(1, {, null, }, false) endConstantPattern(const) handleNullCheckPattern(?) diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.intertwined.expect index 7a03d17fafde..e43b3e1500c7 100644 --- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.intertwined.expect @@ -94,7 +94,7 @@ parseUnit(test) parsePrimary(:, expression, ConstantPatternContext.none) parseLiteralInt(:) listener: handleLiteralInt(2) - listener: handleLiteralMapEntry(:, }) + listener: handleLiteralMapEntry(:, }, null, null) listener: handleLiteralSetOrMap(1, {, null, }, false) listener: endConstantPattern(const) listener: handleNullCheckPattern(?) diff --git a/pkg/front_end/test/coverage_suite_expected.dart b/pkg/front_end/test/coverage_suite_expected.dart index 681bb9cabc71..78466ff124a0 100644 --- a/pkg/front_end/test/coverage_suite_expected.dart +++ b/pkg/front_end/test/coverage_suite_expected.dart @@ -458,10 +458,10 @@ const Map _expect = { hitCount: 0, missCount: 128, ), - // 92.1639300493926%. + // 92.06539074960128%. "package:front_end/src/kernel/body_builder.dart": ( - hitCount: 6904, - missCount: 587, + hitCount: 6927, + missCount: 597, ), // 91.26984126984127%. "package:front_end/src/kernel/body_builder_context.dart": ( @@ -488,10 +488,10 @@ const Map _expect = { hitCount: 205, missCount: 89, ), - // 85.85694379934975%. + // 85.16024152345565%. "package:front_end/src/kernel/constant_evaluator.dart": ( - hitCount: 3697, - missCount: 609, + hitCount: 3667, + missCount: 639, ), // 97.59036144578313%. "package:front_end/src/kernel/constant_int_folder.dart": ( @@ -618,10 +618,10 @@ const Map _expect = { hitCount: 43, missCount: 5, ), - // 0.1984126984126984%. + // 0.19801980198019803%. "package:front_end/src/kernel/macro/annotation_parser.dart": ( hitCount: 2, - missCount: 1006, + missCount: 1008, ), // 0.0%. "package:front_end/src/kernel/macro/identifiers.dart": ( @@ -799,14 +799,14 @@ const Map _expect = { hitCount: 295, missCount: 35, ), - // 85.1680467608378%. + // 85.15720204728248%. "package:front_end/src/source/source_library_builder.dart": ( - hitCount: 3497, + hitCount: 3494, missCount: 609, ), - // 81.87472234562416%. + // 81.82628062360801%. "package:front_end/src/source/source_loader.dart": ( - hitCount: 1843, + hitCount: 1837, missCount: 408, ), // 50.0%. @@ -949,9 +949,9 @@ const Map _expect = { hitCount: 78, missCount: 1312, ), - // 86.54205607476636%. + // 85.79439252336448%. "package:front_end/src/util/textual_outline.dart": ( - hitCount: 463, - missCount: 72, + hitCount: 459, + missCount: 76, ), }; diff --git a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart b/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart index 84196e776bd2..0f61019f0911 100644 --- a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart +++ b/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart @@ -1046,7 +1046,8 @@ class TestInfoListener implements Listener { } @override - void handleLiteralMapEntry(Token colon, Token endToken) { + void handleLiteralMapEntry(Token colon, Token endToken, + {Token? nullAwareKeyToken, Token? nullAwareValueToken}) { calls.add('handleLiteralMapEntry $colon, $endToken'); } diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart index 0b5c61fd5880..0b39db89a7bd 100644 --- a/pkg/front_end/test/parser_test_listener.dart +++ b/pkg/front_end/test/parser_test_listener.dart @@ -1587,10 +1587,17 @@ class ParserTestListener implements Listener { } @override - void handleLiteralMapEntry(Token colon, Token endToken) { + void handleLiteralMapEntry(Token colon, Token endToken, + {Token? nullAwareKeyToken, Token? nullAwareValueToken}) { seen(colon); seen(endToken); - doPrint('handleLiteralMapEntry(' '$colon, ' '$endToken)'); + seen(nullAwareKeyToken); + seen(nullAwareValueToken); + doPrint('handleLiteralMapEntry(' + '$colon, ' + '$endToken, ' + '$nullAwareKeyToken, ' + '$nullAwareValueToken)'); } @override @@ -2646,6 +2653,12 @@ class ParserTestListener implements Listener { doPrint('handleSpreadExpression(' '$spreadToken)'); } + @override + void handleNullAwareElement(Token nullAwareToken) { + seen(nullAwareToken); + doPrint('handleNullAwareElement(' '$nullAwareToken)'); + } + @override void handleRestPattern(Token dots, {required bool hasSubPattern}) { seen(dots); diff --git a/pkg/front_end/testcases/null_aware_elements/folder.options b/pkg/front_end/testcases/null_aware_elements/folder.options new file mode 100644 index 000000000000..3e22d5c60a5d --- /dev/null +++ b/pkg/front_end/testcases/null_aware_elements/folder.options @@ -0,0 +1 @@ +--enable-experiment=null-aware-elements \ No newline at end of file diff --git a/pkg/front_end/testcases/null_aware_elements/simple_positive.dart b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart new file mode 100644 index 000000000000..bfab11b130b9 --- /dev/null +++ b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart @@ -0,0 +1,16 @@ +// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +foo1(int? x) => [?x]; +foo2(String? x) => {?x}; +foo3(bool? x, num y) => {?x: y}; + +bar1(int? x) => [?x]; +bar2(int? x, bool b) => { if (b) ?x }; +bar3(int? x) => { for (var _ in []) ?x }; +bar4(String x, bool? y) => {x: ?y}; +bar5(int? x, num y) => {?x: y}; +bar6(double? x, Symbol? y) => {?x: ?y}; +bar7(num? x, double? y, bool b) => { if (b) ?x: ?y }; +bar8(num? x, double? y) => { for (var _ in []) ?x: ?y }; diff --git a/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.expect b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.expect new file mode 100644 index 000000000000..d005c46e1de3 --- /dev/null +++ b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.expect @@ -0,0 +1,90 @@ +library; +import self as self; +import "dart:core" as core; +import "dart:collection" as col; + +static method foo1(core::int? x) → dynamic + return block { + final core::List #t1 = []; + final has-declared-initializer core::Iterable? #t2 = null; + if(!(#t2 == null)) + #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable}){(core::Iterable) → void}; + } =>#t1; +static method foo2(core::String? x) → dynamic + return block { + final core::Set #t3 = col::LinkedHashSet::•(); + final has-declared-initializer core::Iterable? #t4 = null; + if(!(#t4 == null)) + #t3.{core::Set::addAll}{Invariant}(#t4{core::Iterable}){(core::Iterable) → void}; + } =>#t3; +static method foo3(core::bool? x, core::num y) → dynamic + return block { + final core::Map #t5 = {}; + final has-declared-initializer core::Map? #t6 = null; + if(!(#t6 == null)) + #t5.{core::Map::addAll}{Invariant}(#t6{core::Map}){(core::Map) → void}; + } =>#t5; +static method bar1(core::int? x) → dynamic + return block { + final core::List #t7 = []; + final has-declared-initializer core::Iterable? #t8 = null; + if(!(#t8 == null)) + #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable}){(core::Iterable) → void}; + } =>#t7; +static method bar2(core::int? x, core::bool b) → dynamic + return block { + final core::Set #t9 = col::LinkedHashSet::•(); + if(b) { + final has-declared-initializer core::Iterable? #t10 = null; + if(!(#t10 == null)) + #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable}){(core::Iterable) → void}; + } + } =>#t9; +static method bar3(core::int? x) → dynamic + return block { + final core::Set #t11 = col::LinkedHashSet::•(); + for (dynamic _ in []) { + final has-declared-initializer core::Iterable? #t12 = null; + if(!(#t12 == null)) + #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable}){(core::Iterable) → void}; + } + } =>#t11; +static method bar4(core::String x, core::bool? y) → dynamic + return block { + final core::Map #t13 = {}; + final has-declared-initializer core::Map? #t14 = null; + if(!(#t14 == null)) + #t13.{core::Map::addAll}{Invariant}(#t14{core::Map}){(core::Map) → void}; + } =>#t13; +static method bar5(core::int? x, core::num y) → dynamic + return block { + final core::Map #t15 = {}; + final has-declared-initializer core::Map? #t16 = null; + if(!(#t16 == null)) + #t15.{core::Map::addAll}{Invariant}(#t16{core::Map}){(core::Map) → void}; + } =>#t15; +static method bar6(core::double? x, core::Symbol? y) → dynamic + return block { + final core::Map #t17 = {}; + final has-declared-initializer core::Map? #t18 = null; + if(!(#t18 == null)) + #t17.{core::Map::addAll}{Invariant}(#t18{core::Map}){(core::Map) → void}; + } =>#t17; +static method bar7(core::num? x, core::double? y, core::bool b) → dynamic + return block { + final core::Map #t19 = {}; + if(b) { + final has-declared-initializer core::Map? #t20 = null; + if(!(#t20 == null)) + #t19.{core::Map::addAll}{Invariant}(#t20{core::Map}){(core::Map) → void}; + } + } =>#t19; +static method bar8(core::num? x, core::double? y) → dynamic + return block { + final core::Map #t21 = {}; + for (dynamic _ in []) { + final has-declared-initializer core::Map? #t22 = null; + if(!(#t22 == null)) + #t21.{core::Map::addAll}{Invariant}(#t22{core::Map}){(core::Map) → void}; + } + } =>#t21; diff --git a/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.modular.expect b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.modular.expect new file mode 100644 index 000000000000..d005c46e1de3 --- /dev/null +++ b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.modular.expect @@ -0,0 +1,90 @@ +library; +import self as self; +import "dart:core" as core; +import "dart:collection" as col; + +static method foo1(core::int? x) → dynamic + return block { + final core::List #t1 = []; + final has-declared-initializer core::Iterable? #t2 = null; + if(!(#t2 == null)) + #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable}){(core::Iterable) → void}; + } =>#t1; +static method foo2(core::String? x) → dynamic + return block { + final core::Set #t3 = col::LinkedHashSet::•(); + final has-declared-initializer core::Iterable? #t4 = null; + if(!(#t4 == null)) + #t3.{core::Set::addAll}{Invariant}(#t4{core::Iterable}){(core::Iterable) → void}; + } =>#t3; +static method foo3(core::bool? x, core::num y) → dynamic + return block { + final core::Map #t5 = {}; + final has-declared-initializer core::Map? #t6 = null; + if(!(#t6 == null)) + #t5.{core::Map::addAll}{Invariant}(#t6{core::Map}){(core::Map) → void}; + } =>#t5; +static method bar1(core::int? x) → dynamic + return block { + final core::List #t7 = []; + final has-declared-initializer core::Iterable? #t8 = null; + if(!(#t8 == null)) + #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable}){(core::Iterable) → void}; + } =>#t7; +static method bar2(core::int? x, core::bool b) → dynamic + return block { + final core::Set #t9 = col::LinkedHashSet::•(); + if(b) { + final has-declared-initializer core::Iterable? #t10 = null; + if(!(#t10 == null)) + #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable}){(core::Iterable) → void}; + } + } =>#t9; +static method bar3(core::int? x) → dynamic + return block { + final core::Set #t11 = col::LinkedHashSet::•(); + for (dynamic _ in []) { + final has-declared-initializer core::Iterable? #t12 = null; + if(!(#t12 == null)) + #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable}){(core::Iterable) → void}; + } + } =>#t11; +static method bar4(core::String x, core::bool? y) → dynamic + return block { + final core::Map #t13 = {}; + final has-declared-initializer core::Map? #t14 = null; + if(!(#t14 == null)) + #t13.{core::Map::addAll}{Invariant}(#t14{core::Map}){(core::Map) → void}; + } =>#t13; +static method bar5(core::int? x, core::num y) → dynamic + return block { + final core::Map #t15 = {}; + final has-declared-initializer core::Map? #t16 = null; + if(!(#t16 == null)) + #t15.{core::Map::addAll}{Invariant}(#t16{core::Map}){(core::Map) → void}; + } =>#t15; +static method bar6(core::double? x, core::Symbol? y) → dynamic + return block { + final core::Map #t17 = {}; + final has-declared-initializer core::Map? #t18 = null; + if(!(#t18 == null)) + #t17.{core::Map::addAll}{Invariant}(#t18{core::Map}){(core::Map) → void}; + } =>#t17; +static method bar7(core::num? x, core::double? y, core::bool b) → dynamic + return block { + final core::Map #t19 = {}; + if(b) { + final has-declared-initializer core::Map? #t20 = null; + if(!(#t20 == null)) + #t19.{core::Map::addAll}{Invariant}(#t20{core::Map}){(core::Map) → void}; + } + } =>#t19; +static method bar8(core::num? x, core::double? y) → dynamic + return block { + final core::Map #t21 = {}; + for (dynamic _ in []) { + final has-declared-initializer core::Map? #t22 = null; + if(!(#t22 == null)) + #t21.{core::Map::addAll}{Invariant}(#t22{core::Map}){(core::Map) → void}; + } + } =>#t21; diff --git a/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.outline.expect b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.outline.expect new file mode 100644 index 000000000000..56120d6edaa8 --- /dev/null +++ b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.outline.expect @@ -0,0 +1,26 @@ +library; +import self as self; +import "dart:core" as core; + +static method foo1(core::int? x) → dynamic + ; +static method foo2(core::String? x) → dynamic + ; +static method foo3(core::bool? x, core::num y) → dynamic + ; +static method bar1(core::int? x) → dynamic + ; +static method bar2(core::int? x, core::bool b) → dynamic + ; +static method bar3(core::int? x) → dynamic + ; +static method bar4(core::String x, core::bool? y) → dynamic + ; +static method bar5(core::int? x, core::num y) → dynamic + ; +static method bar6(core::double? x, core::Symbol? y) → dynamic + ; +static method bar7(core::num? x, core::double? y, core::bool b) → dynamic + ; +static method bar8(core::num? x, core::double? y) → dynamic + ; diff --git a/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.transformed.expect b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.transformed.expect new file mode 100644 index 000000000000..be10d659a140 --- /dev/null +++ b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.strong.transformed.expect @@ -0,0 +1,102 @@ +library; +import self as self; +import "dart:core" as core; +import "dart:collection" as col; + +static method foo1(core::int? x) → dynamic + return block { + final core::List #t1 = core::_GrowableList::•(0); + final has-declared-initializer core::Iterable? #t2 = null; + if(!(#t2 == null)) + #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable}){(core::Iterable) → void}; + } =>#t1; +static method foo2(core::String? x) → dynamic + return block { + final core::Set #t3 = new col::_Set::•(); + final has-declared-initializer core::Iterable? #t4 = null; + if(!(#t4 == null)) + #t3.{core::Set::addAll}{Invariant}(#t4{core::Iterable}){(core::Iterable) → void}; + } =>#t3; +static method foo3(core::bool? x, core::num y) → dynamic + return block { + final core::Map #t5 = {}; + final has-declared-initializer core::Map? #t6 = null; + if(!(#t6 == null)) + #t5.{core::Map::addAll}{Invariant}(#t6{core::Map}){(core::Map) → void}; + } =>#t5; +static method bar1(core::int? x) → dynamic + return block { + final core::List #t7 = core::_GrowableList::•(0); + final has-declared-initializer core::Iterable? #t8 = null; + if(!(#t8 == null)) + #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable}){(core::Iterable) → void}; + } =>#t7; +static method bar2(core::int? x, core::bool b) → dynamic + return block { + final core::Set #t9 = new col::_Set::•(); + if(b) { + final has-declared-initializer core::Iterable? #t10 = null; + if(!(#t10 == null)) + #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable}){(core::Iterable) → void}; + } + } =>#t9; +static method bar3(core::int? x) → dynamic + return block { + final core::Set #t11 = new col::_Set::•(); + { + synthesized core::Iterator :sync-for-iterator = core::_GrowableList::•(0).{core::Iterable::iterator}{core::Iterator}; + for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) { + dynamic _ = :sync-for-iterator.{core::Iterator::current}{dynamic}; + { + final has-declared-initializer core::Iterable? #t12 = null; + if(!(#t12 == null)) + #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable}){(core::Iterable) → void}; + } + } + } + } =>#t11; +static method bar4(core::String x, core::bool? y) → dynamic + return block { + final core::Map #t13 = {}; + final has-declared-initializer core::Map? #t14 = null; + if(!(#t14 == null)) + #t13.{core::Map::addAll}{Invariant}(#t14{core::Map}){(core::Map) → void}; + } =>#t13; +static method bar5(core::int? x, core::num y) → dynamic + return block { + final core::Map #t15 = {}; + final has-declared-initializer core::Map? #t16 = null; + if(!(#t16 == null)) + #t15.{core::Map::addAll}{Invariant}(#t16{core::Map}){(core::Map) → void}; + } =>#t15; +static method bar6(core::double? x, core::Symbol? y) → dynamic + return block { + final core::Map #t17 = {}; + final has-declared-initializer core::Map? #t18 = null; + if(!(#t18 == null)) + #t17.{core::Map::addAll}{Invariant}(#t18{core::Map}){(core::Map) → void}; + } =>#t17; +static method bar7(core::num? x, core::double? y, core::bool b) → dynamic + return block { + final core::Map #t19 = {}; + if(b) { + final has-declared-initializer core::Map? #t20 = null; + if(!(#t20 == null)) + #t19.{core::Map::addAll}{Invariant}(#t20{core::Map}){(core::Map) → void}; + } + } =>#t19; +static method bar8(core::num? x, core::double? y) → dynamic + return block { + final core::Map #t21 = {}; + { + synthesized core::Iterator :sync-for-iterator = core::_GrowableList::•(0).{core::Iterable::iterator}{core::Iterator}; + for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) { + dynamic _ = :sync-for-iterator.{core::Iterator::current}{dynamic}; + { + final has-declared-initializer core::Map? #t22 = null; + if(!(#t22 == null)) + #t21.{core::Map::addAll}{Invariant}(#t22{core::Map}){(core::Map) → void}; + } + } + } + } =>#t21; diff --git a/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.textual_outline.expect b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.textual_outline.expect new file mode 100644 index 000000000000..bdd9a79eac8f --- /dev/null +++ b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.textual_outline.expect @@ -0,0 +1,21 @@ +foo1(int? x) => [?x]; + +foo2(String? x) => {?x}; + +foo3(bool? x, num y) => {?x: y}; + +bar1(int? x) => [?x]; + +bar2(int? x, bool b) => { if (b) ?x }; + +bar3(int? x) => { for (var _ in []) ?x }; + +bar4(String x, bool? y) => {x: ?y}; + +bar5(int? x, num y) => {?x: y}; + +bar6(double? x, Symbol? y) => {?x: ?y}; + +bar7(num? x, double? y, bool b) => { if (b) ?x: ?y }; + +bar8(num? x, double? y) => { for (var _ in []) ?x: ?y }; diff --git a/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.textual_outline_modelled.expect new file mode 100644 index 000000000000..59ed5dfa3f04 --- /dev/null +++ b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.textual_outline_modelled.expect @@ -0,0 +1,21 @@ +bar1(int? x) => [?x]; + +bar2(int? x, bool b) => { if (b) ?x }; + +bar3(int? x) => { for (var _ in []) ?x }; + +bar4(String x, bool? y) => {x: ?y}; + +bar5(int? x, num y) => {?x: y}; + +bar6(double? x, Symbol? y) => {?x: ?y}; + +bar7(num? x, double? y, bool b) => { if (b) ?x: ?y }; + +bar8(num? x, double? y) => { for (var _ in []) ?x: ?y }; + +foo1(int? x) => [?x]; + +foo2(String? x) => {?x}; + +foo3(bool? x, num y) => {?x: y}; diff --git a/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.weak.expect b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.weak.expect new file mode 100644 index 000000000000..96a7bfeea59c --- /dev/null +++ b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.weak.expect @@ -0,0 +1,127 @@ +// +// Problems in component: +// +// sdk/lib/core/core.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/async/async.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/collection/collection.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/convert/convert.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/developer/developer.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/ffi/ffi.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/internal/internal.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/isolate/isolate.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/math/math.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/mirrors/mirrors.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/typed_data/typed_data.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/_internal/vm/bin/vmservice_io.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/vmservice/vmservice.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/_internal/vm/bin/builtin.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/html/dartium/nativewrappers.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/io/io.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/cli/cli.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +library; +import self as self; +import "dart:core" as core; +import "dart:collection" as col; + +static method foo1(core::int? x) → dynamic + return block { + final core::List #t1 = []; + final has-declared-initializer core::Iterable? #t2 = null; + if(!(#t2 == null)) + #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable}){(core::Iterable) → void}; + } =>#t1; +static method foo2(core::String? x) → dynamic + return block { + final core::Set #t3 = col::LinkedHashSet::•(); + final has-declared-initializer core::Iterable? #t4 = null; + if(!(#t4 == null)) + #t3.{core::Set::addAll}{Invariant}(#t4{core::Iterable}){(core::Iterable) → void}; + } =>#t3; +static method foo3(core::bool? x, core::num y) → dynamic + return block { + final core::Map #t5 = {}; + final has-declared-initializer core::Map? #t6 = null; + if(!(#t6 == null)) + #t5.{core::Map::addAll}{Invariant}(#t6{core::Map}){(core::Map) → void}; + } =>#t5; +static method bar1(core::int? x) → dynamic + return block { + final core::List #t7 = []; + final has-declared-initializer core::Iterable? #t8 = null; + if(!(#t8 == null)) + #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable}){(core::Iterable) → void}; + } =>#t7; +static method bar2(core::int? x, core::bool b) → dynamic + return block { + final core::Set #t9 = col::LinkedHashSet::•(); + if(b) { + final has-declared-initializer core::Iterable? #t10 = null; + if(!(#t10 == null)) + #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable}){(core::Iterable) → void}; + } + } =>#t9; +static method bar3(core::int? x) → dynamic + return block { + final core::Set #t11 = col::LinkedHashSet::•(); + for (dynamic _ in []) { + final has-declared-initializer core::Iterable? #t12 = null; + if(!(#t12 == null)) + #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable}){(core::Iterable) → void}; + } + } =>#t11; +static method bar4(core::String x, core::bool? y) → dynamic + return block { + final core::Map #t13 = {}; + final has-declared-initializer core::Map? #t14 = null; + if(!(#t14 == null)) + #t13.{core::Map::addAll}{Invariant}(#t14{core::Map}){(core::Map) → void}; + } =>#t13; +static method bar5(core::int? x, core::num y) → dynamic + return block { + final core::Map #t15 = {}; + final has-declared-initializer core::Map? #t16 = null; + if(!(#t16 == null)) + #t15.{core::Map::addAll}{Invariant}(#t16{core::Map}){(core::Map) → void}; + } =>#t15; +static method bar6(core::double? x, core::Symbol? y) → dynamic + return block { + final core::Map #t17 = {}; + final has-declared-initializer core::Map? #t18 = null; + if(!(#t18 == null)) + #t17.{core::Map::addAll}{Invariant}(#t18{core::Map}){(core::Map) → void}; + } =>#t17; +static method bar7(core::num? x, core::double? y, core::bool b) → dynamic + return block { + final core::Map #t19 = {}; + if(b) { + final has-declared-initializer core::Map? #t20 = null; + if(!(#t20 == null)) + #t19.{core::Map::addAll}{Invariant}(#t20{core::Map}){(core::Map) → void}; + } + } =>#t19; +static method bar8(core::num? x, core::double? y) → dynamic + return block { + final core::Map #t21 = {}; + for (dynamic _ in []) { + final has-declared-initializer core::Map? #t22 = null; + if(!(#t22 == null)) + #t21.{core::Map::addAll}{Invariant}(#t22{core::Map}){(core::Map) → void}; + } + } =>#t21; diff --git a/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.weak.transformed.expect b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.weak.transformed.expect new file mode 100644 index 000000000000..0c53463ac2ac --- /dev/null +++ b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.weak.transformed.expect @@ -0,0 +1,139 @@ +// +// Problems in component: +// +// sdk/lib/core/core.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/async/async.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/collection/collection.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/convert/convert.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/developer/developer.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/ffi/ffi.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/internal/internal.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/isolate/isolate.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/math/math.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/mirrors/mirrors.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/typed_data/typed_data.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/_internal/vm/bin/vmservice_io.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/vmservice/vmservice.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/_internal/vm/bin/builtin.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/html/dartium/nativewrappers.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/io/io.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +// sdk/lib/cli/cli.dart: Error: Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety. +// +library; +import self as self; +import "dart:core" as core; +import "dart:collection" as col; + +static method foo1(core::int? x) → dynamic + return block { + final core::List #t1 = core::_GrowableList::•(0); + final has-declared-initializer core::Iterable? #t2 = null; + if(!(#t2 == null)) + #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable}){(core::Iterable) → void}; + } =>#t1; +static method foo2(core::String? x) → dynamic + return block { + final core::Set #t3 = new col::_Set::•(); + final has-declared-initializer core::Iterable? #t4 = null; + if(!(#t4 == null)) + #t3.{core::Set::addAll}{Invariant}(#t4{core::Iterable}){(core::Iterable) → void}; + } =>#t3; +static method foo3(core::bool? x, core::num y) → dynamic + return block { + final core::Map #t5 = {}; + final has-declared-initializer core::Map? #t6 = null; + if(!(#t6 == null)) + #t5.{core::Map::addAll}{Invariant}(#t6{core::Map}){(core::Map) → void}; + } =>#t5; +static method bar1(core::int? x) → dynamic + return block { + final core::List #t7 = core::_GrowableList::•(0); + final has-declared-initializer core::Iterable? #t8 = null; + if(!(#t8 == null)) + #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable}){(core::Iterable) → void}; + } =>#t7; +static method bar2(core::int? x, core::bool b) → dynamic + return block { + final core::Set #t9 = new col::_Set::•(); + if(b) { + final has-declared-initializer core::Iterable? #t10 = null; + if(!(#t10 == null)) + #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable}){(core::Iterable) → void}; + } + } =>#t9; +static method bar3(core::int? x) → dynamic + return block { + final core::Set #t11 = new col::_Set::•(); + { + synthesized core::Iterator :sync-for-iterator = core::_GrowableList::•(0).{core::Iterable::iterator}{core::Iterator}; + for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) { + dynamic _ = :sync-for-iterator.{core::Iterator::current}{dynamic}; + { + final has-declared-initializer core::Iterable? #t12 = null; + if(!(#t12 == null)) + #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable}){(core::Iterable) → void}; + } + } + } + } =>#t11; +static method bar4(core::String x, core::bool? y) → dynamic + return block { + final core::Map #t13 = {}; + final has-declared-initializer core::Map? #t14 = null; + if(!(#t14 == null)) + #t13.{core::Map::addAll}{Invariant}(#t14{core::Map}){(core::Map) → void}; + } =>#t13; +static method bar5(core::int? x, core::num y) → dynamic + return block { + final core::Map #t15 = {}; + final has-declared-initializer core::Map? #t16 = null; + if(!(#t16 == null)) + #t15.{core::Map::addAll}{Invariant}(#t16{core::Map}){(core::Map) → void}; + } =>#t15; +static method bar6(core::double? x, core::Symbol? y) → dynamic + return block { + final core::Map #t17 = {}; + final has-declared-initializer core::Map? #t18 = null; + if(!(#t18 == null)) + #t17.{core::Map::addAll}{Invariant}(#t18{core::Map}){(core::Map) → void}; + } =>#t17; +static method bar7(core::num? x, core::double? y, core::bool b) → dynamic + return block { + final core::Map #t19 = {}; + if(b) { + final has-declared-initializer core::Map? #t20 = null; + if(!(#t20 == null)) + #t19.{core::Map::addAll}{Invariant}(#t20{core::Map}){(core::Map) → void}; + } + } =>#t19; +static method bar8(core::num? x, core::double? y) → dynamic + return block { + final core::Map #t21 = {}; + { + synthesized core::Iterator :sync-for-iterator = core::_GrowableList::•(0).{core::Iterable::iterator}{core::Iterator}; + for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) { + dynamic _ = :sync-for-iterator.{core::Iterator::current}{dynamic}; + { + final has-declared-initializer core::Map? #t22 = null; + if(!(#t22 == null)) + #t21.{core::Map::addAll}{Invariant}(#t22{core::Map}){(core::Map) → void}; + } + } + } + } =>#t21;