| 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 */ |
| 11 | 11 |
| 12 // TODO(leafp): Consider splitting some of this out. | 12 // TODO(leafp): Consider splitting some of this out. |
| 13 dart_library.library('dart_runtime/_classes', null, /* Imports */[ | 13 dart_library.library('dart_runtime/_classes', null, /* Imports */[ |
| 14 ], /* Lazy Imports */[ | 14 ], /* Lazy Imports */[ |
| 15 'dart/core', | 15 'dart/core', |
| 16 'dart/_interceptors', | 16 'dart/_interceptors', |
| 17 'dart_runtime/_types', | 17 'dart_runtime/_types', |
| 18 'dart_runtime/_rtti', | 18 'dart_runtime/_rtti', |
| 19 ], function(exports, core, _interceptors, types, rtti) { | 19 ], function(exports, core, _interceptors, types, rtti) { |
| 20 'use strict'; | 20 'use strict'; |
| 21 | 21 |
| 22 const assert = dart_utils.assert; | 22 const assert = dart_utils.assert; |
| 23 const copyProperties = dart_utils.copyProperties; | 23 const copyProperties = dart_utils.copyProperties; |
| 24 const copyTheseProperties = dart_utils.copyTheseProperties; | 24 const copyTheseProperties = dart_utils.copyTheseProperties; |
| 25 const defineMemoizedGetter = dart_utils.defineMemoizedGetter; | 25 const defineMemoizedGetter = dart_utils.defineMemoizedGetter; |
| 26 const safeGetOwnProperty = dart_utils.safeGetOwnProperty; | 26 const safeGetOwnProperty = dart_utils.safeGetOwnProperty; |
| 27 const throwError = dart_utils.throwError; | 27 const throwInternalError = dart_utils.throwInternalError; |
| 28 | 28 |
| 29 const defineProperty = Object.defineProperty; | 29 const defineProperty = Object.defineProperty; |
| 30 const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; | 30 const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; |
| 31 const getOwnPropertySymbols = Object.getOwnPropertySymbols; | 31 const getOwnPropertySymbols = Object.getOwnPropertySymbols; |
| 32 | 32 |
| 33 const slice = [].slice; | 33 const slice = [].slice; |
| 34 | 34 |
| 35 /** The Symbol for storing type arguments on a specialized generic type. */ | 35 /** The Symbol for storing type arguments on a specialized generic type. */ |
| 36 const _mixins = Symbol('mixins'); | 36 const _mixins = Symbol('mixins'); |
| 37 const _implements = Symbol('implements'); | 37 const _implements = Symbol('implements'); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 exports.getImplements = getImplements; | 103 exports.getImplements = getImplements; |
| 104 | 104 |
| 105 /** The Symbol for storing type arguments on a specialized generic type. */ | 105 /** The Symbol for storing type arguments on a specialized generic type. */ |
| 106 let _typeArguments = Symbol('typeArguments'); | 106 let _typeArguments = Symbol('typeArguments'); |
| 107 let _originalDeclaration = Symbol('originalDeclaration'); | 107 let _originalDeclaration = Symbol('originalDeclaration'); |
| 108 | 108 |
| 109 /** Memoize a generic type constructor function. */ | 109 /** Memoize a generic type constructor function. */ |
| 110 function generic(typeConstructor) { | 110 function generic(typeConstructor) { |
| 111 let length = typeConstructor.length; | 111 let length = typeConstructor.length; |
| 112 if (length < 1) { | 112 if (length < 1) { |
| 113 throwError('must have at least one generic type argument'); | 113 throwInternalError('must have at least one generic type argument'); |
| 114 } | 114 } |
| 115 let resultMap = new Map(); | 115 let resultMap = new Map(); |
| 116 function makeGenericType(/*...arguments*/) { | 116 function makeGenericType(/*...arguments*/) { |
| 117 if (arguments.length != length && arguments.length != 0) { | 117 if (arguments.length != length && arguments.length != 0) { |
| 118 throwError('requires ' + length + ' or 0 type arguments'); | 118 throwInternalError('requires ' + length + ' or 0 type arguments'); |
| 119 } | 119 } |
| 120 let args = slice.call(arguments); | 120 let args = slice.call(arguments); |
| 121 while (args.length < length) args.push(types.dynamic); | 121 while (args.length < length) args.push(types.dynamic); |
| 122 | 122 |
| 123 let value = resultMap; | 123 let value = resultMap; |
| 124 for (let i = 0; i < length; i++) { | 124 for (let i = 0; i < length; i++) { |
| 125 let arg = args[i]; | 125 let arg = args[i]; |
| 126 if (arg == null) { | 126 if (arg == null) { |
| 127 throwError('type arguments should not be null: ' | 127 throwInternalError('type arguments should not be null: ' |
| 128 + typeConstructor); | 128 + typeConstructor); |
| 129 } | 129 } |
| 130 let map = value; | 130 let map = value; |
| 131 value = map.get(arg); | 131 value = map.get(arg); |
| 132 if (value === void 0) { | 132 if (value === void 0) { |
| 133 if (i + 1 == length) { | 133 if (i + 1 == length) { |
| 134 value = typeConstructor.apply(null, args); | 134 value = typeConstructor.apply(null, args); |
| 135 // Save the type constructor and arguments for reflection. | 135 // Save the type constructor and arguments for reflection. |
| 136 if (value) { | 136 if (value) { |
| 137 value[_typeArguments] = args; | 137 value[_typeArguments] = args; |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 } | 399 } |
| 400 exports.list = list; | 400 exports.list = list; |
| 401 | 401 |
| 402 function setBaseClass(derived, base) { | 402 function setBaseClass(derived, base) { |
| 403 // Link the extension to the type it's extending as a base class. | 403 // Link the extension to the type it's extending as a base class. |
| 404 derived.prototype.__proto__ = base.prototype; | 404 derived.prototype.__proto__ = base.prototype; |
| 405 } | 405 } |
| 406 exports.setBaseClass = setBaseClass; | 406 exports.setBaseClass = setBaseClass; |
| 407 | 407 |
| 408 }); | 408 }); |
| OLD | NEW |