Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit fd2ac1d

Browse files
author
Dart CI
committed
Version 2.19.0-422.0.dev
Merge a030c64 into dev
2 parents d2766b3 + a030c64 commit fd2ac1d

File tree

110 files changed

+1794
-381
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+1794
-381
lines changed

pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -542,9 +542,8 @@ class ForwardingListener implements Listener {
542542
}
543543

544544
@override
545-
void handleExtractorPatternFields(
546-
int count, Token beginToken, Token endToken) {
547-
listener?.handleExtractorPatternFields(count, beginToken, endToken);
545+
void handleObjectPatternFields(int count, Token beginToken, Token endToken) {
546+
listener?.handleObjectPatternFields(count, beginToken, endToken);
548547
}
549548

550549
@override
@@ -1817,9 +1816,9 @@ class ForwardingListener implements Listener {
18171816
}
18181817

18191818
@override
1820-
void handleExtractorPattern(
1819+
void handleObjectPattern(
18211820
Token firstIdentifier, Token? dot, Token? secondIdentifier) {
1822-
listener?.handleExtractorPattern(firstIdentifier, dot, secondIdentifier);
1821+
listener?.handleObjectPattern(firstIdentifier, dot, secondIdentifier);
18231822
}
18241823

18251824
@override

pkg/_fe_analyzer_shared/lib/src/parser/listener.dart

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,9 @@ class Listener implements UnescapeErrorListener {
5454
}
5555

5656
/// Called after the parser has consumed a sequence of patternFields that
57-
/// forms the arguments to an extractorPattern
58-
void handleExtractorPatternFields(
59-
int count, Token beginToken, Token endToken) {
60-
logEvent("ExtractorPatternFields");
57+
/// forms the arguments to an objectPattern
58+
void handleObjectPatternFields(int count, Token beginToken, Token endToken) {
59+
logEvent("ObjectPatternFields");
6160
}
6261

6362
/// Handle async modifiers `async`, `async*`, `sync`.
@@ -1900,13 +1899,13 @@ class Listener implements UnescapeErrorListener {
19001899
logEvent("ConstantPattern");
19011900
}
19021901

1903-
/// Called after the parser has consumed an extractor pattern, consisting of
1902+
/// Called after the parser has consumed an object pattern, consisting of
19041903
/// an identifier, optional dot and second identifier, optional type
1905-
/// arguments, and a parenthesized list of extractor pattern fields (see
1906-
/// [handleExtractorPatternFields]).
1907-
void handleExtractorPattern(
1904+
/// arguments, and a parenthesized list of object pattern fields (see
1905+
/// [handleObjectPatternFields]).
1906+
void handleObjectPattern(
19081907
Token firstIdentifier, Token? dot, Token? secondIdentifier) {
1909-
logEvent("ExtractorPattern");
1908+
logEvent("ObjectPattern");
19101909
}
19111910

19121911
/// Handle a construct of the form "identifier.identifier" occurring in a part

pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart

Lines changed: 55 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,17 @@ class Parser {
335335
{this.useImplicitCreationExpression = true, this.allowPatterns = false})
336336
: assert(listener != null); // ignore:unnecessary_null_comparison
337337

338+
/// Executes [callback]; however if `this` is the `TestParser` (from
339+
/// `pkg/front_end/test/parser_test_parser.dart`) then no output is printed
340+
/// during its execution.
341+
///
342+
/// This is sometimes necessary inside `assert` statements, to ensure that the
343+
/// output of `TestParser` is the same regardless of whether assertions are
344+
/// enabled.
345+
T inhibitPrinting<T>(T Function() callback) {
346+
return callback();
347+
}
348+
338349
bool get inGenerator {
339350
return asyncState == AsyncModifier.AsyncStar ||
340351
asyncState == AsyncModifier.SyncStar;
@@ -9249,7 +9260,7 @@ class Parser {
92499260
/// | listPattern
92509261
/// | mapPattern
92519262
/// | recordPattern
9252-
/// | extractorPattern
9263+
/// | objectPattern
92539264
/// listPattern ::= typeArguments? '[' patterns? ']'
92549265
/// mapPattern ::= typeArguments? '{' mapPatternEntries? '}'
92559266
/// mapPatternEntries ::= mapPatternEntry ( ',' mapPatternEntry )* ','?
@@ -9269,10 +9280,9 @@ class Parser {
92699280
/// | 'const' typeArguments? '[' elements? ']'
92709281
/// | 'const' typeArguments? '{' elements? '}'
92719282
/// | 'const' '(' expression ')'
9272-
/// extractorPattern ::= extractorName typeArguments?
9273-
/// '(' patternFields? ')'
9274-
/// extractorName ::= typeIdentifier | qualifiedName
9283+
/// objectPattern ::= typeName typeArguments? '(' patternFields? ')'
92759284
Token parsePrimaryPattern(Token token, {required bool isRefutableContext}) {
9285+
Token start = token;
92769286
TypeParamOrArgInfo typeArg =
92779287
computeTypeParamOrArg(token, /* inDeclaration = */ true);
92789288
Token next = typeArg.skip(token).next!;
@@ -9281,15 +9291,25 @@ class Parser {
92819291
case '[':
92829292
// listPattern ::= typeArguments? '[' patterns? ']'
92839293
token = typeArg.parseArguments(token, this);
9284-
return parseListPatternSuffix(token,
9294+
token = parseListPatternSuffix(token,
92859295
isRefutableContext: isRefutableContext);
9296+
// A list pattern is a valid form of outerPattern, so verify that
9297+
// skipOuterPattern would have skipped this pattern properly.
9298+
assert(
9299+
identical(inhibitPrinting(() => skipOuterPattern(start)), token));
9300+
return token;
92869301
case '{':
92879302
// mapPattern ::= typeArguments? '{' mapPatternEntries? '}'
92889303
// mapPatternEntries ::= mapPatternEntry ( ',' mapPatternEntry )* ','?
92899304
// mapPatternEntry ::= expression ':' pattern
92909305
token = typeArg.parseArguments(token, this);
9291-
return parseMapPatternSuffix(token,
9306+
token = parseMapPatternSuffix(token,
92929307
isRefutableContext: isRefutableContext);
9308+
// A map pattern is a valid form of outerPattern, so verify that
9309+
// skipOuterPattern would have skipped this pattern properly.
9310+
assert(
9311+
identical(inhibitPrinting(() => skipOuterPattern(start)), token));
9312+
return token;
92939313
}
92949314
// Whatever was after the optional type arguments didn't parse as a pattern
92959315
// that can start with type arguments, so back up and reparse assuming that
@@ -9308,11 +9328,17 @@ class Parser {
93089328
Token nextNext = next.next!;
93099329
if (optional(')', nextNext)) {
93109330
listener.handleRecordPattern(next, /* count = */ 0);
9311-
return nextNext;
9331+
token = nextNext;
93129332
} else {
9313-
return parseParenthesizedPatternOrRecordPattern(token,
9333+
token = parseParenthesizedPatternOrRecordPattern(token,
93149334
isRefutableContext: isRefutableContext);
93159335
}
9336+
// A record or parenthesized pattern is a valid form of outerPattern, so
9337+
// verify that skipOuterPattern would have skipped this pattern
9338+
// properly.
9339+
assert(
9340+
identical(inhibitPrinting(() => skipOuterPattern(start)), token));
9341+
return token;
93169342
case 'const':
93179343
// constantPattern ::= booleanLiteral
93189344
// | nullLiteral
@@ -9352,9 +9378,7 @@ class Parser {
93529378
if (typeInfo != noType) {
93539379
return parseVariablePattern(token, typeInfo: typeInfo);
93549380
}
9355-
// extractorPattern ::= extractorName typeArguments?
9356-
// '(' patternFields? ')'
9357-
// extractorName ::= typeIdentifier | qualifiedName
9381+
// objectPattern ::= typeName typeArguments? '(' patternFields? ')'
93589382
// TODO(paulberry): Make sure OTHER_IDENTIFIER is handled
93599383
// TODO(paulberry): Technically `dynamic` is valid for
93609384
// `typeIdentifier`--file an issue
@@ -9381,9 +9405,13 @@ class Parser {
93819405
if (optional('(', afterToken) && !potentialTypeArg.recovered) {
93829406
TypeParamOrArgInfo typeArg = potentialTypeArg;
93839407
token = typeArg.parseArguments(token, this);
9384-
token = parseExtractorPatternRest(token,
9408+
token = parseObjectPatternRest(token,
93859409
isRefutableContext: isRefutableContext);
9386-
listener.handleExtractorPattern(firstIdentifier, dot, secondIdentifier);
9410+
listener.handleObjectPattern(firstIdentifier, dot, secondIdentifier);
9411+
// An object pattern is a valid form of outerPattern, so verify that
9412+
// skipOuterPattern would have skipped this pattern properly.
9413+
assert(
9414+
identical(inhibitPrinting(() => skipOuterPattern(start)), token));
93879415
return token;
93889416
} else if (dot == null) {
93899417
// It's a single identifier. If it's a wildcard pattern or we're in an
@@ -9395,7 +9423,7 @@ class Parser {
93959423
typeInfo: typeInfo);
93969424
}
93979425
}
9398-
// It's not an extractor pattern so parse it as an expression.
9426+
// It's not an object pattern so parse it as an expression.
93999427
token = beforeFirstIdentifier;
94009428
}
94019429
// TODO(paulberry): report error if this constant is not permitted by the
@@ -9642,12 +9670,11 @@ class Parser {
96429670
return token;
96439671
}
96449672

9645-
/// Parses the rest of an extractorPattern, where [token] is the token before
9646-
/// the `(`.
9673+
/// Parses the rest of an objectPattern, where [token] is the token before the
9674+
/// `(`.
96479675
///
9648-
/// extractorPattern ::= extractorName typeArguments?
9649-
/// '(' patternFields? ')'
9650-
Token parseExtractorPatternRest(Token token,
9676+
/// objectPattern ::= typeName typeArguments? '(' patternFields? ')'
9677+
Token parseObjectPatternRest(Token token,
96519678
{required bool isRefutableContext}) {
96529679
Token begin = token = token.next!;
96539680
assert(optional('(', begin));
@@ -9697,7 +9724,7 @@ class Parser {
96979724
}
96989725
assert(optional(')', token));
96999726
mayParseFunctionExpressions = old;
9700-
listener.handleExtractorPatternFields(argumentCount, begin, token);
9727+
listener.handleObjectPatternFields(argumentCount, begin, token);
97019728
return token;
97029729
}
97039730

@@ -9719,19 +9746,19 @@ class Parser {
97199746
/// | listPattern
97209747
/// | mapPattern
97219748
/// | recordPattern
9722-
/// | extractorPattern
9749+
/// | objectPattern
97239750
Token? skipOuterPattern(Token token) {
97249751
Token next = token.next!;
97259752
if (next.isIdentifier) {
97269753
token = next;
97279754
next = token.next!;
97289755
if (!optional('.', next)) {
9729-
return skipExtractorPatternRest(token);
9756+
return skipObjectPatternRest(token);
97309757
}
97319758
token = next;
97329759
next = token.next!;
97339760
if (next.isIdentifier) {
9734-
return skipExtractorPatternRest(next);
9761+
return skipObjectPatternRest(next);
97359762
} else {
97369763
throw new UnimplementedError('TODO(paulberry)');
97379764
}
@@ -9754,12 +9781,12 @@ class Parser {
97549781
throw new UnimplementedError('TODO(paulberry)');
97559782
}
97569783

9757-
/// Tries to advance through an extractor pattern, where [token] is the last
9758-
/// token of the extractor pattern's type name. If the tokens following
9759-
/// [token] don't look like the rest of an extractor pattern, returns `null`.
9784+
/// Tries to advance through an object pattern, where [token] is the last
9785+
/// token of the object pattern's type name. If the tokens following
9786+
/// [token] don't look like the rest of an object pattern, returns `null`.
97609787
///
9761-
/// extractorPattern ::= typeName typeArguments? '(' patternFields? ')'
9762-
Token? skipExtractorPatternRest(Token token) {
9788+
/// objectPattern ::= typeName typeArguments? '(' patternFields? ')'
9789+
Token? skipObjectPatternRest(Token token) {
97639790
TypeParamOrArgInfo typeParamOrArg = computeTypeParamOrArg(token);
97649791
token = typeParamOrArg.skip(token);
97659792
Token? next = token.next;

0 commit comments

Comments
 (0)