Skip to content

Commit 7a51360

Browse files
stereotype441Commit Queue
authored and
Commit Queue
committed
Parser: test that objectPattern accepts OTHER_IDENTIFIER.
The type name in an object pattern is a `typeIdentifier`; in the spec grammar, `typeIdentifier` includes `OTHER_IDENTIFIER`, which is defined as: OTHER_IDENTIFIER ::= `async` | `hide` | `of` | `on` | `show` | `sync` | `await` | `yield` This adds tests to verify that all these identifiers are accepted as type names in an object pattern. Bug: #50035 Change-Id: I6b9d752e1b34f7bc93dedc4304f695e7cb42df48 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/292542 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent 406bdf3 commit 7a51360

File tree

42 files changed

+1200
-1
lines changed

Some content is hidden

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

42 files changed

+1200
-1
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9787,7 +9787,6 @@ class Parser {
97879787
return parseVariablePattern(token, patternContext, typeInfo: typeInfo);
97889788
}
97899789
// objectPattern ::= typeName typeArguments? '(' patternFields? ')'
9790-
// TODO(paulberry): Make sure OTHER_IDENTIFIER is handled
97919790
// TODO(paulberry): Technically `dynamic` is valid for
97929791
// `typeIdentifier`--file an issue
97939792
if (next.isIdentifier) {

pkg/analyzer/test/generated/patterns_parser_test.dart

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6050,6 +6050,166 @@ RecordPattern
60506050
''');
60516051
}
60526052

6053+
test_object_otherIdentifier_async() {
6054+
// The type name in an object pattern is a `typeIdentifier`; in the spec
6055+
// grammar, `typeIdentifier` includes `OTHER_IDENTIFIER`, so this is
6056+
// allowed.
6057+
_parse('''
6058+
void f(x) {
6059+
var async() = x;
6060+
}
6061+
''');
6062+
var node = findNode.patternVariableDeclaration('= x').pattern;
6063+
assertParsedNodeText(node, r'''
6064+
ObjectPattern
6065+
type: NamedType
6066+
name: SimpleIdentifier
6067+
token: async
6068+
leftParenthesis: (
6069+
rightParenthesis: )
6070+
''');
6071+
}
6072+
6073+
test_object_otherIdentifier_await() {
6074+
// The type name in an object pattern is a `typeIdentifier`; in the spec
6075+
// grammar, `typeIdentifier` includes `OTHER_IDENTIFIER`, so this is
6076+
// allowed.
6077+
_parse('''
6078+
void f(x) {
6079+
var await() = x;
6080+
}
6081+
''');
6082+
var node = findNode.patternVariableDeclaration('= x').pattern;
6083+
assertParsedNodeText(node, r'''
6084+
ObjectPattern
6085+
type: NamedType
6086+
name: SimpleIdentifier
6087+
token: await
6088+
leftParenthesis: (
6089+
rightParenthesis: )
6090+
''');
6091+
}
6092+
6093+
test_object_otherIdentifier_hide() {
6094+
// The type name in an object pattern is a `typeIdentifier`; in the spec
6095+
// grammar, `typeIdentifier` includes `OTHER_IDENTIFIER`, so this is
6096+
// allowed.
6097+
_parse('''
6098+
void f(x) {
6099+
var hide() = x;
6100+
}
6101+
''');
6102+
var node = findNode.patternVariableDeclaration('= x').pattern;
6103+
assertParsedNodeText(node, r'''
6104+
ObjectPattern
6105+
type: NamedType
6106+
name: SimpleIdentifier
6107+
token: hide
6108+
leftParenthesis: (
6109+
rightParenthesis: )
6110+
''');
6111+
}
6112+
6113+
test_object_otherIdentifier_of() {
6114+
// The type name in an object pattern is a `typeIdentifier`; in the spec
6115+
// grammar, `typeIdentifier` includes `OTHER_IDENTIFIER`, so this is
6116+
// allowed.
6117+
_parse('''
6118+
void f(x) {
6119+
var of() = x;
6120+
}
6121+
''');
6122+
var node = findNode.patternVariableDeclaration('= x').pattern;
6123+
assertParsedNodeText(node, r'''
6124+
ObjectPattern
6125+
type: NamedType
6126+
name: SimpleIdentifier
6127+
token: of
6128+
leftParenthesis: (
6129+
rightParenthesis: )
6130+
''');
6131+
}
6132+
6133+
test_object_otherIdentifier_on() {
6134+
// The type name in an object pattern is a `typeIdentifier`; in the spec
6135+
// grammar, `typeIdentifier` includes `OTHER_IDENTIFIER`, so this is
6136+
// allowed.
6137+
_parse('''
6138+
void f(x) {
6139+
var on() = x;
6140+
}
6141+
''');
6142+
var node = findNode.patternVariableDeclaration('= x').pattern;
6143+
assertParsedNodeText(node, r'''
6144+
ObjectPattern
6145+
type: NamedType
6146+
name: SimpleIdentifier
6147+
token: on
6148+
leftParenthesis: (
6149+
rightParenthesis: )
6150+
''');
6151+
}
6152+
6153+
test_object_otherIdentifier_show() {
6154+
// The type name in an object pattern is a `typeIdentifier`; in the spec
6155+
// grammar, `typeIdentifier` includes `OTHER_IDENTIFIER`, so this is
6156+
// allowed.
6157+
_parse('''
6158+
void f(x) {
6159+
var show() = x;
6160+
}
6161+
''');
6162+
var node = findNode.patternVariableDeclaration('= x').pattern;
6163+
assertParsedNodeText(node, r'''
6164+
ObjectPattern
6165+
type: NamedType
6166+
name: SimpleIdentifier
6167+
token: show
6168+
leftParenthesis: (
6169+
rightParenthesis: )
6170+
''');
6171+
}
6172+
6173+
test_object_otherIdentifier_sync() {
6174+
// The type name in an object pattern is a `typeIdentifier`; in the spec
6175+
// grammar, `typeIdentifier` includes `OTHER_IDENTIFIER`, so this is
6176+
// allowed.
6177+
_parse('''
6178+
void f(x) {
6179+
var sync() = x;
6180+
}
6181+
''');
6182+
var node = findNode.patternVariableDeclaration('= x').pattern;
6183+
assertParsedNodeText(node, r'''
6184+
ObjectPattern
6185+
type: NamedType
6186+
name: SimpleIdentifier
6187+
token: sync
6188+
leftParenthesis: (
6189+
rightParenthesis: )
6190+
''');
6191+
}
6192+
6193+
test_object_otherIdentifier_yield() {
6194+
// The type name in an object pattern is a `typeIdentifier`; in the spec
6195+
// grammar, `typeIdentifier` includes `OTHER_IDENTIFIER`, so this is
6196+
// allowed.
6197+
_parse('''
6198+
void f(x) {
6199+
var yield() = x;
6200+
}
6201+
''');
6202+
var node = findNode.patternVariableDeclaration('= x').pattern;
6203+
assertParsedNodeText(node, r'''
6204+
ObjectPattern
6205+
type: NamedType
6206+
name: SimpleIdentifier
6207+
token: yield
6208+
leftParenthesis: (
6209+
rightParenthesis: )
6210+
''');
6211+
}
6212+
60536213
test_object_prefixed_withTypeArgs_insideAssignment() {
60546214
_parse('''
60556215
void f(x) {
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
void f(x) {
2+
var async() = x;
3+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
beginCompilationUnit(void)
2+
beginMetadataStar(void)
3+
endMetadataStar(0)
4+
beginTopLevelMember(void)
5+
beginTopLevelMethod(, null, null)
6+
handleVoidKeyword(void)
7+
handleIdentifier(f, topLevelFunctionDeclaration)
8+
handleNoTypeVariables(()
9+
beginFormalParameters((, MemberKind.TopLevelMethod)
10+
beginMetadataStar(x)
11+
endMetadataStar(0)
12+
beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
13+
handleNoType(()
14+
handleIdentifier(x, formalParameterDeclaration)
15+
handleFormalParameterWithoutValue())
16+
endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
17+
endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
18+
handleAsyncModifier(null, null)
19+
beginBlockFunctionBody({)
20+
beginMetadataStar(var)
21+
endMetadataStar(0)
22+
handleNoTypeArguments(()
23+
handleObjectPatternFields(0, (, ))
24+
handleObjectPattern(async, null, null)
25+
handleIdentifier(x, expression)
26+
handleNoTypeArguments(;)
27+
handleNoArguments(;)
28+
handleSend(x, ;)
29+
handlePatternVariableDeclarationStatement(var, =, ;)
30+
endBlockFunctionBody(1, {, })
31+
endTopLevelMethod(void, null, })
32+
endTopLevelDeclaration()
33+
endCompilationUnit(1, )
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
parseUnit(void)
2+
skipErrorTokens(void)
3+
listener: beginCompilationUnit(void)
4+
syntheticPreviousToken(void)
5+
parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
6+
parseMetadataStar()
7+
listener: beginMetadataStar(void)
8+
listener: endMetadataStar(0)
9+
parseTopLevelMemberImpl()
10+
listener: beginTopLevelMember(void)
11+
parseTopLevelMethod(, null, null, , Instance of 'VoidType', null, f, false)
12+
listener: beginTopLevelMethod(, null, null)
13+
listener: handleVoidKeyword(void)
14+
ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
15+
listener: handleIdentifier(f, topLevelFunctionDeclaration)
16+
parseMethodTypeVar(f)
17+
listener: handleNoTypeVariables(()
18+
parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
19+
parseFormalParameters(f, MemberKind.TopLevelMethod)
20+
parseFormalParametersRest((, MemberKind.TopLevelMethod)
21+
listener: beginFormalParameters((, MemberKind.TopLevelMethod)
22+
parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
23+
parseMetadataStar(()
24+
listener: beginMetadataStar(x)
25+
listener: endMetadataStar(0)
26+
listener: beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
27+
listener: handleNoType(()
28+
ensureIdentifier((, formalParameterDeclaration)
29+
listener: handleIdentifier(x, formalParameterDeclaration)
30+
listener: handleFormalParameterWithoutValue())
31+
listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
32+
listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
33+
parseAsyncModifierOpt())
34+
listener: handleAsyncModifier(null, null)
35+
inPlainSync()
36+
parseFunctionBody(), false, false)
37+
listener: beginBlockFunctionBody({)
38+
notEofOrValue(}, var)
39+
parseStatement({)
40+
parseStatementX({)
41+
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
42+
skipOuterPattern(var)
43+
skipObjectPatternRest(async)
44+
listener: beginMetadataStar(var)
45+
listener: endMetadataStar(0)
46+
parsePatternVariableDeclarationStatement(var, {, var)
47+
parsePattern(var, PatternContext.declaration, precedence: 1)
48+
parsePrimaryPattern(var, PatternContext.declaration)
49+
listener: handleNoTypeArguments(()
50+
parseObjectPatternRest(async, PatternContext.declaration)
51+
listener: handleObjectPatternFields(0, (, ))
52+
listener: handleObjectPattern(async, null, null)
53+
parseExpression(=)
54+
looksLikeOuterPatternEquals(=)
55+
skipOuterPattern(=)
56+
skipObjectPatternRest(x)
57+
parsePrecedenceExpression(=, 1, true, ConstantPatternContext.none)
58+
parseUnaryExpression(=, true, ConstantPatternContext.none)
59+
parsePrimary(=, expression, ConstantPatternContext.none)
60+
parseSendOrFunctionLiteral(=, expression, ConstantPatternContext.none)
61+
parseSend(=, expression, ConstantPatternContext.none)
62+
isNextIdentifier(=)
63+
ensureIdentifier(=, expression)
64+
listener: handleIdentifier(x, expression)
65+
listener: handleNoTypeArguments(;)
66+
parseArgumentsOpt(x)
67+
listener: handleNoArguments(;)
68+
listener: handleSend(x, ;)
69+
ensureSemicolon(x)
70+
listener: handlePatternVariableDeclarationStatement(var, =, ;)
71+
notEofOrValue(}, })
72+
listener: endBlockFunctionBody(1, {, })
73+
listener: endTopLevelMethod(void, null, })
74+
listener: endTopLevelDeclaration()
75+
reportAllErrorTokens(void)
76+
listener: endCompilationUnit(1, )
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
void f(x) {
2+
var async() = x;
3+
}
4+
5+
6+
void[KeywordToken] f[StringToken]([BeginToken]x[StringToken])[SimpleToken] {[BeginToken]
7+
var[KeywordToken] async[KeywordToken]([BeginToken])[SimpleToken] =[SimpleToken] x[StringToken];[SimpleToken]
8+
}[SimpleToken]
9+
[SimpleToken]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
void f(x) {
2+
var async() = x;
3+
}
4+
5+
6+
void[KeywordToken] f[StringToken]([BeginToken]x[StringToken])[SimpleToken] {[BeginToken]
7+
var[KeywordToken] async[KeywordToken]([BeginToken])[SimpleToken] =[SimpleToken] x[StringToken];[SimpleToken]
8+
}[SimpleToken]
9+
[SimpleToken]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
void f(x) {
2+
var await() = x;
3+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
beginCompilationUnit(void)
2+
beginMetadataStar(void)
3+
endMetadataStar(0)
4+
beginTopLevelMember(void)
5+
beginTopLevelMethod(, null, null)
6+
handleVoidKeyword(void)
7+
handleIdentifier(f, topLevelFunctionDeclaration)
8+
handleNoTypeVariables(()
9+
beginFormalParameters((, MemberKind.TopLevelMethod)
10+
beginMetadataStar(x)
11+
endMetadataStar(0)
12+
beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
13+
handleNoType(()
14+
handleIdentifier(x, formalParameterDeclaration)
15+
handleFormalParameterWithoutValue())
16+
endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
17+
endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
18+
handleAsyncModifier(null, null)
19+
beginBlockFunctionBody({)
20+
beginMetadataStar(var)
21+
endMetadataStar(0)
22+
handleNoTypeArguments(()
23+
handleObjectPatternFields(0, (, ))
24+
handleObjectPattern(await, null, null)
25+
handleIdentifier(x, expression)
26+
handleNoTypeArguments(;)
27+
handleNoArguments(;)
28+
handleSend(x, ;)
29+
handlePatternVariableDeclarationStatement(var, =, ;)
30+
endBlockFunctionBody(1, {, })
31+
endTopLevelMethod(void, null, })
32+
endTopLevelDeclaration()
33+
endCompilationUnit(1, )

0 commit comments

Comments
 (0)