@@ -799,76 +799,53 @@ Arguments wrapArguments(
799
799
return new Arguments (tuple.second, types: tuple.first, named: tuple.third);
800
800
}
801
801
802
- class VariableDeclarationTagger implements Tagger <VariableDeclaration > {
803
- const VariableDeclarationTagger ();
804
-
805
- String tag (VariableDeclaration decl) {
806
- String prefix = "" ;
807
- if (decl.isCovariant) {
808
- prefix = "${prefix }covariant-" ;
809
- if (decl.isFieldFormal) {
810
- // Field formals can only be used in constructors,
811
- // and "covariant" keyword doesn't make sense for them.
812
- throw StateError ("Encountered covariant field formal." );
813
- }
814
- }
815
- if (decl.isFieldFormal) {
816
- prefix = "${prefix }fieldformal-" ;
817
- }
818
-
819
- if (decl.isConst) {
820
- // It's not clear what invariants we assume about const/final. For now
821
- // throw if we have both.
822
- if (decl.isFinal) {
823
- throw UnimplementedError (
824
- "Encountered a variable that is both const and final." );
825
- }
826
- return "${prefix }const" ;
827
- }
828
- if (decl.isFinal) {
829
- return "${prefix }final" ;
830
- }
831
- return "${prefix }var" ;
802
+ const Map <int , String > variableDeclarationFlagToName = const {
803
+ VariableDeclaration .FlagFinal : "final" ,
804
+ VariableDeclaration .FlagConst : "const" ,
805
+ VariableDeclaration .FlagFieldFormal : "field-formal" ,
806
+ VariableDeclaration .FlagCovariant : "covariant" ,
807
+ VariableDeclaration .FlagInScope : "in-scope" ,
808
+ VariableDeclaration .FlagGenericCovariantImpl : "generic-covariant-impl" ,
809
+ VariableDeclaration .FlagLate : "late" ,
810
+ VariableDeclaration .FlagRequired : "required" ,
811
+ };
812
+
813
+ class VariableDeclarationFlagTagger implements Tagger <IntLiteral > {
814
+ String tag (IntLiteral wrappedFlag) {
815
+ int flag = wrappedFlag.value;
816
+ return variableDeclarationFlagToName[flag] ??
817
+ (throw StateError ("Unknown VariableDeclaration flag value: ${flag }." ));
832
818
}
833
819
}
834
820
835
- TextSerializer <VariableDeclaration > makeVariableDeclarationSerializer (
836
- {bool isFinal = false ,
837
- bool isConst = false ,
838
- bool isCovariant = false ,
839
- bool isFieldFormal = false }) =>
840
- new Wrapped (
841
- (w) => Tuple3 (w.type, w.initializer, w.annotations),
842
- (u) => u.third.fold (
843
- VariableDeclaration (null ,
844
- type: u.first,
845
- initializer: u.second,
846
- isFinal: isFinal,
847
- isConst: isConst,
848
- isCovariant: isCovariant,
849
- isFieldFormal: isFieldFormal),
850
- (v, a) => v..addAnnotation (a)),
851
- Tuple3Serializer (dartTypeSerializer, new Optional (expressionSerializer),
852
- new ListSerializer (expressionSerializer)));
821
+ TextSerializer <int > variableDeclarationFlagsSerializer = Wrapped (
822
+ (w) => List .generate (30 , (i) => IntLiteral (w & (1 << i)))
823
+ .where ((f) => f.value != 0 )
824
+ .toList (),
825
+ (u) => u.fold (0 , (fs, f) => fs | = f.value),
826
+ ListSerializer (Case (
827
+ VariableDeclarationFlagTagger (),
828
+ Map .fromIterable (variableDeclarationFlagToName.entries,
829
+ key: (e) => e.value,
830
+ value: (e) =>
831
+ Wrapped ((_) => null , (_) => IntLiteral (e.key), Nothing ())))));
853
832
854
833
TextSerializer <VariableDeclaration > variableDeclarationSerializer = Wrapped (
855
834
(v) => Tuple2 (v.name, v),
856
835
(t) => t.second..name = t.first,
857
- Binder (Case (VariableDeclarationTagger (), {
858
- "var" : makeVariableDeclarationSerializer (),
859
- "final" : makeVariableDeclarationSerializer (isFinal: true ),
860
- "const" : makeVariableDeclarationSerializer (isConst: true ),
861
- "covariant-var" : makeVariableDeclarationSerializer (isCovariant: true ),
862
- "covariant-final" :
863
- makeVariableDeclarationSerializer (isCovariant: true , isFinal: true ),
864
- "covariant-const" :
865
- makeVariableDeclarationSerializer (isCovariant: true , isConst: true ),
866
- "fieldformal-var" : makeVariableDeclarationSerializer (isFieldFormal: true ),
867
- "fieldformal-final" :
868
- makeVariableDeclarationSerializer (isFieldFormal: true , isFinal: true ),
869
- "fieldformal-const" :
870
- makeVariableDeclarationSerializer (isFieldFormal: true , isConst: true ),
871
- })));
836
+ Binder <VariableDeclaration >(
837
+ new Wrapped (
838
+ (w) => Tuple4 (w.flags, w.type, w.initializer, w.annotations),
839
+ (u) => u.fourth.fold (
840
+ VariableDeclaration (null ,
841
+ flags: u.first, type: u.second, initializer: u.third),
842
+ (v, a) => v..addAnnotation (a)),
843
+ Tuple4Serializer (
844
+ variableDeclarationFlagsSerializer,
845
+ dartTypeSerializer,
846
+ new Optional (expressionSerializer),
847
+ new ListSerializer (expressionSerializer))),
848
+ ));
872
849
873
850
TextSerializer <TypeParameter > typeParameterSerializer = Wrapped (
874
851
(p) => Tuple2 (p.name, p),
@@ -1593,36 +1570,112 @@ FunctionNode wrapSyncYieldingFunctionNode(
1593
1570
Case <FunctionNode > functionNodeSerializer =
1594
1571
new Case .uninitialized (const FunctionNodeTagger ());
1595
1572
1596
- class ProcedureTagger implements Tagger <Procedure > {
1597
- const ProcedureTagger ();
1598
-
1599
- String tag (Procedure node) {
1600
- String prefix = node.isStatic ? "static-" : "" ;
1601
- switch (node.kind) {
1602
- case ProcedureKind .Method :
1603
- return "${prefix }method" ;
1604
- default :
1605
- throw new UnsupportedError ("${node .kind }" );
1606
- }
1573
+ const Map <int , String > procedureFlagToName = const {
1574
+ Procedure .FlagStatic : "static" ,
1575
+ Procedure .FlagAbstract : "abstract" ,
1576
+ Procedure .FlagExternal : "external" ,
1577
+ Procedure .FlagConst : "const" ,
1578
+ Procedure .FlagForwardingStub : "forwarding-stub" ,
1579
+ Procedure .FlagForwardingSemiStub : "forwarding-semi-stub" ,
1580
+ Procedure .FlagRedirectingFactoryConstructor :
1581
+ "redirecting-factory-constructor" ,
1582
+ Procedure .FlagNoSuchMethodForwarder : "no-such-method-forwarder" ,
1583
+ Procedure .FlagExtensionMember : "extension-member" ,
1584
+ Procedure .FlagMemberSignature : "member-signature" ,
1585
+ Procedure .FlagNonNullableByDefault : "non-nullable-by-default" ,
1586
+ };
1587
+
1588
+ class ProcedureFlagTagger implements Tagger <IntLiteral > {
1589
+ const ProcedureFlagTagger ();
1590
+
1591
+ String tag (IntLiteral wrappedFlag) {
1592
+ int flag = wrappedFlag.value;
1593
+ return procedureFlagToName[flag] ??
1594
+ (throw StateError ("Unknown Procedure flag value: ${flag }." ));
1607
1595
}
1608
1596
}
1609
1597
1610
- TextSerializer <Procedure > staticMethodSerializer = new Wrapped (
1611
- unwrapStaticMethod,
1612
- wrapStaticMethod,
1613
- new Tuple2Serializer (nameSerializer, functionNodeSerializer));
1614
-
1615
- Tuple2 <Name , FunctionNode > unwrapStaticMethod (Procedure procedure) {
1616
- return new Tuple2 (procedure.name, procedure.function);
1598
+ TextSerializer <int > procedureFlagsSerializer = Wrapped (
1599
+ (w) => List .generate (30 , (i) => IntLiteral (w & (1 << i)))
1600
+ .where ((f) => f.value != 0 )
1601
+ .toList (),
1602
+ (u) => u.fold (0 , (fs, f) => fs | = f.value),
1603
+ ListSerializer (Case (
1604
+ ProcedureFlagTagger (),
1605
+ Map .fromIterable (procedureFlagToName.entries,
1606
+ key: (e) => e.value,
1607
+ value: (e) =>
1608
+ Wrapped ((_) => null , (_) => IntLiteral (e.key), Nothing ())))));
1609
+
1610
+ const Map <int , String > fieldFlagToName = const {
1611
+ Field .FlagFinal : "final" ,
1612
+ Field .FlagConst : "const" ,
1613
+ Field .FlagStatic : "static" ,
1614
+ Field .FlagHasImplicitGetter : "has-implicit-getter" ,
1615
+ Field .FlagHasImplicitSetter : "has-implicit-setter" ,
1616
+ Field .FlagCovariant : "covariant" ,
1617
+ Field .FlagGenericCovariantImpl : "generic-covariant-impl" ,
1618
+ Field .FlagLate : "late" ,
1619
+ Field .FlagExtensionMember : "extension-member" ,
1620
+ Field .FlagNonNullableByDefault : "non-nullable-by-default" ,
1621
+ Field .FlagInternalImplementation : "internal-implementation" ,
1622
+ };
1623
+
1624
+ class FieldFlagTagger implements Tagger <IntLiteral > {
1625
+ const FieldFlagTagger ();
1626
+
1627
+ String tag (IntLiteral wrappedFlag) {
1628
+ int flag = wrappedFlag.value;
1629
+ return fieldFlagToName[flag] ??
1630
+ (throw StateError ("Unknown Field flag value: ${flag }." ));
1631
+ }
1617
1632
}
1618
1633
1619
- Procedure wrapStaticMethod (Tuple2 <Name , FunctionNode > tuple) {
1620
- return new Procedure (tuple.first, ProcedureKind .Method , tuple.second,
1621
- isStatic: true );
1634
+ TextSerializer <int > fieldFlagsSerializer = Wrapped (
1635
+ (w) => List .generate (30 , (i) => IntLiteral (w & (1 << i)))
1636
+ .where ((f) => f.value != 0 )
1637
+ .toList (),
1638
+ (u) => u.fold (0 , (fs, f) => fs | = f.value),
1639
+ ListSerializer (Case (
1640
+ FieldFlagTagger (),
1641
+ Map .fromIterable (fieldFlagToName.entries,
1642
+ key: (e) => e.value,
1643
+ value: (e) =>
1644
+ Wrapped ((_) => null , (_) => IntLiteral (e.key), Nothing ())))));
1645
+
1646
+ class MemberTagger implements Tagger <Member > {
1647
+ const MemberTagger ();
1648
+
1649
+ String tag (Member node) {
1650
+ if (node is Field ) {
1651
+ return "field" ;
1652
+ } else if (node is Procedure ) {
1653
+ switch (node.kind) {
1654
+ case ProcedureKind .Method :
1655
+ return "method" ;
1656
+ default :
1657
+ throw new UnsupportedError ("${node .kind }" );
1658
+ }
1659
+ } else {
1660
+ throw UnimplementedError ("MemberTagger.tag(${node .runtimeType })" );
1661
+ }
1662
+ }
1622
1663
}
1623
1664
1624
- Case <Procedure > procedureSerializer =
1625
- new Case .uninitialized (const ProcedureTagger ());
1665
+ TextSerializer <Field > fieldSerializer = Wrapped (
1666
+ (w) => Tuple4 (w.name, w.flags, w.type, w.initializer),
1667
+ (u) =>
1668
+ Field (u.first, type: u.third, initializer: u.fourth)..flags = u.second,
1669
+ Tuple4Serializer (nameSerializer, fieldFlagsSerializer, dartTypeSerializer,
1670
+ Optional (expressionSerializer)));
1671
+
1672
+ TextSerializer <Procedure > methodSerializer = Wrapped (
1673
+ (w) => Tuple3 (w.name, w.flags, w.function),
1674
+ (u) => Procedure (u.first, ProcedureKind .Method , u.third)..flags = u.second,
1675
+ Tuple3Serializer (
1676
+ nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
1677
+
1678
+ Case <Member > memberSerializer = new Case .uninitialized (const MemberTagger ());
1626
1679
1627
1680
class LibraryTagger implements Tagger <Library > {
1628
1681
const LibraryTagger ();
@@ -1633,20 +1686,14 @@ class LibraryTagger implements Tagger<Library> {
1633
1686
}
1634
1687
1635
1688
TextSerializer <Library > libraryContentsSerializer = new Wrapped (
1636
- unwrapLibraryNode,
1637
- wrapLibraryNode,
1638
- new Tuple2Serializer (
1639
- const UriSerializer (), new ListSerializer (procedureSerializer)),
1689
+ (w) => Tuple2 (w.importUri, [...w.fields, ...w.procedures]),
1690
+ (u) => Library (u.first,
1691
+ fields: u.second.where ((m) => m is Field ).cast <Field >().toList (),
1692
+ procedures:
1693
+ u.second.where ((m) => m is Procedure ).cast <Procedure >().toList ()),
1694
+ new Tuple2Serializer (const UriSerializer (), ListSerializer (memberSerializer)),
1640
1695
);
1641
1696
1642
- Tuple2 <Uri , List <Procedure >> unwrapLibraryNode (Library library) {
1643
- return new Tuple2 (library.importUri, library.procedures);
1644
- }
1645
-
1646
- Library wrapLibraryNode (Tuple2 <Uri , List <Procedure >> tuple) {
1647
- return new Library (tuple.first, procedures: tuple.second);
1648
- }
1649
-
1650
1697
Case <Library > librarySerializer = new Case .uninitialized (const LibraryTagger ());
1651
1698
1652
1699
class ShowHideTagger implements Tagger <Combinator > {
@@ -1881,7 +1928,8 @@ void initializeSerializers() {
1881
1928
"async-star" : asyncStarFunctionNodeSerializer,
1882
1929
"sync-yielding" : syncYieldingStarFunctionNodeSerializer,
1883
1930
});
1884
- procedureSerializer.registerTags ({"static-method" : staticMethodSerializer});
1931
+ memberSerializer
1932
+ .registerTags ({"field" : fieldSerializer, "method" : methodSerializer});
1885
1933
librarySerializer.registerTags ({
1886
1934
"legacy" : libraryContentsSerializer,
1887
1935
"null-safe" : libraryContentsSerializer,
0 commit comments