Skip to content

Commit 2e5e03f

Browse files
Dmitry Stefantsovcommit-bot@chromium.org
Dmitry Stefantsov
authored andcommitted
[cfe] Add support for Switch statements to text serialization
Also handle TryCatch and TryFinally. Change-Id: I68e64161500c036bc0e1d39723baf2a88f7a3cc1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/153603 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Dmitry Stefantsov <[email protected]>
1 parent ddb9724 commit 2e5e03f

File tree

2 files changed

+72
-7
lines changed

2 files changed

+72
-7
lines changed

pkg/kernel/lib/text/text_serialization_verifier.dart

+5-7
Original file line numberDiff line numberDiff line change
@@ -328,11 +328,7 @@ class VerificationState {
328328
static bool isStatementNotSupported(Statement node) =>
329329
node is VariableDeclaration &&
330330
(node.parent is! Block || node.name == null) ||
331-
node is SwitchStatement ||
332-
node is TryFinally ||
333-
node is TryCatch ||
334-
node is FunctionDeclaration ||
335-
node is ContinueSwitchStatement;
331+
node is FunctionDeclaration;
336332

337333
static bool isSupported(Node node) => !isNotSupported(node);
338334

@@ -342,7 +338,6 @@ class VerificationState {
342338
node is Procedure &&
343339
(!node.isStatic || node.kind != ProcedureKind.Method) ||
344340
node is AssertInitializer ||
345-
node is Catch ||
346341
node is Class ||
347342
node is Component ||
348343
node is Constructor ||
@@ -359,7 +354,6 @@ class VerificationState {
359354
node is RedirectingInitializer ||
360355
node is SuperInitializer ||
361356
node is Supertype ||
362-
node is SwitchCase ||
363357
node is Typedef;
364358
}
365359

@@ -501,6 +495,10 @@ class TextSerializationVerifier extends RecursiveVisitor<void> {
501495
makeRoundTrip<Combinator>(node, showHideSerializer);
502496
} else if (node is LibraryDependency) {
503497
makeRoundTrip<LibraryDependency>(node, libraryDependencySerializer);
498+
} else if (node is Catch) {
499+
makeRoundTrip<Catch>(node, catchSerializer);
500+
} else if (node is SwitchCase) {
501+
makeRoundTrip<SwitchCase>(node, switchCaseSerializer);
504502
} else {
505503
throw new StateError(
506504
"Don't know how to make a round trip for a supported node "

pkg/kernel/lib/text/text_serializer.dart

+67
Original file line numberDiff line numberDiff line change
@@ -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

11081113
TextSerializer<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+
13571420
Case<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

Comments
 (0)