@@ -293,15 +293,17 @@ final class AstNodeVisitor extends ThrowingAstVisitor<void> with PieceFactory {
293293 node.mixinKeyword,
294294 node.classKeyword,
295295 ],
296- node.name ,
297- typeParameters: node.typeParameters,
296+ name : node.namePart.typeName ,
297+ typeParameters: node.namePart. typeParameters,
298298 extendsClause: node.extendsClause,
299299 withClause: node.withClause,
300300 implementsClause: node.implementsClause,
301301 nativeClause: node.nativeClause,
302302 body: () {
303+ // TODO(scheglov): support for EmptyBody
304+ var body = node.body as BlockClassBody ;
303305 return pieces.build (() {
304- writeBody (node .leftBracket, node .members, node .rightBracket);
306+ writeBody (body .leftBracket, body .members, body .rightBracket);
305307 });
306308 },
307309 );
@@ -320,10 +322,10 @@ final class AstNodeVisitor extends ThrowingAstVisitor<void> with PieceFactory {
320322 node.mixinKeyword,
321323 node.typedefKeyword,
322324 ],
323- node.name,
325+ name: node.name,
326+ typeParameters: node.typeParameters,
324327 equals: node.equals,
325328 superclass: node.superclass,
326- typeParameters: node.typeParameters,
327329 withClause: node.withClause,
328330 implementsClause: node.implementsClause,
329331 bodyType: TypeBodyType .semicolon,
@@ -455,8 +457,9 @@ final class AstNodeVisitor extends ThrowingAstVisitor<void> with PieceFactory {
455457 var header = pieces.build (() {
456458 pieces.modifier (node.externalKeyword);
457459 pieces.modifier (node.constKeyword);
460+ pieces.modifier (node.newKeyword);
458461 pieces.modifier (node.factoryKeyword);
459- pieces.visit (node.returnType );
462+ pieces.visit (node.typeName );
460463 pieces.token (node.period);
461464 pieces.token (node.name);
462465 });
@@ -634,71 +637,76 @@ final class AstNodeVisitor extends ThrowingAstVisitor<void> with PieceFactory {
634637 writeType (
635638 node.metadata,
636639 [node.enumKeyword],
637- node.name ,
638- typeParameters: node.typeParameters,
640+ name : node.namePart.typeName ,
641+ typeParameters: node.namePart. typeParameters,
639642 withClause: node.withClause,
640643 implementsClause: node.implementsClause,
641- bodyType: node.members.isEmpty ? TypeBodyType .list : TypeBodyType .block,
644+ bodyType: node.body.members.isEmpty
645+ ? TypeBodyType .list
646+ : TypeBodyType .block,
642647 body: () {
643- if (node.members.isEmpty) {
648+ if (node.body. members.isEmpty) {
644649 // If there are no members, format the constants like a list. This
645650 // keeps the enum declaration on one line if it fits.
646651 var builder = DelimitedListBuilder (
647652 this ,
648653 const ListStyle (spaceWhenUnsplit: true ),
649654 );
650655
651- builder.leftBracket (node.leftBracket);
652- node.constants.forEach (builder.visit);
653- builder.rightBracket (semicolon: node.semicolon, node.rightBracket);
656+ builder.leftBracket (node.body.leftBracket);
657+ node.body.constants.forEach (builder.visit);
658+ builder.rightBracket (
659+ semicolon: node.body.semicolon,
660+ node.body.rightBracket,
661+ );
654662 return builder.build (
655663 forceSplit: style.preserveTrailingCommaBefore (
656- node.semicolon ?? node.rightBracket,
664+ node.body. semicolon ?? node.body .rightBracket,
657665 ),
658666 );
659667 } else {
660668 // If there are members, format it like a block where each constant
661669 // and member is on its own line.
662670 var builder = SequenceBuilder (this );
663- builder.leftBracket (node.leftBracket);
671+ builder.leftBracket (node.body. leftBracket);
664672
665673 // In 3.10 and later, preserved trailing commas will also preserve a
666674 // trailing comma in an enum with members. That in turn forces the
667675 // `;` onto its own line after the last costant. Prior to 3.10, the
668676 // behavior is the same as when preserved trailing commas is off
669677 // where the last constant's comma is removed and the `;` is placed
670678 // there instead.
671- for (var constant in node.constants) {
672- var isLast = constant == node.constants.last;
679+ for (var constant in node.body. constants) {
680+ var isLast = constant == node.body. constants.last;
673681 builder.addCommentsBefore (constant.firstNonCommentToken);
674682 builder.add (
675683 createEnumConstant (
676684 constant,
677685 commaAfter:
678686 ! isLast || style.preserveTrailingCommaAfterEnumValues,
679- semicolon: isLast ? node.semicolon : null ,
687+ semicolon: isLast ? node.body. semicolon : null ,
680688 ),
681689 );
682690 }
683691
684692 // If we are preserving the trailing comma, then put the `;` on its
685693 // own line after the last constant.
686694 if (style.preserveTrailingCommaAfterEnumValues) {
687- builder.add (tokenPiece (node.semicolon! ));
695+ builder.add (tokenPiece (node.body. semicolon! ));
688696 }
689697
690698 // Insert a blank line between the constants and members.
691699 builder.addBlank ();
692700
693- for (var node in node.members) {
701+ for (var node in node.body. members) {
694702 builder.visit (node);
695703
696704 // If the node has a non-empty braced body, then require a blank
697705 // line between it and the next node.
698706 if (node.hasNonEmptyBody) builder.addBlank ();
699707 }
700708
701- builder.rightBracket (node.rightBracket);
709+ builder.rightBracket (node.body. rightBracket);
702710 return builder.build ();
703711 }
704712 },
@@ -785,12 +793,16 @@ final class AstNodeVisitor extends ThrowingAstVisitor<void> with PieceFactory {
785793 writeType (
786794 node.metadata,
787795 [node.extensionKeyword],
788- node.name,
796+ name : node.name,
789797 typeParameters: node.typeParameters,
790798 onType: onType,
791799 body: () {
792800 return pieces.build (() {
793- writeBody (node.leftBracket, node.members, node.rightBracket);
801+ writeBody (
802+ node.body.leftBracket,
803+ node.body.members,
804+ node.body.rightBracket,
805+ );
794806 });
795807 },
796808 );
@@ -800,18 +812,14 @@ final class AstNodeVisitor extends ThrowingAstVisitor<void> with PieceFactory {
800812 void visitExtensionTypeDeclaration (ExtensionTypeDeclaration node) {
801813 writeType (
802814 node.metadata,
803- [
804- node.extensionKeyword,
805- node.typeKeyword,
806- if (node.constKeyword case var keyword? ) keyword,
807- ],
808- node.name,
809- typeParameters: node.typeParameters,
810- representation: node.representation,
815+ [node.extensionKeyword, node.typeKeyword],
816+ primaryConstructor: node.primaryConstructor,
811817 implementsClause: node.implementsClause,
812818 body: () {
813819 return pieces.build (() {
814- writeBody (node.leftBracket, node.members, node.rightBracket);
820+ // TODO(scheglov): support for EmptyBody
821+ var body = node.body as BlockClassBody ;
822+ writeBody (body.leftBracket, body.members, body.rightBracket);
815823 });
816824 },
817825 );
@@ -1532,13 +1540,17 @@ final class AstNodeVisitor extends ThrowingAstVisitor<void> with PieceFactory {
15321540 writeType (
15331541 node.metadata,
15341542 [node.baseKeyword, node.mixinKeyword],
1535- node.name,
1543+ name : node.name,
15361544 typeParameters: node.typeParameters,
15371545 onClause: node.onClause,
15381546 implementsClause: node.implementsClause,
15391547 body: () {
15401548 return pieces.build (() {
1541- writeBody (node.leftBracket, node.members, node.rightBracket);
1549+ writeBody (
1550+ node.body.leftBracket,
1551+ node.body.members,
1552+ node.body.rightBracket,
1553+ );
15421554 });
15431555 },
15441556 );
@@ -1746,6 +1758,62 @@ final class AstNodeVisitor extends ThrowingAstVisitor<void> with PieceFactory {
17461758 writePrefix (node.operator , node.operand, space: space);
17471759 }
17481760
1761+ @override
1762+ void visitPrimaryConstructorBody (PrimaryConstructorBody node) {
1763+ pieces.withMetadata (node.metadata, () {
1764+ pieces.token (node.thisKeyword);
1765+
1766+ if (node.initializers.isNotEmpty) {
1767+ pieces.space ();
1768+ pieces.token (node.colon);
1769+ pieces.space ();
1770+ pieces.add (createCommaSeparated (node.initializers));
1771+ }
1772+
1773+ pieces.visit (node.body);
1774+ });
1775+ }
1776+
1777+ @override
1778+ void visitPrimaryConstructorDeclaration (PrimaryConstructorDeclaration node) {
1779+ pieces.modifier (node.constKeyword);
1780+ pieces.token (node.typeName);
1781+ pieces.visit (node.typeParameters);
1782+ pieces.visit (node.constructorName);
1783+
1784+ if (node.parent is ExtensionTypeDeclaration ) {
1785+ var formalParameters = node.formalParameters;
1786+ var builder = DelimitedListBuilder (
1787+ this ,
1788+ const ListStyle (commas: Commas .nonTrailing),
1789+ );
1790+ builder.leftBracket (formalParameters.leftParenthesis);
1791+ for (var formalParameter in formalParameters.parameters) {
1792+ // TODO(scheglov): support for optional formal parameters
1793+ formalParameter as SimpleFormalParameter ;
1794+ builder.add (
1795+ pieces.build (() {
1796+ writeParameter (
1797+ metadata: formalParameter.metadata,
1798+ formalParameter.type,
1799+ formalParameter.name,
1800+ );
1801+ }),
1802+ );
1803+ }
1804+ builder.rightBracket (formalParameters.rightParenthesis);
1805+ pieces.add (builder.build ());
1806+ } else {
1807+ pieces.visit (node.formalParameters);
1808+ }
1809+ }
1810+
1811+ @override
1812+ void visitPrimaryConstructorName (PrimaryConstructorName node) {
1813+ pieces.token (node.period);
1814+ pieces.token (node.name);
1815+ }
1816+
17491817 @override
17501818 void visitPropertyAccess (PropertyAccess node) {
17511819 // If there's no target, this is a section in a cascade.
@@ -1860,34 +1928,6 @@ final class AstNodeVisitor extends ThrowingAstVisitor<void> with PieceFactory {
18601928 pieces.visit (node.operand);
18611929 }
18621930
1863- @override
1864- void visitRepresentationConstructorName (RepresentationConstructorName node) {
1865- pieces.token (node.period);
1866- pieces.token (node.name);
1867- }
1868-
1869- @override
1870- void visitRepresentationDeclaration (RepresentationDeclaration node) {
1871- pieces.visit (node.constructorName);
1872-
1873- var builder = DelimitedListBuilder (
1874- this ,
1875- const ListStyle (commas: Commas .nonTrailing),
1876- );
1877- builder.leftBracket (node.leftParenthesis);
1878- builder.add (
1879- pieces.build (() {
1880- writeParameter (
1881- metadata: node.fieldMetadata,
1882- node.fieldType,
1883- node.fieldName,
1884- );
1885- }),
1886- );
1887- builder.rightBracket (node.rightParenthesis);
1888- pieces.add (builder.build ());
1889- }
1890-
18911931 @override
18921932 void visitRethrowExpression (RethrowExpression node) {
18931933 pieces.token (node.rethrowKeyword);
0 commit comments