Skip to content

Commit 7584faf

Browse files
stereotype441commit-bot@chromium.org
authored and
commit-bot@chromium.org
committed
Visitor changes to support constructor tearoffs.
Change-Id: I8e00eb6094733238549ca259e4355032fc8c1cea Bug: #46020 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/199681 Commit-Queue: Paul Berry <paulberry@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
1 parent 46ceec4 commit 7584faf

File tree

6 files changed

+171
-12
lines changed

6 files changed

+171
-12
lines changed

pkg/analyzer/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
## 1.6.0-dev
22
* Deprecated `AnalysisDriver` default constructor. Added `tmp1`. The goal
33
is to allow deprecating and removing unused parameters.
4+
* Added AST structures and visit methods to support the upcoming "constructor
5+
tearoffs" feature: `ConstructorReference`, `FunctionReference`, and
6+
`TypeLiteral`.
47

58
## 1.5.0
69
* Support for the language version `2.14`.

pkg/analyzer/lib/dart/ast/ast.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,8 @@ abstract class AstVisitor<R> {
508508

509509
R? visitConstructorName(ConstructorName node);
510510

511+
R? visitConstructorReference(ConstructorReference node);
512+
511513
R? visitContinueStatement(ContinueStatement node);
512514

513515
R? visitDeclaredIdentifier(DeclaredIdentifier node);
@@ -566,6 +568,8 @@ abstract class AstVisitor<R> {
566568

567569
R? visitFunctionExpressionInvocation(FunctionExpressionInvocation node);
568570

571+
R? visitFunctionReference(FunctionReference node);
572+
569573
R? visitFunctionTypeAlias(FunctionTypeAlias functionTypeAlias);
570574

571575
R? visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node);
@@ -683,6 +687,8 @@ abstract class AstVisitor<R> {
683687

684688
R? visitTypeArgumentList(TypeArgumentList node);
685689

690+
R? visitTypeLiteral(TypeLiteral node);
691+
686692
R? visitTypeName(TypeName node);
687693

688694
R? visitTypeParameter(TypeParameter node);

pkg/analyzer/lib/dart/ast/visitor.dart

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,10 @@ class GeneralizingAstVisitor<R> implements AstVisitor<R> {
225225
@override
226226
R? visitConstructorName(ConstructorName node) => visitNode(node);
227227

228+
@override
229+
R? visitConstructorReference(ConstructorReference node) =>
230+
visitExpression(node);
231+
228232
@override
229233
R? visitContinueStatement(ContinueStatement node) => visitStatement(node);
230234

@@ -340,6 +344,9 @@ class GeneralizingAstVisitor<R> implements AstVisitor<R> {
340344
R? visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
341345
visitInvocationExpression(node);
342346

347+
@override
348+
R? visitFunctionReference(FunctionReference node) => visitExpression(node);
349+
343350
@override
344351
R? visitFunctionTypeAlias(FunctionTypeAlias node) => visitTypeAlias(node);
345352

@@ -569,6 +576,9 @@ class GeneralizingAstVisitor<R> implements AstVisitor<R> {
569576

570577
R? visitTypedLiteral(TypedLiteral node) => visitLiteral(node);
571578

579+
@override
580+
R? visitTypeLiteral(TypeLiteral node) => visitExpression(node);
581+
572582
@override
573583
R? visitTypeName(TypeName node) => visitNode(node);
574584

@@ -766,6 +776,12 @@ class RecursiveAstVisitor<R> implements AstVisitor<R> {
766776
return null;
767777
}
768778

779+
@override
780+
R? visitConstructorReference(ConstructorReference node) {
781+
node.visitChildren(this);
782+
return null;
783+
}
784+
769785
@override
770786
R? visitContinueStatement(ContinueStatement node) {
771787
node.visitChildren(this);
@@ -940,6 +956,12 @@ class RecursiveAstVisitor<R> implements AstVisitor<R> {
940956
return null;
941957
}
942958

959+
@override
960+
R? visitFunctionReference(FunctionReference node) {
961+
node.visitChildren(this);
962+
return null;
963+
}
964+
943965
@override
944966
R? visitFunctionTypeAlias(FunctionTypeAlias node) {
945967
node.visitChildren(this);
@@ -1289,6 +1311,12 @@ class RecursiveAstVisitor<R> implements AstVisitor<R> {
12891311
return null;
12901312
}
12911313

1314+
@override
1315+
R? visitTypeLiteral(TypeLiteral node) {
1316+
node.visitChildren(this);
1317+
return null;
1318+
}
1319+
12921320
@override
12931321
R? visitTypeName(TypeName node) {
12941322
node.visitChildren(this);
@@ -1429,6 +1457,9 @@ class SimpleAstVisitor<R> implements AstVisitor<R> {
14291457
@override
14301458
R? visitConstructorName(ConstructorName node) => null;
14311459

1460+
@override
1461+
R? visitConstructorReference(ConstructorReference node) => null;
1462+
14321463
@override
14331464
R? visitContinueStatement(ContinueStatement node) => null;
14341465

@@ -1518,6 +1549,9 @@ class SimpleAstVisitor<R> implements AstVisitor<R> {
15181549
R? visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
15191550
null;
15201551

1552+
@override
1553+
R? visitFunctionReference(FunctionReference node) => null;
1554+
15211555
@override
15221556
R? visitFunctionTypeAlias(FunctionTypeAlias node) => null;
15231557

@@ -1695,6 +1729,9 @@ class SimpleAstVisitor<R> implements AstVisitor<R> {
16951729
@override
16961730
R? visitTypeArgumentList(TypeArgumentList node) => null;
16971731

1732+
@override
1733+
R? visitTypeLiteral(TypeLiteral node) => null;
1734+
16981735
@override
16991736
R? visitTypeName(TypeName node) => null;
17001737

@@ -1811,6 +1848,9 @@ class ThrowingAstVisitor<R> implements AstVisitor<R> {
18111848
@override
18121849
R? visitConstructorName(ConstructorName node) => _throw(node);
18131850

1851+
@override
1852+
R? visitConstructorReference(ConstructorReference node) => _throw(node);
1853+
18141854
@override
18151855
R? visitContinueStatement(ContinueStatement node) => _throw(node);
18161856

@@ -1903,6 +1943,9 @@ class ThrowingAstVisitor<R> implements AstVisitor<R> {
19031943
R? visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
19041944
_throw(node);
19051945

1946+
@override
1947+
R? visitFunctionReference(FunctionReference node) => _throw(node);
1948+
19061949
@override
19071950
R? visitFunctionTypeAlias(FunctionTypeAlias node) => _throw(node);
19081951

@@ -2083,6 +2126,9 @@ class ThrowingAstVisitor<R> implements AstVisitor<R> {
20832126
@override
20842127
R? visitTypeArgumentList(TypeArgumentList node) => _throw(node);
20852128

2129+
@override
2130+
R? visitTypeLiteral(TypeLiteral node) => _throw(node);
2131+
20862132
@override
20872133
R? visitTypeName(TypeName node) => _throw(node);
20882134

@@ -2331,6 +2377,14 @@ class TimedAstVisitor<T> implements AstVisitor<T> {
23312377
return result;
23322378
}
23332379

2380+
@override
2381+
T? visitConstructorReference(ConstructorReference node) {
2382+
stopwatch.start();
2383+
T? result = _baseVisitor.visitConstructorReference(node);
2384+
stopwatch.stop();
2385+
return result;
2386+
}
2387+
23342388
@override
23352389
T? visitContinueStatement(ContinueStatement node) {
23362390
stopwatch.start();
@@ -2563,6 +2617,14 @@ class TimedAstVisitor<T> implements AstVisitor<T> {
25632617
return result;
25642618
}
25652619

2620+
@override
2621+
T? visitFunctionReference(FunctionReference node) {
2622+
stopwatch.start();
2623+
T? result = _baseVisitor.visitFunctionReference(node);
2624+
stopwatch.stop();
2625+
return result;
2626+
}
2627+
25662628
@override
25672629
T? visitFunctionTypeAlias(FunctionTypeAlias node) {
25682630
stopwatch.start();
@@ -3028,6 +3090,14 @@ class TimedAstVisitor<T> implements AstVisitor<T> {
30283090
return result;
30293091
}
30303092

3093+
@override
3094+
T? visitTypeLiteral(TypeLiteral node) {
3095+
stopwatch.start();
3096+
T? result = _baseVisitor.visitTypeLiteral(node);
3097+
stopwatch.stop();
3098+
return result;
3099+
}
3100+
30313101
@override
30323102
T? visitTypeName(TypeName node) {
30333103
stopwatch.start();
@@ -3193,6 +3263,9 @@ class UnifyingAstVisitor<R> implements AstVisitor<R> {
31933263
@override
31943264
R? visitConstructorName(ConstructorName node) => visitNode(node);
31953265

3266+
@override
3267+
R? visitConstructorReference(ConstructorReference node) => visitNode(node);
3268+
31963269
@override
31973270
R? visitContinueStatement(ContinueStatement node) => visitNode(node);
31983271

@@ -3289,6 +3362,9 @@ class UnifyingAstVisitor<R> implements AstVisitor<R> {
32893362
R? visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
32903363
visitNode(node);
32913364

3365+
@override
3366+
R? visitFunctionReference(FunctionReference node) => visitNode(node);
3367+
32923368
@override
32933369
R? visitFunctionTypeAlias(FunctionTypeAlias node) => visitNode(node);
32943370

@@ -3476,6 +3552,9 @@ class UnifyingAstVisitor<R> implements AstVisitor<R> {
34763552
@override
34773553
R? visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
34783554

3555+
@override
3556+
R? visitTypeLiteral(TypeLiteral node) => visitNode(node);
3557+
34793558
@override
34803559
R? visitTypeName(TypeName node) => visitNode(node);
34813560

pkg/analyzer/lib/src/dart/ast/ast.dart

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2715,10 +2715,8 @@ class ConstructorReferenceImpl extends ExpressionImpl
27152715
Precedence get precedence => Precedence.postfix;
27162716

27172717
@override
2718-
E? accept<E>(AstVisitor<E> visitor) {
2719-
throw UnimplementedError(
2720-
'Visitor support for ConstructorReference is not yet implemented');
2721-
}
2718+
E? accept<E>(AstVisitor<E> visitor) =>
2719+
visitor.visitConstructorReference(this);
27222720

27232721
@override
27242722
void visitChildren(AstVisitor visitor) {
@@ -5064,10 +5062,7 @@ class FunctionReferenceImpl extends ExpressionImpl
50645062
}
50655063

50665064
@override
5067-
E? accept<E>(AstVisitor<E> visitor) {
5068-
throw UnimplementedError(
5069-
'Visitor support for FunctionReference is not yet implemented');
5070-
}
5065+
E? accept<E>(AstVisitor<E> visitor) => visitor.visitFunctionReference(this);
50715066

50725067
@override
50735068
void visitChildren(AstVisitor visitor) {
@@ -10106,10 +10101,7 @@ class TypeLiteralImpl extends ExpressionImpl implements TypeLiteral {
1010610101
}
1010710102

1010810103
@override
10109-
E? accept<E>(AstVisitor<E> visitor) {
10110-
throw UnimplementedError(
10111-
'Visitor support for TypeLiteral is not yet implemented');
10112-
}
10104+
E? accept<E>(AstVisitor<E> visitor) => visitor.visitTypeLiteral(this);
1011310105

1011410106
@override
1011510107
void visitChildren(AstVisitor visitor) {

pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,11 @@ class ToSourceVisitor implements AstVisitor<void> {
350350
safelyVisitNodeWithPrefix(".", node.name);
351351
}
352352

353+
@override
354+
void visitConstructorReference(ConstructorReference node) {
355+
safelyVisitNode(node.constructorName);
356+
}
357+
353358
@override
354359
void visitContinueStatement(ContinueStatement node) {
355360
sink.write("continue");
@@ -613,6 +618,12 @@ class ToSourceVisitor implements AstVisitor<void> {
613618
safelyVisitNode(node.argumentList);
614619
}
615620

621+
@override
622+
void visitFunctionReference(FunctionReference node) {
623+
safelyVisitNode(node.function);
624+
safelyVisitNode(node.typeArguments);
625+
}
626+
616627
@override
617628
void visitFunctionTypeAlias(FunctionTypeAlias node) {
618629
safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
@@ -1083,6 +1094,11 @@ class ToSourceVisitor implements AstVisitor<void> {
10831094
sink.write('>');
10841095
}
10851096

1097+
@override
1098+
void visitTypeLiteral(TypeLiteral node) {
1099+
safelyVisitNode(node.typeName);
1100+
}
1101+
10861102
@override
10871103
void visitTypeName(TypeName node) {
10881104
safelyVisitNode(node.name);

0 commit comments

Comments
 (0)