Skip to content

Commit 2eee763

Browse files
Dmitry Stefantsovcommit-bot@chromium.org
Dmitry Stefantsov
authored andcommitted
[cfe] Add support for constants to Kernel text serialization
The CL also finalizes the support for expressions because the constant expressions can now be serialized. Change-Id: I7bc98fc974d3be1d4b9f1712cf67f9fbe6496e01 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/153461 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Dmitry Stefantsov <[email protected]>
1 parent bec928c commit 2eee763

5 files changed

+202
-23
lines changed

pkg/front_end/test/spell_checking_list_code.txt

+3
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ casing
154154
cast
155155
casted
156156
casts
157+
ce
157158
cfe
158159
ch
159160
channel
@@ -495,6 +496,7 @@ human
495496
i
496497
i'll
497498
i2b
499+
ic
498500
id
499501
identifies
500502
identifying
@@ -1138,6 +1140,7 @@ tuple2
11381140
tuple3
11391141
tuple4
11401142
tuple5
1143+
tuple6
11411144
type1
11421145
type2
11431146
typeref

pkg/front_end/test/spell_checking_list_common.txt

+1
Original file line numberDiff line numberDiff line change
@@ -2701,6 +2701,7 @@ sink
27012701
sites
27022702
situation
27032703
situations
2704+
sixth
27042705
skip
27052706
skipped
27062707
skipping

pkg/kernel/lib/text/serializer_combinators.dart

+51
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,57 @@ class Tuple5<T1, T2, T3, T4, T5> {
466466
const Tuple5(this.first, this.second, this.third, this.fourth, this.fifth);
467467
}
468468

469+
class Tuple6Serializer<T1, T2, T3, T4, T5, T6>
470+
extends TextSerializer<Tuple6<T1, T2, T3, T4, T5, T6>> {
471+
final TextSerializer<T1> first;
472+
final TextSerializer<T2> second;
473+
final TextSerializer<T3> third;
474+
final TextSerializer<T4> fourth;
475+
final TextSerializer<T5> fifth;
476+
final TextSerializer<T6> sixth;
477+
478+
const Tuple6Serializer(
479+
this.first, this.second, this.third, this.fourth, this.fifth, this.sixth);
480+
481+
Tuple6<T1, T2, T3, T4, T5, T6> readFrom(
482+
Iterator<Object> stream, DeserializationState state) {
483+
return new Tuple6(
484+
first.readFrom(stream, state),
485+
second.readFrom(stream, state),
486+
third.readFrom(stream, state),
487+
fourth.readFrom(stream, state),
488+
fifth.readFrom(stream, state),
489+
sixth.readFrom(stream, state));
490+
}
491+
492+
void writeTo(StringBuffer buffer, Tuple6<T1, T2, T3, T4, T5, T6> object,
493+
SerializationState state) {
494+
first.writeTo(buffer, object.first, state);
495+
if (!second.isEmpty) buffer.write(' ');
496+
second.writeTo(buffer, object.second, state);
497+
if (!third.isEmpty) buffer.write(' ');
498+
third.writeTo(buffer, object.third, state);
499+
if (!fourth.isEmpty) buffer.write(' ');
500+
fourth.writeTo(buffer, object.fourth, state);
501+
if (!fifth.isEmpty) buffer.write(' ');
502+
fifth.writeTo(buffer, object.fifth, state);
503+
if (!sixth.isEmpty) buffer.write(' ');
504+
sixth.writeTo(buffer, object.sixth, state);
505+
}
506+
}
507+
508+
class Tuple6<T1, T2, T3, T4, T5, T6> {
509+
final T1 first;
510+
final T2 second;
511+
final T3 third;
512+
final T4 fourth;
513+
final T5 fifth;
514+
final T6 sixth;
515+
516+
const Tuple6(
517+
this.first, this.second, this.third, this.fourth, this.fifth, this.sixth);
518+
}
519+
469520
// A serializer/deserializer for lists.
470521
class ListSerializer<T> extends TextSerializer<List<T>> {
471522
final TextSerializer<T> elements;

pkg/kernel/lib/text/text_serialization_verifier.dart

+1-23
Original file line numberDiff line numberDiff line change
@@ -322,12 +322,6 @@ class VerificationState {
322322
}
323323
}
324324

325-
static bool isExpressionSupported(Expression node) =>
326-
!isExpressionNotSupported(node);
327-
328-
static bool isExpressionNotSupported(Expression node) =>
329-
node is InstanceCreation || node is ConstantExpression;
330-
331325
static bool isStatementSupported(Statement node) =>
332326
!isStatementNotSupported(node);
333327

@@ -343,46 +337,30 @@ class VerificationState {
343337
static bool isSupported(Node node) => !isNotSupported(node);
344338

345339
static bool isNotSupported(Node node) =>
346-
node is Expression && isExpressionNotSupported(node) ||
347340
node is Statement && isStatementNotSupported(node) ||
348341
node is FunctionNode && node.body == null ||
349342
node is Procedure &&
350343
(!node.isStatic || node.kind != ProcedureKind.Method) ||
351344
node is AssertInitializer ||
352-
node is BoolConstant ||
353345
node is Catch ||
354346
node is Class ||
355347
node is Component ||
356348
node is Constructor ||
357-
node is DoubleConstant ||
358349
node is Extension ||
359350
node is Field ||
360351
node is FieldInitializer ||
361-
node is InstanceConstant ||
362-
node is IntConstant ||
363352
node is InvalidInitializer ||
364353
node is Library ||
365354
node is LibraryPart ||
366-
node is ListConstant ||
367355
node is LocalInitializer ||
368-
node is MapConstant ||
369356
node is MapEntry ||
370357
node is Name && node.isPrivate ||
371-
node is NullConstant ||
372-
node is PartialInstantiationConstant ||
373-
node is PrimitiveConstant ||
374358
node is RedirectingFactoryConstructor ||
375359
node is RedirectingInitializer ||
376-
node is SetConstant ||
377-
node is StringConstant ||
378360
node is SuperInitializer ||
379361
node is Supertype ||
380362
node is SwitchCase ||
381-
node is SymbolConstant ||
382-
node is TearOffConstant ||
383-
node is TypeLiteralConstant ||
384-
node is Typedef ||
385-
node is UnevaluatedConstant;
363+
node is Typedef;
386364
}
387365

388366
class TextSerializationVerifier extends RecursiveVisitor<void> {

pkg/kernel/lib/text/text_serializer.dart

+146
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ class ExpressionTagger extends ExpressionVisitor<String>
121121
String visitFileUriExpression(FileUriExpression _) => "with-uri";
122122
String visitCheckLibraryIsLoaded(CheckLibraryIsLoaded _) => "is-loaded";
123123
String visitLoadLibrary(LoadLibrary _) => "load";
124+
String visitConstantExpression(ConstantExpression _) => "const";
125+
String visitInstanceCreation(InstanceCreation _) => "object";
124126
}
125127

126128
const TextSerializer<InvalidExpression> invalidExpressionSerializer =
@@ -740,6 +742,29 @@ TextSerializer<CheckLibraryIsLoaded> checkLibraryIsLoadedSerializer = Wrapped(
740742
TextSerializer<LoadLibrary> loadLibrarySerializer = Wrapped(
741743
(ll) => ll.import, (i) => LoadLibrary(i), libraryDependencySerializer);
742744

745+
TextSerializer<ConstantExpression> constantExpressionSerializer = Wrapped(
746+
(ce) => Tuple2(ce.constant, ce.type),
747+
(t) => ConstantExpression(t.first, t.second),
748+
Tuple2Serializer(constantSerializer, dartTypeSerializer));
749+
750+
TextSerializer<InstanceCreation> instanceCreationSerializer = Wrapped(
751+
(ic) => Tuple6(
752+
ic.classReference.canonicalName,
753+
ic.typeArguments,
754+
ic.fieldValues.keys.map((r) => r.canonicalName).toList(),
755+
ic.fieldValues.values.toList(),
756+
ic.asserts,
757+
ic.unusedArguments),
758+
(t) => InstanceCreation(t.first.getReference(), t.second,
759+
Map.fromIterables(t.third, t.fourth), t.fifth, t.sixth),
760+
Tuple6Serializer(
761+
CanonicalNameSerializer(),
762+
ListSerializer(dartTypeSerializer),
763+
ListSerializer(CanonicalNameSerializer()),
764+
ListSerializer(expressionSerializer),
765+
ListSerializer(assertStatementSerializer),
766+
ListSerializer(expressionSerializer)));
767+
743768
Case<Expression> expressionSerializer =
744769
new Case.uninitialized(const ExpressionTagger());
745770

@@ -1605,6 +1630,109 @@ TextSerializer<LibraryDependency> libraryDependencySerializer = Wrapped(
16051630
DartInt(),
16061631
ListSerializer(expressionSerializer)));
16071632

1633+
class ConstantTagger extends ConstantVisitor<String>
1634+
implements Tagger<Constant> {
1635+
const ConstantTagger();
1636+
1637+
String tag(Constant node) => node.accept(this);
1638+
1639+
String visitBoolConstant(BoolConstant node) => "const-bool";
1640+
String visitDoubleConstant(DoubleConstant node) => "const-double";
1641+
String visitInstanceConstant(InstanceConstant node) => "const-object";
1642+
String visitIntConstant(IntConstant node) => "const-int";
1643+
String visitListConstant(ListConstant node) => "const-list";
1644+
String visitMapConstant(MapConstant node) => "const-map";
1645+
String visitNullConstant(NullConstant node) => "const-null";
1646+
String visitPartialInstantiationConstant(PartialInstantiationConstant node) =>
1647+
"const-apply";
1648+
String visitSetConstant(SetConstant node) => "const-set";
1649+
String visitStringConstant(StringConstant node) => "const-string";
1650+
String visitSymbolConstant(SymbolConstant node) => "const-symbol";
1651+
String visitTearOffConstant(TearOffConstant node) => "const-tearoff";
1652+
String visitTypeLiteralConstant(TypeLiteralConstant node) => "const-type";
1653+
String visitUnevaluatedConstant(UnevaluatedConstant node) => "const-expr";
1654+
}
1655+
1656+
TextSerializer<BoolConstant> boolConstantSerializer =
1657+
Wrapped((w) => w.value, (u) => BoolConstant(u), DartBool());
1658+
1659+
TextSerializer<DoubleConstant> doubleConstantSerializer =
1660+
Wrapped((w) => w.value, (u) => DoubleConstant(u), DartDouble());
1661+
1662+
TextSerializer<IntConstant> intConstantSerializer =
1663+
Wrapped((w) => w.value, (u) => IntConstant(u), DartInt());
1664+
1665+
TextSerializer<ListConstant> listConstantSerializer = Wrapped(
1666+
(w) => Tuple2(w.typeArgument, w.entries),
1667+
(u) => ListConstant(u.first, u.second),
1668+
Tuple2Serializer(dartTypeSerializer, ListSerializer(constantSerializer)));
1669+
1670+
TextSerializer<MapConstant> mapConstantSerializer = Wrapped(
1671+
(w) => Tuple3(w.keyType, w.valueType, w.entries),
1672+
(u) => MapConstant(u.first, u.second, u.third),
1673+
Tuple3Serializer(
1674+
dartTypeSerializer,
1675+
dartTypeSerializer,
1676+
Zip(
1677+
Tuple2Serializer(ListSerializer(constantSerializer),
1678+
ListSerializer(constantSerializer)),
1679+
(k, v) => ConstantMapEntry(k, v),
1680+
(z) => Tuple2(z.key, z.value))));
1681+
1682+
TextSerializer<NullConstant> nullConstantSerializer =
1683+
Wrapped((w) => null, (u) => NullConstant(), Nothing());
1684+
1685+
TextSerializer<PartialInstantiationConstant>
1686+
partialInstantiationConstantSerializer = Wrapped(
1687+
(w) => Tuple2(w.tearOffConstant, w.types),
1688+
(u) => PartialInstantiationConstant(u.first, u.second),
1689+
Tuple2Serializer(
1690+
tearOffConstantSerializer, ListSerializer(dartTypeSerializer)));
1691+
1692+
TextSerializer<SetConstant> setConstantSerializer = Wrapped(
1693+
(w) => Tuple2(w.typeArgument, w.entries),
1694+
(u) => SetConstant(u.first, u.second),
1695+
Tuple2Serializer(dartTypeSerializer, ListSerializer(constantSerializer)));
1696+
1697+
TextSerializer<StringConstant> stringConstantSerializer =
1698+
Wrapped((w) => w.value, (u) => StringConstant(u), DartString());
1699+
1700+
TextSerializer<SymbolConstant> symbolConstantSerializer = Wrapped(
1701+
(w) => Tuple2(w.name, w.libraryReference?.canonicalName),
1702+
(u) => SymbolConstant(u.first, u.second?.getReference()),
1703+
Tuple2Serializer(DartString(), Optional(CanonicalNameSerializer())));
1704+
1705+
TextSerializer<TearOffConstant> tearOffConstantSerializer = Wrapped(
1706+
(w) => w.procedureReference.canonicalName,
1707+
(u) => TearOffConstant.byReference(u.getReference()),
1708+
CanonicalNameSerializer());
1709+
1710+
TextSerializer<TypeLiteralConstant> typeLiteralConstantSerializer =
1711+
Wrapped((w) => w.type, (u) => TypeLiteralConstant(u), dartTypeSerializer);
1712+
1713+
TextSerializer<UnevaluatedConstant> unevaluatedConstantSerializer = Wrapped(
1714+
(w) => w.expression, (u) => UnevaluatedConstant(u), expressionSerializer);
1715+
1716+
TextSerializer<InstanceConstant> instanceConstantSerializer =
1717+
Wrapped<
1718+
Tuple4<CanonicalName, List<DartType>, List<CanonicalName>,
1719+
List<Constant>>,
1720+
InstanceConstant>(
1721+
(w) => Tuple4(
1722+
w.classReference.canonicalName,
1723+
w.typeArguments,
1724+
w.fieldValues.keys.map((r) => r.canonicalName).toList(),
1725+
w.fieldValues.values.toList()),
1726+
(u) => InstanceConstant(u.first.getReference(), u.second,
1727+
Map.fromIterables(u.third.map((c) => c.getReference()), u.fourth)),
1728+
Tuple4Serializer(
1729+
CanonicalNameSerializer(),
1730+
ListSerializer(dartTypeSerializer),
1731+
ListSerializer(CanonicalNameSerializer()),
1732+
ListSerializer(constantSerializer)));
1733+
1734+
Case<Constant> constantSerializer = Case.uninitialized(ConstantTagger());
1735+
16081736
void initializeSerializers() {
16091737
expressionSerializer.registerTags({
16101738
"string": stringLiteralSerializer,
@@ -1660,6 +1788,8 @@ void initializeSerializers() {
16601788
"with-uri": fileUriExpressionSerializer,
16611789
"is-loaded": checkLibraryIsLoadedSerializer,
16621790
"load": loadLibrarySerializer,
1791+
"const": constantExpressionSerializer,
1792+
"object": instanceCreationSerializer,
16631793
});
16641794
dartTypeSerializer.registerTags({
16651795
"invalid": invalidTypeSerializer,
@@ -1705,4 +1835,20 @@ void initializeSerializers() {
17051835
"legacy": libraryContentsSerializer,
17061836
"null-safe": libraryContentsSerializer,
17071837
});
1838+
constantSerializer.registerTags({
1839+
"const-bool": boolConstantSerializer,
1840+
"const-double": doubleConstantSerializer,
1841+
"const-int": intConstantSerializer,
1842+
"const-list": listConstantSerializer,
1843+
"const-map": mapConstantSerializer,
1844+
"const-null": nullConstantSerializer,
1845+
"const-apply": partialInstantiationConstantSerializer,
1846+
"const-set": setConstantSerializer,
1847+
"const-string": stringConstantSerializer,
1848+
"const-symbol": symbolConstantSerializer,
1849+
"const-tearoff": tearOffConstantSerializer,
1850+
"const-type": typeLiteralConstantSerializer,
1851+
"const-expr": unevaluatedConstantSerializer,
1852+
"const-object": instanceConstantSerializer,
1853+
});
17081854
}

0 commit comments

Comments
 (0)