@@ -8,12 +8,12 @@ library vm.transformations.type_flow.native_code;
88import 'dart:core' hide Type;
99
1010import 'package:kernel/ast.dart' ;
11- import 'package:kernel/core_types.dart' show CoreTypes;
1211import 'package:kernel/library_index.dart' show LibraryIndex;
1312
1413import 'calls.dart' ;
1514import 'types.dart' ;
1615import 'utils.dart' ;
16+ import '../pragma.dart' ;
1717
1818abstract class EntryPointsListener {
1919 /// Add call by the given selector with arbitrary ('raw') arguments.
@@ -33,96 +33,6 @@ abstract class EntryPointsListener {
3333 void recordMemberCalledViaThis (Member target);
3434}
3535
36- abstract class ParsedPragma {}
37-
38- enum PragmaEntryPointType { Always , GetterOnly , SetterOnly }
39-
40- class ParsedEntryPointPragma extends ParsedPragma {
41- final PragmaEntryPointType type;
42- ParsedEntryPointPragma (this .type);
43- }
44-
45- class ParsedResultTypeByTypePragma extends ParsedPragma {
46- final DartType type;
47- ParsedResultTypeByTypePragma (this .type);
48- }
49-
50- class ParsedResultTypeByPathPragma extends ParsedPragma {
51- final String path;
52- ParsedResultTypeByPathPragma (this .path);
53- }
54-
55- const kEntryPointPragmaName = "vm:entry-point" ;
56- const kExactResultTypePragmaName = "vm:exact-result-type" ;
57-
58- abstract class PragmaAnnotationParser {
59- /// May return 'null' if the annotation does not represent a recognized
60- /// @pragma.
61- ParsedPragma parsePragma (Expression annotation);
62- }
63-
64- class ConstantPragmaAnnotationParser extends PragmaAnnotationParser {
65- final CoreTypes coreTypes;
66-
67- ConstantPragmaAnnotationParser (this .coreTypes);
68-
69- ParsedPragma parsePragma (Expression annotation) {
70- InstanceConstant pragmaConstant;
71- if (annotation is ConstantExpression ) {
72- Constant constant = annotation.constant;
73- if (constant is InstanceConstant ) {
74- if (constant.classReference.node == coreTypes.pragmaClass) {
75- pragmaConstant = constant;
76- }
77- }
78- }
79- if (pragmaConstant == null ) return null ;
80-
81- String pragmaName;
82- Constant name = pragmaConstant.fieldValues[coreTypes.pragmaName.reference];
83- if (name is StringConstant ) {
84- pragmaName = name.value;
85- } else {
86- return null ;
87- }
88-
89- Constant options =
90- pragmaConstant.fieldValues[coreTypes.pragmaOptions.reference];
91- assertx (options != null );
92-
93- switch (pragmaName) {
94- case kEntryPointPragmaName:
95- PragmaEntryPointType type;
96- if (options is NullConstant ) {
97- type = PragmaEntryPointType .Always ;
98- } else if (options is BoolConstant && options.value == true ) {
99- type = PragmaEntryPointType .Always ;
100- } else if (options is StringConstant ) {
101- if (options.value == "get" ) {
102- type = PragmaEntryPointType .GetterOnly ;
103- } else if (options.value == "set" ) {
104- type = PragmaEntryPointType .SetterOnly ;
105- } else {
106- throw "Error: string directive to @pragma('$kEntryPointPragmaName ', ...) "
107- "must be either 'get' or 'set'." ;
108- }
109- }
110- return type != null ? new ParsedEntryPointPragma (type) : null ;
111- case kExactResultTypePragmaName:
112- if (options == null ) return null ;
113- if (options is TypeLiteralConstant ) {
114- return new ParsedResultTypeByTypePragma (options.type);
115- } else if (options is StringConstant ) {
116- return new ParsedResultTypeByPathPragma (options.value);
117- }
118- throw "ERROR: Unsupported option to '$kExactResultTypePragmaName ' "
119- "pragma: $options " ;
120- default :
121- return null ;
122- }
123- }
124- }
125-
12636class PragmaEntryPointsVisitor extends RecursiveVisitor {
12737 final EntryPointsListener entryPoints;
12838 final NativeCodeOracle nativeCodeOracle;
@@ -145,13 +55,15 @@ class PragmaEntryPointsVisitor extends RecursiveVisitor {
14555
14656 @override
14757 visitClass (Class klass) {
148- var type = _annotationsDefineRoot (klass.annotations);
149- if (type != null ) {
150- if (type != PragmaEntryPointType .Always ) {
151- throw "Error: pragma entry-point definition on a class must evaluate "
152- "to null, true or false. See entry_points_pragma.md." ;
58+ if (! klass.isAbstract) {
59+ var type = _annotationsDefineRoot (klass.annotations);
60+ if (type != null ) {
61+ if (type != PragmaEntryPointType .Always ) {
62+ throw "Error: pragma entry-point definition on a class must evaluate "
63+ "to null, true or false. See entry_points_pragma.md." ;
64+ }
65+ entryPoints.addAllocatedClass (klass);
15366 }
154- entryPoints.addAllocatedClass (klass);
15567 }
15668 currentClass = klass;
15769 klass.visitChildren (this );
0 commit comments