Skip to content

Commit d6dfbda

Browse files
Dmitry Stefantsovcommit-bot@chromium.org
authored andcommitted
[cfe] Complete basic implementation of round-trip text serialization
The future non-basic version is to include the following: * adding missing annotations on nodes * adding URIs and file offsets to the nodes * adding nullability markers to types * stylistic changes * optimizations * better surface syntax * better error messages Change-Id: If2fc51e4932d9043dd1719b766bd23ff4e0fc1ad Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/154001 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Dmitry Stefantsov <[email protected]>
1 parent 7269b79 commit d6dfbda

File tree

7 files changed

+288
-46
lines changed

7 files changed

+288
-46
lines changed

pkg/front_end/test/spell_checking_list_code.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,7 @@ tuple3
11441144
tuple4
11451145
tuple5
11461146
tuple6
1147+
tuple7
11471148
type1
11481149
type2
11491150
typeref

pkg/front_end/test/spell_checking_list_common.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2643,6 +2643,7 @@ setting
26432643
settings
26442644
settled
26452645
setup
2646+
seventh
26462647
several
26472648
severity
26482649
shadow

pkg/kernel/lib/ast.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1471,7 +1471,7 @@ class Extension extends NamedNode implements FileUriNode {
14711471
{this.name,
14721472
List<TypeParameter> typeParameters,
14731473
this.onType,
1474-
List<Reference> members,
1474+
List<ExtensionMemberDescriptor> members,
14751475
this.fileUri,
14761476
Reference reference})
14771477
: this.typeParameters = typeParameters ?? <TypeParameter>[],

pkg/kernel/lib/text/serializer_combinators.dart

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,62 @@ class Tuple6<T1, T2, T3, T4, T5, T6> {
517517
this.first, this.second, this.third, this.fourth, this.fifth, this.sixth);
518518
}
519519

520+
class Tuple7Serializer<T1, T2, T3, T4, T5, T6, T7>
521+
extends TextSerializer<Tuple7<T1, T2, T3, T4, T5, T6, T7>> {
522+
final TextSerializer<T1> first;
523+
final TextSerializer<T2> second;
524+
final TextSerializer<T3> third;
525+
final TextSerializer<T4> fourth;
526+
final TextSerializer<T5> fifth;
527+
final TextSerializer<T6> sixth;
528+
final TextSerializer<T7> seventh;
529+
530+
const Tuple7Serializer(this.first, this.second, this.third, this.fourth,
531+
this.fifth, this.sixth, this.seventh);
532+
533+
Tuple7<T1, T2, T3, T4, T5, T6, T7> readFrom(
534+
Iterator<Object> stream, DeserializationState state) {
535+
return new Tuple7(
536+
first.readFrom(stream, state),
537+
second.readFrom(stream, state),
538+
third.readFrom(stream, state),
539+
fourth.readFrom(stream, state),
540+
fifth.readFrom(stream, state),
541+
sixth.readFrom(stream, state),
542+
seventh.readFrom(stream, state));
543+
}
544+
545+
void writeTo(StringBuffer buffer, Tuple7<T1, T2, T3, T4, T5, T6, T7> object,
546+
SerializationState state) {
547+
first.writeTo(buffer, object.first, state);
548+
if (!second.isEmpty) buffer.write(' ');
549+
second.writeTo(buffer, object.second, state);
550+
if (!third.isEmpty) buffer.write(' ');
551+
third.writeTo(buffer, object.third, state);
552+
if (!fourth.isEmpty) buffer.write(' ');
553+
fourth.writeTo(buffer, object.fourth, state);
554+
if (!fifth.isEmpty) buffer.write(' ');
555+
fifth.writeTo(buffer, object.fifth, state);
556+
if (!sixth.isEmpty) buffer.write(' ');
557+
sixth.writeTo(buffer, object.sixth, state);
558+
if (!seventh.isEmpty) buffer.write(' ');
559+
seventh.writeTo(buffer, object.seventh, state);
560+
}
561+
}
562+
563+
class Tuple7<T1, T2, T3, T4, T5, T6, T7> {
564+
final T1 first;
565+
final T2 second;
566+
final T3 third;
567+
final T4 fourth;
568+
final T5 fifth;
569+
final T6 sixth;
570+
final T7 seventh;
571+
572+
const Tuple7(this.first, this.second, this.third, this.fourth, this.fifth,
573+
this.sixth, this.seventh);
574+
}
575+
520576
// A serializer/deserializer for lists.
521577
class ListSerializer<T> extends TextSerializer<List<T>> {
522578
final TextSerializer<T> elements;

pkg/kernel/lib/text/text_serialization_verifier.dart

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ abstract class RoundTripStatus implements Comparable<RoundTripStatus> {
2929
RoundTripStatus(this.node, {TreeNode context})
3030
: context = node is TreeNode && node.location != null ? node : context;
3131

32-
Uri get uri => context.location.file;
32+
Uri get uri => context?.location?.file;
3333

34-
int get offset => context.fileOffset;
34+
int get offset => context?.fileOffset;
3535

3636
bool get isSuccess;
3737

@@ -324,15 +324,7 @@ class VerificationState {
324324

325325
static bool isSupported(Node node) => !isNotSupported(node);
326326

327-
static bool isNotSupported(Node node) =>
328-
node is Component ||
329-
node is Extension ||
330-
node is Library ||
331-
node is LibraryPart ||
332-
node is MapEntry ||
333-
node is Name && node.isPrivate ||
334-
node is RedirectingFactoryConstructor ||
335-
node is Typedef;
327+
static bool isNotSupported(Node node) => false;
336328
}
337329

338330
class TextSerializationVerifier extends RecursiveVisitor<void> {
@@ -483,6 +475,16 @@ class TextSerializationVerifier extends RecursiveVisitor<void> {
483475
makeRoundTrip<Supertype>(node, supertypeSerializer);
484476
} else if (node is Class) {
485477
makeRoundTrip<Class>(node, classSerializer);
478+
} else if (node is Extension) {
479+
makeRoundTrip<Extension>(node, extensionSerializer);
480+
} else if (node is Typedef) {
481+
makeRoundTrip<Typedef>(node, typedefSerializer);
482+
} else if (node is LibraryPart) {
483+
makeRoundTrip<LibraryPart>(node, libraryPartSerializer);
484+
} else if (node is Library) {
485+
makeRoundTrip<Library>(node, librarySerializer);
486+
} else if (node is Component) {
487+
makeRoundTrip<Component>(node, componentSerializer);
486488
} else {
487489
throw new StateError(
488490
"Don't know how to make a round trip for a supported node "

0 commit comments

Comments
 (0)