@@ -5,7 +5,9 @@ import 'package:analyzer/dart/ast/ast.dart';
5
5
import 'package:analyzer/dart/ast/visitor.dart' ;
6
6
import 'package:analyzer/source/line_info.dart' ;
7
7
8
+ import '../constants.dart' ;
8
9
import '../dart_formatter.dart' ;
10
+ import '../piece/block.dart' ;
9
11
import '../piece/do_while.dart' ;
10
12
import '../piece/if.dart' ;
11
13
import '../piece/infix.dart' ;
@@ -54,28 +56,28 @@ class AstNodeVisitor extends ThrowingAstVisitor<void>
54
56
55
57
if (node is CompilationUnit ) {
56
58
if (node.scriptTag case var scriptTag? ) {
57
- sequence.add (scriptTag);
59
+ sequence.visit (scriptTag);
58
60
sequence.addBlank ();
59
61
}
60
62
61
63
// Put a blank line between the library tag and the other directives.
62
64
Iterable <Directive > directives = node.directives;
63
65
if (directives.isNotEmpty && directives.first is LibraryDirective ) {
64
- sequence.add (directives.first);
66
+ sequence.visit (directives.first);
65
67
sequence.addBlank ();
66
68
directives = directives.skip (1 );
67
69
}
68
70
69
71
for (var directive in directives) {
70
- sequence.add (directive);
72
+ sequence.visit (directive);
71
73
}
72
74
73
75
for (var declaration in node.declarations) {
74
- sequence.add (declaration);
76
+ sequence.visit (declaration);
75
77
}
76
78
} else {
77
79
// Just formatting a single statement.
78
- sequence.add (node);
80
+ sequence.visit (node);
79
81
}
80
82
81
83
// Write any comments at the end of the code.
@@ -260,7 +262,8 @@ class AstNodeVisitor extends ThrowingAstVisitor<void>
260
262
261
263
@override
262
264
void visitConstantPattern (ConstantPattern node) {
263
- throw UnimplementedError ();
265
+ if (node.constKeyword != null ) throw UnimplementedError ();
266
+ visit (node.expression);
264
267
}
265
268
266
269
@override
@@ -574,10 +577,10 @@ class AstNodeVisitor extends ThrowingAstVisitor<void>
574
577
void visitLabeledStatement (LabeledStatement node) {
575
578
var sequence = SequenceBuilder (this );
576
579
for (var label in node.labels) {
577
- sequence.add (label);
580
+ sequence.visit (label);
578
581
}
579
582
580
- sequence.add (node.statement);
583
+ sequence.visit (node.statement);
581
584
writer.push (sequence.build ());
582
585
}
583
586
@@ -643,8 +646,8 @@ class AstNodeVisitor extends ThrowingAstVisitor<void>
643
646
visit (node.methodName);
644
647
visit (node.typeArguments);
645
648
646
- createDelimited (node.argumentList.leftParenthesis,
647
- node.argumentList.arguments, node.argumentList. rightParenthesis);
649
+ createList (node.argumentList.leftParenthesis, node.argumentList.arguments ,
650
+ node.argumentList.rightParenthesis);
648
651
}
649
652
650
653
@override
@@ -927,17 +930,88 @@ class AstNodeVisitor extends ThrowingAstVisitor<void>
927
930
928
931
@override
929
932
void visitSwitchExpression (SwitchExpression node) {
930
- throw UnimplementedError ();
933
+ var list = DelimitedListBuilder .switchBody (this );
934
+
935
+ createSwitchValue (node.switchKeyword, node.leftParenthesis, node.expression,
936
+ node.rightParenthesis);
937
+ writer.space ();
938
+ list.leftBracket (node.leftBracket);
939
+
940
+ for (var member in node.cases) {
941
+ list.add (member);
942
+ }
943
+
944
+ list.rightBracket (node.rightBracket);
945
+ writer.push (list.build ());
931
946
}
932
947
933
948
@override
934
949
void visitSwitchExpressionCase (SwitchExpressionCase node) {
935
- throw UnimplementedError ();
950
+ if (node.guardedPattern.whenClause != null ) throw UnimplementedError ();
951
+
952
+ visit (node.guardedPattern.pattern);
953
+ writer.space ();
954
+ finishAssignment (node.arrow, node.expression);
936
955
}
937
956
938
957
@override
939
958
void visitSwitchStatement (SwitchStatement node) {
940
- throw UnimplementedError ();
959
+ createSwitchValue (node.switchKeyword, node.leftParenthesis, node.expression,
960
+ node.rightParenthesis);
961
+
962
+ // Attach the ` {` after the `)` in the [ListPiece] created by
963
+ // [createSwitchValue()].
964
+ writer.space ();
965
+ token (node.leftBracket);
966
+ writer.split ();
967
+ var switchPiece = writer.pop ();
968
+
969
+ var sequence = SequenceBuilder (this );
970
+ for (var member in node.members) {
971
+ for (var label in member.labels) {
972
+ sequence.visit (label);
973
+ }
974
+
975
+ sequence.addCommentsBefore (member.keyword);
976
+ token (member.keyword);
977
+
978
+ if (member is SwitchCase ) {
979
+ writer.space ();
980
+ visit (member.expression);
981
+ } else if (member is SwitchPatternCase ) {
982
+ writer.space ();
983
+
984
+ if (member.guardedPattern.whenClause != null ) {
985
+ throw UnimplementedError ();
986
+ }
987
+
988
+ visit (member.guardedPattern.pattern);
989
+ } else {
990
+ assert (member is SwitchDefault );
991
+ // Nothing to do.
992
+ }
993
+
994
+ token (member.colon);
995
+ var casePiece = writer.pop ();
996
+ writer.split ();
997
+
998
+ // Don't allow any blank lines between the `case` line and the first
999
+ // statement in the case (or the next case if this case has no body).
1000
+ sequence.add (casePiece, indent: Indent .none, allowBlankAfter: false );
1001
+
1002
+ for (var statement in member.statements) {
1003
+ sequence.visit (statement, indent: Indent .block);
1004
+ }
1005
+ }
1006
+
1007
+ // Place any comments before the "}" inside the sequence.
1008
+ sequence.addCommentsBefore (node.rightBracket);
1009
+
1010
+ token (node.rightBracket);
1011
+ var rightBracketPiece = writer.pop ();
1012
+
1013
+ writer.push (BlockPiece (switchPiece, sequence.build (), rightBracketPiece,
1014
+ alwaysSplit: node.members.isNotEmpty));
941
1015
}
942
1016
943
1017
@override
@@ -974,7 +1048,7 @@ class AstNodeVisitor extends ThrowingAstVisitor<void>
974
1048
975
1049
@override
976
1050
void visitTypeArgumentList (TypeArgumentList node) {
977
- createDelimited (node.leftBracket, node.arguments, node.rightBracket);
1051
+ createTypeList (node.leftBracket, node.arguments, node.rightBracket);
978
1052
}
979
1053
980
1054
@override
@@ -989,7 +1063,7 @@ class AstNodeVisitor extends ThrowingAstVisitor<void>
989
1063
990
1064
@override
991
1065
void visitTypeParameterList (TypeParameterList node) {
992
- createDelimited (node.leftBracket, node.typeParameters, node.rightBracket);
1066
+ createTypeList (node.leftBracket, node.typeParameters, node.rightBracket);
993
1067
}
994
1068
995
1069
@override
0 commit comments