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 | 4 |
5 /// This library defines the operations that define and manipulate Dart | 5 /// This library defines the operations that define and manipulate Dart |
6 /// classes. Included in this are: | 6 /// classes. Included in this are: |
7 /// - Generics | 7 /// - Generics |
8 /// - Class metadata | 8 /// - Class metadata |
9 /// - Extension methods | 9 /// - Extension methods |
10 /// | 10 /// |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 $_setConstructorSignature($f, constructors); | 223 $_setConstructorSignature($f, constructors); |
224 $_setMethodSignature($f, methods); | 224 $_setMethodSignature($f, methods); |
225 $_setStaticSignature($f, statics); | 225 $_setStaticSignature($f, statics); |
226 $_setStaticTypes($f, names); | 226 $_setStaticTypes($f, names); |
227 $tagMemoized($f, () => $Type); | 227 $tagMemoized($f, () => $Type); |
228 })()'''); | 228 })()'''); |
229 | 229 |
230 hasMethod(obj, name) => JS('', '$getMethodType($obj, $name) !== void 0'); | 230 hasMethod(obj, name) => JS('', '$getMethodType($obj, $name) !== void 0'); |
231 | 231 |
232 /// | 232 /// |
233 /// This is called whenever a derived class needs to introduce a new field, | |
234 /// shadowing a field or getter/setter pair on its parent. | |
235 /// | |
236 /// This is important because otherwise, trying to read or write the field | |
237 /// would end up calling the getter or setter, and one of those might not even | |
238 /// exist, resulting in a runtime error. Even if they did exist, that's the | |
239 /// wrong behavior if a new field was declared. | |
240 /// | |
241 virtualField(subclass, fieldName) => JS('', '''(() => { | |
242 // If the field is already overridden, do nothing. | |
243 let prop = $getOwnPropertyDescriptor($subclass.prototype, $fieldName); | |
244 if (prop) return; | |
245 | |
246 let symbol = Symbol($subclass.name + '.' + $fieldName.toString()); | |
247 $defineProperty($subclass.prototype, $fieldName, { | |
248 get: function() { return this[symbol]; }, | |
249 set: function(x) { this[symbol] = x; } | |
250 }); | |
251 })()'''); | |
252 | |
253 /// | |
254 /// Given a class and an initializer method name, creates a constructor | 233 /// Given a class and an initializer method name, creates a constructor |
255 /// function with the same name. For example `new SomeClass.name(args)`. | 234 /// function with the same name. For example `new SomeClass.name(args)`. |
256 /// | 235 /// |
257 defineNamedConstructor(clazz, name) => JS('', '''(() => { | 236 defineNamedConstructor(clazz, name) => JS('', '''(() => { |
258 let proto = $clazz.prototype; | 237 let proto = $clazz.prototype; |
259 let initMethod = proto[$name]; | 238 let initMethod = proto[$name]; |
260 let ctor = function() { return initMethod.apply(this, arguments); }; | 239 let ctor = function() { return initMethod.apply(this, arguments); }; |
261 ctor.prototype = proto; | 240 ctor.prototype = proto; |
262 // Use defineProperty so we don't hit a property defined on Function, | 241 // Use defineProperty so we don't hit a property defined on Function, |
263 // like `caller` and `arguments`. | 242 // like `caller` and `arguments`. |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 })()'''); | 351 })()'''); |
373 | 352 |
374 /// Sets the element type of a list literal. | 353 /// Sets the element type of a list literal. |
375 list(obj, elementType) => | 354 list(obj, elementType) => |
376 JS('', '$setType($obj, ${getGenericClass(JSArray)}($elementType))'); | 355 JS('', '$setType($obj, ${getGenericClass(JSArray)}($elementType))'); |
377 | 356 |
378 setBaseClass(derived, base) => JS('', '''(() => { | 357 setBaseClass(derived, base) => JS('', '''(() => { |
379 // Link the extension to the type it's extending as a base class. | 358 // Link the extension to the type it's extending as a base class. |
380 $derived.prototype.__proto__ = $base.prototype; | 359 $derived.prototype.__proto__ = $base.prototype; |
381 })()'''); | 360 })()'''); |
OLD | NEW |