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

Commit 8dc6c5e

Browse files
stereotype441commit-bot@chromium.org
authored andcommitted
Allow is or as to follow type arguments in constructor tearoff disambiguation.
Fixes #46888. Bug: dart-lang/sdk#46888 Change-Id: I780a53a2d5a45a8630935c9be5c886d96ef1a2ef Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/209881 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent e8ddc02 commit 8dc6c5e

7 files changed

+184
-6
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,9 @@ bool mayFollowTypeArgs(Token token) {
387387
'*',
388388
'%',
389389
'/',
390-
'~/'
390+
'~/',
391+
'is',
392+
'as'
391393
};
392394
if (token.type == TokenType.EOF) {
393395
// The spec doesn't have anything to say about this case, since an

pkg/analyzer/test/generated/function_reference_parser_test.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ class FunctionReferenceParserTest extends FastaParserTestCase {
5151
.leftOperand);
5252
}
5353

54+
void test_followingToken_accepted_as() {
55+
expect_f_a_b(
56+
(parseExpression('f<a, b> as int', featureSet: constructorTearoffs)
57+
as AsExpression)
58+
.expression);
59+
}
60+
5461
void test_followingToken_accepted_asterisk() {
5562
expect_f_a_b(
5663
(parseExpression('f<a, b> * 0', featureSet: constructorTearoffs)
@@ -113,6 +120,13 @@ class FunctionReferenceParserTest extends FastaParserTestCase {
113120
.leftOperand);
114121
}
115122

123+
void test_followingToken_accepted_is() {
124+
expect_f_a_b(
125+
(parseExpression('f<a, b> is int', featureSet: constructorTearoffs)
126+
as IsExpression)
127+
.expression);
128+
}
129+
116130
void test_followingToken_accepted_not_equals() {
117131
expect_f_a_b(
118132
(parseExpression('f<a, b> != null', featureSet: constructorTearoffs)

pkg/front_end/parser_testcases/general/function_reference_following_token.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// operators.
1414

1515
var typeArgs_ampersand = f<a, b> & 0;
16+
var typeArgs_as = f<a, b> as int;
1617
var typeArgs_asterisk = f<a, b> * 0;
1718
var typeArgs_bar = f<a, b> | 0;
1819
var typeArgs_caret = f<a, b> ^ 0;
@@ -22,6 +23,7 @@ var typeArgs_closeParen = g(f<a, b>);
2223
var typeArgs_colon = {f<a, b>: null};
2324
var typeArgs_comma = [f<a, b>, null];
2425
var typeArgs_equals = f<a, b> == null;
26+
var typeArgs_is = f<a, b> is int;
2527
var typeArgs_not_equals = f<a, b> != null;
2628

2729
// This is a special case because when a `(` follows `<typeArguments>` it is

pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
Problems reported:
22

3-
parser/general/function_reference_following_token:79:29: A comparison expression can't be an operand of another comparison expression.
3+
parser/general/function_reference_following_token:81:29: A comparison expression can't be an operand of another comparison expression.
44
var operators_lessThan = f<a><b>;
55
^
66

7-
parser/general/function_reference_following_token:79:33: Expected '[' before this.
7+
parser/general/function_reference_following_token:81:33: Expected '[' before this.
88
var operators_lessThan = f<a><b>;
99
^
1010

11-
parser/general/function_reference_following_token:89:46: A comparison expression can't be an operand of another comparison expression.
11+
parser/general/function_reference_following_token:91:46: A comparison expression can't be an operand of another comparison expression.
1212
var operators_openBracket_error = f(a<b,c>[d]>e);
1313
^
1414

@@ -41,6 +41,35 @@ beginCompilationUnit(var)
4141
endTopLevelDeclaration(var)
4242
beginMetadataStar(var)
4343
endMetadataStar(0)
44+
beginTopLevelMember(var)
45+
beginFields(;)
46+
handleNoType(var)
47+
handleIdentifier(typeArgs_as, topLevelVariableDeclaration)
48+
beginFieldInitializer(=)
49+
handleIdentifier(f, expression)
50+
handleNoTypeArguments(<)
51+
handleNoArguments(<)
52+
handleSend(f, <)
53+
beginTypeArguments(<)
54+
handleIdentifier(a, typeReference)
55+
handleNoTypeArguments(,)
56+
handleType(a, null)
57+
handleIdentifier(b, typeReference)
58+
handleNoTypeArguments(>)
59+
handleType(b, null)
60+
endTypeArguments(2, <, >)
61+
handleTypeArgumentApplication(<)
62+
beginAsOperatorType(as)
63+
handleIdentifier(int, typeReference)
64+
handleNoTypeArguments(;)
65+
handleType(int, null)
66+
endAsOperatorType(as)
67+
handleAsOperator(as)
68+
endFieldInitializer(=, ;)
69+
endTopLevelFields(null, null, null, null, var, 1, var, ;)
70+
endTopLevelDeclaration(var)
71+
beginMetadataStar(var)
72+
endMetadataStar(0)
4473
beginTopLevelMember(var)
4574
beginFields(;)
4675
handleNoType(var)
@@ -276,6 +305,35 @@ beginCompilationUnit(var)
276305
endTopLevelDeclaration(var)
277306
beginMetadataStar(var)
278307
endMetadataStar(0)
308+
beginTopLevelMember(var)
309+
beginFields(;)
310+
handleNoType(var)
311+
handleIdentifier(typeArgs_is, topLevelVariableDeclaration)
312+
beginFieldInitializer(=)
313+
handleIdentifier(f, expression)
314+
handleNoTypeArguments(<)
315+
handleNoArguments(<)
316+
handleSend(f, <)
317+
beginTypeArguments(<)
318+
handleIdentifier(a, typeReference)
319+
handleNoTypeArguments(,)
320+
handleType(a, null)
321+
handleIdentifier(b, typeReference)
322+
handleNoTypeArguments(>)
323+
handleType(b, null)
324+
endTypeArguments(2, <, >)
325+
handleTypeArgumentApplication(<)
326+
beginIsOperatorType(is)
327+
handleIdentifier(int, typeReference)
328+
handleNoTypeArguments(;)
329+
handleType(int, null)
330+
endIsOperatorType(is)
331+
handleIsOperator(is, null)
332+
endFieldInitializer(=, ;)
333+
endTopLevelFields(null, null, null, null, var, 1, var, ;)
334+
endTopLevelDeclaration(var)
335+
beginMetadataStar(var)
336+
endMetadataStar(0)
279337
beginTopLevelMember(var)
280338
beginFields(;)
281339
handleNoType(var)
@@ -1005,4 +1063,4 @@ beginCompilationUnit(var)
10051063
endFieldInitializer(=, ;)
10061064
endTopLevelFields(null, null, null, null, var, 1, var, ;)
10071065
endTopLevelDeclaration()
1008-
endCompilationUnit(34, )
1066+
endCompilationUnit(36, )

pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,53 @@ parseUnit(var)
4747
listener: endFieldInitializer(=, ;)
4848
listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
4949
listener: endTopLevelDeclaration(var)
50+
parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
51+
parseMetadataStar(;)
52+
listener: beginMetadataStar(var)
53+
listener: endMetadataStar(0)
54+
parseTopLevelMemberImpl(;)
55+
listener: beginTopLevelMember(var)
56+
parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_as, DeclarationKind.TopLevel, null, false)
57+
listener: beginFields(;)
58+
listener: handleNoType(var)
59+
ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
60+
listener: handleIdentifier(typeArgs_as, topLevelVariableDeclaration)
61+
parseFieldInitializerOpt(typeArgs_as, typeArgs_as, null, null, null, var, DeclarationKind.TopLevel, null)
62+
listener: beginFieldInitializer(=)
63+
parseExpression(=)
64+
parsePrecedenceExpression(=, 1, true)
65+
parseUnaryExpression(=, true)
66+
parsePrimary(=, expression)
67+
parseSendOrFunctionLiteral(=, expression)
68+
parseSend(=, expression)
69+
isNextIdentifier(=)
70+
ensureIdentifier(=, expression)
71+
listener: handleIdentifier(f, expression)
72+
listener: handleNoTypeArguments(<)
73+
parseArgumentsOpt(f)
74+
listener: handleNoArguments(<)
75+
listener: handleSend(f, <)
76+
listener: beginTypeArguments(<)
77+
listener: handleIdentifier(a, typeReference)
78+
listener: handleNoTypeArguments(,)
79+
listener: handleType(a, null)
80+
listener: handleIdentifier(b, typeReference)
81+
listener: handleNoTypeArguments(>)
82+
listener: handleType(b, null)
83+
listener: endTypeArguments(2, <, >)
84+
listener: handleTypeArgumentApplication(<)
85+
parseAsOperatorRest(>)
86+
listener: beginAsOperatorType(as)
87+
computeTypeAfterIsOrAs(as)
88+
listener: handleIdentifier(int, typeReference)
89+
listener: handleNoTypeArguments(;)
90+
listener: handleType(int, null)
91+
listener: endAsOperatorType(as)
92+
listener: handleAsOperator(as)
93+
skipChainedAsIsOperators(int)
94+
listener: endFieldInitializer(=, ;)
95+
listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
96+
listener: endTopLevelDeclaration(var)
5097
parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
5198
parseMetadataStar(;)
5299
listener: beginMetadataStar(var)
@@ -475,6 +522,53 @@ parseUnit(var)
475522
listener: endFieldInitializer(=, ;)
476523
listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
477524
listener: endTopLevelDeclaration(var)
525+
parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
526+
parseMetadataStar(;)
527+
listener: beginMetadataStar(var)
528+
listener: endMetadataStar(0)
529+
parseTopLevelMemberImpl(;)
530+
listener: beginTopLevelMember(var)
531+
parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_is, DeclarationKind.TopLevel, null, false)
532+
listener: beginFields(;)
533+
listener: handleNoType(var)
534+
ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
535+
listener: handleIdentifier(typeArgs_is, topLevelVariableDeclaration)
536+
parseFieldInitializerOpt(typeArgs_is, typeArgs_is, null, null, null, var, DeclarationKind.TopLevel, null)
537+
listener: beginFieldInitializer(=)
538+
parseExpression(=)
539+
parsePrecedenceExpression(=, 1, true)
540+
parseUnaryExpression(=, true)
541+
parsePrimary(=, expression)
542+
parseSendOrFunctionLiteral(=, expression)
543+
parseSend(=, expression)
544+
isNextIdentifier(=)
545+
ensureIdentifier(=, expression)
546+
listener: handleIdentifier(f, expression)
547+
listener: handleNoTypeArguments(<)
548+
parseArgumentsOpt(f)
549+
listener: handleNoArguments(<)
550+
listener: handleSend(f, <)
551+
listener: beginTypeArguments(<)
552+
listener: handleIdentifier(a, typeReference)
553+
listener: handleNoTypeArguments(,)
554+
listener: handleType(a, null)
555+
listener: handleIdentifier(b, typeReference)
556+
listener: handleNoTypeArguments(>)
557+
listener: handleType(b, null)
558+
listener: endTypeArguments(2, <, >)
559+
listener: handleTypeArgumentApplication(<)
560+
parseIsOperatorRest(>)
561+
listener: beginIsOperatorType(is)
562+
computeTypeAfterIsOrAs(is)
563+
listener: handleIdentifier(int, typeReference)
564+
listener: handleNoTypeArguments(;)
565+
listener: handleType(int, null)
566+
listener: endIsOperatorType(is)
567+
listener: handleIsOperator(is, null)
568+
skipChainedAsIsOperators(int)
569+
listener: endFieldInitializer(=, ;)
570+
listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
571+
listener: endTopLevelDeclaration(var)
478572
parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
479573
parseMetadataStar(;)
480574
listener: beginMetadataStar(var)
@@ -1956,4 +2050,4 @@ parseUnit(var)
19562050
listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
19572051
listener: endTopLevelDeclaration()
19582052
reportAllErrorTokens(var)
1959-
listener: endCompilationUnit(34, )
2053+
listener: endCompilationUnit(36, )

pkg/front_end/parser_testcases/general/function_reference_following_token.dart.parser.expect

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
NOTICE: Stream was rewritten by parser!
22

33
var typeArgs_ampersand = f<a, b> & 0;
4+
var typeArgs_as = f<a, b> as int;
45
var typeArgs_asterisk = f<a, b> * 0;
56
var typeArgs_bar = f<a, b> | 0;
67
var typeArgs_caret = f<a, b> ^ 0;
@@ -10,6 +11,7 @@ var typeArgs_closeParen = g(f<a, b>);
1011
var typeArgs_colon = {f<a, b>: null};
1112
var typeArgs_comma = [f<a, b>, null];
1213
var typeArgs_equals = f<a, b> == null;
14+
var typeArgs_is = f<a, b> is int;
1315
var typeArgs_not_equals = f<a, b> != null;
1416

1517

@@ -80,6 +82,7 @@ var operators_openBracket_unambiguous = f(a<b,c>[d, e]);
8082

8183

8284
var[KeywordToken] typeArgs_ampersand[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] &[SimpleToken] 0[StringToken];[SimpleToken]
85+
var[KeywordToken] typeArgs_as[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] as[KeywordToken] int[StringToken];[SimpleToken]
8386
var[KeywordToken] typeArgs_asterisk[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] *[SimpleToken] 0[StringToken];[SimpleToken]
8487
var[KeywordToken] typeArgs_bar[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] |[SimpleToken] 0[StringToken];[SimpleToken]
8588
var[KeywordToken] typeArgs_caret[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ^[SimpleToken] 0[StringToken];[SimpleToken]
@@ -89,6 +92,7 @@ var[KeywordToken] typeArgs_closeParen[StringToken] =[SimpleToken] g[StringToken]
8992
var[KeywordToken] typeArgs_colon[StringToken] =[SimpleToken] {[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]:[SimpleToken] null[KeywordToken]}[SimpleToken];[SimpleToken]
9093
var[KeywordToken] typeArgs_comma[StringToken] =[SimpleToken] [[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken],[SimpleToken] null[KeywordToken]][SimpleToken];[SimpleToken]
9194
var[KeywordToken] typeArgs_equals[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ==[SimpleToken] null[KeywordToken];[SimpleToken]
95+
var[KeywordToken] typeArgs_is[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] is[KeywordToken] int[StringToken];[SimpleToken]
9296
var[KeywordToken] typeArgs_not_equals[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] !=[SimpleToken] null[KeywordToken];[SimpleToken]
9397

9498

pkg/front_end/parser_testcases/general/function_reference_following_token.dart.scanner.expect

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var typeArgs_ampersand = f<a, b> & 0;
2+
var typeArgs_as = f<a, b> as int;
23
var typeArgs_asterisk = f<a, b> * 0;
34
var typeArgs_bar = f<a, b> | 0;
45
var typeArgs_caret = f<a, b> ^ 0;
@@ -8,6 +9,7 @@ var typeArgs_closeParen = g(f<a, b>);
89
var typeArgs_colon = {f<a, b>: null};
910
var typeArgs_comma = [f<a, b>, null];
1011
var typeArgs_equals = f<a, b> == null;
12+
var typeArgs_is = f<a, b> is int;
1113
var typeArgs_not_equals = f<a, b> != null;
1214

1315

@@ -78,6 +80,7 @@ var operators_openBracket_unambiguous = f(a<b,c>[d, e]);
7880

7981

8082
var[KeywordToken] typeArgs_ampersand[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] &[SimpleToken] 0[StringToken];[SimpleToken]
83+
var[KeywordToken] typeArgs_as[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] as[KeywordToken] int[StringToken];[SimpleToken]
8184
var[KeywordToken] typeArgs_asterisk[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] *[SimpleToken] 0[StringToken];[SimpleToken]
8285
var[KeywordToken] typeArgs_bar[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] |[SimpleToken] 0[StringToken];[SimpleToken]
8386
var[KeywordToken] typeArgs_caret[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ^[SimpleToken] 0[StringToken];[SimpleToken]
@@ -87,6 +90,7 @@ var[KeywordToken] typeArgs_closeParen[StringToken] =[SimpleToken] g[StringToken]
8790
var[KeywordToken] typeArgs_colon[StringToken] =[SimpleToken] {[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]:[SimpleToken] null[KeywordToken]}[SimpleToken];[SimpleToken]
8891
var[KeywordToken] typeArgs_comma[StringToken] =[SimpleToken] [[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken],[SimpleToken] null[KeywordToken]][SimpleToken];[SimpleToken]
8992
var[KeywordToken] typeArgs_equals[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ==[SimpleToken] null[KeywordToken];[SimpleToken]
93+
var[KeywordToken] typeArgs_is[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] is[KeywordToken] int[StringToken];[SimpleToken]
9094
var[KeywordToken] typeArgs_not_equals[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] !=[SimpleToken] null[KeywordToken];[SimpleToken]
9195

9296

0 commit comments

Comments
 (0)