Chromium Code Reviews| 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 11 matching lines...) Expand all Loading... | |
| 22 /// superclass (prototype). | 22 /// superclass (prototype). |
| 23 /// | 23 /// |
| 24 mixin(base, @rest mixins) => JS( | 24 mixin(base, @rest mixins) => JS( |
| 25 '', | 25 '', |
| 26 '''(() => { | 26 '''(() => { |
| 27 // Create an initializer for the mixin, so when derived constructor calls | 27 // Create an initializer for the mixin, so when derived constructor calls |
| 28 // super, we can correctly initialize base and mixins. | 28 // super, we can correctly initialize base and mixins. |
| 29 | 29 |
| 30 // Create a class that will hold all of the mixin methods. | 30 // Create a class that will hold all of the mixin methods. |
| 31 class Mixin extends $base {} | 31 class Mixin extends $base {} |
| 32 // Save the original constructor. For ClassTypeAlias definitions, this | |
| 33 // is the concrete type. We embed metadata (e.g., implemented interfaces) | |
| 34 // on this constructor and need to access that from runtime instances. | |
| 35 var constructor = Mixin.prototype.constructor; | |
| 32 // Copy each mixin's methods, with later ones overwriting earlier entries. | 36 // Copy each mixin's methods, with later ones overwriting earlier entries. |
| 33 for (let m of $mixins) { | 37 for (let m of $mixins) { |
| 34 $copyProperties(Mixin.prototype, m.prototype); | 38 $copyProperties(Mixin.prototype, m.prototype); |
|
Jennifer Messerly
2017/03/28 20:47:48
hmm, maybe just skip "constructor" when copying pr
| |
| 35 } | 39 } |
| 40 // Restore original Mixin constructor. | |
| 41 Mixin.prototype.constructor = constructor; | |
| 36 // Initializer method: run mixin initializers, then the base. | 42 // Initializer method: run mixin initializers, then the base. |
| 37 Mixin.prototype.new = function(...args) { | 43 Mixin.prototype.new = function(...args) { |
| 38 // Run mixin initializers. They cannot have arguments. | 44 // Run mixin initializers. They cannot have arguments. |
| 39 // Run them backwards so most-derived mixin is initialized first. | 45 // Run them backwards so most-derived mixin is initialized first. |
| 40 for (let i = $mixins.length - 1; i >= 0; i--) { | 46 for (let i = $mixins.length - 1; i >= 0; i--) { |
| 41 $mixins[i].prototype.new.call(this); | 47 $mixins[i].prototype.new.call(this); |
| 42 } | 48 } |
| 43 // Run base initializer. | 49 // Run base initializer. |
| 44 $base.prototype.new.apply(this, args); | 50 $base.prototype.new.apply(this, args); |
| 45 }; | 51 }; |
| (...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 638 '''(() => { | 644 '''(() => { |
| 639 let values = []; | 645 let values = []; |
| 640 for (var i = 0; i < $names.length; i++) { | 646 for (var i = 0; i < $names.length; i++) { |
| 641 let value = $const_(new $enumClass(i)); | 647 let value = $const_(new $enumClass(i)); |
| 642 values.push(value); | 648 values.push(value); |
| 643 Object.defineProperty($enumClass, $names[i], | 649 Object.defineProperty($enumClass, $names[i], |
| 644 { value: value, configurable: true }); | 650 { value: value, configurable: true }); |
| 645 } | 651 } |
| 646 $enumClass.values = $constList(values, $enumClass); | 652 $enumClass.values = $constList(values, $enumClass); |
| 647 })()'''); | 653 })()'''); |
| OLD | NEW |