Index: compiler/lib/implementation/rtt.js |
diff --git a/compiler/lib/implementation/rtt.js b/compiler/lib/implementation/rtt.js |
deleted file mode 100644 |
index b1e7450de0537633c19b6070c0bcd23cd1e2583d..0000000000000000000000000000000000000000 |
--- a/compiler/lib/implementation/rtt.js |
+++ /dev/null |
@@ -1,441 +0,0 @@ |
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-// The following methods are used to handle type information |
-// |
- |
-/** |
- * @constructor |
- * @param {string} classkey |
- * @param {string=} typekey |
- * @param {Array.<RTT>=} typeargs |
- * @param {RTT} returnType |
- * @param {bool} functionType |
- * @param {string=} named optional |
- */ |
-function RTT(classkey, typekey, typeargs, returnType, functionType, named) { |
- this.classKey = classkey; |
- this.typeKey = typekey ? typekey : classkey; |
- this.typeArgs = typeargs; |
- this.returnType = returnType; // key for the return type |
- this.named = named; |
- this.implementedTypes = {}; |
- this.functionType = functionType; |
- // Add self |
- this.implementedTypes[classkey] = this; |
- // Add Object |
- if (!functionType && classkey != $cls('Object')) { |
- this.implementedTypes[$cls('Object')] = RTT.objectType; |
- } |
-} |
- |
-/** @type {Object.<string, Object>} */ |
-RTT.types = {}; |
- |
-/** @return {string} */ |
-RTT.prototype.toString = function() { return this.typeKey; } |
- |
-/** |
- * @param {*} value |
- * @return {boolean} Whether this type is implemented by the value |
- */ |
-RTT.prototype.implementedBy = function(value){ |
- return (value == null) ? RTT.nullInstanceOf(this) : |
- this.functionType ? this.implementedByTypeFunc(value) : |
- this.implementedByType(RTT.getTypeInfo(value)); |
-}; |
- |
-/** |
- * A helper function for safely looking up a value |
- * in a Object used as a map. |
- * @param {Object.<*>} map |
- * @param {srting} key |
- * @return {*} the value or null; |
- */ |
-function $mapLookup(map, key) { |
- return map.hasOwnProperty(key) ? map[key] : null; |
-} |
- |
-RTT.prototype.implementedByTypeSwitch = function(value){ |
- return this.functionType ? this.implementedByTypeFunc(value) : |
- this.implementedByType(value); |
-}; |
- |
-/** |
- * @param {!RTT} other |
- * @return {boolean} Whether this type is implement by other |
- */ |
-RTT.prototype.implementedByType = function(otherType) { |
- if (otherType === this || otherType === RTT.dynamicType.$lookupRTT(null,otherType.named)) { |
- return true; |
- } |
- var targetTypeInfo = $mapLookup(otherType.implementedTypes, this.classKey); |
- if (targetTypeInfo == null) { |
- return false; |
- } |
- if (targetTypeInfo.typeArgs && this.typeArgs) { |
- for(var i = this.typeArgs.length - 1; i >= 0; i--) { |
- if (!this.typeArgs[i].implementedByTypeSwitch(targetTypeInfo.typeArgs[i])) { |
- return false; |
- } |
- } |
- } |
- return true; |
-}; |
- |
-/** |
- * @param {!RTT} other |
- * @return {boolean} Whether this type is assignable by other |
- */ |
-RTT.prototype.assignableByType = function(otherType) { |
- if (otherType === this || otherType === RTT.dynamicType.$lookupRTT(null,otherType.named) |
- || this === RTT.dynamicType.$lookupRTT(null,this.named)) { |
- return true; |
- } |
- var targetTypeInfo = $mapLookup(otherType.implementedTypes, this.classKey); |
- if (targetTypeInfo == null) { |
- targetTypeInfo = $mapLookup(this.implementedTypes, otherType.classKey); |
- if (targetTypeInfo == null) { |
- return false; |
- } |
- } |
- if (targetTypeInfo.typeArgs && this.typeArgs) { |
- for(var i = this.typeArgs.length - 1; i >= 0; i--) { |
- if (!this.typeArgs[i].assignableByType(targetTypeInfo.typeArgs[i])) { |
- return false; |
- } |
- } |
- } |
- return true; |
-}; |
- |
- |
-/** |
- * @param {!RTT} other |
- * @return {boolean} Whether this type is implemented by other |
- */ |
-RTT.prototype.implementedByTypeFunc = function(otherType) { |
- if (otherType.$lookupRTT) { |
- otherType = otherType.$lookupRTT(); |
- } else if (!(otherType instanceof RTT)) { |
- return false; |
- } |
- if (otherType === this || otherType === RTT.dynamicType.$lookupRTT(null,otherType.named)) { |
- return true; |
- } |
- var props = Object.getOwnPropertyNames(otherType.implementedTypes); |
- NEXT_PROPERTY: for (var i = 0 ; i < props.length; i++) { |
- var mapped = otherType.implementedTypes[props[i]]; |
- if (mapped.returnType && this.returnType && |
- !this.returnType.assignableByType(mapped.returnType)) { |
- continue; |
- } |
- if (mapped.typeArgs && this.typeArgs) { |
- if (mapped.typeArgs.length < this.typeArgs.length) { |
- continue; |
- } |
- var named = false; |
- var x; |
- for (x = 0; x < this.typeArgs.length; x++) { |
- if (this.typeArgs[x].named || mapped.typeArgs[x].named) { |
- named = true; |
- break; |
- } |
- if (!this.typeArgs[x].assignableByType(mapped.typeArgs[x])) { |
- continue NEXT_PROPERTY; |
- } |
- } |
- if (!named && x < this.typeArgs.length) { |
- continue NEXT_PROPERTY; |
- } |
- for (; x < this.typeArgs.length; x++) { |
- if (!this.typeArgs[x].assignableByType(mapped.typeArgs[x]) |
- || !(this.typeArgs[x].named === mapped.typeArgs[x].named)) { |
- continue NEXT_PROPERTY; |
- } |
- } |
- } else if (mapped.typeArgs || this.typeArgs) { |
- continue NEXT_PROPERTY; |
- } |
- return true; |
- } |
- return false; |
-}; |
- |
-/** |
- * @return {string} the class name associated with this type |
- */ |
-RTT.prototype.getClassName = function() { |
- var name = this.classKey; |
- if (name.substr(0, 4) == "cls:") { |
- name = name.substr(4); |
- } |
- if (name.substr(-5) == "$Dart") { |
- name = name.substr(0, name.length - 5); |
- } |
- return name; |
-} |
- |
-/** |
- * @param {RTT} |
- * @return {boolean} |
- */ |
-RTT.nullInstanceOf = function(type) { |
- return type === RTT.objectType || type === RTT.dynamicType.$lookupRTT(null,type.named); |
-}; |
- |
-/** |
- * @param {*} value The value to retrieve type information for |
- * @return {RTT} |
- */ |
-RTT.getNativeTypeInfo = function(value) { |
- if (value instanceof Array) return Array.$lookupRTT(); |
- switch (typeof value) { |
- case 'string': return String.$lookupRTT(); |
- case 'number': return Number.$lookupRTT(); |
- case 'boolean': return Boolean.$lookupRTT(); |
- } |
- return RTT.placeholderType; |
-}; |
- |
-/** |
- * @param {string} name |
- * @param {function(RTT,Array.<RTT>)=} implementsSupplier |
- * @param {Array.<RTT>=} typeArgs |
- * @param {string} named optional value |
- * @return {RTT} The RTT information object |
- */ |
-RTT.create = function(name, implementsSupplier, typeArgs, named) { |
- if (name == $cls("Object") && !named) return RTT.objectType; |
- var typekey = RTT.getTypeKey(name, typeArgs, null, named); |
- var rtt = $mapLookup(RTT.types, typekey); |
- if (rtt) { |
- return rtt; |
- } |
- var classkey = RTT.getTypeKey(name); |
- rtt = new RTT(classkey, typekey, typeArgs, null, false, named); |
- RTT.types[typekey] = rtt; |
- if (implementsSupplier) { |
- implementsSupplier(rtt, typeArgs); |
- } |
- return rtt; |
-}; |
- |
-/** |
- * @param {Array.<RTT>=} typeArgs |
- * @param {<RTT>=} returnType (if defined) |
- * @param {string} named optional value |
- * @return {RTT} The RTT information object |
- */ |
-RTT.createFunction = function(typeArgs, returnType, named) { |
- var name = $cls("Function$Dart"); |
- var typekey = RTT.getTypeKey(name, typeArgs, returnType, named); |
- var rtt = $mapLookup(RTT.types, typekey); |
- if (rtt) { |
- return rtt; |
- } |
- var classkey = RTT.getTypeKey(name); |
- rtt = new RTT(classkey, typekey, typeArgs, returnType, true, named); |
- RTT.types[typekey] = rtt; |
- return rtt; |
-}; |
- |
-/** |
- * @param {RTT} old |
- * @param {string} named optional |
- * @return {RTT} The RTT information object with named |
- */ |
-RTT.clone = function(old, named) { |
- var name = old.getClassName(); |
- var typekey = RTT.getTypeKey(name, old.typeArgs, old.returnType, named); |
- var rtt = $mapLookup(RTT.types, typekey); |
- if (rtt) { |
- return rtt; |
- } |
- var classkey = RTT.getTypeKey(name); |
- rtt = new RTT(classkey, typekey, old.typeArgs, old.returnType, old.functionType, named); |
- RTT.types[typekey] = rtt; |
- rtt.implementedTypes = old.implementedTypes |
- return rtt; |
-}; |
- |
-/** |
- * @param {string} classkey |
- * @param {Array.<(RTT|string)>=} typeargs |
- * @param {string} returntype |
- * @param {string=} named optional |
- * @return {string} |
- */ |
-RTT.getTypeKey = function(classkey, typeargs, returntype, named) { |
- var key = classkey; |
- if (named) { |
- key += ":" + named; |
- } |
- if (typeargs) { |
- key += "<" + typeargs.join(",") + ">"; |
- } |
- if (returntype) { |
- key += "-><" + returntype + ">"; |
- } |
- return key; |
-}; |
- |
-/** |
- * @return {*} value |
- * @return {RTT} return the RTT information object for the value |
- */ |
-RTT.getTypeInfo = function(value) { |
- return (value.$typeInfo) ? value.$typeInfo : RTT.getNativeTypeInfo(value); |
-}; |
- |
-/** |
- * @param {Object} o |
- * @param {RTT} rtt |
- * Sets the RTT on the object and returns the object itself. |
- */ |
-RTT.setTypeInfo = function(o, rtt) { |
- o.$typeInfo = rtt; |
- return o; |
-}; |
- |
-/** |
- * @param {Object} o |
- * Removes any RTT from the object and returns the object itself. |
- */ |
-RTT.removeTypeInfo = function(o) { |
- o.$typeInfo = null; |
- return o; |
-}; |
- |
-/** |
- * The typeArg array is optional |
- * @param {Array.<RTT>=} typeArgs |
- * @param {number} i |
- * @param {string=} named optional |
- * @return {RTT} |
- */ |
-RTT.getTypeArg = function(typeArgs, i, named) { |
- if (typeArgs) { |
- if (typeArgs.length > i) { |
- if (named && named != typeArgs[i].named) { |
- return RTT.clone(typeArgs[i], named); |
- } |
- return typeArgs[i]; |
- } else { |
- throw new Error("Missing type arg"); |
- } |
- } |
- return RTT.dynamicType.$lookupRTT(null,named); |
-}; |
- |
-/** |
- * The typeArg array is optional |
- * @param {*} o |
- * @param {string} classkey |
- * @return {Array.<RTT>} |
- */ |
-RTT.getTypeArgsFor = function(o, classkey) { |
- var rtt = $mapLookup(RTT.getTypeInfo(o).implementedTypes, classkey); |
- if (!rtt) { |
- throw new Error("internal error: can not find " + |
- classkey + " in " + JSON.stringify(o)); |
- } |
- return rtt.typeArgs; |
-}; |
- |
-// Base types for runtime type information |
- |
-/** @type {!RTT} */ |
-function ImplementsAll(name,named) { |
- var typeKey = RTT.getTypeKey(name, null, null, named); |
- RTT.call(this,name,typeKey,null,null,null,named); |
-} |
-$inherits(ImplementsAll,RTT); |
-ImplementsAll.prototype.implementedBy = function(o) {return true}; |
-ImplementsAll.prototype.implementedByType = function(o) {return true}; |
- |
-RTT.objectType = new ImplementsAll($cls('Object')); |
-RTT.placeholderType = new ImplementsAll($cls('::')); |
- |
-function ImplementsDynamic(named) { |
- ImplementsAll.call(this,$cls('Dynamic'),named); |
-} |
-$inherits(ImplementsDynamic,ImplementsAll); |
-ImplementsDynamic.prototype.$lookupRTT = function(typeArgs, named) { |
- var typekey = RTT.getTypeKey($cls('Dynamic'), null, null, named); |
- var rtt = $mapLookup(RTT.types, typekey); |
- if (rtt) { |
- return rtt; |
- } |
- rtt = new ImplementsDynamic(named); |
- RTT.types[typekey] = rtt; |
- return rtt; |
-} |
-RTT.dynamicType = ImplementsDynamic.prototype.$lookupRTT(); |
- |
-/** |
- * Checks that a value is assignable to an expected type, and either returns that |
- * value if it is, or else throws a TypeMismatchException. |
- * |
- * @param {!RTT} the expected type |
- * @param {*} the value to check |
- * @return {*} the value |
- */ |
-function $chk(rtt, value) { |
- // null can be assigned to any type |
- if (value == $Dart$Null || rtt.implementedBy(value)) { |
- return value; |
- } |
- $te(rtt, value); |
-} |
- |
-/** |
- * Throw a TypeError. See core.dart for the ExceptionHelper class. |
- * |
- * @param {!RTT} the expected type |
- * @param {*) the value that failed |
- */ |
-function $te(rtt, value) { |
- var srcType = RTT.getTypeInfo(value).getClassName(); |
- var dstType = rtt.getClassName(); |
- var e = native_ExceptionHelper_createTypeError(srcType, dstType); |
- $Dart$ThrowException(e); |
-} |
- |
-// Setup the Function object |
-Function.prototype.$implements$Function$Dart = 1; |
-RTT.setTypeInfo(Function.prototype, RTT.create($cls('Function$Dart'))); |
- |
-/** |
- * @param {string} cls |
- * @return {string} |
- * @consistentIdGenerator |
- */ |
-function $cls(cls) { |
- return "cls:" + cls; |
-} |
- |
-/** |
- * @param {*} o |
- * @return {boolean} |
- */ |
-function $isBool(o) { |
- return typeof o == 'boolean'; |
-} |
- |
-/** |
- * @param {*} o |
- * @return {boolean} |
- */ |
-function $isNum(o) { |
- return typeof o == 'number'; |
-} |
- |
-/** |
- * @param {*} o |
- * @return {boolean} |
- */ |
-function $isString(o) { |
- return typeof o == 'string'; |
-} |