OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 // SExpressionUnstringifier implements the inverse operation to | 5 // SExpressionUnstringifier implements the inverse operation to |
6 // [SExpressionStringifier]. | 6 // [SExpressionStringifier]. |
7 | 7 |
8 library sexpr_unstringifier; | 8 library sexpr_unstringifier; |
9 | 9 |
10 import 'package:compiler/src/constants/expressions.dart'; | 10 import 'package:compiler/src/constants/expressions.dart'; |
11 import 'package:compiler/src/constants/values.dart'; | 11 import 'package:compiler/src/constants/values.dart'; |
12 import 'package:compiler/src/dart2jslib.dart' as dart2js | 12 import 'package:compiler/src/dart2jslib.dart' as dart2js |
13 show MessageKind; | 13 show MessageKind; |
14 import 'package:compiler/src/dart_types.dart' as dart_types | 14 import 'package:compiler/src/dart_types.dart' as dart_types |
15 show DartType; | 15 show DartType; |
16 import 'package:compiler/src/elements/elements.dart' | 16 import 'package:compiler/src/elements/elements.dart'; |
17 show Entity, Element, Elements, Local, TypeVariableElement, ErroneousElement, | |
18 TypeDeclarationElement, ExecutableElement, PublicName; | |
19 import 'package:compiler/src/elements/modelx.dart' | 17 import 'package:compiler/src/elements/modelx.dart' |
20 show ErroneousElementX, TypeVariableElementX; | 18 show ErroneousElementX, TypeVariableElementX; |
21 import 'package:compiler/src/tree/tree.dart' show LiteralDartString; | 19 import 'package:compiler/src/tree/tree.dart' show LiteralDartString; |
22 import 'package:compiler/src/universe/universe.dart' | 20 import 'package:compiler/src/universe/universe.dart' |
23 show Selector, SelectorKind, CallStructure; | 21 show Selector, SelectorKind, CallStructure; |
24 import 'package:compiler/src/cps_ir/cps_ir_nodes.dart'; | 22 import 'package:compiler/src/cps_ir/cps_ir_nodes.dart'; |
25 | 23 |
26 /// Used whenever a node constructed by [SExpressionUnstringifier] needs a | 24 /// Used whenever a node constructed by [SExpressionUnstringifier] needs a |
27 /// named entity. | 25 /// named entity. |
28 class DummyEntity extends Entity { | 26 class DummyEntity extends Entity { |
(...skipping 12 matching lines...) Expand all Loading... |
41 // TODO(karlklose): we should remove all references to [ErroneousElement] from | 39 // TODO(karlklose): we should remove all references to [ErroneousElement] from |
42 // the CPS IR. Instead, the builder must construct appropriate terms for ASTs | 40 // the CPS IR. Instead, the builder must construct appropriate terms for ASTs |
43 // that could not be resolved correctly. Perhaps the IR should not rely on | 41 // that could not be resolved correctly. Perhaps the IR should not rely on |
44 // elements at all for naming. | 42 // elements at all for naming. |
45 /// Used whenever a node constructed by [SExpressionUnstringifier] requires | 43 /// Used whenever a node constructed by [SExpressionUnstringifier] requires |
46 /// an [Element] or [FunctionElement]. Extends [ErroneousElementX] since there | 44 /// an [Element] or [FunctionElement]. Extends [ErroneousElementX] since there |
47 /// is currently a large amount of overhead when extending the base abstract | 45 /// is currently a large amount of overhead when extending the base abstract |
48 /// classes, and erroneous elements conveniently also skip several assertion | 46 /// classes, and erroneous elements conveniently also skip several assertion |
49 /// checks in CPS IR nodes that are irrelevant to us. | 47 /// checks in CPS IR nodes that are irrelevant to us. |
50 class DummyElement extends ErroneousElementX | 48 class DummyElement extends ErroneousElementX |
51 implements TypeVariableElement { | 49 implements TypeVariableElement, FieldElement { |
52 DummyElement(String name) | 50 DummyElement(String name) |
53 : super(dart2js.MessageKind.GENERIC, {}, name, null); | 51 : super(dart2js.MessageKind.GENERIC, {}, name, null); |
54 | 52 |
55 final dart_types.DartType bound = null; | 53 final dart_types.DartType bound = null; |
56 final TypeDeclarationElement typeDeclaration = null; | 54 final TypeDeclarationElement typeDeclaration = null; |
| 55 |
| 56 noSuchMethod(inv) => super.noSuchMethod(inv); |
57 } | 57 } |
58 | 58 |
59 /// Used whenever a node constructed by [SExpressionUnstringifier] requires | 59 /// Used whenever a node constructed by [SExpressionUnstringifier] requires |
60 /// a named type. | 60 /// a named type. |
61 class DummyNamedType extends dart_types.DartType { | 61 class DummyNamedType extends dart_types.DartType { |
62 final String name; | 62 final String name; |
63 | 63 |
64 final kind = null; | 64 final kind = null; |
65 final element = null; | 65 final element = null; |
66 | 66 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 static const String INVOKE_CONTINUATION = "InvokeContinuation"; | 130 static const String INVOKE_CONTINUATION = "InvokeContinuation"; |
131 static const String INVOKE_STATIC = "InvokeStatic"; | 131 static const String INVOKE_STATIC = "InvokeStatic"; |
132 static const String INVOKE_METHOD_DIRECTLY = "InvokeMethodDirectly"; | 132 static const String INVOKE_METHOD_DIRECTLY = "InvokeMethodDirectly"; |
133 static const String INVOKE_METHOD = "InvokeMethod"; | 133 static const String INVOKE_METHOD = "InvokeMethod"; |
134 static const String LET_PRIM = "LetPrim"; | 134 static const String LET_PRIM = "LetPrim"; |
135 static const String LET_CONT = "LetCont"; | 135 static const String LET_CONT = "LetCont"; |
136 static const String LET_MUTABLE = "LetMutable"; | 136 static const String LET_MUTABLE = "LetMutable"; |
137 static const String SET_MUTABLE_VARIABLE = "SetMutableVariable"; | 137 static const String SET_MUTABLE_VARIABLE = "SetMutableVariable"; |
138 static const String TYPE_OPERATOR = "TypeOperator"; | 138 static const String TYPE_OPERATOR = "TypeOperator"; |
139 static const String SET_STATIC = "SetStatic"; | 139 static const String SET_STATIC = "SetStatic"; |
| 140 static const String GET_LAZY_STATIC = "GetLazyStatic"; |
140 | 141 |
141 // Primitives | 142 // Primitives |
142 static const String CONSTANT = "Constant"; | 143 static const String CONSTANT = "Constant"; |
143 static const String CREATE_FUNCTION = "CreateFunction"; | 144 static const String CREATE_FUNCTION = "CreateFunction"; |
144 static const String GET_MUTABLE_VARIABLE = "GetMutableVariable"; | 145 static const String GET_MUTABLE_VARIABLE = "GetMutableVariable"; |
145 static const String LITERAL_LIST = "LiteralList"; | 146 static const String LITERAL_LIST = "LiteralList"; |
146 static const String LITERAL_MAP = "LiteralMap"; | 147 static const String LITERAL_MAP = "LiteralMap"; |
147 static const String REIFY_TYPE_VAR = "ReifyTypeVar"; | 148 static const String REIFY_TYPE_VAR = "ReifyTypeVar"; |
148 static const String GET_STATIC = "GetStatic"; | 149 static const String GET_STATIC = "GetStatic"; |
149 | 150 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 case LET_CONT: | 244 case LET_CONT: |
244 return parseLetCont(); | 245 return parseLetCont(); |
245 case LET_MUTABLE: | 246 case LET_MUTABLE: |
246 return parseLetMutable(); | 247 return parseLetMutable(); |
247 case SET_MUTABLE_VARIABLE: | 248 case SET_MUTABLE_VARIABLE: |
248 return parseSetMutableVariable(); | 249 return parseSetMutableVariable(); |
249 case TYPE_OPERATOR: | 250 case TYPE_OPERATOR: |
250 return parseTypeOperator(); | 251 return parseTypeOperator(); |
251 case SET_STATIC: | 252 case SET_STATIC: |
252 return parseSetStatic(); | 253 return parseSetStatic(); |
| 254 case GET_LAZY_STATIC: |
| 255 return parseGetLazyStatic(); |
253 default: | 256 default: |
254 assert(false); | 257 assert(false); |
255 } | 258 } |
256 | 259 |
257 return null; | 260 return null; |
258 } | 261 } |
259 | 262 |
260 /// (prim1 prim2 ... primn) | 263 /// (prim1 prim2 ... primn) |
261 List<Primitive> parsePrimitiveList() { | 264 List<Primitive> parsePrimitiveList() { |
262 tokens.consumeStart(); | 265 tokens.consumeStart(); |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 Continuation cont = name2variable[tokens.read()]; | 567 Continuation cont = name2variable[tokens.read()]; |
565 assert(cont != null); | 568 assert(cont != null); |
566 | 569 |
567 tokens.consumeEnd(); | 570 tokens.consumeEnd(); |
568 return new TypeOperator(recv, type, cont, isTypeTest: operator == 'is'); | 571 return new TypeOperator(recv, type, cont, isTypeTest: operator == 'is'); |
569 } | 572 } |
570 | 573 |
571 /// (SetStatic field value body) | 574 /// (SetStatic field value body) |
572 SetStatic parseSetStatic() { | 575 SetStatic parseSetStatic() { |
573 tokens.consumeStart(SET_STATIC); | 576 tokens.consumeStart(SET_STATIC); |
| 577 |
574 Element fieldElement = new DummyElement(tokens.read()); | 578 Element fieldElement = new DummyElement(tokens.read()); |
575 | |
576 Primitive value = name2variable[tokens.read()]; | 579 Primitive value = name2variable[tokens.read()]; |
577 assert(value != null); | 580 assert(value != null); |
578 | |
579 Expression body = parseExpression(); | 581 Expression body = parseExpression(); |
580 | 582 |
581 tokens.consumeEnd(); | 583 tokens.consumeEnd(); |
582 return new SetStatic(fieldElement, value, null).plug(body); | 584 return new SetStatic(fieldElement, value, null)..plug(body); |
| 585 } |
| 586 |
| 587 /// (GetLazyStatic field cont) |
| 588 GetLazyStatic parseGetLazyStatic() { |
| 589 tokens.consumeStart(GET_LAZY_STATIC); |
| 590 |
| 591 Element fieldElement = new DummyElement(tokens.read()); |
| 592 Continuation cont = name2variable[tokens.read()]; |
| 593 assert(cont != null); |
| 594 |
| 595 tokens.consumeEnd(); |
| 596 return new GetLazyStatic(fieldElement, cont, null); |
583 } | 597 } |
584 | 598 |
585 /// (LetPrim (name primitive) body) | 599 /// (LetPrim (name primitive) body) |
586 LetPrim parseLetPrim() { | 600 LetPrim parseLetPrim() { |
587 tokens.consumeStart(LET_PRIM); | 601 tokens.consumeStart(LET_PRIM); |
588 | 602 |
589 // (name | 603 // (name |
590 tokens.consumeStart(); | 604 tokens.consumeStart(); |
591 String name = tokens.read(); | 605 String name = tokens.read(); |
592 | 606 |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 /// (GetStatic field) | 764 /// (GetStatic field) |
751 GetStatic parseGetStatic() { | 765 GetStatic parseGetStatic() { |
752 tokens.consumeStart(GET_STATIC); | 766 tokens.consumeStart(GET_STATIC); |
753 | 767 |
754 Element field = new DummyElement(tokens.read()); | 768 Element field = new DummyElement(tokens.read()); |
755 | 769 |
756 tokens.consumeEnd(); | 770 tokens.consumeEnd(); |
757 return new GetStatic(field, null); | 771 return new GetStatic(field, null); |
758 } | 772 } |
759 } | 773 } |
OLD | NEW |