Skip to content

Commit e196354

Browse files
Dmitry Stefantsovcommit-bot@chromium.org
Dmitry Stefantsov
authored andcommitted
[cfe] Support more Expression nodes in text serialization
The following nodes are now supported: * SetConcatenation * MapConcatenation * FileUriExpression * BlockExpression * ListConcatenation * NullCheck * Instantiation * CheckLibraryIsLoaded * LoadLibrary Change-Id: Ia269196c36facb211995d0ef8cd8a68cbf836e37 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/153346 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Dmitry Stefantsov <[email protected]>
1 parent da87123 commit e196354

5 files changed

+152
-28
lines changed

pkg/front_end/test/spell_checking_list_code.txt

+8
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ class6a
184184
class6b
185185
clazz
186186
cli
187+
clil
187188
clock
188189
cls
189190
cn
@@ -432,6 +433,7 @@ frontend
432433
frontends
433434
fs
434435
fsource
436+
fue
435437
fuller
436438
function's
437439
fuse
@@ -577,6 +579,8 @@ largest
577579
lattice
578580
layer
579581
layout
582+
lc
583+
ld
580584
leafp
581585
len
582586
lets
@@ -593,6 +597,7 @@ linearized
593597
linebreak
594598
linter
595599
lives
600+
ll
596601
llub
597602
lm
598603
locationd
@@ -622,6 +627,7 @@ masking
622627
master
623628
matcher
624629
mb
630+
mc
625631
md
626632
me
627633
merely
@@ -679,6 +685,7 @@ nameless
679685
namer
680686
natively
681687
nbsp
688+
nc
682689
ncs
683690
ncurses
684691
nd
@@ -1130,6 +1137,7 @@ tuple
11301137
tuple2
11311138
tuple3
11321139
tuple4
1140+
tuple5
11331141
type1
11341142
type2
11351143
typeref

pkg/front_end/test/spell_checking_list_common.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -1083,8 +1083,8 @@ experimental
10831083
experimentally
10841084
experiments
10851085
expired
1086-
explanation
10871086
explain
1087+
explanation
10881088
explicit
10891089
explicitly
10901090
exponent
@@ -1152,6 +1152,7 @@ field
11521152
field's
11531153
fieldname
11541154
fields
1155+
fifth
11551156
figure
11561157
file
11571158
filename

pkg/kernel/lib/text/serializer_combinators.dart

+45
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,51 @@ class Tuple4<T1, T2, T3, T4> {
421421
const Tuple4(this.first, this.second, this.third, this.fourth);
422422
}
423423

424+
class Tuple5Serializer<T1, T2, T3, T4, T5>
425+
extends TextSerializer<Tuple5<T1, T2, T3, T4, T5>> {
426+
final TextSerializer<T1> first;
427+
final TextSerializer<T2> second;
428+
final TextSerializer<T3> third;
429+
final TextSerializer<T4> fourth;
430+
final TextSerializer<T5> fifth;
431+
432+
const Tuple5Serializer(
433+
this.first, this.second, this.third, this.fourth, this.fifth);
434+
435+
Tuple5<T1, T2, T3, T4, T5> readFrom(
436+
Iterator<Object> stream, DeserializationState state) {
437+
return new Tuple5(
438+
first.readFrom(stream, state),
439+
second.readFrom(stream, state),
440+
third.readFrom(stream, state),
441+
fourth.readFrom(stream, state),
442+
fifth.readFrom(stream, state));
443+
}
444+
445+
void writeTo(StringBuffer buffer, Tuple5<T1, T2, T3, T4, T5> object,
446+
SerializationState state) {
447+
first.writeTo(buffer, object.first, state);
448+
if (!second.isEmpty) buffer.write(' ');
449+
second.writeTo(buffer, object.second, state);
450+
if (!third.isEmpty) buffer.write(' ');
451+
third.writeTo(buffer, object.third, state);
452+
if (!fourth.isEmpty) buffer.write(' ');
453+
fourth.writeTo(buffer, object.fourth, state);
454+
if (!fifth.isEmpty) buffer.write(' ');
455+
fifth.writeTo(buffer, object.fifth, state);
456+
}
457+
}
458+
459+
class Tuple5<T1, T2, T3, T4, T5> {
460+
final T1 first;
461+
final T2 second;
462+
final T3 third;
463+
final T4 fourth;
464+
final T5 fifth;
465+
466+
const Tuple5(this.first, this.second, this.third, this.fourth, this.fifth);
467+
}
468+
424469
// A serializer/deserializer for lists.
425470
class ListSerializer<T> extends TextSerializer<List<T>> {
426471
final TextSerializer<T> elements;

pkg/kernel/lib/text/text_serialization_verifier.dart

+6-15
Original file line numberDiff line numberDiff line change
@@ -326,19 +326,7 @@ class VerificationState {
326326
!isExpressionNotSupported(node);
327327

328328
static bool isExpressionNotSupported(Expression node) =>
329-
node is SetConcatenation ||
330-
node is MapConcatenation ||
331-
node is InstanceCreation ||
332-
node is FileUriExpression ||
333-
node is BlockExpression ||
334-
node is ListConcatenation ||
335-
node is NullCheck ||
336-
node is BasicLiteral ||
337-
node is InvocationExpression ||
338-
node is Instantiation ||
339-
node is ConstantExpression ||
340-
node is CheckLibraryIsLoaded ||
341-
node is LoadLibrary;
329+
node is InstanceCreation || node is ConstantExpression;
342330

343331
static bool isStatementSupported(Statement node) =>
344332
!isStatementNotSupported(node);
@@ -364,7 +352,6 @@ class VerificationState {
364352
node is BoolConstant ||
365353
node is Catch ||
366354
node is Class ||
367-
node is Combinator ||
368355
node is Component ||
369356
node is Constructor ||
370357
node is DoubleConstant ||
@@ -375,11 +362,11 @@ class VerificationState {
375362
node is IntConstant ||
376363
node is InvalidInitializer ||
377364
node is Library ||
378-
node is LibraryDependency ||
379365
node is LibraryPart ||
380366
node is ListConstant ||
381367
node is LocalInitializer ||
382368
node is MapConstant ||
369+
node is MapEntry ||
383370
node is Name && node.isPrivate ||
384371
node is NullConstant ||
385372
node is PartialInstantiationConstant ||
@@ -532,6 +519,10 @@ class TextSerializationVerifier extends RecursiveVisitor<void> {
532519
makeRoundTrip<NamedType>(node, namedTypeSerializer);
533520
} else if (node is Name) {
534521
makeRoundTrip<Name>(node, nameSerializer);
522+
} else if (node is Combinator) {
523+
makeRoundTrip<Combinator>(node, showHideSerializer);
524+
} else if (node is LibraryDependency) {
525+
makeRoundTrip<LibraryDependency>(node, libraryDependencySerializer);
535526
} else {
536527
throw new StateError(
537528
"Don't know how to make a round trip for a supported node "

pkg/kernel/lib/text/text_serializer.dart

+91-12
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,15 @@ class ExpressionTagger extends ExpressionVisitor<String>
112112
}
113113

114114
String visitFunctionExpression(FunctionExpression _) => "fun";
115+
String visitListConcatenation(ListConcatenation _) => "lists";
116+
String visitSetConcatenation(SetConcatenation _) => "sets";
117+
String visitMapConcatenation(MapConcatenation _) => "maps";
118+
String visitBlockExpression(BlockExpression _) => "let-block";
119+
String visitInstantiation(Instantiation _) => "apply";
120+
String visitNullCheck(NullCheck _) => "not-null";
121+
String visitFileUriExpression(FileUriExpression _) => "with-uri";
122+
String visitCheckLibraryIsLoaded(CheckLibraryIsLoaded _) => "is-loaded";
123+
String visitLoadLibrary(LoadLibrary _) => "load";
115124
}
116125

117126
const TextSerializer<InvalidExpression> invalidExpressionSerializer =
@@ -689,6 +698,48 @@ FunctionExpression wrapFunctionExpression(FunctionNode node) {
689698
return new FunctionExpression(node);
690699
}
691700

701+
TextSerializer<ListConcatenation> listConcatenationSerializer = Wrapped(
702+
(lc) => Tuple2(lc.typeArgument, lc.lists),
703+
(t) => ListConcatenation(t.second, typeArgument: t.first),
704+
Tuple2Serializer(dartTypeSerializer, ListSerializer(expressionSerializer)));
705+
706+
TextSerializer<SetConcatenation> setConcatenationSerializer = Wrapped(
707+
(sc) => Tuple2(sc.typeArgument, sc.sets),
708+
(t) => SetConcatenation(t.second, typeArgument: t.first),
709+
Tuple2Serializer(dartTypeSerializer, ListSerializer(expressionSerializer)));
710+
711+
TextSerializer<MapConcatenation> mapConcatenationSerializer = Wrapped(
712+
(mc) => Tuple3(mc.keyType, mc.valueType, mc.maps),
713+
(t) => MapConcatenation(t.third, keyType: t.first, valueType: t.second),
714+
Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
715+
ListSerializer(expressionSerializer)));
716+
717+
TextSerializer<BlockExpression> blockExpressionSerializer = Wrapped(
718+
(be) => Tuple2(be.body, be.value),
719+
(t) => BlockExpression(t.first, t.second),
720+
Tuple2Serializer(blockSerializer, expressionSerializer));
721+
722+
TextSerializer<Instantiation> instantiationSerializer = Wrapped(
723+
(i) => Tuple2(i.expression, i.typeArguments),
724+
(t) => Instantiation(t.first, t.second),
725+
Tuple2Serializer(expressionSerializer, ListSerializer(dartTypeSerializer)));
726+
727+
TextSerializer<NullCheck> nullCheckSerializer =
728+
Wrapped((nc) => nc.operand, (op) => NullCheck(op), expressionSerializer);
729+
730+
TextSerializer<FileUriExpression> fileUriExpressionSerializer = Wrapped(
731+
(fue) => Tuple2(fue.expression, fue.fileUri),
732+
(t) => FileUriExpression(t.first, t.second),
733+
Tuple2Serializer(expressionSerializer, const UriSerializer()));
734+
735+
TextSerializer<CheckLibraryIsLoaded> checkLibraryIsLoadedSerializer = Wrapped(
736+
(clil) => clil.import,
737+
(i) => CheckLibraryIsLoaded(i),
738+
libraryDependencySerializer);
739+
740+
TextSerializer<LoadLibrary> loadLibrarySerializer = Wrapped(
741+
(ll) => ll.import, (i) => LoadLibrary(i), libraryDependencySerializer);
742+
692743
Case<Expression> expressionSerializer =
693744
new Case.uninitialized(const ExpressionTagger());
694745

@@ -1067,18 +1118,10 @@ YieldStatement wrapYieldStatement(Expression expression) {
10671118
return new YieldStatement(expression);
10681119
}
10691120

1070-
TextSerializer<AssertStatement> assertStatementSerializer = new Wrapped(
1071-
unwrapAssertStatement,
1072-
wrapAssertStatement,
1073-
new Tuple2Serializer(expressionSerializer, expressionSerializer));
1074-
1075-
Tuple2<Expression, Expression> unwrapAssertStatement(AssertStatement node) {
1076-
return new Tuple2<Expression, Expression>(node.condition, node.message);
1077-
}
1078-
1079-
AssertStatement wrapAssertStatement(Tuple2<Expression, Expression> tuple) {
1080-
return new AssertStatement(tuple.first, message: tuple.second);
1081-
}
1121+
TextSerializer<AssertStatement> assertStatementSerializer = Wrapped(
1122+
(a) => Tuple2(a.condition, a.message),
1123+
(t) => AssertStatement(t.first, message: t.second),
1124+
Tuple2Serializer(expressionSerializer, Optional(expressionSerializer)));
10821125

10831126
TextSerializer<Block> blockSerializer =
10841127
new Wrapped(unwrapBlock, wrapBlock, const BlockSerializer());
@@ -1535,6 +1578,33 @@ Library wrapLibraryNode(Tuple2<Uri, List<Procedure>> tuple) {
15351578

15361579
Case<Library> librarySerializer = new Case.uninitialized(const LibraryTagger());
15371580

1581+
class ShowHideTagger implements Tagger<Combinator> {
1582+
String tag(Combinator node) => node.isShow ? "show" : "hide";
1583+
}
1584+
1585+
TextSerializer<Combinator> showSerializer = Wrapped(
1586+
(c) => c.names, (ns) => Combinator(true, ns), ListSerializer(DartString()));
1587+
1588+
TextSerializer<Combinator> hideSerializer = Wrapped((c) => c.names,
1589+
(ns) => Combinator(false, ns), ListSerializer(DartString()));
1590+
1591+
Case<Combinator> showHideSerializer = new Case(ShowHideTagger(), {
1592+
"show": showSerializer,
1593+
"hide": hideSerializer,
1594+
});
1595+
1596+
TextSerializer<LibraryDependency> libraryDependencySerializer = Wrapped(
1597+
(ld) => Tuple5(ld.importedLibraryReference.canonicalName, ld.name,
1598+
ld.combinators, ld.flags, ld.annotations),
1599+
(t) => LibraryDependency.byReference(
1600+
t.fourth, t.fifth, t.first.getReference(), t.second, t.third),
1601+
Tuple5Serializer(
1602+
CanonicalNameSerializer(),
1603+
Optional(DartString()),
1604+
ListSerializer(showHideSerializer),
1605+
DartInt(),
1606+
ListSerializer(expressionSerializer)));
1607+
15381608
void initializeSerializers() {
15391609
expressionSerializer.registerTags({
15401610
"string": stringLiteralSerializer,
@@ -1581,6 +1651,15 @@ void initializeSerializers() {
15811651
"invoke-constructor": constructorInvocationSerializer,
15821652
"invoke-const-constructor": constConstructorInvocationSerializer,
15831653
"fun": functionExpressionSerializer,
1654+
"lists": listConcatenationSerializer,
1655+
"sets": setConcatenationSerializer,
1656+
"maps": mapConcatenationSerializer,
1657+
"let-block": blockExpressionSerializer,
1658+
"apply": instantiationSerializer,
1659+
"not-null": nullCheckSerializer,
1660+
"with-uri": fileUriExpressionSerializer,
1661+
"is-loaded": checkLibraryIsLoadedSerializer,
1662+
"load": loadLibrarySerializer,
15841663
});
15851664
dartTypeSerializer.registerTags({
15861665
"invalid": invalidTypeSerializer,

0 commit comments

Comments
 (0)