[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 <keertip@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
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 2801ba2..e7bdfb1 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 @@
}
@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
@@ -1910,6 +1913,11 @@
}
@override
+ void handleNullAwareElement(Token nullAwareToken) {
+ listener?.handleNullAwareElement(nullAwareToken);
+ }
+
+ @override
void handleObjectPattern(
Token firstIdentifier, Token? dot, Token? secondIdentifier) {
listener?.handleObjectPattern(firstIdentifier, dot, secondIdentifier);
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index 8889dbf..642824e 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 @@
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 @@
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 8b5b93a..9c81f25 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 @@
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 02621b4..a8add65 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 @@
/// 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 @@
);
} 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 @@
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 @@
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 88c0fc6..f0fd748 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 @@
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:
+ // <int, String>{ x: ?y }
+ token = parseExpression(next);
+ listener.handleLiteralMapEntry(colon, token,
+ nullAwareKeyToken: null, nullAwareValueToken: next);
+ } else {
+ // Non null-aware entry. For example:
+ // <bool, num>{ x: y }
+ token = parseExpression(colon);
+ listener.handleLiteralMapEntry(colon, token.next!);
+ }
}
} else {
while (info != null) {
@@ -7000,8 +7011,19 @@
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:
+ // <double, Symbol>{ if (b) x: ?y }
+ listener.handleLiteralMapEntry(colon, token,
+ nullAwareKeyToken: null, nullAwareValueToken: next);
+ } else {
+ // Non null-aware entry. For example:
+ // <String, int>{ 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 29d41d1..bb98c10 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -147,6 +147,9 @@
/// `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 @@
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 @@
}
@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(
@@ -5037,6 +5052,18 @@
}
@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');
if (!_featureSet.isEnabled(Feature.patterns)) {
diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart
index 394d848..3399d8e 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 @@
}
@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) {
@@ -7130,6 +7148,24 @@
}
@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");
Object? expression = pop();
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 dc7e7f6..0de7023 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 @@
}
@override
- void handleLiteralMapEntry(Token colon, Token endToken) {
+ void handleLiteralMapEntry(Token colon, Token endToken,
+ {Token? nullAwareKeyToken, Token? nullAwareValueToken}) {
_unhandled('map entry');
}
@@ -2189,6 +2190,11 @@
}
@override
+ void handleNullAwareElement(Token spreadToken) {
+ _unsupported();
+ }
+
+ @override
void handleObjectPattern(
Token firstIdentifier, Token? dot, Token? secondIdentifier) {
_unsupported();
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 58bb32f..b9e5d33 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 @@
}
@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);
}
@@ -2454,6 +2458,14 @@
}
@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,
dots: dots, hasSubPattern: hasSubPattern);
@@ -6234,15 +6246,22 @@
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<String, Object?> get deprecatedArguments => {
"colon": colon,
"endToken": endToken,
+ "nullAwareKeyToken": nullAwareKeyToken,
+ "nullAwareValueToken": nullAwareValueToken,
};
@override
@@ -8481,6 +8500,21 @@
R accept<R>(ParserAstVisitor<R> v) => v.visitSpreadExpressionHandle(this);
}
+class NullAwareElementHandle extends ParserAstNode {
+ final Token nullAwareToken;
+
+ NullAwareElementHandle(ParserAstType type, {required this.nullAwareToken})
+ : super("NullAwareElement", type);
+
+ @override
+ Map<String, Object?> get deprecatedArguments => {
+ "nullAwareToken": nullAwareToken,
+ };
+
+ @override
+ R accept<R>(ParserAstVisitor<R> v) => v.visitNullAwareElementHandle(this);
+}
+
class RestPatternHandle extends ParserAstNode {
final Token dots;
final bool hasSubPattern;
@@ -10281,6 +10315,7 @@
R visitIfControlFlowEnd(IfControlFlowEnd node);
R visitIfElseControlFlowEnd(IfElseControlFlowEnd node);
R visitSpreadExpressionHandle(SpreadExpressionHandle node);
+ R visitNullAwareElementHandle(NullAwareElementHandle node);
R visitRestPatternHandle(RestPatternHandle node);
R visitFunctionTypedFormalParameterBegin(
FunctionTypedFormalParameterBegin node);
@@ -11443,6 +11478,10 @@
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 d67b321..4114b55 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 @@
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 @@
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 @@
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 @@
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 84fc530..7ac869fd 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 @@
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 @@
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 @@
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 @@
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 66f0520..85fe115 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 @@
beginLiteralString("a")
endLiteralString(0, :)
handleLiteralNull(null)
- handleLiteralMapEntry(:, })
+ handleLiteralMapEntry(:, }, null, null)
handleLiteralSetOrMap(1, {, const, }, false)
endConstLiteral(})
endFieldInitializer(=, })
@@ -250,7 +250,7 @@
beginLiteralString("a")
endLiteralString(0, :)
handleLiteralNull(null)
- handleLiteralMapEntry(:, })
+ handleLiteralMapEntry(:, }, null, null)
handleLiteralSetOrMap(1, {, const, }, false)
endConstLiteral(})
endFieldInitializer(=, })
@@ -288,7 +288,7 @@
beginLiteralString("a")
endLiteralString(0, :)
handleLiteralNull(null)
- handleLiteralMapEntry(:, })
+ handleLiteralMapEntry(:, }, null, null)
handleLiteralSetOrMap(1, {, const, }, false)
endConstLiteral(})
endFieldInitializer(=, })
@@ -315,7 +315,7 @@
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 96fe89b..b501898 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 @@
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 @@
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 @@
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 @@
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 5ad1474..55c8bf1 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 @@
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 @@
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 @@
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 @@
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 3903b5a..a284668 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 @@
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 @@
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 @@
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 @@
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 63227f5..288192f 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 @@
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 82294b8..458ab58 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 @@
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 c1189bd..379d9a0 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 @@
endLiteralString(0, :)
beginLiteralString("b")
endLiteralString(0, })
- handleLiteralMapEntry(:, })
+ handleLiteralMapEntry(:, }, null, null)
handleLiteralSetOrMap(1, {, null, }, false)
handleConditionalExpressionColon()
handleNoTypeArguments([)
@@ -226,7 +226,7 @@
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 1798655..4ec4fe5 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 @@
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 @@
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 0f14de8..1fb8045 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 @@
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 c963c6f..295f06d 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 @@
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 05488be..a6680ef 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 @@
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 2016417..24e4922 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 @@
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 0000000..28d9df0
--- /dev/null
+++ b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart
@@ -0,0 +1,11 @@
+foo1(int? x) => <int>[?x];
+foo2(String? x) => <String>{?x};
+foo3(bool? x, num y) => <bool, num>{?x: y};
+bar1(int? x) => <int>[?x];
+bar2(int? x, bool b) => <int>{ if (b) ?x };
+bar3(int? x) => <int>{ for (var _ in []) ?x };
+bar4(String x, bool? y) => <String, bool>{x: ?y};
+bar5(int? x, num y) => <int, num>{?x: y};
+bar6(double? x, Symbol? y) => <double, Symbol>{?x: ?y};
+bar7(num? x, double? y, bool b) => <num, double>{ if (b) ?x: ?y };
+bar8(num? x, double? y) => <num, double>{ 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 0000000..5776664
--- /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 0000000..a937d85
--- /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 0000000..c1a1abd
--- /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) => <int>[?x];
+foo2(String? x) => <String>{?x};
+foo3(bool? x, num y) => <bool, num>{?x: y};
+bar1(int? x) => <int>[?x];
+bar2(int? x, bool b) => <int>{ if (b) ?x };
+bar3(int? x) => <int>{ for (var _ in []) ?x };
+bar4(String x, bool? y) => <String, bool>{x: ?y};
+bar5(int? x, num y) => <int, num>{?x: y};
+bar6(double? x, Symbol? y) => <double, Symbol>{?x: ?y};
+bar7(num? x, double? y, bool b) => <num, double>{ if (b) ?x: ?y };
+bar8(num? x, double? y) => <num, double>{ 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 0000000..57d6ae8
--- /dev/null
+++ b/pkg/front_end/parser_testcases/null_aware_elements/simple_positive.dart.scanner.expect
@@ -0,0 +1,25 @@
+foo1(int? x) => <int>[?x];
+foo2(String? x) => <String>{?x};
+foo3(bool? x, num y) => <bool, num>{?x: y};
+bar1(int? x) => <int>[?x];
+bar2(int? x, bool b) => <int>{ if (b) ?x };
+bar3(int? x) => <int>{ for (var _ in []) ?x };
+bar4(String x, bool? y) => <String, bool>{x: ?y};
+bar5(int? x, num y) => <int, num>{?x: y};
+bar6(double? x, Symbol? y) => <double, Symbol>{?x: ?y};
+bar7(num? x, double? y, bool b) => <num, double>{ if (b) ?x: ?y };
+bar8(num? x, double? y) => <num, double>{ 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 5069152..c0dbd6c 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 @@
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 8865451..471814e 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 @@
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 1c09586..7017a27 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 @@
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 3db49f8..104ceea 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 @@
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 210ac8c..84f360e 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 @@
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 e1ad065..c504325 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 @@
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 6271408..433fb22 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 @@
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 1568696..82b3142 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 @@
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 850ac54..94fb165 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 @@
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 1749691..8645c4b 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 @@
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 1a87322..ff87c2d 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 @@
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 f6be17d..9a970ba 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 @@
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 a042c0b..9f16f79 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 @@
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 eead9ff..73cd2c9 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 @@
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 6ddf3aa..34f0da0 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 @@
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 faba811..9cc807d 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 @@
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 b67114c..afbc9d1 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 @@
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 ff359ae..e016a2d 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 @@
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 ddb519b..1eddc22 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 @@
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 7a03d17..e43b3e1 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 @@
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 681bb9c..78466ff 100644
--- a/pkg/front_end/test/coverage_suite_expected.dart
+++ b/pkg/front_end/test/coverage_suite_expected.dart
@@ -458,10 +458,10 @@
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 @@
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 @@
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 @@
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 @@
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 84196e7..0f61019 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 @@
}
@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 0b5c61f..0b39db8 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -1587,10 +1587,17 @@
}
@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
@@ -2647,6 +2654,12 @@
}
@override
+ void handleNullAwareElement(Token nullAwareToken) {
+ seen(nullAwareToken);
+ doPrint('handleNullAwareElement(' '$nullAwareToken)');
+ }
+
+ @override
void handleRestPattern(Token dots, {required bool hasSubPattern}) {
seen(dots);
doPrint('handleRestPattern(' '$dots, ' '$hasSubPattern)');
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 0000000..3e22d5c
--- /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 0000000..bfab11b
--- /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) => <int>[?x];
+foo2(String? x) => <String>{?x};
+foo3(bool? x, num y) => <bool, num>{?x: y};
+
+bar1(int? x) => <int>[?x];
+bar2(int? x, bool b) => <int>{ if (b) ?x };
+bar3(int? x) => <int>{ for (var _ in []) ?x };
+bar4(String x, bool? y) => <String, bool>{x: ?y};
+bar5(int? x, num y) => <int, num>{?x: y};
+bar6(double? x, Symbol? y) => <double, Symbol>{?x: ?y};
+bar7(num? x, double? y, bool b) => <num, double>{ if (b) ?x: ?y };
+bar8(num? x, double? y) => <num, double>{ 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 0000000..d005c46
--- /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<core::int> #t1 = <core::int>[];
+ final has-declared-initializer core::Iterable<core::int>? #t2 = null;
+ if(!(#t2 == null))
+ #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ } =>#t1;
+static method foo2(core::String? x) → dynamic
+ return block {
+ final core::Set<core::String> #t3 = col::LinkedHashSet::•<core::String>();
+ final has-declared-initializer core::Iterable<core::String>? #t4 = null;
+ if(!(#t4 == null))
+ #t3.{core::Set::addAll}{Invariant}(#t4{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+ } =>#t3;
+static method foo3(core::bool? x, core::num y) → dynamic
+ return block {
+ final core::Map<core::bool, core::num> #t5 = <core::bool, core::num>{};
+ final has-declared-initializer core::Map<core::bool, core::num>? #t6 = null;
+ if(!(#t6 == null))
+ #t5.{core::Map::addAll}{Invariant}(#t6{core::Map<core::bool, core::num>}){(core::Map<core::bool, core::num>) → void};
+ } =>#t5;
+static method bar1(core::int? x) → dynamic
+ return block {
+ final core::List<core::int> #t7 = <core::int>[];
+ final has-declared-initializer core::Iterable<core::int>? #t8 = null;
+ if(!(#t8 == null))
+ #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ } =>#t7;
+static method bar2(core::int? x, core::bool b) → dynamic
+ return block {
+ final core::Set<core::int> #t9 = col::LinkedHashSet::•<core::int>();
+ if(b) {
+ final has-declared-initializer core::Iterable<core::int>? #t10 = null;
+ if(!(#t10 == null))
+ #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ }
+ } =>#t9;
+static method bar3(core::int? x) → dynamic
+ return block {
+ final core::Set<core::int> #t11 = col::LinkedHashSet::•<core::int>();
+ for (dynamic _ in <dynamic>[]) {
+ final has-declared-initializer core::Iterable<core::int>? #t12 = null;
+ if(!(#t12 == null))
+ #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ }
+ } =>#t11;
+static method bar4(core::String x, core::bool? y) → dynamic
+ return block {
+ final core::Map<core::String, core::bool> #t13 = <core::String, core::bool>{};
+ final has-declared-initializer core::Map<core::String, core::bool>? #t14 = null;
+ if(!(#t14 == null))
+ #t13.{core::Map::addAll}{Invariant}(#t14{core::Map<core::String, core::bool>}){(core::Map<core::String, core::bool>) → void};
+ } =>#t13;
+static method bar5(core::int? x, core::num y) → dynamic
+ return block {
+ final core::Map<core::int, core::num> #t15 = <core::int, core::num>{};
+ final has-declared-initializer core::Map<core::int, core::num>? #t16 = null;
+ if(!(#t16 == null))
+ #t15.{core::Map::addAll}{Invariant}(#t16{core::Map<core::int, core::num>}){(core::Map<core::int, core::num>) → void};
+ } =>#t15;
+static method bar6(core::double? x, core::Symbol? y) → dynamic
+ return block {
+ final core::Map<core::double, core::Symbol> #t17 = <core::double, core::Symbol>{};
+ final has-declared-initializer core::Map<core::double, core::Symbol>? #t18 = null;
+ if(!(#t18 == null))
+ #t17.{core::Map::addAll}{Invariant}(#t18{core::Map<core::double, core::Symbol>}){(core::Map<core::double, core::Symbol>) → void};
+ } =>#t17;
+static method bar7(core::num? x, core::double? y, core::bool b) → dynamic
+ return block {
+ final core::Map<core::num, core::double> #t19 = <core::num, core::double>{};
+ if(b) {
+ final has-declared-initializer core::Map<core::num, core::double>? #t20 = null;
+ if(!(#t20 == null))
+ #t19.{core::Map::addAll}{Invariant}(#t20{core::Map<core::num, core::double>}){(core::Map<core::num, core::double>) → void};
+ }
+ } =>#t19;
+static method bar8(core::num? x, core::double? y) → dynamic
+ return block {
+ final core::Map<core::num, core::double> #t21 = <core::num, core::double>{};
+ for (dynamic _ in <dynamic>[]) {
+ final has-declared-initializer core::Map<core::num, core::double>? #t22 = null;
+ if(!(#t22 == null))
+ #t21.{core::Map::addAll}{Invariant}(#t22{core::Map<core::num, core::double>}){(core::Map<core::num, core::double>) → 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 0000000..d005c46
--- /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<core::int> #t1 = <core::int>[];
+ final has-declared-initializer core::Iterable<core::int>? #t2 = null;
+ if(!(#t2 == null))
+ #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ } =>#t1;
+static method foo2(core::String? x) → dynamic
+ return block {
+ final core::Set<core::String> #t3 = col::LinkedHashSet::•<core::String>();
+ final has-declared-initializer core::Iterable<core::String>? #t4 = null;
+ if(!(#t4 == null))
+ #t3.{core::Set::addAll}{Invariant}(#t4{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+ } =>#t3;
+static method foo3(core::bool? x, core::num y) → dynamic
+ return block {
+ final core::Map<core::bool, core::num> #t5 = <core::bool, core::num>{};
+ final has-declared-initializer core::Map<core::bool, core::num>? #t6 = null;
+ if(!(#t6 == null))
+ #t5.{core::Map::addAll}{Invariant}(#t6{core::Map<core::bool, core::num>}){(core::Map<core::bool, core::num>) → void};
+ } =>#t5;
+static method bar1(core::int? x) → dynamic
+ return block {
+ final core::List<core::int> #t7 = <core::int>[];
+ final has-declared-initializer core::Iterable<core::int>? #t8 = null;
+ if(!(#t8 == null))
+ #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ } =>#t7;
+static method bar2(core::int? x, core::bool b) → dynamic
+ return block {
+ final core::Set<core::int> #t9 = col::LinkedHashSet::•<core::int>();
+ if(b) {
+ final has-declared-initializer core::Iterable<core::int>? #t10 = null;
+ if(!(#t10 == null))
+ #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ }
+ } =>#t9;
+static method bar3(core::int? x) → dynamic
+ return block {
+ final core::Set<core::int> #t11 = col::LinkedHashSet::•<core::int>();
+ for (dynamic _ in <dynamic>[]) {
+ final has-declared-initializer core::Iterable<core::int>? #t12 = null;
+ if(!(#t12 == null))
+ #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ }
+ } =>#t11;
+static method bar4(core::String x, core::bool? y) → dynamic
+ return block {
+ final core::Map<core::String, core::bool> #t13 = <core::String, core::bool>{};
+ final has-declared-initializer core::Map<core::String, core::bool>? #t14 = null;
+ if(!(#t14 == null))
+ #t13.{core::Map::addAll}{Invariant}(#t14{core::Map<core::String, core::bool>}){(core::Map<core::String, core::bool>) → void};
+ } =>#t13;
+static method bar5(core::int? x, core::num y) → dynamic
+ return block {
+ final core::Map<core::int, core::num> #t15 = <core::int, core::num>{};
+ final has-declared-initializer core::Map<core::int, core::num>? #t16 = null;
+ if(!(#t16 == null))
+ #t15.{core::Map::addAll}{Invariant}(#t16{core::Map<core::int, core::num>}){(core::Map<core::int, core::num>) → void};
+ } =>#t15;
+static method bar6(core::double? x, core::Symbol? y) → dynamic
+ return block {
+ final core::Map<core::double, core::Symbol> #t17 = <core::double, core::Symbol>{};
+ final has-declared-initializer core::Map<core::double, core::Symbol>? #t18 = null;
+ if(!(#t18 == null))
+ #t17.{core::Map::addAll}{Invariant}(#t18{core::Map<core::double, core::Symbol>}){(core::Map<core::double, core::Symbol>) → void};
+ } =>#t17;
+static method bar7(core::num? x, core::double? y, core::bool b) → dynamic
+ return block {
+ final core::Map<core::num, core::double> #t19 = <core::num, core::double>{};
+ if(b) {
+ final has-declared-initializer core::Map<core::num, core::double>? #t20 = null;
+ if(!(#t20 == null))
+ #t19.{core::Map::addAll}{Invariant}(#t20{core::Map<core::num, core::double>}){(core::Map<core::num, core::double>) → void};
+ }
+ } =>#t19;
+static method bar8(core::num? x, core::double? y) → dynamic
+ return block {
+ final core::Map<core::num, core::double> #t21 = <core::num, core::double>{};
+ for (dynamic _ in <dynamic>[]) {
+ final has-declared-initializer core::Map<core::num, core::double>? #t22 = null;
+ if(!(#t22 == null))
+ #t21.{core::Map::addAll}{Invariant}(#t22{core::Map<core::num, core::double>}){(core::Map<core::num, core::double>) → 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 0000000..56120d6
--- /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 0000000..be10d65
--- /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<core::int> #t1 = core::_GrowableList::•<core::int>(0);
+ final has-declared-initializer core::Iterable<core::int>? #t2 = null;
+ if(!(#t2 == null))
+ #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ } =>#t1;
+static method foo2(core::String? x) → dynamic
+ return block {
+ final core::Set<core::String> #t3 = new col::_Set::•<core::String>();
+ final has-declared-initializer core::Iterable<core::String>? #t4 = null;
+ if(!(#t4 == null))
+ #t3.{core::Set::addAll}{Invariant}(#t4{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+ } =>#t3;
+static method foo3(core::bool? x, core::num y) → dynamic
+ return block {
+ final core::Map<core::bool, core::num> #t5 = <core::bool, core::num>{};
+ final has-declared-initializer core::Map<core::bool, core::num>? #t6 = null;
+ if(!(#t6 == null))
+ #t5.{core::Map::addAll}{Invariant}(#t6{core::Map<core::bool, core::num>}){(core::Map<core::bool, core::num>) → void};
+ } =>#t5;
+static method bar1(core::int? x) → dynamic
+ return block {
+ final core::List<core::int> #t7 = core::_GrowableList::•<core::int>(0);
+ final has-declared-initializer core::Iterable<core::int>? #t8 = null;
+ if(!(#t8 == null))
+ #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ } =>#t7;
+static method bar2(core::int? x, core::bool b) → dynamic
+ return block {
+ final core::Set<core::int> #t9 = new col::_Set::•<core::int>();
+ if(b) {
+ final has-declared-initializer core::Iterable<core::int>? #t10 = null;
+ if(!(#t10 == null))
+ #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ }
+ } =>#t9;
+static method bar3(core::int? x) → dynamic
+ return block {
+ final core::Set<core::int> #t11 = new col::_Set::•<core::int>();
+ {
+ synthesized core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::•<dynamic>(0).{core::Iterable::iterator}{core::Iterator<dynamic>};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+ dynamic _ = :sync-for-iterator.{core::Iterator::current}{dynamic};
+ {
+ final has-declared-initializer core::Iterable<core::int>? #t12 = null;
+ if(!(#t12 == null))
+ #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ }
+ }
+ }
+ } =>#t11;
+static method bar4(core::String x, core::bool? y) → dynamic
+ return block {
+ final core::Map<core::String, core::bool> #t13 = <core::String, core::bool>{};
+ final has-declared-initializer core::Map<core::String, core::bool>? #t14 = null;
+ if(!(#t14 == null))
+ #t13.{core::Map::addAll}{Invariant}(#t14{core::Map<core::String, core::bool>}){(core::Map<core::String, core::bool>) → void};
+ } =>#t13;
+static method bar5(core::int? x, core::num y) → dynamic
+ return block {
+ final core::Map<core::int, core::num> #t15 = <core::int, core::num>{};
+ final has-declared-initializer core::Map<core::int, core::num>? #t16 = null;
+ if(!(#t16 == null))
+ #t15.{core::Map::addAll}{Invariant}(#t16{core::Map<core::int, core::num>}){(core::Map<core::int, core::num>) → void};
+ } =>#t15;
+static method bar6(core::double? x, core::Symbol? y) → dynamic
+ return block {
+ final core::Map<core::double, core::Symbol> #t17 = <core::double, core::Symbol>{};
+ final has-declared-initializer core::Map<core::double, core::Symbol>? #t18 = null;
+ if(!(#t18 == null))
+ #t17.{core::Map::addAll}{Invariant}(#t18{core::Map<core::double, core::Symbol>}){(core::Map<core::double, core::Symbol>) → void};
+ } =>#t17;
+static method bar7(core::num? x, core::double? y, core::bool b) → dynamic
+ return block {
+ final core::Map<core::num, core::double> #t19 = <core::num, core::double>{};
+ if(b) {
+ final has-declared-initializer core::Map<core::num, core::double>? #t20 = null;
+ if(!(#t20 == null))
+ #t19.{core::Map::addAll}{Invariant}(#t20{core::Map<core::num, core::double>}){(core::Map<core::num, core::double>) → void};
+ }
+ } =>#t19;
+static method bar8(core::num? x, core::double? y) → dynamic
+ return block {
+ final core::Map<core::num, core::double> #t21 = <core::num, core::double>{};
+ {
+ synthesized core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::•<dynamic>(0).{core::Iterable::iterator}{core::Iterator<dynamic>};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+ dynamic _ = :sync-for-iterator.{core::Iterator::current}{dynamic};
+ {
+ final has-declared-initializer core::Map<core::num, core::double>? #t22 = null;
+ if(!(#t22 == null))
+ #t21.{core::Map::addAll}{Invariant}(#t22{core::Map<core::num, core::double>}){(core::Map<core::num, core::double>) → 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 0000000..bdd9a79
--- /dev/null
+++ b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.textual_outline.expect
@@ -0,0 +1,21 @@
+foo1(int? x) => <int>[?x];
+
+foo2(String? x) => <String>{?x};
+
+foo3(bool? x, num y) => <bool, num>{?x: y};
+
+bar1(int? x) => <int>[?x];
+
+bar2(int? x, bool b) => <int>{ if (b) ?x };
+
+bar3(int? x) => <int>{ for (var _ in []) ?x };
+
+bar4(String x, bool? y) => <String, bool>{x: ?y};
+
+bar5(int? x, num y) => <int, num>{?x: y};
+
+bar6(double? x, Symbol? y) => <double, Symbol>{?x: ?y};
+
+bar7(num? x, double? y, bool b) => <num, double>{ if (b) ?x: ?y };
+
+bar8(num? x, double? y) => <num, double>{ 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 0000000..59ed5df
--- /dev/null
+++ b/pkg/front_end/testcases/null_aware_elements/simple_positive.dart.textual_outline_modelled.expect
@@ -0,0 +1,21 @@
+bar1(int? x) => <int>[?x];
+
+bar2(int? x, bool b) => <int>{ if (b) ?x };
+
+bar3(int? x) => <int>{ for (var _ in []) ?x };
+
+bar4(String x, bool? y) => <String, bool>{x: ?y};
+
+bar5(int? x, num y) => <int, num>{?x: y};
+
+bar6(double? x, Symbol? y) => <double, Symbol>{?x: ?y};
+
+bar7(num? x, double? y, bool b) => <num, double>{ if (b) ?x: ?y };
+
+bar8(num? x, double? y) => <num, double>{ for (var _ in []) ?x: ?y };
+
+foo1(int? x) => <int>[?x];
+
+foo2(String? x) => <String>{?x};
+
+foo3(bool? x, num y) => <bool, num>{?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 0000000..96a7bfe
--- /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<core::int> #t1 = <core::int>[];
+ final has-declared-initializer core::Iterable<core::int>? #t2 = null;
+ if(!(#t2 == null))
+ #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ } =>#t1;
+static method foo2(core::String? x) → dynamic
+ return block {
+ final core::Set<core::String> #t3 = col::LinkedHashSet::•<core::String>();
+ final has-declared-initializer core::Iterable<core::String>? #t4 = null;
+ if(!(#t4 == null))
+ #t3.{core::Set::addAll}{Invariant}(#t4{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+ } =>#t3;
+static method foo3(core::bool? x, core::num y) → dynamic
+ return block {
+ final core::Map<core::bool, core::num> #t5 = <core::bool, core::num>{};
+ final has-declared-initializer core::Map<core::bool, core::num>? #t6 = null;
+ if(!(#t6 == null))
+ #t5.{core::Map::addAll}{Invariant}(#t6{core::Map<core::bool, core::num>}){(core::Map<core::bool, core::num>) → void};
+ } =>#t5;
+static method bar1(core::int? x) → dynamic
+ return block {
+ final core::List<core::int> #t7 = <core::int>[];
+ final has-declared-initializer core::Iterable<core::int>? #t8 = null;
+ if(!(#t8 == null))
+ #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ } =>#t7;
+static method bar2(core::int? x, core::bool b) → dynamic
+ return block {
+ final core::Set<core::int> #t9 = col::LinkedHashSet::•<core::int>();
+ if(b) {
+ final has-declared-initializer core::Iterable<core::int>? #t10 = null;
+ if(!(#t10 == null))
+ #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ }
+ } =>#t9;
+static method bar3(core::int? x) → dynamic
+ return block {
+ final core::Set<core::int> #t11 = col::LinkedHashSet::•<core::int>();
+ for (dynamic _ in <dynamic>[]) {
+ final has-declared-initializer core::Iterable<core::int>? #t12 = null;
+ if(!(#t12 == null))
+ #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ }
+ } =>#t11;
+static method bar4(core::String x, core::bool? y) → dynamic
+ return block {
+ final core::Map<core::String, core::bool> #t13 = <core::String, core::bool>{};
+ final has-declared-initializer core::Map<core::String, core::bool>? #t14 = null;
+ if(!(#t14 == null))
+ #t13.{core::Map::addAll}{Invariant}(#t14{core::Map<core::String, core::bool>}){(core::Map<core::String, core::bool>) → void};
+ } =>#t13;
+static method bar5(core::int? x, core::num y) → dynamic
+ return block {
+ final core::Map<core::int, core::num> #t15 = <core::int, core::num>{};
+ final has-declared-initializer core::Map<core::int, core::num>? #t16 = null;
+ if(!(#t16 == null))
+ #t15.{core::Map::addAll}{Invariant}(#t16{core::Map<core::int, core::num>}){(core::Map<core::int, core::num>) → void};
+ } =>#t15;
+static method bar6(core::double? x, core::Symbol? y) → dynamic
+ return block {
+ final core::Map<core::double, core::Symbol> #t17 = <core::double, core::Symbol>{};
+ final has-declared-initializer core::Map<core::double, core::Symbol>? #t18 = null;
+ if(!(#t18 == null))
+ #t17.{core::Map::addAll}{Invariant}(#t18{core::Map<core::double, core::Symbol>}){(core::Map<core::double, core::Symbol>) → void};
+ } =>#t17;
+static method bar7(core::num? x, core::double? y, core::bool b) → dynamic
+ return block {
+ final core::Map<core::num, core::double> #t19 = <core::num, core::double>{};
+ if(b) {
+ final has-declared-initializer core::Map<core::num, core::double>? #t20 = null;
+ if(!(#t20 == null))
+ #t19.{core::Map::addAll}{Invariant}(#t20{core::Map<core::num, core::double>}){(core::Map<core::num, core::double>) → void};
+ }
+ } =>#t19;
+static method bar8(core::num? x, core::double? y) → dynamic
+ return block {
+ final core::Map<core::num, core::double> #t21 = <core::num, core::double>{};
+ for (dynamic _ in <dynamic>[]) {
+ final has-declared-initializer core::Map<core::num, core::double>? #t22 = null;
+ if(!(#t22 == null))
+ #t21.{core::Map::addAll}{Invariant}(#t22{core::Map<core::num, core::double>}){(core::Map<core::num, core::double>) → 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 0000000..0c53463
--- /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<core::int> #t1 = core::_GrowableList::•<core::int>(0);
+ final has-declared-initializer core::Iterable<core::int>? #t2 = null;
+ if(!(#t2 == null))
+ #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ } =>#t1;
+static method foo2(core::String? x) → dynamic
+ return block {
+ final core::Set<core::String> #t3 = new col::_Set::•<core::String>();
+ final has-declared-initializer core::Iterable<core::String>? #t4 = null;
+ if(!(#t4 == null))
+ #t3.{core::Set::addAll}{Invariant}(#t4{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+ } =>#t3;
+static method foo3(core::bool? x, core::num y) → dynamic
+ return block {
+ final core::Map<core::bool, core::num> #t5 = <core::bool, core::num>{};
+ final has-declared-initializer core::Map<core::bool, core::num>? #t6 = null;
+ if(!(#t6 == null))
+ #t5.{core::Map::addAll}{Invariant}(#t6{core::Map<core::bool, core::num>}){(core::Map<core::bool, core::num>) → void};
+ } =>#t5;
+static method bar1(core::int? x) → dynamic
+ return block {
+ final core::List<core::int> #t7 = core::_GrowableList::•<core::int>(0);
+ final has-declared-initializer core::Iterable<core::int>? #t8 = null;
+ if(!(#t8 == null))
+ #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ } =>#t7;
+static method bar2(core::int? x, core::bool b) → dynamic
+ return block {
+ final core::Set<core::int> #t9 = new col::_Set::•<core::int>();
+ if(b) {
+ final has-declared-initializer core::Iterable<core::int>? #t10 = null;
+ if(!(#t10 == null))
+ #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ }
+ } =>#t9;
+static method bar3(core::int? x) → dynamic
+ return block {
+ final core::Set<core::int> #t11 = new col::_Set::•<core::int>();
+ {
+ synthesized core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::•<dynamic>(0).{core::Iterable::iterator}{core::Iterator<dynamic>};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+ dynamic _ = :sync-for-iterator.{core::Iterator::current}{dynamic};
+ {
+ final has-declared-initializer core::Iterable<core::int>? #t12 = null;
+ if(!(#t12 == null))
+ #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+ }
+ }
+ }
+ } =>#t11;
+static method bar4(core::String x, core::bool? y) → dynamic
+ return block {
+ final core::Map<core::String, core::bool> #t13 = <core::String, core::bool>{};
+ final has-declared-initializer core::Map<core::String, core::bool>? #t14 = null;
+ if(!(#t14 == null))
+ #t13.{core::Map::addAll}{Invariant}(#t14{core::Map<core::String, core::bool>}){(core::Map<core::String, core::bool>) → void};
+ } =>#t13;
+static method bar5(core::int? x, core::num y) → dynamic
+ return block {
+ final core::Map<core::int, core::num> #t15 = <core::int, core::num>{};
+ final has-declared-initializer core::Map<core::int, core::num>? #t16 = null;
+ if(!(#t16 == null))
+ #t15.{core::Map::addAll}{Invariant}(#t16{core::Map<core::int, core::num>}){(core::Map<core::int, core::num>) → void};
+ } =>#t15;
+static method bar6(core::double? x, core::Symbol? y) → dynamic
+ return block {
+ final core::Map<core::double, core::Symbol> #t17 = <core::double, core::Symbol>{};
+ final has-declared-initializer core::Map<core::double, core::Symbol>? #t18 = null;
+ if(!(#t18 == null))
+ #t17.{core::Map::addAll}{Invariant}(#t18{core::Map<core::double, core::Symbol>}){(core::Map<core::double, core::Symbol>) → void};
+ } =>#t17;
+static method bar7(core::num? x, core::double? y, core::bool b) → dynamic
+ return block {
+ final core::Map<core::num, core::double> #t19 = <core::num, core::double>{};
+ if(b) {
+ final has-declared-initializer core::Map<core::num, core::double>? #t20 = null;
+ if(!(#t20 == null))
+ #t19.{core::Map::addAll}{Invariant}(#t20{core::Map<core::num, core::double>}){(core::Map<core::num, core::double>) → void};
+ }
+ } =>#t19;
+static method bar8(core::num? x, core::double? y) → dynamic
+ return block {
+ final core::Map<core::num, core::double> #t21 = <core::num, core::double>{};
+ {
+ synthesized core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::•<dynamic>(0).{core::Iterable::iterator}{core::Iterator<dynamic>};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+ dynamic _ = :sync-for-iterator.{core::Iterator::current}{dynamic};
+ {
+ final has-declared-initializer core::Map<core::num, core::double>? #t22 = null;
+ if(!(#t22 == null))
+ #t21.{core::Map::addAll}{Invariant}(#t22{core::Map<core::num, core::double>}){(core::Map<core::num, core::double>) → void};
+ }
+ }
+ }
+ } =>#t21;