@@ -1103,6 +1103,11 @@ class StatementTagger extends StatementVisitor<String>
11031103 String visitAssertBlock (AssertBlock node) => "assert-block" ;
11041104 String visitLabeledStatement (LabeledStatement node) => "label" ;
11051105 String visitBreakStatement (BreakStatement node) => "break" ;
1106+ String visitTryFinally (TryFinally node) => "try-finally" ;
1107+ String visitTryCatch (TryCatch node) => "try-catch" ;
1108+ String visitSwitchStatement (SwitchStatement node) => "switch" ;
1109+ String visitContinueSwitchStatement (ContinueSwitchStatement node) =>
1110+ "continue" ;
11061111}
11071112
11081113TextSerializer <ExpressionStatement > expressionStatementSerializer = new Wrapped (
@@ -1354,6 +1359,64 @@ BreakStatement wrapBreakStatement(LabeledStatement node) {
13541359 return new BreakStatement (node);
13551360}
13561361
1362+ TextSerializer <TryFinally > tryFinallySerializer = Wrapped (
1363+ (w) => Tuple2 (w.body, w.finalizer),
1364+ (u) => TryFinally (u.first, u.second),
1365+ Tuple2Serializer (statementSerializer, statementSerializer));
1366+
1367+ TextSerializer <TryCatch > tryCatchSerializer = Wrapped (
1368+ (w) => Tuple2 (w.body, w.catches),
1369+ (u) => TryCatch (u.first, u.second),
1370+ Tuple2Serializer (statementSerializer, ListSerializer (catchSerializer)));
1371+
1372+ TextSerializer <Catch > catchSerializer = Wrapped (
1373+ (w) => Tuple4 (w.guard, w.exception, w.stackTrace, w.body),
1374+ (u) => Catch (u.second, u.fourth, stackTrace: u.third, guard: u.first),
1375+ Tuple4Serializer (
1376+ dartTypeSerializer,
1377+ Optional (variableDeclarationSerializer),
1378+ Optional (variableDeclarationSerializer),
1379+ statementSerializer));
1380+
1381+ TextSerializer <SwitchStatement > switchStatementSerializer = Wrapped (
1382+ (w) => Tuple2 (w.expression, w.cases),
1383+ (u) => SwitchStatement (u.first, u.second),
1384+ Tuple2Serializer (
1385+ expressionSerializer,
1386+ Zip (
1387+ Bind (ListSerializer <SwitchCase >(switchCaseSerializer),
1388+ ListSerializer (statementSerializer)),
1389+ (SwitchCase c, Statement b) => c..body = b,
1390+ (SwitchCase z) => Tuple2 (z, z.body))));
1391+
1392+ class SwitchCaseTagger implements Tagger <SwitchCase > {
1393+ String tag (SwitchCase node) {
1394+ return node.isDefault ? "default" : "case" ;
1395+ }
1396+ }
1397+
1398+ TextSerializer <SwitchCase > switchCaseCaseSerializer = Wrapped (
1399+ (w) => Tuple2 ("L" , w),
1400+ (u) => u.second,
1401+ Binder (Wrapped (
1402+ (w) => w.expressions,
1403+ (u) => SwitchCase (u, List .filled (u.length, 0 ), null ),
1404+ ListSerializer (expressionSerializer))));
1405+
1406+ TextSerializer <SwitchCase > switchCaseDefaultSerializer = Wrapped (
1407+ (w) => Tuple2 ("L" , w),
1408+ (u) => u.second,
1409+ Binder (
1410+ Wrapped ((w) => null , (u) => SwitchCase .defaultCase (null ), Nothing ())));
1411+
1412+ TextSerializer <SwitchCase > switchCaseSerializer = Case (SwitchCaseTagger (), {
1413+ "case" : switchCaseCaseSerializer,
1414+ "default" : switchCaseDefaultSerializer,
1415+ });
1416+
1417+ TextSerializer <ContinueSwitchStatement > continueSwitchStatementSerializer =
1418+ Wrapped ((w) => w.target, (u) => ContinueSwitchStatement (u), ScopedUse ());
1419+
13571420Case <Statement > statementSerializer =
13581421 new Case .uninitialized (const StatementTagger ());
13591422
@@ -1822,6 +1885,10 @@ void initializeSerializers() {
18221885 "assert-block" : assertBlockSerializer,
18231886 "label" : labeledStatementSerializer,
18241887 "break" : breakSerializer,
1888+ "try-finally" : tryFinallySerializer,
1889+ "try-catch" : tryCatchSerializer,
1890+ "switch" : switchStatementSerializer,
1891+ "continue" : continueSwitchStatementSerializer,
18251892 });
18261893 functionNodeSerializer.registerTags ({
18271894 "sync" : syncFunctionNodeSerializer,
0 commit comments