| 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 // Run base initializer. | 43 // Run base initializer. |
| 44 $base.prototype.new.apply(this, args); | 44 $base.prototype.new.apply(this, args); |
| 45 }; | 45 }; |
| 46 | 46 |
| 47 // Set the signature of the Mixin class to be the composition | 47 // Set the signature of the Mixin class to be the composition |
| 48 // of the signatures of the mixins. | 48 // of the signatures of the mixins. |
| 49 $setSignature(Mixin, { | 49 $setSignature(Mixin, { |
| 50 methods: () => { | 50 methods: () => { |
| 51 let s = {}; | 51 let s = {}; |
| 52 for (let m of $mixins) { | 52 for (let m of $mixins) { |
| 53 $copyProperties(s, m[$_methodSig]); | 53 if (m[$_methodSig]) $copyProperties(s, m[$_methodSig]); |
| 54 } | 54 } |
| 55 return s; | 55 return s; |
| 56 }, | 56 }, |
| 57 fields: () => { | 57 fields: () => { |
| 58 let s = {}; | 58 let s = {}; |
| 59 for (let m of $mixins) { | 59 for (let m of $mixins) { |
| 60 $copyProperties(s, m[$_fieldSig]); | 60 if (m[$_fieldSig]) $copyProperties(s, m[$_fieldSig]); |
| 61 } | 61 } |
| 62 return s; | 62 return s; |
| 63 }, | 63 }, |
| 64 getters: () => { | 64 getters: () => { |
| 65 let s = {}; | 65 let s = {}; |
| 66 for (let m of $mixins) { | 66 for (let m of $mixins) { |
| 67 $copyProperties(s, m[$_getterSig]); | 67 if (m[$_getterSig]) $copyProperties(s, m[$_getterSig]); |
| 68 } | 68 } |
| 69 return s; | 69 return s; |
| 70 }, | 70 }, |
| 71 setters: () => { | 71 setters: () => { |
| 72 let s = {}; | 72 let s = {}; |
| 73 for (let m of $mixins) { | 73 for (let m of $mixins) { |
| 74 $copyProperties(s, m[$_setterSig]); | 74 if (m[$_setterSig]) $copyProperties(s, m[$_setterSig]); |
| 75 } | 75 } |
| 76 return s; | 76 return s; |
| 77 } | 77 } |
| 78 }); | 78 }); |
| 79 | 79 |
| 80 // Save mixins for reflection | 80 // Save mixins for reflection |
| 81 Mixin[$_mixins] = $mixins; | 81 Mixin[$_mixins] = $mixins; |
| 82 return Mixin; | 82 return Mixin; |
| 83 })()'''); | 83 })()'''); |
| 84 | 84 |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 let jsProto = $jsType.prototype; | 493 let jsProto = $jsType.prototype; |
| 494 | 494 |
| 495 // TODO(vsm): This sometimes doesn't exist on FF. These types will be | 495 // TODO(vsm): This sometimes doesn't exist on FF. These types will be |
| 496 // broken. | 496 // broken. |
| 497 if (!jsProto) return; | 497 if (!jsProto) return; |
| 498 | 498 |
| 499 // Mark the JS type's instances so we can easily check for extensions. | 499 // Mark the JS type's instances so we can easily check for extensions. |
| 500 jsProto[$_extensionType] = $dartExtType; | 500 jsProto[$_extensionType] = $dartExtType; |
| 501 $_installProperties(jsProto, extProto); | 501 $_installProperties(jsProto, extProto); |
| 502 function updateSig(sigF) { | 502 function updateSig(sigF) { |
| 503 let originalSigFn = $getOwnPropertyDescriptor($dartExtType, sigF).get; | 503 let originalDesc = $getOwnPropertyDescriptor($dartExtType, sigF); |
| 504 if (originalDesc === void 0) return; |
| 505 let originalSigFn = originalDesc.get; |
| 504 $assert_(originalSigFn); | 506 $assert_(originalSigFn); |
| 505 $defineMemoizedGetter($jsType, sigF, originalSigFn); | 507 $defineMemoizedGetter($jsType, sigF, originalSigFn); |
| 506 } | 508 } |
| 507 updateSig($_methodSig); | 509 updateSig($_methodSig); |
| 508 updateSig($_fieldSig); | 510 updateSig($_fieldSig); |
| 509 updateSig($_getterSig); | 511 updateSig($_getterSig); |
| 510 updateSig($_setterSig); | 512 updateSig($_setterSig); |
| 511 })()'''); | 513 })()'''); |
| 512 | 514 |
| 513 /// | 515 /// |
| (...skipping 24 matching lines...) Expand all Loading... |
| 538 $defineProperty(proto, $getExtensionSymbol(name), method); | 540 $defineProperty(proto, $getExtensionSymbol(name), method); |
| 539 } | 541 } |
| 540 // Ensure the signature is available too. | 542 // Ensure the signature is available too. |
| 541 // TODO(jmesserly): not sure if we can do this in a cleaner way. Essentially | 543 // TODO(jmesserly): not sure if we can do this in a cleaner way. Essentially |
| 542 // we need to copy the signature (and in the future, other data like | 544 // we need to copy the signature (and in the future, other data like |
| 543 // annotations) any time we copy a method as part of our metaprogramming. | 545 // annotations) any time we copy a method as part of our metaprogramming. |
| 544 // It might be more friendly to JS metaprogramming if we include this info | 546 // It might be more friendly to JS metaprogramming if we include this info |
| 545 // on the function. | 547 // on the function. |
| 546 | 548 |
| 547 function upgradeSig(sigF) { | 549 function upgradeSig(sigF) { |
| 548 let originalSigFn = $getOwnPropertyDescriptor($type, sigF).get; | 550 let originalSigDesc = $getOwnPropertyDescriptor($type, sigF); |
| 551 if (originalSigDesc === void 0) return; |
| 552 let originalSigFn = originalSigDesc.get; |
| 549 $defineMemoizedGetter(type, sigF, function() { | 553 $defineMemoizedGetter(type, sigF, function() { |
| 550 let sig = originalSigFn(); | 554 let sig = originalSigFn(); |
| 551 let propertyNames = Object.getOwnPropertyNames(sig); | 555 let propertyNames = Object.getOwnPropertyNames(sig); |
| 552 for (let name of methodNames) { | 556 for (let name of methodNames) { |
| 553 if (name in sig) { | 557 if (name in sig) { |
| 554 sig[$getExtensionSymbol(name)] = sig[name]; | 558 sig[$getExtensionSymbol(name)] = sig[name]; |
| 555 } | 559 } |
| 556 } | 560 } |
| 557 return sig; | 561 return sig; |
| 558 }); | 562 }); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 634 '''(() => { | 638 '''(() => { |
| 635 let values = []; | 639 let values = []; |
| 636 for (var i = 0; i < $names.length; i++) { | 640 for (var i = 0; i < $names.length; i++) { |
| 637 let value = $const_(new $enumClass(i)); | 641 let value = $const_(new $enumClass(i)); |
| 638 values.push(value); | 642 values.push(value); |
| 639 Object.defineProperty($enumClass, $names[i], | 643 Object.defineProperty($enumClass, $names[i], |
| 640 { value: value, configurable: true }); | 644 { value: value, configurable: true }); |
| 641 } | 645 } |
| 642 $enumClass.values = $constList(values, $enumClass); | 646 $enumClass.values = $constList(values, $enumClass); |
| 643 })()'''); | 647 })()'''); |
| OLD | NEW |