Skip to content

Commit 78b7695

Browse files
authored
Format extensions. (#1318)
This was trivial thanks to `createType()`.
1 parent 565e8bf commit 78b7695

File tree

3 files changed

+87
-4
lines changed

3 files changed

+87
-4
lines changed

lib/src/front_end/ast_node_visitor.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,14 @@ class AstNodeVisitor extends ThrowingAstVisitor<void>
433433

434434
@override
435435
void visitExtensionDeclaration(ExtensionDeclaration node) {
436-
throw UnimplementedError();
436+
createType(node.metadata, const [], node.extensionKeyword, node.name,
437+
typeParameters: node.typeParameters,
438+
onType: (node.onKeyword, node.extendedType),
439+
body: (
440+
leftBracket: node.leftBracket,
441+
members: node.members,
442+
rightBracket: node.rightBracket
443+
));
437444
}
438445

439446
@override

lib/src/front_end/piece_factory.dart

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -450,8 +450,11 @@ mixin PieceFactory implements CommentWriter {
450450
///
451451
/// For mixin application classes, [body] is `null` and instead [equals],
452452
/// [superclass], and [semicolon] are provided.
453+
///
454+
/// If the type is an extension, then [onType] is a record containing the
455+
/// `on` keyword and the on type.
453456
void createType(NodeList<Annotation> metadata, List<Token?> modifiers,
454-
Token keyword, Token name,
457+
Token keyword, Token? name,
455458
{TypeParameterList? typeParameters,
456459
Token? equals,
457460
NamedType? superclass,
@@ -460,14 +463,14 @@ mixin PieceFactory implements CommentWriter {
460463
WithClause? withClause,
461464
ImplementsClause? implementsClause,
462465
NativeClause? nativeClause,
466+
(Token, TypeAnnotation)? onType,
463467
({Token leftBracket, List<AstNode> members, Token rightBracket})? body,
464468
Token? semicolon}) {
465469
if (metadata.isNotEmpty) throw UnimplementedError('Type metadata.');
466470

467471
modifiers.forEach(modifier);
468472
token(keyword);
469-
space();
470-
token(name);
473+
token(name, before: space);
471474
visit(typeParameters);
472475

473476
// Mixin application classes have ` = Superclass` after the declaration
@@ -514,6 +517,10 @@ mixin PieceFactory implements CommentWriter {
514517
implementsClause.implementsKeyword, implementsClause.interfaces);
515518
}
516519

520+
if (onType case (var onKeyword, var onType)?) {
521+
typeClause(onKeyword, [onType]);
522+
}
523+
517524
ClausesPiece? clausesPiece;
518525
if (clauses.isNotEmpty) {
519526
clausesPiece = ClausesPiece(clauses,

test/declaration/extension.unit

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
40 columns |
2+
>>> Empty body.
3+
extension A on B {
4+
5+
6+
}
7+
<<<
8+
extension A on B {}
9+
>>> Members.
10+
extension A on B{z() => 0;f() { body; }}
11+
<<<
12+
extension A on B {
13+
z() => 0;
14+
f() {
15+
body;
16+
}
17+
}
18+
>>> Insert blank line before and after extension.
19+
var x = 1;
20+
extension A on B {}
21+
var y = 2;
22+
<<<
23+
var x = 1;
24+
25+
extension A on B {}
26+
27+
var y = 2;
28+
>>> Unsplit type parameters.
29+
extension A < T , S > on B {}
30+
<<<
31+
extension A<T, S> on B {}
32+
>>> Split type parameters.
33+
extension Extension<LongTypeParameter, Another> on BaseClass {}
34+
<<<
35+
extension Extension<
36+
LongTypeParameter,
37+
Another
38+
> on BaseClass {}
39+
>>> Unnamed.
40+
extension on String {}
41+
<<<
42+
extension on String {}
43+
>>> Unnamed with type parameters.
44+
extension < T , S > on B {}
45+
<<<
46+
extension<T, S> on B {}
47+
>>> Split at `on`.
48+
extension SomeExtension on VeryLongClass {}
49+
<<<
50+
extension SomeExtension
51+
on VeryLongClass {}
52+
>>> Unsplit generic on type.
53+
extension SomeExtension on C<int> {}
54+
<<<
55+
extension SomeExtension on C<int> {}
56+
>>> Split before `on` on generic on type.
57+
extension SomeExtension on C<SomeLongClass> {}
58+
<<<
59+
extension SomeExtension
60+
on C<SomeLongClass> {}
61+
>>> Split in generic on type.
62+
extension SomeExtension on C<VeryLongType, AnotherLongType> {}
63+
<<<
64+
extension SomeExtension
65+
on
66+
C<
67+
VeryLongType,
68+
AnotherLongType
69+
> {}

0 commit comments

Comments
 (0)