@@ -117,7 +117,14 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
117
117
118
118
@override
119
119
Piece visitAnnotation (Annotation node) {
120
- throw UnimplementedError ();
120
+ return buildPiece ((b) {
121
+ b.token (node.atSign);
122
+ b.visit (node.name);
123
+ b.visit (node.typeArguments);
124
+ b.token (node.period);
125
+ b.visit (node.constructorName);
126
+ b.visit (node.arguments);
127
+ });
121
128
}
122
129
123
130
@override
@@ -360,6 +367,7 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
360
367
@override
361
368
Piece visitConstructorDeclaration (ConstructorDeclaration node) {
362
369
var header = buildPiece ((b) {
370
+ b.metadata (node.metadata);
363
371
b.modifier (node.externalKeyword);
364
372
b.modifier (node.constKeyword);
365
373
b.modifier (node.factoryKeyword);
@@ -500,7 +508,8 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
500
508
501
509
@override
502
510
Piece visitEnumDeclaration (EnumDeclaration node) {
503
- if (node.metadata.isNotEmpty) throw UnimplementedError ();
511
+ var metadataBuilder = AdjacentBuilder (this );
512
+ metadataBuilder.metadata (node.metadata);
504
513
505
514
var header = buildPiece ((b) {
506
515
b.token (node.enumKeyword);
@@ -512,48 +521,53 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
512
521
if (node.members.isEmpty) {
513
522
// If there are no members, format the constants like a delimited list.
514
523
// This keeps the enum declaration on one line if it fits.
524
+ // TODO(tall): The old style preserves blank lines and newlines between
525
+ // enum values. A newline will also force the enum to split even if it
526
+ // would otherwise fit. Do we want to do that with the new style too?
515
527
var builder = DelimitedListBuilder (
516
528
this ,
517
529
const ListStyle (
518
530
spaceWhenUnsplit: true , splitListIfBeforeSplits: true ));
519
531
builder.leftBracket (node.leftBracket, preceding: header);
520
532
node.constants.forEach (builder.visit);
521
533
builder.rightBracket (semicolon: node.semicolon, node.rightBracket);
522
- return builder.build ();
534
+ metadataBuilder. add ( builder.build () );
523
535
} else {
524
- var builder = AdjacentBuilder (this );
525
- builder.add (header);
526
- builder.space ();
527
-
528
- // If there are members, format it like a block where each constant and
529
- // member is on its own line.
530
- var sequence = SequenceBuilder (this );
531
- sequence.leftBracket (node.leftBracket);
536
+ metadataBuilder.add (buildPiece ((b) {
537
+ b.add (header);
538
+ b.space ();
532
539
533
- for (var constant in node.constants) {
534
- sequence.addCommentsBefore (constant.firstNonCommentToken);
535
- sequence.add (createEnumConstant (constant,
536
- hasMembers: true ,
537
- isLastConstant: constant == node.constants.last,
538
- semicolon: node.semicolon));
539
- }
540
+ // If there are members, format it like a block where each constant and
541
+ // member is on its own line.
542
+ var members = SequenceBuilder (this );
543
+ members.leftBracket (node.leftBracket);
544
+
545
+ for (var constant in node.constants) {
546
+ members.addCommentsBefore (constant.firstNonCommentToken);
547
+ members.add (createEnumConstant (constant,
548
+ hasMembers: true ,
549
+ isLastConstant: constant == node.constants.last,
550
+ semicolon: node.semicolon));
551
+ }
540
552
541
- // Insert a blank line between the constants and members.
542
- sequence .addBlank ();
553
+ // Insert a blank line between the constants and members.
554
+ members .addBlank ();
543
555
544
- for (var node in node.members) {
545
- sequence .visit (node);
556
+ for (var node in node.members) {
557
+ members .visit (node);
546
558
547
- // If the node has a non-empty braced body, then require a blank line
548
- // between it and the next node.
549
- if (node.hasNonEmptyBody) sequence .addBlank ();
550
- }
559
+ // If the node has a non-empty braced body, then require a blank line
560
+ // between it and the next node.
561
+ if (node.hasNonEmptyBody) members .addBlank ();
562
+ }
551
563
552
- sequence .rightBracket (node.rightBracket);
564
+ members .rightBracket (node.rightBracket);
553
565
554
- builder .add (sequence .build ());
555
- return builder. build ( );
566
+ b .add (members .build ());
567
+ }) );
556
568
}
569
+
570
+ return metadataBuilder.build ();
557
571
}
558
572
559
573
@override
@@ -606,6 +620,7 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
606
620
@override
607
621
Piece visitFieldDeclaration (FieldDeclaration node) {
608
622
return buildPiece ((b) {
623
+ b.metadata (node.metadata);
609
624
b.modifier (node.externalKeyword);
610
625
b.modifier (node.staticKeyword);
611
626
b.modifier (node.abstractKeyword);
@@ -739,6 +754,7 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
739
754
@override
740
755
Piece visitFunctionDeclaration (FunctionDeclaration node) {
741
756
return createFunction (
757
+ metadata: node.metadata,
742
758
modifiers: [node.externalKeyword],
743
759
returnType: node.returnType,
744
760
propertyKeyword: node.propertyKeyword,
@@ -784,11 +800,11 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
784
800
785
801
@override
786
802
Piece visitFunctionTypeAlias (FunctionTypeAlias node) {
787
- if (node.metadata.isNotEmpty) throw UnimplementedError ();
788
-
789
803
return buildPiece ((b) {
804
+ b.metadata (node.metadata);
790
805
b.token (node.typedefKeyword);
791
806
b.space ();
807
+ b.visit (node.returnType, spaceAfter: true );
792
808
b.token (node.name);
793
809
b.visit (node.typeParameters);
794
810
b.visit (node.parameters);
@@ -815,9 +831,8 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
815
831
816
832
@override
817
833
Piece visitGenericTypeAlias (GenericTypeAlias node) {
818
- if (node.metadata.isNotEmpty) throw UnimplementedError ();
819
-
820
834
return buildPiece ((b) {
835
+ b.metadata (node.metadata);
821
836
b.token (node.typedefKeyword);
822
837
b.space ();
823
838
b.token (node.name);
@@ -1088,7 +1103,7 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
1088
1103
@override
1089
1104
Piece visitLibraryDirective (LibraryDirective node) {
1090
1105
return buildPiece ((b) {
1091
- createDirectiveMetadata (node);
1106
+ b. metadata (node.metadata );
1092
1107
b.token (node.libraryKeyword);
1093
1108
b.visit (node.name2, spaceBefore: true );
1094
1109
b.token (node.semicolon);
@@ -1177,6 +1192,7 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
1177
1192
@override
1178
1193
Piece visitMethodDeclaration (MethodDeclaration node) {
1179
1194
return createFunction (
1195
+ metadata: node.metadata,
1180
1196
modifiers: [node.externalKeyword, node.modifierKeyword],
1181
1197
returnType: node.returnType,
1182
1198
propertyKeyword: node.operatorKeyword ?? node.propertyKeyword,
@@ -1309,7 +1325,7 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
1309
1325
@override
1310
1326
Piece visitPartDirective (PartDirective node) {
1311
1327
return buildPiece ((b) {
1312
- createDirectiveMetadata (node);
1328
+ b. metadata (node.metadata );
1313
1329
b.token (node.partKeyword);
1314
1330
b.space ();
1315
1331
b.visit (node.uri);
@@ -1320,8 +1336,7 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
1320
1336
@override
1321
1337
Piece visitPartOfDirective (PartOfDirective node) {
1322
1338
return buildPiece ((b) {
1323
- createDirectiveMetadata (node);
1324
-
1339
+ b.metadata (node.metadata);
1325
1340
b.token (node.partKeyword);
1326
1341
b.space ();
1327
1342
b.token (node.ofKeyword);
@@ -1359,13 +1374,27 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
1359
1374
1360
1375
@override
1361
1376
Piece visitPatternVariableDeclaration (PatternVariableDeclaration node) {
1362
- throw UnimplementedError ();
1377
+ // TODO(tall): This is just a basic implementation for the metadata tests.
1378
+ // It still needs a full implementation and tests.
1379
+ return buildPiece ((b) {
1380
+ b.metadata (node.metadata);
1381
+ b.token (node.keyword);
1382
+ b.space ();
1383
+ b.visit (node.pattern);
1384
+ b.space ();
1385
+ b.token (node.equals);
1386
+ b.space ();
1387
+ b.visit (node.expression);
1388
+ });
1363
1389
}
1364
1390
1365
1391
@override
1366
1392
Piece visitPatternVariableDeclarationStatement (
1367
1393
PatternVariableDeclarationStatement node) {
1368
- throw UnimplementedError ();
1394
+ return buildPiece ((b) {
1395
+ b.visit (node.declaration);
1396
+ b.token (node.semicolon);
1397
+ });
1369
1398
}
1370
1399
1371
1400
@override
@@ -1740,6 +1769,7 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
1740
1769
@override
1741
1770
Piece visitTopLevelVariableDeclaration (TopLevelVariableDeclaration node) {
1742
1771
return buildPiece ((b) {
1772
+ b.metadata (node.metadata);
1743
1773
b.modifier (node.externalKeyword);
1744
1774
b.visit (node.variables);
1745
1775
b.token (node.semicolon);
@@ -1759,6 +1789,7 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
1759
1789
@override
1760
1790
Piece visitTypeParameter (TypeParameter node) {
1761
1791
return buildPiece ((b) {
1792
+ b.metadata (node.metadata, inline: true );
1762
1793
b.token (node.name);
1763
1794
if (node.bound case var bound? ) {
1764
1795
b.space ();
@@ -1782,10 +1813,8 @@ class AstNodeVisitor extends ThrowingAstVisitor<Piece> with PieceFactory {
1782
1813
1783
1814
@override
1784
1815
Piece visitVariableDeclarationList (VariableDeclarationList node) {
1785
- // TODO(tall): Format metadata.
1786
- if (node.metadata.isNotEmpty) throw UnimplementedError ();
1787
-
1788
1816
var header = buildPiece ((b) {
1817
+ b.metadata (node.metadata);
1789
1818
b.modifier (node.lateKeyword);
1790
1819
b.modifier (node.keyword);
1791
1820
0 commit comments