OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 part of dart._runtime; | 4 part of dart._runtime; |
5 | 5 |
6 /// This library defines a set of general javascript utilities for us | 6 /// This library defines a set of general javascript utilities for us |
7 /// by the Dart runtime. | 7 /// by the Dart runtime. |
8 // TODO(ochafik): Rewrite some of these in Dart when possible. | 8 // TODO(ochafik): Rewrite some of these in Dart when possible. |
9 | 9 |
10 final defineProperty = JS('', 'Object.defineProperty'); | 10 final defineProperty = JS('', 'Object.defineProperty'); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 void defineLazy(to, from) => JS('', '''(() => { | 76 void defineLazy(to, from) => JS('', '''(() => { |
77 for (let name of $getOwnNamesAndSymbols($from)) { | 77 for (let name of $getOwnNamesAndSymbols($from)) { |
78 $defineLazyProperty($to, name, $getOwnPropertyDescriptor($from, name)); | 78 $defineLazyProperty($to, name, $getOwnPropertyDescriptor($from, name)); |
79 } | 79 } |
80 })()'''); | 80 })()'''); |
81 | 81 |
82 defineMemoizedGetter(obj, String name, getter) => JS('', '''(() => { | 82 defineMemoizedGetter(obj, String name, getter) => JS('', '''(() => { |
83 return $defineLazyProperty($obj, $name, {get: $getter}); | 83 return $defineLazyProperty($obj, $name, {get: $getter}); |
84 })()'''); | 84 })()'''); |
85 | 85 |
| 86 |
| 87 // TODO(jmesserly): don't stomp on native Symbol.iterator. |
| 88 // We need to find a better solution for this. |
| 89 // See: https://github.com/dart-lang/dev_compiler/issues/487 |
86 copyTheseProperties(to, from, names) => JS('', '''(() => { | 90 copyTheseProperties(to, from, names) => JS('', '''(() => { |
87 for (let name of $names) { | 91 for (let name of $names) { |
88 var desc = $getOwnPropertyDescriptor($from, name); | 92 let desc = $getOwnPropertyDescriptor($from, name); |
89 if (desc != void 0) { | 93 if (desc != void 0) { |
| 94 if (name == Symbol.iterator) { |
| 95 // On native types, Symbol.iterator may already be present. |
| 96 let existing = $getOwnPropertyDescriptor($to, name); |
| 97 if (existing != null) { |
| 98 if (existing.writable) $to[Symbol.iterator] = desc.value; |
| 99 continue; |
| 100 } |
| 101 } |
90 $defineProperty($to, name, desc); | 102 $defineProperty($to, name, desc); |
91 } else { | 103 } else { |
92 $defineLazyProperty($to, name, () => $from[name]); | 104 $defineLazyProperty($to, name, () => $from[name]); |
93 } | 105 } |
94 } | 106 } |
95 return $to; | 107 return $to; |
96 })()'''); | 108 })()'''); |
97 | 109 |
98 /// Copy properties from source to destination object. | 110 /// Copy properties from source to destination object. |
99 /// This operation is commonly called `mixin` in JS. | 111 /// This operation is commonly called `mixin` in JS. |
100 copyProperties(to, from) => JS('', '''(() => { | 112 copyProperties(to, from) => JS('', '''(() => { |
101 return $copyTheseProperties($to, $from, $getOwnNamesAndSymbols($from)); | 113 return $copyTheseProperties($to, $from, $getOwnNamesAndSymbols($from)); |
102 })()'''); | 114 })()'''); |
103 | |
104 /// Exports from one Dart module to another. | |
105 @JSExportName('export') | |
106 export_(to, from, show, hide) => JS('', '''(() => { | |
107 if ($show == void 0 || $show.length == 0) { | |
108 $show = $getOwnNamesAndSymbols($from); | |
109 } | |
110 if ($hide != void 0) { | |
111 var hideMap = new Set($hide); | |
112 $show = $show.filter((k) => !hideMap.has(k)); | |
113 } | |
114 return $copyTheseProperties($to, $from, $show); | |
115 })()'''); | |
OLD | NEW |