| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 kernel.transformations.method_call; | 5 library kernel.transformations.method_call; |
| 6 | 6 |
| 7 import 'dart:math' as math; | 7 import 'dart:math' as math; |
| 8 | 8 |
| 9 import '../ast.dart'; | 9 import '../ast.dart'; |
| 10 import '../class_hierarchy.dart'; | 10 import '../class_hierarchy.dart'; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 /// } | 46 /// } |
| 47 /// | 47 /// |
| 48 /// class B extends A { | 48 /// class B extends A { |
| 49 /// foo(required1) => print("Hello from class B"); | 49 /// foo(required1) => print("Hello from class B"); |
| 50 /// } | 50 /// } |
| 51 /// | 51 /// |
| 52 /// main() { | 52 /// main() { |
| 53 /// var b = new B(); | 53 /// var b = new B(); |
| 54 /// b.foo(499, named1: 88); | 54 /// b.foo(499, named1: 88); |
| 55 /// } | 55 /// } |
| 56 Program transformProgram(Program program, [debug = false]) { | 56 Program transformProgram(CoreTypes coreTypes, Program program, |
| 57 new MethodCallTransformer(debug).visitProgram(program); | 57 [debug = false]) { |
| 58 new MethodCallTransformer(coreTypes, debug).visitProgram(program); |
| 58 return program; | 59 return program; |
| 59 } | 60 } |
| 60 | 61 |
| 61 class MethodCallTransformer extends Transformer { | 62 class MethodCallTransformer extends Transformer { |
| 63 final CoreTypes coreTypes; |
| 64 |
| 62 /// Keep track of "visited" procedures and constructors to not visit already | 65 /// Keep track of "visited" procedures and constructors to not visit already |
| 63 /// visited stuff, nor visit newly created stubs. | 66 /// visited stuff, nor visit newly created stubs. |
| 64 Set<Member> _visited = new Set<Member>(); | 67 Set<Member> _visited = new Set<Member>(); |
| 65 | 68 |
| 66 /// Some things currently cannot be rewritten. Calls to methods called "call" | 69 /// Some things currently cannot be rewritten. Calls to methods called "call" |
| 67 /// (because invoking tear-offs and closures and whatnot becomes .call) | 70 /// (because invoking tear-offs and closures and whatnot becomes .call) |
| 68 /// as well as clashes with field names as a field can contain a function | 71 /// as well as clashes with field names as a field can contain a function |
| 69 /// and one can then do a clazz.fieldName(...). | 72 /// and one can then do a clazz.fieldName(...). |
| 70 Set<String> blacklistedSelectors = new Set<String>.from(["call"]); | 73 Set<String> blacklistedSelectors = new Set<String>.from(["call"]); |
| 71 | 74 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 98 /// For non-static method transformations: | 101 /// For non-static method transformations: |
| 99 /// Maps a procedure to the mapping of argument signature to procedure stub. | 102 /// Maps a procedure to the mapping of argument signature to procedure stub. |
| 100 Map<Procedure, Map<String, Procedure>> _superProcedureCalls = {}; | 103 Map<Procedure, Map<String, Procedure>> _superProcedureCalls = {}; |
| 101 | 104 |
| 102 /// Whether in debug mode, i.e. if we can insert extra print statements for | 105 /// Whether in debug mode, i.e. if we can insert extra print statements for |
| 103 /// debugging purposes. | 106 /// debugging purposes. |
| 104 bool _debug; | 107 bool _debug; |
| 105 | 108 |
| 106 /// For noSuchMethod calls. | 109 /// For noSuchMethod calls. |
| 107 ClassHierarchy hierarchy; | 110 ClassHierarchy hierarchy; |
| 108 CoreTypes coreTypes; | |
| 109 Constructor _invocationMirrorConstructor; // cached | 111 Constructor _invocationMirrorConstructor; // cached |
| 110 Procedure _listFrom; // cached | 112 Procedure _listFrom; // cached |
| 111 | 113 |
| 112 MethodCallTransformer(this._debug); | 114 MethodCallTransformer(this.coreTypes, this._debug); |
| 113 | 115 |
| 114 @override | 116 @override |
| 115 TreeNode visitProgram(Program node) { | 117 TreeNode visitProgram(Program node) { |
| 116 hierarchy = new ClassHierarchy(node); | 118 hierarchy = new ClassHierarchy(node); |
| 117 coreTypes = new CoreTypes(node); | |
| 118 | 119 |
| 119 // First move body of all procedures that takes optional positional or named | 120 // First move body of all procedures that takes optional positional or named |
| 120 // parameters and record which non-static procedure names have optional | 121 // parameters and record which non-static procedure names have optional |
| 121 // positional arguments. | 122 // positional arguments. |
| 122 // Do the same for constructors. Then also rewrite constructor initializers | 123 // Do the same for constructors. Then also rewrite constructor initializers |
| 123 // using LocalInitializer and sort named arguments in those initializers | 124 // using LocalInitializer and sort named arguments in those initializers |
| 124 for (final library in node.libraries) { | 125 for (final library in node.libraries) { |
| 125 for (final procedure in new List<Procedure>.from(library.procedures)) { | 126 for (final procedure in new List<Procedure>.from(library.procedures)) { |
| 126 _moveAndTransformProcedure(procedure); | 127 _moveAndTransformProcedure(procedure); |
| 127 } | 128 } |
| (...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1306 return printStackTrace; | 1307 return printStackTrace; |
| 1307 } | 1308 } |
| 1308 } | 1309 } |
| 1309 | 1310 |
| 1310 class _Pair<K, V> { | 1311 class _Pair<K, V> { |
| 1311 final K key; | 1312 final K key; |
| 1312 final V value; | 1313 final V value; |
| 1313 | 1314 |
| 1314 _Pair(this.key, this.value); | 1315 _Pair(this.key, this.value); |
| 1315 } | 1316 } |
| OLD | NEW |