Skip to content

Commit bdae98c

Browse files
authored
Require analyzer 10.0.0, stop using deprecated nodes and properties. (#1795)
* Require analyzer 10.0.0, stop using deprecated nodes and properties. * Prepare for publishing 3.1.4, remove -wip. * Fixes for review comments.
1 parent af2e770 commit bdae98c

6 files changed

Lines changed: 186 additions & 144 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
## 3.1.4-wip
1+
## 3.1.4
22

33
* Remove dependencies on analyzer internal implementation.
4+
* Require `analyzer: '^10.0.0'`.
45

56
## 3.1.3
67

lib/src/front_end/ast_node_visitor.dart

Lines changed: 102 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

lib/src/front_end/piece_factory.dart

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,16 +1437,16 @@ mixin PieceFactory {
14371437
/// If the type is an extension, then [onType] is a record containing the
14381438
/// `on` keyword and the on type.
14391439
///
1440-
/// If the type is an extension type, then [representation] is the primary
1441-
/// constructor for it.
1440+
/// If the type has a primary constructor, e.g. an extension type, then
1441+
/// [primaryConstructor] is not `null`.
14421442
void writeType(
14431443
NodeList<Annotation> metadata,
1444-
List<Token?> keywords,
1445-
Token? name, {
1444+
List<Token?> keywords, {
1445+
Token? name,
14461446
TypeParameterList? typeParameters,
14471447
Token? equals,
14481448
NamedType? superclass,
1449-
RepresentationDeclaration? representation,
1449+
PrimaryConstructorDeclaration? primaryConstructor,
14501450
ExtendsClause? extendsClause,
14511451
MixinOnClause? onClause,
14521452
WithClause? withClause,
@@ -1481,9 +1481,8 @@ mixin PieceFactory {
14811481
pieces.visit(superclass!);
14821482
}
14831483

1484-
// Extension types have a representation type.
1485-
if (representation != null) {
1486-
pieces.visit(representation);
1484+
if (primaryConstructor != null) {
1485+
pieces.visit(primaryConstructor, spaceBefore: true);
14871486
}
14881487
});
14891488

0 commit comments

Comments
 (0)