OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library type_graph_inferrer; | 5 library type_graph_inferrer; |
6 | 6 |
7 import 'dart:collection' show Queue, IterableBase; | 7 import 'dart:collection' show Queue, IterableBase; |
8 import '../dart_types.dart' show DartType, InterfaceType, TypeKind; | 8 import '../dart_types.dart' show DartType, InterfaceType, TypeKind; |
9 import '../elements/elements.dart'; | 9 import '../elements/elements.dart'; |
10 import '../tree/tree.dart' show LiteralList, Node; | 10 import '../tree/tree.dart' show LiteralList, Node; |
11 import '../types/types.dart' show TypeMask, ContainerTypeMask, TypesInferrer; | 11 import '../types/types.dart' show TypeMask, ContainerTypeMask, TypesInferrer; |
12 import '../universe/universe.dart' show Selector, TypedSelector, SideEffects; | 12 import '../universe/universe.dart' show Selector, TypedSelector, SideEffects; |
13 import '../dart2jslib.dart' show Compiler, TreeElementMapping; | 13 import '../dart2jslib.dart' show Compiler, TreeElementMapping; |
14 import 'inferrer_visitor.dart' show TypeSystem, ArgumentsTypes; | 14 import 'inferrer_visitor.dart' show TypeSystem, ArgumentsTypes; |
15 import '../native_handler.dart' as native; | 15 import '../native_handler.dart' as native; |
16 import '../util/util.dart' show Spannable, Setlet; | 16 import '../util/util.dart' show Spannable, Setlet; |
17 import 'simple_types_inferrer.dart'; | 17 import 'simple_types_inferrer.dart'; |
18 import 'ir_type_inferrer.dart'; | |
18 import '../dart2jslib.dart' show invariant; | 19 import '../dart2jslib.dart' show invariant; |
19 | 20 |
20 part 'type_graph_nodes.dart'; | 21 part 'type_graph_nodes.dart'; |
21 part 'container_tracer.dart'; | 22 part 'container_tracer.dart'; |
22 | 23 |
23 /** | 24 /** |
24 * A set of selector names that [List] implements, that we know return | 25 * A set of selector names that [List] implements, that we know return |
25 * their element type. | 26 * their element type. |
26 */ | 27 */ |
27 Set<Selector> returnsElementTypeSet = new Set<Selector>.from( | 28 Set<Selector> returnsElementTypeSet = new Set<Selector>.from( |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
461 compiler.log('Inferred $overallRefineCount types.'); | 462 compiler.log('Inferred $overallRefineCount types.'); |
462 | 463 |
463 processLoopInformation(); | 464 processLoopInformation(); |
464 } | 465 } |
465 | 466 |
466 void analyze(Element element) { | 467 void analyze(Element element) { |
467 element = element.implementation; | 468 element = element.implementation; |
468 if (analyzedElements.contains(element)) return; | 469 if (analyzedElements.contains(element)) return; |
469 analyzedElements.add(element); | 470 analyzedElements.add(element); |
470 | 471 |
471 SimpleTypeInferrerVisitor visitor = | 472 var visitor; |
472 new SimpleTypeInferrerVisitor(element, compiler, this); | 473 if (element.hasIrNode(compiler)) { |
474 visitor = new IrTypeInferrerVisitor(compiler, element, this); | |
475 } else { | |
476 visitor = new SimpleTypeInferrerVisitor(element, compiler, this); | |
477 } | |
478 // SimpleTypeInferrerVisitor visitor = | |
ngeoffray
2013/11/21 15:02:05
Remove commented code.
lukas
2013/11/21 17:14:27
Done.
| |
479 // new SimpleTypeInferrerVisitor(element, compiler, this); | |
473 TypeInformation type; | 480 TypeInformation type; |
474 compiler.withCurrentElement(element, () { | 481 compiler.withCurrentElement(element, () { |
475 type = visitor.run(); | 482 type = visitor.run(); |
476 }); | 483 }); |
477 addedInGraph++; | 484 addedInGraph++; |
478 | 485 |
479 if (element.isField()) { | 486 if (element.isField()) { |
480 Node node = element.parseNode(compiler); | 487 Node node = element.parseNode(compiler); |
481 if (element.modifiers.isFinal() || element.modifiers.isConst()) { | 488 if (element.modifiers.isFinal() || element.modifiers.isConst()) { |
482 // If [element] is final and has an initializer, we record | 489 // If [element] is final and has an initializer, we record |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
673 } | 680 } |
674 | 681 |
675 bool recordType(Element element, TypeInformation type) { | 682 bool recordType(Element element, TypeInformation type) { |
676 types.getInferredTypeOf(element).addAssignment(type); | 683 types.getInferredTypeOf(element).addAssignment(type); |
677 return false; | 684 return false; |
678 } | 685 } |
679 | 686 |
680 void recordReturnType(Element element, TypeInformation type) { | 687 void recordReturnType(Element element, TypeInformation type) { |
681 TypeInformation info = types.getInferredTypeOf(element); | 688 TypeInformation info = types.getInferredTypeOf(element); |
682 if (element.name == '==') { | 689 if (element.name == '==') { |
690 // Even if x.== doesn't return a bool, 'x == null' evaluates to 'false'. | |
683 info.addAssignment(types.boolType); | 691 info.addAssignment(types.boolType); |
684 } | 692 } |
685 // TODO(ngeoffray): Clean up. We do these checks because | 693 // TODO(ngeoffray): Clean up. We do these checks because |
686 // [SimpleTypesInferrer] deals with two different inferrers. | 694 // [SimpleTypesInferrer] deals with two different inferrers. |
687 if (type == null) return; | 695 if (type == null) return; |
688 if (info.assignments.isEmpty) info.addAssignment(type); | 696 if (info.assignments.isEmpty) info.addAssignment(type); |
689 } | 697 } |
690 | 698 |
691 TypeInformation addReturnTypeFor(Element element, | 699 TypeInformation addReturnTypeFor(Element element, |
692 TypeInformation unused, | 700 TypeInformation unused, |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
912 throw new UnsupportedError( | 920 throw new UnsupportedError( |
913 "Cannot query the type inferrer when type inference is disabled."); | 921 "Cannot query the type inferrer when type inference is disabled."); |
914 } | 922 } |
915 return inferrer.getCallersOf(element); | 923 return inferrer.getCallersOf(element); |
916 } | 924 } |
917 | 925 |
918 void clear() { | 926 void clear() { |
919 inferrer.clear(); | 927 inferrer.clear(); |
920 } | 928 } |
921 } | 929 } |
OLD | NEW |