Index: utils/tip/toss.dart.js |
diff --git a/utils/tip/toss.dart.js b/utils/tip/toss.dart.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8e657bdb1d3ee72d5cbe27f00650bcb1ba89af14 |
--- /dev/null |
+++ b/utils/tip/toss.dart.js |
@@ -0,0 +1,13447 @@ |
+// ********** Library dart:core ************** |
+// ********** Natives dart:core ************** |
+/** |
+ * Generates a dynamic call stub for a function. |
+ * Our goal is to create a stub method like this on-the-fly: |
+ * function($0, $1, capture) { return this($0, $1, true, capture); } |
+ * |
+ * This stub then replaces the dynamic one on Function, with one that is |
+ * specialized for that particular function, taking into account its default |
+ * arguments. |
+ */ |
+Function.prototype.$genStub = function(argsLength, names) { |
+ // Fast path: if no named arguments and arg count matches |
+ if (this.length == argsLength && !names) { |
+ return this; |
+ } |
+ |
+ function $throwArgMismatch() { |
+ // TODO(jmesserly): better error message |
+ $throw(new ClosureArgumentMismatchException()); |
+ } |
+ |
+ var paramsNamed = this.$optional ? (this.$optional.length / 2) : 0; |
+ var paramsBare = this.length - paramsNamed; |
+ var argsNamed = names ? names.length : 0; |
+ var argsBare = argsLength - argsNamed; |
+ |
+ // Check we got the right number of arguments |
+ if (argsBare < paramsBare || argsLength > this.length || |
+ argsNamed > paramsNamed) { |
+ return $throwArgMismatch; |
+ } |
+ |
+ // First, fill in all of the default values |
+ var p = new Array(paramsBare); |
+ if (paramsNamed) { |
+ p = p.concat(this.$optional.slice(paramsNamed)); |
+ } |
+ // Fill in positional args |
+ var a = new Array(argsLength); |
+ for (var i = 0; i < argsBare; i++) { |
+ p[i] = a[i] = '$' + i; |
+ } |
+ // Then overwrite with supplied values for optional args |
+ var lastParameterIndex; |
+ var namesInOrder = true; |
+ for (var i = 0; i < argsNamed; i++) { |
+ var name = names[i]; |
+ a[i + argsBare] = name; |
+ var j = this.$optional.indexOf(name); |
+ if (j < 0 || j >= paramsNamed) { |
+ return $throwArgMismatch; |
+ } else if (lastParameterIndex && lastParameterIndex > j) { |
+ namesInOrder = false; |
+ } |
+ p[j + paramsBare] = name; |
+ lastParameterIndex = j; |
+ } |
+ |
+ if (this.length == argsLength && namesInOrder) { |
+ // Fast path #2: named arguments, but they're in order. |
+ return this; |
+ } |
+ |
+ // Note: using Function instead of 'eval' to get a clean scope. |
+ // TODO(jmesserly): evaluate the performance of these stubs. |
+ var f = 'function(' + a.join(',') + '){return $f(' + p.join(',') + ');}'; |
+ return new Function('$f', 'return ' + f + '').call(null, this); |
+} |
+function $throw(e) { |
+ // If e is not a value, we can use V8's captureStackTrace utility method. |
+ // TODO(jmesserly): capture the stack trace on other JS engines. |
+ if (e && (typeof e == 'object') && Error.captureStackTrace) { |
+ // TODO(jmesserly): this will clobber the e.stack property |
+ Error.captureStackTrace(e, $throw); |
+ } |
+ throw e; |
+} |
+Object.prototype.$index = function(i) { |
+ var proto = Object.getPrototypeOf(this); |
+ if (proto !== Object) { |
+ proto.$index = function(i) { return this[i]; } |
+ } |
+ return this[i]; |
+} |
+Array.prototype.$index = function(i) { return this[i]; } |
+String.prototype.$index = function(i) { return this[i]; } |
+Object.prototype.$setindex = function(i, value) { |
+ var proto = Object.getPrototypeOf(this); |
+ if (proto !== Object) { |
+ proto.$setindex = function(i, value) { return this[i] = value; } |
+ } |
+ return this[i] = value; |
+} |
+Array.prototype.$setindex = function(i, value) { return this[i] = value; } |
+function $eq(x, y) { |
+ if (x == null) return y == null; |
+ return (typeof(x) == 'number' && typeof(y) == 'number') || |
+ (typeof(x) == 'boolean' && typeof(y) == 'boolean') || |
+ (typeof(x) == 'string' && typeof(y) == 'string') |
+ ? x == y : x.$eq(y); |
+} |
+// TODO(jimhug): Should this or should it not match equals? |
+Object.prototype.$eq = function(other) { return this === other; } |
+function $mod(x, y) { |
+ if (typeof(x) == 'number' && typeof(y) == 'number') { |
+ var result = x % y; |
+ if (result == 0) { |
+ return 0; // Make sure we don't return -0.0. |
+ } else if (result < 0) { |
+ if (y < 0) { |
+ return result - y; |
+ } else { |
+ return result + y; |
+ } |
+ } |
+ return result; |
+ } else { |
+ return x.$mod(y); |
+ } |
+} |
+function $ne(x, y) { |
+ if (x == null) return y != null; |
+ return (typeof(x) == 'number' && typeof(y) == 'number') || |
+ (typeof(x) == 'boolean' && typeof(y) == 'boolean') || |
+ (typeof(x) == 'string' && typeof(y) == 'string') |
+ ? x != y : !x.$eq(y); |
+} |
+function $truncdiv(x, y) { |
+ if (typeof(x) == 'number' && typeof(y) == 'number') { |
+ if (y == 0) $throw(new IntegerDivisionByZeroException()); |
+ var tmp = x / y; |
+ return (tmp < 0) ? Math.ceil(tmp) : Math.floor(tmp); |
+ } else { |
+ return x.$truncdiv(y); |
+ } |
+} |
+// ********** Code for Object ************** |
+Object.prototype.get$dynamic = function() { |
+ return this; |
+} |
+Object.prototype.noSuchMethod = function(name, args) { |
+ $throw(new NoSuchMethodException(this, name, args)); |
+} |
+Object.prototype._checkExtends$0 = function() { |
+ return this.noSuchMethod("_checkExtends", []); |
+}; |
+Object.prototype._checkNonStatic$1 = function($0) { |
+ return this.noSuchMethod("_checkNonStatic", [$0]); |
+}; |
+Object.prototype._get$3 = function($0, $1, $2) { |
+ return this.noSuchMethod("_get", [$0, $1, $2]); |
+}; |
+Object.prototype._get$3$isDynamic = function($0, $1, $2, isDynamic) { |
+ return this.noSuchMethod("_get", [$0, $1, $2, isDynamic]); |
+}; |
+Object.prototype._get$4 = function($0, $1, $2, $3) { |
+ return this.noSuchMethod("_get", [$0, $1, $2, $3]); |
+}; |
+Object.prototype._set$4 = function($0, $1, $2, $3) { |
+ return this.noSuchMethod("_set", [$0, $1, $2, $3]); |
+}; |
+Object.prototype._set$4$isDynamic = function($0, $1, $2, $3, isDynamic) { |
+ return this.noSuchMethod("_set", [$0, $1, $2, $3, isDynamic]); |
+}; |
+Object.prototype._set$5 = function($0, $1, $2, $3, $4) { |
+ return this.noSuchMethod("_set", [$0, $1, $2, $3, $4]); |
+}; |
+Object.prototype._wrapDomCallback$2 = function($0, $1) { |
+ return this.noSuchMethod("_wrapDomCallback", [$0, $1]); |
+}; |
+Object.prototype.add$1 = function($0) { |
+ return this.noSuchMethod("add", [$0]); |
+}; |
+Object.prototype.addAll$1 = function($0) { |
+ return this.noSuchMethod("addAll", [$0]); |
+}; |
+Object.prototype.addDirectSubtype$1 = function($0) { |
+ return this.noSuchMethod("addDirectSubtype", [$0]); |
+}; |
+Object.prototype.addMethod$2 = function($0, $1) { |
+ return this.noSuchMethod("addMethod", [$0, $1]); |
+}; |
+Object.prototype.addSource$1 = function($0) { |
+ return this.noSuchMethod("addSource", [$0]); |
+}; |
+Object.prototype.block$0 = function() { |
+ return this.noSuchMethod("block", []); |
+}; |
+Object.prototype.canInvoke$2 = function($0, $1) { |
+ return this.noSuchMethod("canInvoke", [$0, $1]); |
+}; |
+Object.prototype.checkFirstClass$1 = function($0) { |
+ return this.noSuchMethod("checkFirstClass", [$0]); |
+}; |
+Object.prototype.compareTo$1 = function($0) { |
+ return this.noSuchMethod("compareTo", [$0]); |
+}; |
+Object.prototype.computeValue$0 = function() { |
+ return this.noSuchMethod("computeValue", []); |
+}; |
+Object.prototype.contains$1 = function($0) { |
+ return this.noSuchMethod("contains", [$0]); |
+}; |
+Object.prototype.containsKey$1 = function($0) { |
+ return this.noSuchMethod("containsKey", [$0]); |
+}; |
+Object.prototype.convertTo$3 = function($0, $1, $2) { |
+ return this.noSuchMethod("convertTo", [$0, $1, $2]); |
+}; |
+Object.prototype.convertTo$4 = function($0, $1, $2, $3) { |
+ return this.noSuchMethod("convertTo", [$0, $1, $2, $3]); |
+}; |
+Object.prototype.copyWithNewType$2 = function($0, $1) { |
+ return this.noSuchMethod("copyWithNewType", [$0, $1]); |
+}; |
+Object.prototype.end$0 = function() { |
+ return this.noSuchMethod("end", []); |
+}; |
+Object.prototype.endsWith$1 = function($0) { |
+ return this.noSuchMethod("endsWith", [$0]); |
+}; |
+Object.prototype.ensureSubtypeOf$3 = function($0, $1, $2) { |
+ return this.noSuchMethod("ensureSubtypeOf", [$0, $1, $2]); |
+}; |
+Object.prototype.every$1 = function($0) { |
+ return this.noSuchMethod("every", [$0]); |
+}; |
+Object.prototype.filter$1 = function($0) { |
+ return this.noSuchMethod("filter", [$0]); |
+}; |
+Object.prototype.findTypeByName$1 = function($0) { |
+ return this.noSuchMethod("findTypeByName", [$0]); |
+}; |
+Object.prototype.forEach$1 = function($0) { |
+ return this.noSuchMethod("forEach", [$0]); |
+}; |
+Object.prototype.genValue$2 = function($0, $1) { |
+ return this.noSuchMethod("genValue", [$0, $1]); |
+}; |
+Object.prototype.generate$1 = function($0) { |
+ return this.noSuchMethod("generate", [$0]); |
+}; |
+Object.prototype.getColumn$2 = function($0, $1) { |
+ return this.noSuchMethod("getColumn", [$0, $1]); |
+}; |
+Object.prototype.getConstructor$1 = function($0) { |
+ return this.noSuchMethod("getConstructor", [$0]); |
+}; |
+Object.prototype.getFactory$2 = function($0, $1) { |
+ return this.noSuchMethod("getFactory", [$0, $1]); |
+}; |
+Object.prototype.getKeys$0 = function() { |
+ return this.noSuchMethod("getKeys", []); |
+}; |
+Object.prototype.getLine$1 = function($0) { |
+ return this.noSuchMethod("getLine", [$0]); |
+}; |
+Object.prototype.getMember$1 = function($0) { |
+ return this.noSuchMethod("getMember", [$0]); |
+}; |
+Object.prototype.getOrMakeConcreteType$1 = function($0) { |
+ return this.noSuchMethod("getOrMakeConcreteType", [$0]); |
+}; |
+Object.prototype.getValues$0 = function() { |
+ return this.noSuchMethod("getValues", []); |
+}; |
+Object.prototype.get_$3 = function($0, $1, $2) { |
+ return this.noSuchMethod("get_", [$0, $1, $2]); |
+}; |
+Object.prototype.group$1 = function($0) { |
+ return this.noSuchMethod("group", [$0]); |
+}; |
+Object.prototype.hasNext$0 = function() { |
+ return this.noSuchMethod("hasNext", []); |
+}; |
+Object.prototype.hashCode$0 = function() { |
+ return this.noSuchMethod("hashCode", []); |
+}; |
+Object.prototype.indexOf$1 = function($0) { |
+ return this.noSuchMethod("indexOf", [$0]); |
+}; |
+Object.prototype.instanceOf$3$isTrue$forceCheck = function($0, $1, $2, isTrue, forceCheck) { |
+ return this.noSuchMethod("instanceOf", [$0, $1, $2, isTrue, forceCheck]); |
+}; |
+Object.prototype.instanceOf$4 = function($0, $1, $2, $3) { |
+ return this.noSuchMethod("instanceOf", [$0, $1, $2, $3]); |
+}; |
+Object.prototype.invoke$4 = function($0, $1, $2, $3) { |
+ return this.noSuchMethod("invoke", [$0, $1, $2, $3]); |
+}; |
+Object.prototype.invoke$4$isDynamic = function($0, $1, $2, $3, isDynamic) { |
+ return this.noSuchMethod("invoke", [$0, $1, $2, $3, isDynamic]); |
+}; |
+Object.prototype.invoke$5 = function($0, $1, $2, $3, $4) { |
+ return this.noSuchMethod("invoke", [$0, $1, $2, $3, $4]); |
+}; |
+Object.prototype.is$List = function() { |
+ return false; |
+}; |
+Object.prototype.is$RegExp = function() { |
+ return false; |
+}; |
+Object.prototype.isAssignable$1 = function($0) { |
+ return this.noSuchMethod("isAssignable", [$0]); |
+}; |
+Object.prototype.isEmpty$0 = function() { |
+ return this.noSuchMethod("isEmpty", []); |
+}; |
+Object.prototype.isFile$0 = function() { |
+ return this.noSuchMethod("isFile", []); |
+}; |
+Object.prototype.isSubtypeOf$1 = function($0) { |
+ return this.noSuchMethod("isSubtypeOf", [$0]); |
+}; |
+Object.prototype.iterator$0 = function() { |
+ return this.noSuchMethod("iterator", []); |
+}; |
+Object.prototype.last$0 = function() { |
+ return this.noSuchMethod("last", []); |
+}; |
+Object.prototype.markUsed$0 = function() { |
+ return this.noSuchMethod("markUsed", []); |
+}; |
+Object.prototype.namesInOrder$1 = function($0) { |
+ return this.noSuchMethod("namesInOrder", [$0]); |
+}; |
+Object.prototype.needsConversion$1 = function($0) { |
+ return this.noSuchMethod("needsConversion", [$0]); |
+}; |
+Object.prototype.next$0 = function() { |
+ return this.noSuchMethod("next", []); |
+}; |
+Object.prototype.provideFieldSyntax$0 = function() { |
+ return this.noSuchMethod("provideFieldSyntax", []); |
+}; |
+Object.prototype.providePropertySyntax$0 = function() { |
+ return this.noSuchMethod("providePropertySyntax", []); |
+}; |
+Object.prototype.removeLast$0 = function() { |
+ return this.noSuchMethod("removeLast", []); |
+}; |
+Object.prototype.replaceAll$2 = function($0, $1) { |
+ return this.noSuchMethod("replaceAll", [$0, $1]); |
+}; |
+Object.prototype.replaceFirst$2 = function($0, $1) { |
+ return this.noSuchMethod("replaceFirst", [$0, $1]); |
+}; |
+Object.prototype.resolve$0 = function() { |
+ return this.noSuchMethod("resolve", []); |
+}; |
+Object.prototype.resolveTypeParams$1 = function($0) { |
+ return this.noSuchMethod("resolveTypeParams", [$0]); |
+}; |
+Object.prototype.setDefinition$1 = function($0) { |
+ return this.noSuchMethod("setDefinition", [$0]); |
+}; |
+Object.prototype.set_$4 = function($0, $1, $2, $3) { |
+ return this.noSuchMethod("set_", [$0, $1, $2, $3]); |
+}; |
+Object.prototype.some$1 = function($0) { |
+ return this.noSuchMethod("some", [$0]); |
+}; |
+Object.prototype.sort$1 = function($0) { |
+ return this.noSuchMethod("sort", [$0]); |
+}; |
+Object.prototype.start$0 = function() { |
+ return this.noSuchMethod("start", []); |
+}; |
+Object.prototype.startsWith$1 = function($0) { |
+ return this.noSuchMethod("startsWith", [$0]); |
+}; |
+Object.prototype.substring$1 = function($0) { |
+ return this.noSuchMethod("substring", [$0]); |
+}; |
+Object.prototype.substring$2 = function($0, $1) { |
+ return this.noSuchMethod("substring", [$0, $1]); |
+}; |
+Object.prototype.toString$0 = function() { |
+ return this.toString(); |
+}; |
+Object.prototype.visit$1 = function($0) { |
+ return this.noSuchMethod("visit", [$0]); |
+}; |
+Object.prototype.visitBinaryExpression$1 = function($0) { |
+ return this.noSuchMethod("visitBinaryExpression", [$0]); |
+}; |
+Object.prototype.visitPostfixExpression$1 = function($0) { |
+ return this.noSuchMethod("visitPostfixExpression", [$0]); |
+}; |
+Object.prototype.visitSources$0 = function() { |
+ return this.noSuchMethod("visitSources", []); |
+}; |
+Object.prototype.writeDefinition$2 = function($0, $1) { |
+ return this.noSuchMethod("writeDefinition", [$0, $1]); |
+}; |
+// ********** Code for Clock ************** |
+function Clock() {} |
+Clock.now = function() { |
+ return new Date().getTime(); |
+} |
+Clock.frequency = function() { |
+ return 1000; |
+} |
+// ********** Code for NoSuchMethodException ************** |
+function NoSuchMethodException(_receiver, _functionName, _arguments) { |
+ this._receiver = _receiver; |
+ this._functionName = _functionName; |
+ this._arguments = _arguments; |
+ // Initializers done |
+} |
+NoSuchMethodException.prototype.toString = function() { |
+ var sb = new StringBufferImpl(""); |
+ for (var i = 0; |
+ i < this._arguments.length; i++) { |
+ if (i > 0) { |
+ sb.add(", "); |
+ } |
+ sb.add(this._arguments.$index(i)); |
+ } |
+ sb.add("]"); |
+ return ("NoSuchMethodException - receiver: '" + this._receiver + "' ") + ("function name: '" + this._functionName + "' arguments: [" + sb + "]"); |
+} |
+NoSuchMethodException.prototype.toString$0 = NoSuchMethodException.prototype.toString; |
+// ********** Code for ObjectNotClosureException ************** |
+function ObjectNotClosureException() { |
+ // Initializers done |
+} |
+ObjectNotClosureException.prototype.toString = function() { |
+ return "Object is not closure"; |
+} |
+ObjectNotClosureException.prototype.toString$0 = ObjectNotClosureException.prototype.toString; |
+// ********** Code for StackOverflowException ************** |
+function StackOverflowException() { |
+ // Initializers done |
+} |
+StackOverflowException.prototype.toString = function() { |
+ return "Stack Overflow"; |
+} |
+StackOverflowException.prototype.toString$0 = StackOverflowException.prototype.toString; |
+// ********** Code for BadNumberFormatException ************** |
+function BadNumberFormatException() {} |
+BadNumberFormatException.prototype.toString = function() { |
+ return ("BadNumberFormatException: '" + this._s + "'"); |
+} |
+BadNumberFormatException.prototype.toString$0 = BadNumberFormatException.prototype.toString; |
+// ********** Code for NullPointerException ************** |
+function NullPointerException() { |
+ // Initializers done |
+} |
+NullPointerException.prototype.toString = function() { |
+ return "NullPointerException"; |
+} |
+NullPointerException.prototype.toString$0 = NullPointerException.prototype.toString; |
+// ********** Code for NoMoreElementsException ************** |
+function NoMoreElementsException() { |
+ // Initializers done |
+} |
+NoMoreElementsException.prototype.toString = function() { |
+ return "NoMoreElementsException"; |
+} |
+NoMoreElementsException.prototype.toString$0 = NoMoreElementsException.prototype.toString; |
+// ********** Code for EmptyQueueException ************** |
+function EmptyQueueException() { |
+ // Initializers done |
+} |
+EmptyQueueException.prototype.toString = function() { |
+ return "EmptyQueueException"; |
+} |
+EmptyQueueException.prototype.toString$0 = EmptyQueueException.prototype.toString; |
+// ********** Code for Function ************** |
+Function.prototype.to$call$0 = function() { |
+ this.call$0 = this.$genStub(0); |
+ this.to$call$0 = function() { return this.call$0; }; |
+ return this.call$0; |
+}; |
+Function.prototype.call$0 = function() { |
+ return this.to$call$0()(); |
+}; |
+function to$call$0(f) { return f && f.to$call$0(); } |
+Function.prototype.to$call$1 = function() { |
+ this.call$1 = this.$genStub(1); |
+ this.to$call$1 = function() { return this.call$1; }; |
+ return this.call$1; |
+}; |
+Function.prototype.call$1 = function($0) { |
+ return this.to$call$1()($0); |
+}; |
+function to$call$1(f) { return f && f.to$call$1(); } |
+Function.prototype.to$call$2 = function() { |
+ this.call$2 = this.$genStub(2); |
+ this.to$call$2 = function() { return this.call$2; }; |
+ return this.call$2; |
+}; |
+Function.prototype.call$2 = function($0, $1) { |
+ return this.to$call$2()($0, $1); |
+}; |
+function to$call$2(f) { return f && f.to$call$2(); } |
+// ********** Code for Math ************** |
+Math.parseInt = function(str) { |
+ var ret = parseInt(str); |
+ if (isNaN(ret)) $throw(new BadNumberFormatException(str)); |
+ return ret; |
+} |
+Math.parseDouble = function(str) { |
+ var ret = parseFloat(str); |
+ if (isNaN(ret) && str != 'NaN') $throw(new BadNumberFormatException(str)); |
+ return ret; |
+} |
+Math.min = function(a, b) { |
+ if (a == b) return a; |
+ if (a < b) { |
+ if (isNaN(b)) return b; |
+ else return a; |
+ } |
+ if (isNaN(a)) return a; |
+ else return b; |
+} |
+// ********** Code for Strings ************** |
+function Strings() {} |
+Strings.join = function(strings, separator) { |
+ return StringBase.join(strings, separator); |
+} |
+// ********** Code for top level ************** |
+function print(obj) { |
+ return _print(obj); |
+} |
+function _print(obj) { |
+ if (typeof console == 'object') { |
+ if (obj) obj = obj.toString(); |
+ console.log(obj); |
+ } else { |
+ write(obj); |
+ write('\n'); |
+ } |
+} |
+function _map(itemsAndKeys) { |
+ var ret = new LinkedHashMapImplementation(); |
+ for (var i = 0; |
+ i < itemsAndKeys.length; ) { |
+ ret.$setindex(itemsAndKeys.$index(i++), itemsAndKeys.$index(i++)); |
+ } |
+ return ret; |
+} |
+function _toDartException(e) { |
+ function attachStack(dartEx) { |
+ // TODO(jmesserly): setting the stack property is not a long term solution. |
+ var stack = e.stack; |
+ // The stack contains the error message, and the stack is all that is |
+ // printed (the exception's toString() is never called). Make the Dart |
+ // exception's toString() be the dominant message. |
+ if (typeof stack == 'string') { |
+ var message = dartEx.toString(); |
+ if (/^(Type|Range)Error:/.test(stack)) { |
+ // Indent JS message (it can be helpful) so new message stands out. |
+ stack = ' (' + stack.substring(0, stack.indexOf('\n')) + ')\n' + |
+ stack.substring(stack.indexOf('\n') + 1); |
+ } |
+ stack = message + '\n' + stack; |
+ } |
+ dartEx.stack = stack; |
+ return dartEx; |
+ } |
+ |
+ if (e instanceof TypeError) { |
+ switch(e.type) { |
+ case 'property_not_function': |
+ case 'called_non_callable': |
+ if (e.arguments[0] == null) { |
+ return attachStack(new NullPointerException()); |
+ } else { |
+ return attachStack(new ObjectNotClosureException()); |
+ } |
+ break; |
+ case 'non_object_property_call': |
+ case 'non_object_property_load': |
+ return attachStack(new NullPointerException()); |
+ break; |
+ case 'undefined_method': |
+ var mname = e.arguments[0]; |
+ if (typeof(mname) == 'string' && (mname.indexOf('call$') == 0 |
+ || mname == 'call' || mname == 'apply')) { |
+ return attachStack(new ObjectNotClosureException()); |
+ } else { |
+ // TODO(jmesserly): fix noSuchMethod on operators so we don't hit this |
+ return attachStack(new NoSuchMethodException('', e.arguments[0], [])); |
+ } |
+ break; |
+ } |
+ } else if (e instanceof RangeError) { |
+ if (e.message.indexOf('call stack') >= 0) { |
+ return attachStack(new StackOverflowException()); |
+ } |
+ } |
+ return e; |
+} |
+// ********** Library dart:coreimpl ************** |
+// ********** Code for ListFactory ************** |
+ListFactory = Array; |
+ListFactory.prototype.is$List = function(){return true}; |
+ListFactory.ListFactory$from$factory = function(other) { |
+ var list = []; |
+ for (var $$i = other.iterator(); $$i.hasNext$0(); ) { |
+ var e = $$i.next$0(); |
+ list.add(e); |
+ } |
+ return list; |
+} |
+ListFactory.prototype.add = function(value) { |
+ this.push(value); |
+} |
+ListFactory.prototype.addLast = function(value) { |
+ this.push(value); |
+} |
+ListFactory.prototype.addAll = function(collection) { |
+ for (var $$i = collection.iterator(); $$i.hasNext$0(); ) { |
+ var item = $$i.next$0(); |
+ this.add(item); |
+ } |
+} |
+ListFactory.prototype.clear = function() { |
+ this.length = 0; |
+} |
+ListFactory.prototype.removeLast = function() { |
+ return this.pop(); |
+} |
+ListFactory.prototype.last = function() { |
+ return this[this.length - 1]; |
+} |
+ListFactory.prototype.getRange = function(start, length) { |
+ return this.slice(start, start + length); |
+} |
+ListFactory.prototype.isEmpty = function() { |
+ return this.length == 0; |
+} |
+ListFactory.prototype.iterator = function() { |
+ return new ListIterator(this); |
+} |
+ListFactory.prototype.add$1 = ListFactory.prototype.add; |
+ListFactory.prototype.addAll$1 = ListFactory.prototype.addAll; |
+ListFactory.prototype.every$1 = function($0) { |
+ return this.every(to$call$1($0)); |
+}; |
+ListFactory.prototype.filter$1 = function($0) { |
+ return this.filter(to$call$1($0)); |
+}; |
+ListFactory.prototype.forEach$1 = function($0) { |
+ return this.forEach(to$call$1($0)); |
+}; |
+ListFactory.prototype.indexOf$1 = ListFactory.prototype.indexOf; |
+ListFactory.prototype.isEmpty$0 = ListFactory.prototype.isEmpty; |
+ListFactory.prototype.iterator$0 = ListFactory.prototype.iterator; |
+ListFactory.prototype.last$0 = ListFactory.prototype.last; |
+ListFactory.prototype.removeLast$0 = ListFactory.prototype.removeLast; |
+ListFactory.prototype.some$1 = function($0) { |
+ return this.some(to$call$1($0)); |
+}; |
+ListFactory.prototype.sort$1 = function($0) { |
+ return this.sort(to$call$2($0)); |
+}; |
+ListFactory_E = ListFactory; |
+ListFactory_K = ListFactory; |
+ListFactory_String = ListFactory; |
+ListFactory_V = ListFactory; |
+// ********** Code for ListIterator ************** |
+function ListIterator(array) { |
+ this._array = array; |
+ this._pos = 0; |
+ // Initializers done |
+} |
+ListIterator.prototype.hasNext = function() { |
+ return this._array.length > this._pos; |
+} |
+ListIterator.prototype.next = function() { |
+ if (!this.hasNext()) { |
+ $throw(const$7/*const NoMoreElementsException()*/); |
+ } |
+ return this._array.$index(this._pos++); |
+} |
+ListIterator.prototype.hasNext$0 = ListIterator.prototype.hasNext; |
+ListIterator.prototype.next$0 = ListIterator.prototype.next; |
+// ********** Code for JSSyntaxRegExp ************** |
+function JSSyntaxRegExp(pattern, multiLine, ignoreCase) { |
+ // Initializers done |
+ JSSyntaxRegExp._create$ctor.call(this, pattern, ($eq(multiLine, true) ? 'm' : '') + ($eq(ignoreCase, true) ? 'i' : '')); |
+} |
+JSSyntaxRegExp._create$ctor = function(pattern, flags) { |
+ this.re = new RegExp(pattern, flags); |
+ this.pattern = pattern; |
+ this.multiLine = this.re.multiline; |
+ this.ignoreCase = this.re.ignoreCase; |
+} |
+JSSyntaxRegExp._create$ctor.prototype = JSSyntaxRegExp.prototype; |
+JSSyntaxRegExp.prototype.is$RegExp = function(){return true}; |
+JSSyntaxRegExp.prototype.firstMatch = function(str) { |
+ var m = this._exec(str); |
+ return m == null ? null : new MatchImplementation(this.pattern, str, this._matchStart(m), this.get$_lastIndex(), m); |
+} |
+JSSyntaxRegExp.prototype._exec = function(str) { |
+ return this.re.exec(str); |
+} |
+JSSyntaxRegExp.prototype._matchStart = function(m) { |
+ return m.index; |
+} |
+JSSyntaxRegExp.prototype.get$_lastIndex = function() { |
+ return this.re.lastIndex; |
+} |
+JSSyntaxRegExp.prototype.allMatches = function(str) { |
+ return new _AllMatchesIterable(this, str); |
+} |
+// ********** Code for MatchImplementation ************** |
+function MatchImplementation(pattern, str, _start, _end, _groups) { |
+ this.pattern = pattern; |
+ this.str = str; |
+ this._start = _start; |
+ this._end = _end; |
+ this._groups = _groups; |
+ // Initializers done |
+} |
+MatchImplementation.prototype.start = function() { |
+ return this._start; |
+} |
+MatchImplementation.prototype.get$start = function() { |
+ return MatchImplementation.prototype.start.bind(this); |
+} |
+MatchImplementation.prototype.end = function() { |
+ return this._end; |
+} |
+MatchImplementation.prototype.get$end = function() { |
+ return MatchImplementation.prototype.end.bind(this); |
+} |
+MatchImplementation.prototype.group = function(group) { |
+ return this._groups.$index(group); |
+} |
+MatchImplementation.prototype.$index = function(group) { |
+ return this._groups.$index(group); |
+} |
+MatchImplementation.prototype.end$0 = MatchImplementation.prototype.end; |
+MatchImplementation.prototype.group$1 = MatchImplementation.prototype.group; |
+MatchImplementation.prototype.start$0 = MatchImplementation.prototype.start; |
+// ********** Code for _AllMatchesIterable ************** |
+function _AllMatchesIterable(_re, _str) { |
+ this._re = _re; |
+ this._str = _str; |
+ // Initializers done |
+} |
+_AllMatchesIterable.prototype.iterator = function() { |
+ return new _AllMatchesIterator(this._re, this._str); |
+} |
+_AllMatchesIterable.prototype.iterator$0 = _AllMatchesIterable.prototype.iterator; |
+// ********** Code for _AllMatchesIterator ************** |
+function _AllMatchesIterator(re, _str) { |
+ this._str = _str; |
+ this._done = false; |
+ this._re = new JSSyntaxRegExp._create$ctor(re.pattern, 'g' + (re.multiLine ? 'm' : '') + (re.ignoreCase ? 'i' : '')); |
+ // Initializers done |
+} |
+_AllMatchesIterator.prototype.next = function() { |
+ if (!this.hasNext()) { |
+ $throw(const$7/*const NoMoreElementsException()*/); |
+ } |
+ var next = this._next; |
+ this._next = null; |
+ return next; |
+} |
+_AllMatchesIterator.prototype.hasNext = function() { |
+ if (this._done) { |
+ return false; |
+ } |
+ else if (this._next != null) { |
+ return true; |
+ } |
+ this._next = this._re.firstMatch(this._str); |
+ if (this._next == null) { |
+ this._done = true; |
+ return false; |
+ } |
+ else { |
+ return true; |
+ } |
+} |
+_AllMatchesIterator.prototype.hasNext$0 = _AllMatchesIterator.prototype.hasNext; |
+_AllMatchesIterator.prototype.next$0 = _AllMatchesIterator.prototype.next; |
+// ********** Code for NumImplementation ************** |
+NumImplementation = Number; |
+NumImplementation.prototype.isNaN = function() { |
+ return isNaN(this); |
+} |
+NumImplementation.prototype.isNegative = function() { |
+ return this == 0 ? (1 / this) < 0 : this < 0; |
+} |
+NumImplementation.prototype.hashCode = function() { |
+ return this & 0xFFFFFFF; |
+} |
+NumImplementation.prototype.toInt = function() { |
+ if (isNaN(this)) throw new BadNumberFormatException("NaN"); |
+ if ((this == Infinity) || (this == -Infinity)) { |
+ throw new BadNumberFormatException("Infinity"); |
+ } |
+ var truncated = (this < 0) ? Math.ceil(this) : Math.floor(this); |
+ |
+ if (truncated == -0.0) return 0; |
+ return truncated; |
+} |
+NumImplementation.prototype.toDouble = function() { |
+ return this + 0; |
+} |
+NumImplementation.prototype.compareTo = function(other) { |
+ var thisValue = this.toDouble(); |
+ if (thisValue < other) { |
+ return -1; |
+ } |
+ else if (thisValue > other) { |
+ return 1; |
+ } |
+ else if (thisValue == other) { |
+ if (thisValue == 0) { |
+ var thisIsNegative = this.isNegative(); |
+ var otherIsNegative = other.isNegative(); |
+ if ($eq(thisIsNegative, otherIsNegative)) return 0; |
+ if (thisIsNegative) return -1; |
+ return 1; |
+ } |
+ return 0; |
+ } |
+ else if (this.isNaN()) { |
+ if (other.isNaN()) { |
+ return 0; |
+ } |
+ return 1; |
+ } |
+ else { |
+ return -1; |
+ } |
+} |
+NumImplementation.prototype.compareTo$1 = NumImplementation.prototype.compareTo; |
+NumImplementation.prototype.hashCode$0 = NumImplementation.prototype.hashCode; |
+// ********** Code for HashMapImplementation ************** |
+function HashMapImplementation() { |
+ // Initializers done |
+ this._numberOfEntries = 0; |
+ this._numberOfDeleted = 0; |
+ this._loadLimit = HashMapImplementation._computeLoadLimit(8/*HashMapImplementation._INITIAL_CAPACITY*/); |
+ this._keys = new ListFactory(8/*HashMapImplementation._INITIAL_CAPACITY*/); |
+ this._values = new ListFactory(8/*HashMapImplementation._INITIAL_CAPACITY*/); |
+} |
+HashMapImplementation.HashMapImplementation$from$factory = function(other) { |
+ var result = new HashMapImplementation(); |
+ other.forEach((function (key, value) { |
+ result.$setindex(key, value); |
+ }) |
+ ); |
+ return result; |
+} |
+HashMapImplementation._computeLoadLimit = function(capacity) { |
+ return $truncdiv((capacity * 3), 4); |
+} |
+HashMapImplementation._firstProbe = function(hashCode, length) { |
+ return hashCode & (length - 1); |
+} |
+HashMapImplementation._nextProbe = function(currentProbe, numberOfProbes, length) { |
+ return (currentProbe + numberOfProbes) & (length - 1); |
+} |
+HashMapImplementation.prototype._probeForAdding = function(key) { |
+ var hash = HashMapImplementation._firstProbe(key.hashCode$0(), this._keys.length); |
+ var numberOfProbes = 1; |
+ var initialHash = hash; |
+ var insertionIndex = -1; |
+ while (true) { |
+ var existingKey = this._keys.$index(hash); |
+ if (existingKey == null) { |
+ if (insertionIndex < 0) return hash; |
+ return insertionIndex; |
+ } |
+ else if ($eq(existingKey, key)) { |
+ return hash; |
+ } |
+ else if ((insertionIndex < 0) && (const$2/*HashMapImplementation._DELETED_KEY*/ === existingKey)) { |
+ insertionIndex = hash; |
+ } |
+ hash = HashMapImplementation._nextProbe(hash, numberOfProbes++, this._keys.length); |
+ } |
+} |
+HashMapImplementation.prototype._probeForLookup = function(key) { |
+ var hash = HashMapImplementation._firstProbe(key.hashCode$0(), this._keys.length); |
+ var numberOfProbes = 1; |
+ var initialHash = hash; |
+ while (true) { |
+ var existingKey = this._keys.$index(hash); |
+ if (existingKey == null) return -1; |
+ if ($eq(existingKey, key)) return hash; |
+ hash = HashMapImplementation._nextProbe(hash, numberOfProbes++, this._keys.length); |
+ } |
+} |
+HashMapImplementation.prototype._ensureCapacity = function() { |
+ var newNumberOfEntries = this._numberOfEntries + 1; |
+ if (newNumberOfEntries >= this._loadLimit) { |
+ this._grow(this._keys.length * 2); |
+ return; |
+ } |
+ var capacity = this._keys.length; |
+ var numberOfFreeOrDeleted = capacity - newNumberOfEntries; |
+ var numberOfFree = numberOfFreeOrDeleted - this._numberOfDeleted; |
+ if (this._numberOfDeleted > numberOfFree) { |
+ this._grow(this._keys.length); |
+ } |
+} |
+HashMapImplementation._isPowerOfTwo = function(x) { |
+ return ((x & (x - 1)) == 0); |
+} |
+HashMapImplementation.prototype._grow = function(newCapacity) { |
+ var capacity = this._keys.length; |
+ this._loadLimit = HashMapImplementation._computeLoadLimit(newCapacity); |
+ var oldKeys = this._keys; |
+ var oldValues = this._values; |
+ this._keys = new ListFactory(newCapacity); |
+ this._values = new ListFactory(newCapacity); |
+ for (var i = 0; |
+ i < capacity; i++) { |
+ var key = oldKeys.$index(i); |
+ if (key == null || key === const$2/*HashMapImplementation._DELETED_KEY*/) { |
+ continue; |
+ } |
+ var value = oldValues.$index(i); |
+ var newIndex = this._probeForAdding(key); |
+ this._keys.$setindex(newIndex, key); |
+ this._values.$setindex(newIndex, value); |
+ } |
+ this._numberOfDeleted = 0; |
+} |
+HashMapImplementation.prototype.$setindex = function(key, value) { |
+ this._ensureCapacity(); |
+ var index = this._probeForAdding(key); |
+ if ((this._keys.$index(index) == null) || (this._keys.$index(index) === const$2/*HashMapImplementation._DELETED_KEY*/)) { |
+ this._numberOfEntries++; |
+ } |
+ this._keys.$setindex(index, key); |
+ this._values.$setindex(index, value); |
+} |
+HashMapImplementation.prototype.$index = function(key) { |
+ var index = this._probeForLookup(key); |
+ if (index < 0) return null; |
+ return this._values.$index(index); |
+} |
+HashMapImplementation.prototype.remove = function(key) { |
+ var index = this._probeForLookup(key); |
+ if (index >= 0) { |
+ this._numberOfEntries--; |
+ var value = this._values.$index(index); |
+ this._values.$setindex(index); |
+ this._keys.$setindex(index, const$2/*HashMapImplementation._DELETED_KEY*/); |
+ this._numberOfDeleted++; |
+ return value; |
+ } |
+ return null; |
+} |
+HashMapImplementation.prototype.isEmpty = function() { |
+ return this._numberOfEntries == 0; |
+} |
+HashMapImplementation.prototype.get$length = function() { |
+ return this._numberOfEntries; |
+} |
+Object.defineProperty(HashMapImplementation.prototype, "length", { |
+ get: HashMapImplementation.prototype.get$length |
+}); |
+HashMapImplementation.prototype.forEach = function(f) { |
+ var length = this._keys.length; |
+ for (var i = 0; |
+ i < length; i++) { |
+ if ((this._keys.$index(i) != null) && (this._keys.$index(i) !== const$2/*HashMapImplementation._DELETED_KEY*/)) { |
+ f(this._keys.$index(i), this._values.$index(i)); |
+ } |
+ } |
+} |
+HashMapImplementation.prototype.getKeys = function() { |
+ var list = new ListFactory(this.get$length()); |
+ var i = 0; |
+ this.forEach(function _(key, value) { |
+ list.$setindex(i++, key); |
+ } |
+ ); |
+ return list; |
+} |
+HashMapImplementation.prototype.getValues = function() { |
+ var list = new ListFactory(this.get$length()); |
+ var i = 0; |
+ this.forEach(function _(key, value) { |
+ list.$setindex(i++, value); |
+ } |
+ ); |
+ return list; |
+} |
+HashMapImplementation.prototype.containsKey = function(key) { |
+ return (this._probeForLookup(key) != -1); |
+} |
+HashMapImplementation.prototype.containsKey$1 = HashMapImplementation.prototype.containsKey; |
+HashMapImplementation.prototype.forEach$1 = function($0) { |
+ return this.forEach(to$call$2($0)); |
+}; |
+HashMapImplementation.prototype.getKeys$0 = HashMapImplementation.prototype.getKeys; |
+HashMapImplementation.prototype.getValues$0 = HashMapImplementation.prototype.getValues; |
+HashMapImplementation.prototype.isEmpty$0 = HashMapImplementation.prototype.isEmpty; |
+// ********** Code for HashMapImplementation_E$E ************** |
+/** Implements extends for Dart classes on JavaScript prototypes. */ |
+function $inherits(child, parent) { |
+ if (child.prototype.__proto__) { |
+ child.prototype.__proto__ = parent.prototype; |
+ } else { |
+ function tmp() {}; |
+ tmp.prototype = parent.prototype; |
+ child.prototype = new tmp(); |
+ child.prototype.constructor = child; |
+ } |
+} |
+$inherits(HashMapImplementation_E$E, HashMapImplementation); |
+function HashMapImplementation_E$E() { |
+ // Initializers done |
+ this._numberOfEntries = 0; |
+ this._numberOfDeleted = 0; |
+ this._loadLimit = HashMapImplementation._computeLoadLimit(8/*HashMapImplementation._INITIAL_CAPACITY*/); |
+ this._keys = new ListFactory(8/*HashMapImplementation._INITIAL_CAPACITY*/); |
+ this._values = new ListFactory(8/*HashMapImplementation._INITIAL_CAPACITY*/); |
+} |
+HashMapImplementation_E$E._computeLoadLimit = function(capacity) { |
+ return $truncdiv((capacity * 3), 4); |
+} |
+HashMapImplementation_E$E._firstProbe = function(hashCode, length) { |
+ return hashCode & (length - 1); |
+} |
+HashMapImplementation_E$E._nextProbe = function(currentProbe, numberOfProbes, length) { |
+ return (currentProbe + numberOfProbes) & (length - 1); |
+} |
+HashMapImplementation_E$E.prototype._probeForAdding = function(key) { |
+ var hash = HashMapImplementation._firstProbe(key.hashCode$0(), this._keys.length); |
+ var numberOfProbes = 1; |
+ var initialHash = hash; |
+ var insertionIndex = -1; |
+ while (true) { |
+ var existingKey = this._keys.$index(hash); |
+ if (existingKey == null) { |
+ if (insertionIndex < 0) return hash; |
+ return insertionIndex; |
+ } |
+ else if ($eq(existingKey, key)) { |
+ return hash; |
+ } |
+ else if ((insertionIndex < 0) && (const$2/*HashMapImplementation._DELETED_KEY*/ === existingKey)) { |
+ insertionIndex = hash; |
+ } |
+ hash = HashMapImplementation._nextProbe(hash, numberOfProbes++, this._keys.length); |
+ } |
+} |
+HashMapImplementation_E$E.prototype._probeForLookup = function(key) { |
+ var hash = HashMapImplementation._firstProbe(key.hashCode$0(), this._keys.length); |
+ var numberOfProbes = 1; |
+ var initialHash = hash; |
+ while (true) { |
+ var existingKey = this._keys.$index(hash); |
+ if (existingKey == null) return -1; |
+ if ($eq(existingKey, key)) return hash; |
+ hash = HashMapImplementation._nextProbe(hash, numberOfProbes++, this._keys.length); |
+ } |
+} |
+HashMapImplementation_E$E.prototype._ensureCapacity = function() { |
+ var newNumberOfEntries = this._numberOfEntries + 1; |
+ if (newNumberOfEntries >= this._loadLimit) { |
+ this._grow(this._keys.length * 2); |
+ return; |
+ } |
+ var capacity = this._keys.length; |
+ var numberOfFreeOrDeleted = capacity - newNumberOfEntries; |
+ var numberOfFree = numberOfFreeOrDeleted - this._numberOfDeleted; |
+ if (this._numberOfDeleted > numberOfFree) { |
+ this._grow(this._keys.length); |
+ } |
+} |
+HashMapImplementation_E$E._isPowerOfTwo = function(x) { |
+ return ((x & (x - 1)) == 0); |
+} |
+HashMapImplementation_E$E.prototype._grow = function(newCapacity) { |
+ var capacity = this._keys.length; |
+ this._loadLimit = HashMapImplementation._computeLoadLimit(newCapacity); |
+ var oldKeys = this._keys; |
+ var oldValues = this._values; |
+ this._keys = new ListFactory(newCapacity); |
+ this._values = new ListFactory(newCapacity); |
+ for (var i = 0; |
+ i < capacity; i++) { |
+ var key = oldKeys.$index(i); |
+ if (key == null || key === const$2/*HashMapImplementation._DELETED_KEY*/) { |
+ continue; |
+ } |
+ var value = oldValues.$index(i); |
+ var newIndex = this._probeForAdding(key); |
+ this._keys.$setindex(newIndex, key); |
+ this._values.$setindex(newIndex, value); |
+ } |
+ this._numberOfDeleted = 0; |
+} |
+HashMapImplementation_E$E.prototype.$setindex = function(key, value) { |
+ this._ensureCapacity(); |
+ var index = this._probeForAdding(key); |
+ if ((this._keys.$index(index) == null) || (this._keys.$index(index) === const$2/*HashMapImplementation._DELETED_KEY*/)) { |
+ this._numberOfEntries++; |
+ } |
+ this._keys.$setindex(index, key); |
+ this._values.$setindex(index, value); |
+} |
+HashMapImplementation_E$E.prototype.remove = function(key) { |
+ var index = this._probeForLookup(key); |
+ if (index >= 0) { |
+ this._numberOfEntries--; |
+ var value = this._values.$index(index); |
+ this._values.$setindex(index); |
+ this._keys.$setindex(index, const$2/*HashMapImplementation._DELETED_KEY*/); |
+ this._numberOfDeleted++; |
+ return value; |
+ } |
+ return null; |
+} |
+HashMapImplementation_E$E.prototype.isEmpty = function() { |
+ return this._numberOfEntries == 0; |
+} |
+HashMapImplementation_E$E.prototype.forEach = function(f) { |
+ var length = this._keys.length; |
+ for (var i = 0; |
+ i < length; i++) { |
+ if ((this._keys.$index(i) != null) && (this._keys.$index(i) !== const$2/*HashMapImplementation._DELETED_KEY*/)) { |
+ f(this._keys.$index(i), this._values.$index(i)); |
+ } |
+ } |
+} |
+HashMapImplementation_E$E.prototype.getKeys = function() { |
+ var list = new ListFactory(this.get$length()); |
+ var i = 0; |
+ this.forEach(function _(key, value) { |
+ list.$setindex(i++, key); |
+ } |
+ ); |
+ return list; |
+} |
+HashMapImplementation_E$E.prototype.containsKey = function(key) { |
+ return (this._probeForLookup(key) != -1); |
+} |
+// ********** Code for HashMapImplementation_K$DoubleLinkedQueueEntry_KeyValuePair_K$V ************** |
+$inherits(HashMapImplementation_K$DoubleLinkedQueueEntry_KeyValuePair_K$V, HashMapImplementation); |
+function HashMapImplementation_K$DoubleLinkedQueueEntry_KeyValuePair_K$V() {} |
+// ********** Code for HashMapImplementation_String$EvaluatedValue ************** |
+$inherits(HashMapImplementation_String$EvaluatedValue, HashMapImplementation); |
+function HashMapImplementation_String$EvaluatedValue() {} |
+// ********** Code for HashSetImplementation ************** |
+function HashSetImplementation() { |
+ // Initializers done |
+ this._backingMap = new HashMapImplementation_E$E(); |
+} |
+HashSetImplementation.HashSetImplementation$from$factory = function(other) { |
+ var set = new HashSetImplementation(); |
+ for (var $$i = other.iterator(); $$i.hasNext$0(); ) { |
+ var e = $$i.next$0(); |
+ set.add(e); |
+ } |
+ return set; |
+} |
+HashSetImplementation.prototype.add = function(value) { |
+ this._backingMap.$setindex(value, value); |
+} |
+HashSetImplementation.prototype.contains = function(value) { |
+ return this._backingMap.containsKey(value); |
+} |
+HashSetImplementation.prototype.remove = function(value) { |
+ if (!this._backingMap.containsKey(value)) return false; |
+ this._backingMap.remove(value); |
+ return true; |
+} |
+HashSetImplementation.prototype.addAll = function(collection) { |
+ var $this = this; // closure support |
+ collection.forEach(function _(value) { |
+ $this.add(value); |
+ } |
+ ); |
+} |
+HashSetImplementation.prototype.forEach = function(f) { |
+ this._backingMap.forEach(function _(key, value) { |
+ f(key); |
+ } |
+ ); |
+} |
+HashSetImplementation.prototype.filter = function(f) { |
+ var result = new HashSetImplementation(); |
+ this._backingMap.forEach(function _(key, value) { |
+ if (f(key)) result.add(key); |
+ } |
+ ); |
+ return result; |
+} |
+HashSetImplementation.prototype.every = function(f) { |
+ var keys = this._backingMap.getKeys(); |
+ return keys.every(f); |
+} |
+HashSetImplementation.prototype.some = function(f) { |
+ var keys = this._backingMap.getKeys(); |
+ return keys.some(f); |
+} |
+HashSetImplementation.prototype.isEmpty = function() { |
+ return this._backingMap.isEmpty(); |
+} |
+HashSetImplementation.prototype.get$length = function() { |
+ return this._backingMap.get$length(); |
+} |
+Object.defineProperty(HashSetImplementation.prototype, "length", { |
+ get: HashSetImplementation.prototype.get$length |
+}); |
+HashSetImplementation.prototype.iterator = function() { |
+ return new HashSetIterator_E(this); |
+} |
+HashSetImplementation.prototype.add$1 = HashSetImplementation.prototype.add; |
+HashSetImplementation.prototype.addAll$1 = HashSetImplementation.prototype.addAll; |
+HashSetImplementation.prototype.contains$1 = HashSetImplementation.prototype.contains; |
+HashSetImplementation.prototype.every$1 = function($0) { |
+ return this.every(to$call$1($0)); |
+}; |
+HashSetImplementation.prototype.filter$1 = function($0) { |
+ return this.filter(to$call$1($0)); |
+}; |
+HashSetImplementation.prototype.forEach$1 = function($0) { |
+ return this.forEach(to$call$1($0)); |
+}; |
+HashSetImplementation.prototype.isEmpty$0 = HashSetImplementation.prototype.isEmpty; |
+HashSetImplementation.prototype.iterator$0 = HashSetImplementation.prototype.iterator; |
+HashSetImplementation.prototype.some$1 = function($0) { |
+ return this.some(to$call$1($0)); |
+}; |
+// ********** Code for HashSetImplementation_E ************** |
+$inherits(HashSetImplementation_E, HashSetImplementation); |
+function HashSetImplementation_E() {} |
+// ********** Code for HashSetImplementation_Library ************** |
+$inherits(HashSetImplementation_Library, HashSetImplementation); |
+function HashSetImplementation_Library() {} |
+// ********** Code for HashSetImplementation_String ************** |
+$inherits(HashSetImplementation_String, HashSetImplementation); |
+function HashSetImplementation_String() {} |
+// ********** Code for HashSetImplementation_Type ************** |
+$inherits(HashSetImplementation_Type, HashSetImplementation); |
+function HashSetImplementation_Type() {} |
+// ********** Code for HashSetIterator ************** |
+function HashSetIterator(set_) { |
+ this._nextValidIndex = -1; |
+ this._entries = set_._backingMap._keys; |
+ // Initializers done |
+ this._advance(); |
+} |
+HashSetIterator.prototype.hasNext = function() { |
+ if (this._nextValidIndex >= this._entries.length) return false; |
+ if (this._entries.$index(this._nextValidIndex) === const$2/*HashMapImplementation._DELETED_KEY*/) { |
+ this._advance(); |
+ } |
+ return this._nextValidIndex < this._entries.length; |
+} |
+HashSetIterator.prototype.next = function() { |
+ if (!this.hasNext()) { |
+ $throw(const$7/*const NoMoreElementsException()*/); |
+ } |
+ var res = this._entries.$index(this._nextValidIndex); |
+ this._advance(); |
+ return res; |
+} |
+HashSetIterator.prototype._advance = function() { |
+ var length = this._entries.length; |
+ var entry; |
+ var deletedKey = const$2/*HashMapImplementation._DELETED_KEY*/; |
+ do { |
+ if (++this._nextValidIndex >= length) break; |
+ entry = this._entries.$index(this._nextValidIndex); |
+ } |
+ while ((entry == null) || (entry === deletedKey)) |
+} |
+HashSetIterator.prototype.hasNext$0 = HashSetIterator.prototype.hasNext; |
+HashSetIterator.prototype.next$0 = HashSetIterator.prototype.next; |
+// ********** Code for HashSetIterator_E ************** |
+$inherits(HashSetIterator_E, HashSetIterator); |
+function HashSetIterator_E(set_) { |
+ this._nextValidIndex = -1; |
+ this._entries = set_._backingMap._keys; |
+ // Initializers done |
+ this._advance(); |
+} |
+HashSetIterator_E.prototype._advance = function() { |
+ var length = this._entries.length; |
+ var entry; |
+ var deletedKey = const$2/*HashMapImplementation._DELETED_KEY*/; |
+ do { |
+ if (++this._nextValidIndex >= length) break; |
+ entry = this._entries.$index(this._nextValidIndex); |
+ } |
+ while ((entry == null) || (entry === deletedKey)) |
+} |
+// ********** Code for _DeletedKeySentinel ************** |
+function _DeletedKeySentinel() { |
+ // Initializers done |
+} |
+// ********** Code for KeyValuePair ************** |
+function KeyValuePair(key, value) { |
+ this.key = key; |
+ this.value = value; |
+ // Initializers done |
+} |
+KeyValuePair.prototype.get$value = function() { return this.value; }; |
+KeyValuePair.prototype.set$value = function(value) { return this.value = value; }; |
+// ********** Code for KeyValuePair_K$V ************** |
+$inherits(KeyValuePair_K$V, KeyValuePair); |
+function KeyValuePair_K$V(key, value) { |
+ this.key = key; |
+ this.value = value; |
+ // Initializers done |
+} |
+// ********** Code for LinkedHashMapImplementation ************** |
+function LinkedHashMapImplementation() { |
+ // Initializers done |
+ this._map = new HashMapImplementation(); |
+ this._list = new DoubleLinkedQueue_KeyValuePair_K$V(); |
+} |
+LinkedHashMapImplementation.prototype.$setindex = function(key, value) { |
+ if (this._map.containsKey(key)) { |
+ this._map.$index(key).get$element().set$value(value); |
+ } |
+ else { |
+ this._list.addLast(new KeyValuePair_K$V(key, value)); |
+ this._map.$setindex(key, this._list.lastEntry()); |
+ } |
+} |
+LinkedHashMapImplementation.prototype.$index = function(key) { |
+ var entry = this._map.$index(key); |
+ if (entry == null) return null; |
+ return entry.get$element().get$value(); |
+} |
+LinkedHashMapImplementation.prototype.getKeys = function() { |
+ var list = new ListFactory(this.get$length()); |
+ var index = 0; |
+ this._list.forEach(function _(entry) { |
+ list.$setindex(index++, entry.key); |
+ } |
+ ); |
+ return list; |
+} |
+LinkedHashMapImplementation.prototype.getValues = function() { |
+ var list = new ListFactory(this.get$length()); |
+ var index = 0; |
+ this._list.forEach(function _(entry) { |
+ list.$setindex(index++, entry.value); |
+ } |
+ ); |
+ return list; |
+} |
+LinkedHashMapImplementation.prototype.forEach = function(f) { |
+ this._list.forEach(function _(entry) { |
+ f(entry.key, entry.value); |
+ } |
+ ); |
+} |
+LinkedHashMapImplementation.prototype.containsKey = function(key) { |
+ return this._map.containsKey(key); |
+} |
+LinkedHashMapImplementation.prototype.get$length = function() { |
+ return this._map.get$length(); |
+} |
+Object.defineProperty(LinkedHashMapImplementation.prototype, "length", { |
+ get: LinkedHashMapImplementation.prototype.get$length |
+}); |
+LinkedHashMapImplementation.prototype.isEmpty = function() { |
+ return this.get$length() == 0; |
+} |
+LinkedHashMapImplementation.prototype.containsKey$1 = LinkedHashMapImplementation.prototype.containsKey; |
+LinkedHashMapImplementation.prototype.forEach$1 = function($0) { |
+ return this.forEach(to$call$2($0)); |
+}; |
+LinkedHashMapImplementation.prototype.getKeys$0 = LinkedHashMapImplementation.prototype.getKeys; |
+LinkedHashMapImplementation.prototype.getValues$0 = LinkedHashMapImplementation.prototype.getValues; |
+LinkedHashMapImplementation.prototype.isEmpty$0 = LinkedHashMapImplementation.prototype.isEmpty; |
+// ********** Code for DoubleLinkedQueueEntry ************** |
+function DoubleLinkedQueueEntry(e) { |
+ // Initializers done |
+ this._element = e; |
+} |
+DoubleLinkedQueueEntry.prototype._link = function(p, n) { |
+ this._next = n; |
+ this._previous = p; |
+ p._next = this; |
+ n._previous = this; |
+} |
+DoubleLinkedQueueEntry.prototype.prepend = function(e) { |
+ new DoubleLinkedQueueEntry_E(e)._link(this._previous, this); |
+} |
+DoubleLinkedQueueEntry.prototype.remove = function() { |
+ this._previous._next = this._next; |
+ this._next._previous = this._previous; |
+ this._next = null; |
+ this._previous = null; |
+ return this._element; |
+} |
+DoubleLinkedQueueEntry.prototype._asNonSentinelEntry = function() { |
+ return this; |
+} |
+DoubleLinkedQueueEntry.prototype.previousEntry = function() { |
+ return this._previous._asNonSentinelEntry(); |
+} |
+DoubleLinkedQueueEntry.prototype.get$element = function() { |
+ return this._element; |
+} |
+// ********** Code for DoubleLinkedQueueEntry_E ************** |
+$inherits(DoubleLinkedQueueEntry_E, DoubleLinkedQueueEntry); |
+function DoubleLinkedQueueEntry_E(e) { |
+ // Initializers done |
+ this._element = e; |
+} |
+DoubleLinkedQueueEntry_E.prototype._link = function(p, n) { |
+ this._next = n; |
+ this._previous = p; |
+ p._next = this; |
+ n._previous = this; |
+} |
+DoubleLinkedQueueEntry_E.prototype.prepend = function(e) { |
+ new DoubleLinkedQueueEntry_E(e)._link(this._previous, this); |
+} |
+DoubleLinkedQueueEntry_E.prototype.remove = function() { |
+ this._previous._next = this._next; |
+ this._next._previous = this._previous; |
+ this._next = null; |
+ this._previous = null; |
+ return this._element; |
+} |
+DoubleLinkedQueueEntry_E.prototype._asNonSentinelEntry = function() { |
+ return this; |
+} |
+DoubleLinkedQueueEntry_E.prototype.previousEntry = function() { |
+ return this._previous._asNonSentinelEntry(); |
+} |
+// ********** Code for DoubleLinkedQueueEntry_KeyValuePair_K$V ************** |
+$inherits(DoubleLinkedQueueEntry_KeyValuePair_K$V, DoubleLinkedQueueEntry); |
+function DoubleLinkedQueueEntry_KeyValuePair_K$V(e) { |
+ // Initializers done |
+ this._element = e; |
+} |
+DoubleLinkedQueueEntry_KeyValuePair_K$V.prototype._link = function(p, n) { |
+ this._next = n; |
+ this._previous = p; |
+ p._next = this; |
+ n._previous = this; |
+} |
+DoubleLinkedQueueEntry_KeyValuePair_K$V.prototype.prepend = function(e) { |
+ new DoubleLinkedQueueEntry_KeyValuePair_K$V(e)._link(this._previous, this); |
+} |
+DoubleLinkedQueueEntry_KeyValuePair_K$V.prototype._asNonSentinelEntry = function() { |
+ return this; |
+} |
+DoubleLinkedQueueEntry_KeyValuePair_K$V.prototype.previousEntry = function() { |
+ return this._previous._asNonSentinelEntry(); |
+} |
+// ********** Code for _DoubleLinkedQueueEntrySentinel ************** |
+$inherits(_DoubleLinkedQueueEntrySentinel, DoubleLinkedQueueEntry_E); |
+function _DoubleLinkedQueueEntrySentinel() { |
+ // Initializers done |
+ DoubleLinkedQueueEntry_E.call(this, null); |
+ this._link(this, this); |
+} |
+_DoubleLinkedQueueEntrySentinel.prototype.remove = function() { |
+ $throw(const$1/*const EmptyQueueException()*/); |
+} |
+_DoubleLinkedQueueEntrySentinel.prototype._asNonSentinelEntry = function() { |
+ return null; |
+} |
+_DoubleLinkedQueueEntrySentinel.prototype.get$element = function() { |
+ $throw(const$1/*const EmptyQueueException()*/); |
+} |
+// ********** Code for _DoubleLinkedQueueEntrySentinel_E ************** |
+$inherits(_DoubleLinkedQueueEntrySentinel_E, _DoubleLinkedQueueEntrySentinel); |
+function _DoubleLinkedQueueEntrySentinel_E() { |
+ // Initializers done |
+ DoubleLinkedQueueEntry_E.call(this, null); |
+ this._link(this, this); |
+} |
+// ********** Code for _DoubleLinkedQueueEntrySentinel_KeyValuePair_K$V ************** |
+$inherits(_DoubleLinkedQueueEntrySentinel_KeyValuePair_K$V, _DoubleLinkedQueueEntrySentinel); |
+function _DoubleLinkedQueueEntrySentinel_KeyValuePair_K$V() { |
+ // Initializers done |
+ DoubleLinkedQueueEntry_KeyValuePair_K$V.call(this, null); |
+ this._link(this, this); |
+} |
+// ********** Code for DoubleLinkedQueue ************** |
+function DoubleLinkedQueue() { |
+ // Initializers done |
+ this._sentinel = new _DoubleLinkedQueueEntrySentinel_E(); |
+} |
+DoubleLinkedQueue.DoubleLinkedQueue$from$factory = function(other) { |
+ var list = new DoubleLinkedQueue(); |
+ for (var $$i = other.iterator(); $$i.hasNext$0(); ) { |
+ var e = $$i.next$0(); |
+ list.addLast(e); |
+ } |
+ return list; |
+} |
+DoubleLinkedQueue.prototype.addLast = function(value) { |
+ this._sentinel.prepend(value); |
+} |
+DoubleLinkedQueue.prototype.add = function(value) { |
+ this.addLast(value); |
+} |
+DoubleLinkedQueue.prototype.addAll = function(collection) { |
+ for (var $$i = collection.iterator(); $$i.hasNext$0(); ) { |
+ var e = $$i.next$0(); |
+ this.add(e); |
+ } |
+} |
+DoubleLinkedQueue.prototype.removeLast = function() { |
+ return this._sentinel._previous.remove(); |
+} |
+DoubleLinkedQueue.prototype.removeFirst = function() { |
+ return this._sentinel._next.remove(); |
+} |
+DoubleLinkedQueue.prototype.last = function() { |
+ return this._sentinel._previous.get$element(); |
+} |
+DoubleLinkedQueue.prototype.lastEntry = function() { |
+ return this._sentinel.previousEntry(); |
+} |
+DoubleLinkedQueue.prototype.get$length = function() { |
+ var counter = 0; |
+ this.forEach(function _(element) { |
+ counter++; |
+ } |
+ ); |
+ return counter; |
+} |
+Object.defineProperty(DoubleLinkedQueue.prototype, "length", { |
+ get: DoubleLinkedQueue.prototype.get$length |
+}); |
+DoubleLinkedQueue.prototype.isEmpty = function() { |
+ return (this._sentinel._next === this._sentinel); |
+} |
+DoubleLinkedQueue.prototype.forEach = function(f) { |
+ var entry = this._sentinel._next; |
+ while (entry !== this._sentinel) { |
+ var nextEntry = entry._next; |
+ f(entry._element); |
+ entry = nextEntry; |
+ } |
+} |
+DoubleLinkedQueue.prototype.every = function(f) { |
+ var entry = this._sentinel._next; |
+ while (entry !== this._sentinel) { |
+ var nextEntry = entry._next; |
+ if (!f(entry._element)) return false; |
+ entry = nextEntry; |
+ } |
+ return true; |
+} |
+DoubleLinkedQueue.prototype.some = function(f) { |
+ var entry = this._sentinel._next; |
+ while (entry !== this._sentinel) { |
+ var nextEntry = entry._next; |
+ if (f(entry._element)) return true; |
+ entry = nextEntry; |
+ } |
+ return false; |
+} |
+DoubleLinkedQueue.prototype.filter = function(f) { |
+ var other = new DoubleLinkedQueue(); |
+ var entry = this._sentinel._next; |
+ while (entry !== this._sentinel) { |
+ var nextEntry = entry._next; |
+ if (f(entry._element)) other.addLast(entry._element); |
+ entry = nextEntry; |
+ } |
+ return other; |
+} |
+DoubleLinkedQueue.prototype.iterator = function() { |
+ return new _DoubleLinkedQueueIterator_E(this._sentinel); |
+} |
+DoubleLinkedQueue.prototype.add$1 = DoubleLinkedQueue.prototype.add; |
+DoubleLinkedQueue.prototype.addAll$1 = DoubleLinkedQueue.prototype.addAll; |
+DoubleLinkedQueue.prototype.every$1 = function($0) { |
+ return this.every(to$call$1($0)); |
+}; |
+DoubleLinkedQueue.prototype.filter$1 = function($0) { |
+ return this.filter(to$call$1($0)); |
+}; |
+DoubleLinkedQueue.prototype.forEach$1 = function($0) { |
+ return this.forEach(to$call$1($0)); |
+}; |
+DoubleLinkedQueue.prototype.isEmpty$0 = DoubleLinkedQueue.prototype.isEmpty; |
+DoubleLinkedQueue.prototype.iterator$0 = DoubleLinkedQueue.prototype.iterator; |
+DoubleLinkedQueue.prototype.last$0 = DoubleLinkedQueue.prototype.last; |
+DoubleLinkedQueue.prototype.removeLast$0 = DoubleLinkedQueue.prototype.removeLast; |
+DoubleLinkedQueue.prototype.some$1 = function($0) { |
+ return this.some(to$call$1($0)); |
+}; |
+// ********** Code for DoubleLinkedQueue_E ************** |
+$inherits(DoubleLinkedQueue_E, DoubleLinkedQueue); |
+function DoubleLinkedQueue_E() {} |
+// ********** Code for DoubleLinkedQueue_KeyValuePair_K$V ************** |
+$inherits(DoubleLinkedQueue_KeyValuePair_K$V, DoubleLinkedQueue); |
+function DoubleLinkedQueue_KeyValuePair_K$V() { |
+ // Initializers done |
+ this._sentinel = new _DoubleLinkedQueueEntrySentinel_KeyValuePair_K$V(); |
+} |
+DoubleLinkedQueue_KeyValuePair_K$V.prototype.addLast = function(value) { |
+ this._sentinel.prepend(value); |
+} |
+DoubleLinkedQueue_KeyValuePair_K$V.prototype.lastEntry = function() { |
+ return this._sentinel.previousEntry(); |
+} |
+DoubleLinkedQueue_KeyValuePair_K$V.prototype.forEach = function(f) { |
+ var entry = this._sentinel._next; |
+ while (entry !== this._sentinel) { |
+ var nextEntry = entry._next; |
+ f(entry._element); |
+ entry = nextEntry; |
+ } |
+} |
+// ********** Code for _DoubleLinkedQueueIterator ************** |
+function _DoubleLinkedQueueIterator(_sentinel) { |
+ this._sentinel = _sentinel; |
+ // Initializers done |
+ this._currentEntry = this._sentinel; |
+} |
+_DoubleLinkedQueueIterator.prototype.hasNext = function() { |
+ return this._currentEntry._next !== this._sentinel; |
+} |
+_DoubleLinkedQueueIterator.prototype.next = function() { |
+ if (!this.hasNext()) { |
+ $throw(const$7/*const NoMoreElementsException()*/); |
+ } |
+ this._currentEntry = this._currentEntry._next; |
+ return this._currentEntry.get$element(); |
+} |
+_DoubleLinkedQueueIterator.prototype.hasNext$0 = _DoubleLinkedQueueIterator.prototype.hasNext; |
+_DoubleLinkedQueueIterator.prototype.next$0 = _DoubleLinkedQueueIterator.prototype.next; |
+// ********** Code for _DoubleLinkedQueueIterator_E ************** |
+$inherits(_DoubleLinkedQueueIterator_E, _DoubleLinkedQueueIterator); |
+function _DoubleLinkedQueueIterator_E(_sentinel) { |
+ this._sentinel = _sentinel; |
+ // Initializers done |
+ this._currentEntry = this._sentinel; |
+} |
+// ********** Code for StopwatchImplementation ************** |
+function StopwatchImplementation() { |
+ this._start = null; |
+ this._stop = null; |
+ // Initializers done |
+} |
+StopwatchImplementation.prototype.start = function() { |
+ if (this._start == null) { |
+ this._start = Clock.now(); |
+ } |
+ else { |
+ if (this._stop == null) { |
+ return; |
+ } |
+ this._start = Clock.now() - (this._stop - this._start); |
+ } |
+} |
+StopwatchImplementation.prototype.get$start = function() { |
+ return StopwatchImplementation.prototype.start.bind(this); |
+} |
+StopwatchImplementation.prototype.stop = function() { |
+ if (this._start == null) { |
+ return; |
+ } |
+ this._stop = Clock.now(); |
+} |
+StopwatchImplementation.prototype.elapsed = function() { |
+ if (this._start == null) { |
+ return 0; |
+ } |
+ return (this._stop == null) ? (Clock.now() - this._start) : (this._stop - this._start); |
+} |
+StopwatchImplementation.prototype.elapsedInMs = function() { |
+ return $truncdiv((this.elapsed() * 1000), this.frequency()); |
+} |
+StopwatchImplementation.prototype.frequency = function() { |
+ return Clock.frequency(); |
+} |
+StopwatchImplementation.prototype.start$0 = StopwatchImplementation.prototype.start; |
+// ********** Code for StringBufferImpl ************** |
+function StringBufferImpl(content) { |
+ // Initializers done |
+ this.clear(); |
+ this.add(content); |
+} |
+StringBufferImpl.prototype.get$length = function() { |
+ return this._length; |
+} |
+Object.defineProperty(StringBufferImpl.prototype, "length", { |
+ get: StringBufferImpl.prototype.get$length |
+}); |
+StringBufferImpl.prototype.isEmpty = function() { |
+ return this._length == 0; |
+} |
+StringBufferImpl.prototype.add = function(obj) { |
+ var str = obj.toString(); |
+ if (str == null || str.isEmpty()) return this; |
+ this._buffer.add(str); |
+ this._length += str.length; |
+ return this; |
+} |
+StringBufferImpl.prototype.addAll = function(objects) { |
+ for (var $$i = objects.iterator(); $$i.hasNext$0(); ) { |
+ var obj = $$i.next$0(); |
+ this.add(obj); |
+ } |
+ return this; |
+} |
+StringBufferImpl.prototype.clear = function() { |
+ this._buffer = new ListFactory(); |
+ this._length = 0; |
+ return this; |
+} |
+StringBufferImpl.prototype.toString = function() { |
+ if (this._buffer.length == 0) return ""; |
+ if (this._buffer.length == 1) return this._buffer.$index(0); |
+ var result = StringBase.concatAll(this._buffer); |
+ this._buffer.clear(); |
+ this._buffer.add(result); |
+ return result; |
+} |
+StringBufferImpl.prototype.add$1 = StringBufferImpl.prototype.add; |
+StringBufferImpl.prototype.addAll$1 = StringBufferImpl.prototype.addAll; |
+StringBufferImpl.prototype.isEmpty$0 = StringBufferImpl.prototype.isEmpty; |
+StringBufferImpl.prototype.toString$0 = StringBufferImpl.prototype.toString; |
+// ********** Code for StringBase ************** |
+function StringBase() {} |
+StringBase.join = function(strings, separator) { |
+ if (strings.length == 0) return ''; |
+ var s = strings.$index(0); |
+ for (var i = 1; |
+ i < strings.length; i++) { |
+ s = s + separator + strings.$index(i); |
+ } |
+ return s; |
+} |
+StringBase.concatAll = function(strings) { |
+ return StringBase.join(strings, ""); |
+} |
+// ********** Code for StringImplementation ************** |
+StringImplementation = String; |
+StringImplementation.prototype.endsWith = function(other) { |
+ if (other.length > this.length) return false; |
+ return other == this.substring(this.length - other.length); |
+} |
+StringImplementation.prototype.startsWith = function(other) { |
+ if (other.length > this.length) return false; |
+ return other == this.substring(0, other.length); |
+} |
+StringImplementation.prototype.isEmpty = function() { |
+ return this.length == 0; |
+} |
+StringImplementation.prototype.contains = function(pattern, startIndex) { |
+ return this.indexOf(pattern, startIndex) >= 0; |
+} |
+StringImplementation.prototype._replaceFirst = function(from, to) { |
+ return this.replace(from, to); |
+} |
+StringImplementation.prototype._replaceFirstRegExp = function(from, to) { |
+ return this.replace(from.re, to); |
+} |
+StringImplementation.prototype.replaceFirst = function(from, to) { |
+ if ((typeof(from) == 'string')) return this._replaceFirst(from, to); |
+ if (!!(from && from.is$RegExp())) return this._replaceFirstRegExp(from, to); |
+ var $$list = from.allMatches(this); |
+ for (var $$i = from.allMatches(this).iterator(); $$i.hasNext$0(); ) { |
+ var match = $$i.next$0(); |
+ return this.substring(0, match.start$0()) + to + this.substring(match.end$0()); |
+ } |
+} |
+StringImplementation.prototype.replaceAll = function(from, to) { |
+ if (typeof(from) == 'string' || from instanceof String) { |
+ from = new RegExp(from.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'g'); |
+ to = to.replace(/\$/g, '$$$$'); // Escape sequences are fun! |
+ } |
+ return this.replace(from, to); |
+} |
+StringImplementation.prototype.hashCode = function() { |
+ if (this.hash_ === undefined) { |
+ for (var i = 0; i < this.length; i++) { |
+ var ch = this.charCodeAt(i); |
+ this.hash_ += ch; |
+ this.hash_ += this.hash_ << 10; |
+ this.hash_ ^= this.hash_ >> 6; |
+ } |
+ |
+ this.hash_ += this.hash_ << 3; |
+ this.hash_ ^= this.hash_ >> 11; |
+ this.hash_ += this.hash_ << 15; |
+ this.hash_ = this.hash_ & ((1 << 29) - 1); |
+ } |
+ return this.hash_; |
+} |
+StringImplementation.prototype.compareTo = function(other) { |
+ return this == other ? 0 : this < other ? -1 : 1; |
+} |
+StringImplementation.prototype.compareTo$1 = StringImplementation.prototype.compareTo; |
+StringImplementation.prototype.contains$1 = StringImplementation.prototype.contains; |
+StringImplementation.prototype.endsWith$1 = StringImplementation.prototype.endsWith; |
+StringImplementation.prototype.hashCode$0 = StringImplementation.prototype.hashCode; |
+StringImplementation.prototype.indexOf$1 = StringImplementation.prototype.indexOf; |
+StringImplementation.prototype.isEmpty$0 = StringImplementation.prototype.isEmpty; |
+StringImplementation.prototype.replaceAll$2 = StringImplementation.prototype.replaceAll; |
+StringImplementation.prototype.replaceFirst$2 = StringImplementation.prototype.replaceFirst; |
+StringImplementation.prototype.startsWith$1 = StringImplementation.prototype.startsWith; |
+StringImplementation.prototype.substring$1 = StringImplementation.prototype.substring; |
+StringImplementation.prototype.substring$2 = StringImplementation.prototype.substring; |
+// ********** Code for Collections ************** |
+function Collections() {} |
+Collections.forEach = function(iterable, f) { |
+ for (var $$i = iterable.iterator(); $$i.hasNext$0(); ) { |
+ var e = $$i.next$0(); |
+ f(e); |
+ } |
+} |
+Collections.some = function(iterable, f) { |
+ for (var $$i = iterable.iterator(); $$i.hasNext$0(); ) { |
+ var e = $$i.next$0(); |
+ if (f(e)) return true; |
+ } |
+ return false; |
+} |
+Collections.every = function(iterable, f) { |
+ for (var $$i = iterable.iterator(); $$i.hasNext$0(); ) { |
+ var e = $$i.next$0(); |
+ if (!f(e)) return false; |
+ } |
+ return true; |
+} |
+Collections.filter = function(source, destination, f) { |
+ for (var $$i = source.iterator(); $$i.hasNext$0(); ) { |
+ var e = $$i.next$0(); |
+ if (f(e)) destination.add(e); |
+ } |
+ return destination; |
+} |
+// ********** Code for top level ************** |
+// ********** Library node ************** |
+// ********** Code for http ************** |
+http = require('http'); |
+// ********** Code for Server ************** |
+Server = http.Server; |
+// ********** Code for process ************** |
+// ********** Code for fs ************** |
+fs = require('fs'); |
+// ********** Code for Stats ************** |
+Stats = fs.Stats; |
+Stats.prototype.isFile$0 = Stats.prototype.isFile; |
+// ********** Code for path ************** |
+path = require('path'); |
+// ********** Code for top level ************** |
+// ********** Library file_system ************** |
+// ********** Code for top level ************** |
+function joinPaths(path1, path2) { |
+ var pieces = path1.split('/'); |
+ var $$list = path2.split('/'); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var piece = $$list.$index($$i); |
+ if ($eq(piece, '..') && pieces.length > 0 && $ne(pieces.last$0(), '.') && $ne(pieces.last$0(), '..')) { |
+ pieces.removeLast$0(); |
+ } |
+ else if ($ne(piece, '')) { |
+ if (pieces.length > 0 && $eq(pieces.last$0(), '.')) { |
+ pieces.removeLast$0(); |
+ } |
+ pieces.add$1(piece); |
+ } |
+ } |
+ return Strings.join(pieces, '/'); |
+} |
+function dirname(path) { |
+ var lastSlash = path.lastIndexOf('/', path.length); |
+ if (lastSlash == -1) { |
+ return '.'; |
+ } |
+ else { |
+ return path.substring(0, lastSlash); |
+ } |
+} |
+function basename(path) { |
+ var lastSlash = path.lastIndexOf('/', path.length); |
+ if (lastSlash == -1) { |
+ return path; |
+ } |
+ else { |
+ return path.substring(lastSlash + 1); |
+ } |
+} |
+// ********** Library file_system_node ************** |
+// ********** Code for NodeFileSystem ************** |
+function NodeFileSystem() { |
+ // Initializers done |
+} |
+NodeFileSystem.prototype.readAll = function(filename) { |
+ return fs.readFileSync(filename, 'utf8'); |
+} |
+NodeFileSystem.prototype.fileExists = function(filename) { |
+ return path.existsSync(filename); |
+} |
+// ********** Code for top level ************** |
+// ********** Library lang ************** |
+// ********** Code for CodeWriter ************** |
+function CodeWriter() { |
+ this._indentation = 0 |
+ this._pendingIndent = false |
+ this.writeComments = true |
+ this._buf = new StringBufferImpl(""); |
+ // Initializers done |
+} |
+CodeWriter.prototype.get$text = function() { |
+ return this._buf.toString(); |
+} |
+CodeWriter.prototype._indent = function() { |
+ this._pendingIndent = false; |
+ for (var i = 0; |
+ i < this._indentation; i++) { |
+ this._buf.add(' '/*CodeWriter.INDENTATION*/); |
+ } |
+} |
+CodeWriter.prototype.comment = function(text) { |
+ if (this.writeComments) { |
+ this.writeln(text); |
+ } |
+} |
+CodeWriter.prototype.write = function(text) { |
+ if (text.length == 0) return; |
+ if (this._pendingIndent) this._indent(); |
+ if (text.indexOf('\n') != -1) { |
+ var lines = text.split('\n'); |
+ for (var i = 0; |
+ i < lines.length - 1; i++) { |
+ this.writeln(lines.$index(i)); |
+ } |
+ this.write(lines.$index(lines.length - 1)); |
+ } |
+ else { |
+ this._buf.add(text); |
+ } |
+} |
+CodeWriter.prototype.writeln = function(text) { |
+ if (text != null) { |
+ this.write(text); |
+ } |
+ if (!text.endsWith('\n')) this._buf.add('\n'/*CodeWriter.NEWLINE*/); |
+ this._pendingIndent = true; |
+} |
+CodeWriter.prototype.enterBlock = function(text) { |
+ this.writeln(text); |
+ this._indentation++; |
+} |
+CodeWriter.prototype.exitBlock = function(text) { |
+ this._indentation--; |
+ this.writeln(text); |
+} |
+CodeWriter.prototype.nextBlock = function(text) { |
+ this._indentation--; |
+ this.writeln(text); |
+ this._indentation++; |
+} |
+// ********** Code for CoreJs ************** |
+function CoreJs() { |
+ this.useStackTraceOf = false |
+ this.useThrow = false |
+ this.useGenStub = false |
+ this.useAssert = false |
+ this.useNotNullBool = false |
+ this.useIndex = false |
+ this.useSetIndex = false |
+ this.useWrap0 = false |
+ this.useWrap1 = false |
+ this.useIsolates = false |
+ this.useToString = false |
+ this._generatedTypeNameOf = false |
+ this._generatedDynamicProto = false |
+ this._generatedInherits = false |
+ this._usedOperators = new HashMapImplementation(); |
+ this.writer = new CodeWriter(); |
+ // Initializers done |
+} |
+CoreJs.prototype.useOperator = function(name) { |
+ if (this._usedOperators.$index(name) != null) return; |
+ var code; |
+ switch (name) { |
+ case ':ne': |
+ |
+ code = "function $ne(x, y) {\n if (x == null) return y != null;\n return (typeof(x) == 'number' && typeof(y) == 'number') ||\n (typeof(x) == 'boolean' && typeof(y) == 'boolean') ||\n (typeof(x) == 'string' && typeof(y) == 'string')\n ? x != y : !x.$eq(y);\n}"/*null._NE_FUNCTION*/; |
+ break; |
+ |
+ case ':eq': |
+ |
+ code = "function $eq(x, y) {\n if (x == null) return y == null;\n return (typeof(x) == 'number' && typeof(y) == 'number') ||\n (typeof(x) == 'boolean' && typeof(y) == 'boolean') ||\n (typeof(x) == 'string' && typeof(y) == 'string')\n ? x == y : x.$eq(y);\n}\n// TODO(jimhug): Should this or should it not match equals?\nObject.prototype.$eq = function(other) { return this === other; }"/*null._EQ_FUNCTION*/; |
+ break; |
+ |
+ case ':bit_not': |
+ |
+ code = "function $bit_not(x) {\n return (typeof(x) == 'number') ? ~x : x.$bit_not();\n}"/*null._BIT_NOT_FUNCTION*/; |
+ break; |
+ |
+ case ':negate': |
+ |
+ code = "function $negate(x) {\n return (typeof(x) == 'number') ? -x : x.$negate();\n}"/*null._NEGATE_FUNCTION*/; |
+ break; |
+ |
+ case ':add': |
+ |
+ code = "function $add(x, y) {\n return ((typeof(x) == 'number' && typeof(y) == 'number') ||\n (typeof(x) == 'string'))\n ? x + y : x.$add(y);\n}"/*null._ADD_FUNCTION*/; |
+ break; |
+ |
+ case ':truncdiv': |
+ |
+ this.useThrow = true; |
+ code = "function $truncdiv(x, y) {\n if (typeof(x) == 'number' && typeof(y) == 'number') {\n if (y == 0) $throw(new IntegerDivisionByZeroException());\n var tmp = x / y;\n return (tmp < 0) ? Math.ceil(tmp) : Math.floor(tmp);\n } else {\n return x.$truncdiv(y);\n }\n}"/*null._TRUNCDIV_FUNCTION*/; |
+ break; |
+ |
+ case ':mod': |
+ |
+ code = "function $mod(x, y) {\n if (typeof(x) == 'number' && typeof(y) == 'number') {\n var result = x % y;\n if (result == 0) {\n return 0; // Make sure we don't return -0.0.\n } else if (result < 0) {\n if (y < 0) {\n return result - y;\n } else {\n return result + y;\n }\n }\n return result;\n } else {\n return x.$mod(y);\n }\n}"/*null._MOD_FUNCTION*/; |
+ break; |
+ |
+ default: |
+ |
+ var op = TokenKind.rawOperatorFromMethod(name); |
+ var jsname = $globals.world.toJsIdentifier(name); |
+ code = _otherOperator(jsname, op); |
+ break; |
+ |
+ } |
+ this._usedOperators.$setindex(name, code); |
+} |
+CoreJs.prototype.ensureDynamicProto = function() { |
+ if (this._generatedDynamicProto) return; |
+ this._generatedDynamicProto = true; |
+ this.ensureTypeNameOf(); |
+ this.writer.writeln("function $dynamic(name) {\n var f = Object.prototype[name];\n if (f && f.methods) return f.methods;\n\n var methods = {};\n if (f) methods.Object = f;\n function $dynamicBind() {\n // Find the target method\n var method;\n var proto = Object.getPrototypeOf(this);\n var obj = this;\n do {\n method = methods[obj.$typeNameOf()];\n if (method) break;\n obj = Object.getPrototypeOf(obj);\n } while (obj);\n\n // Patch the prototype, but don't overwrite an existing stub, like\n // the one on Object.prototype.\n if (!proto.hasOwnProperty(name)) proto[name] = method || methods.Object;\n\n return method.apply(this, Array.prototype.slice.call(arguments));\n };\n $dynamicBind.methods = methods;\n Object.prototype[name] = $dynamicBind;\n return methods;\n}"/*null._DYNAMIC_FUNCTION*/); |
+} |
+CoreJs.prototype.ensureTypeNameOf = function() { |
+ if (this._generatedTypeNameOf) return; |
+ this._generatedTypeNameOf = true; |
+ this.writer.writeln("Object.prototype.$typeNameOf = function() {\n if ((typeof(window) != 'undefined' && window.constructor.name == 'DOMWindow')\n || typeof(process) != 'undefined') { // fast-path for Chrome and Node\n return this.constructor.name;\n }\n var str = Object.prototype.toString.call(this);\n str = str.substring(8, str.length - 1);\n if (str == 'Window') str = 'DOMWindow';\n return str;\n}"/*null._TYPE_NAME_OF_FUNCTION*/); |
+} |
+CoreJs.prototype.ensureInheritsHelper = function() { |
+ if (this._generatedInherits) return; |
+ this._generatedInherits = true; |
+ this.writer.writeln("/** Implements extends for Dart classes on JavaScript prototypes. */\nfunction $inherits(child, parent) {\n if (child.prototype.__proto__) {\n child.prototype.__proto__ = parent.prototype;\n } else {\n function tmp() {};\n tmp.prototype = parent.prototype;\n child.prototype = new tmp();\n child.prototype.constructor = child;\n }\n}"/*null._INHERITS_FUNCTION*/); |
+} |
+CoreJs.prototype.generate = function(w) { |
+ w.write(this.writer.get$text()); |
+ this.writer = w; |
+ if (this.useGenStub) { |
+ this.useThrow = true; |
+ w.writeln("/**\n * Generates a dynamic call stub for a function.\n * Our goal is to create a stub method like this on-the-fly:\n * function($0, $1, capture) { return this($0, $1, true, capture); }\n *\n * This stub then replaces the dynamic one on Function, with one that is\n * specialized for that particular function, taking into account its default\n * arguments.\n */\nFunction.prototype.$genStub = function(argsLength, names) {\n // Fast path: if no named arguments and arg count matches\n if (this.length == argsLength && !names) {\n return this;\n }\n\n function $throwArgMismatch() {\n // TODO(jmesserly): better error message\n $throw(new ClosureArgumentMismatchException());\n }\n\n var paramsNamed = this.$optional ? (this.$optional.length / 2) : 0;\n var paramsBare = this.length - paramsNamed;\n var argsNamed = names ? names.length : 0;\n var argsBare = argsLength - argsNamed;\n\n // Check we got the right number of arguments\n if (argsBare < paramsBare || argsLength > this.length ||\n argsNamed > paramsNamed) {\n return $throwArgMismatch;\n }\n\n // First, fill in all of the default values\n var p = new Array(paramsBare);\n if (paramsNamed) {\n p = p.concat(this.$optional.slice(paramsNamed));\n }\n // Fill in positional args\n var a = new Array(argsLength);\n for (var i = 0; i < argsBare; i++) {\n p[i] = a[i] = '$' + i;\n }\n // Then overwrite with supplied values for optional args\n var lastParameterIndex;\n var namesInOrder = true;\n for (var i = 0; i < argsNamed; i++) {\n var name = names[i];\n a[i + argsBare] = name;\n var j = this.$optional.indexOf(name);\n if (j < 0 || j >= paramsNamed) {\n return $throwArgMismatch;\n } else if (lastParameterIndex && lastParameterIndex > j) {\n namesInOrder = false;\n }\n p[j + paramsBare] = name;\n lastParameterIndex = j;\n }\n\n if (this.length == argsLength && namesInOrder) {\n // Fast path #2: named arguments, but they're in order.\n return this;\n }\n\n // Note: using Function instead of 'eval' to get a clean scope.\n // TODO(jmesserly): evaluate the performance of these stubs.\n var f = 'function(' + a.join(',') + '){return $f(' + p.join(',') + ');}';\n return new Function('$f', 'return ' + f + '').call(null, this);\n}"/*null._GENSTUB_FUNCTION*/); |
+ } |
+ if (this.useStackTraceOf) { |
+ w.writeln("function $stackTraceOf(e) {\n // TODO(jmesserly): we shouldn't be relying on the e.stack property.\n // Need to mangle it.\n return (e && e.stack) ? e.stack : null;\n}"/*null._STACKTRACEOF_FUNCTION*/); |
+ } |
+ if (this.useNotNullBool) { |
+ this.useThrow = true; |
+ w.writeln("function $notnull_bool(test) {\n if (test === true || test === false) return test;\n $throw(new TypeError(test, 'bool'));\n}"/*null._NOTNULL_BOOL_FUNCTION*/); |
+ } |
+ if (this.useThrow) { |
+ w.writeln("function $throw(e) {\n // If e is not a value, we can use V8's captureStackTrace utility method.\n // TODO(jmesserly): capture the stack trace on other JS engines.\n if (e && (typeof e == 'object') && Error.captureStackTrace) {\n // TODO(jmesserly): this will clobber the e.stack property\n Error.captureStackTrace(e, $throw);\n }\n throw e;\n}"/*null._THROW_FUNCTION*/); |
+ } |
+ if (this.useToString) { |
+ w.writeln("function $toString(o) {\n if (o == null) return 'null';\n var t = typeof(o);\n if (t == 'object') { return o.toString(); }\n else if (t == 'string') { return o; }\n else if (t == 'bool') { return ''+o; }\n else if (t == 'number') { return ''+o; }\n else return o.toString();\n}"/*null._TOSTRING_FUNCTION*/); |
+ } |
+ if (this.useIndex) { |
+ w.writeln("Object.prototype.$index = function(i) {\n var proto = Object.getPrototypeOf(this);\n if (proto !== Object) {\n proto.$index = function(i) { return this[i]; }\n }\n return this[i];\n}\nArray.prototype.$index = function(i) { return this[i]; }\nString.prototype.$index = function(i) { return this[i]; }"/*null._INDEX_OPERATORS*/); |
+ } |
+ if (this.useSetIndex) { |
+ w.writeln("Object.prototype.$setindex = function(i, value) {\n var proto = Object.getPrototypeOf(this);\n if (proto !== Object) {\n proto.$setindex = function(i, value) { return this[i] = value; }\n }\n return this[i] = value;\n}\nArray.prototype.$setindex = function(i, value) { return this[i] = value; }"/*null._SETINDEX_OPERATORS*/); |
+ } |
+ if (this.useIsolates) { |
+ if (this.useWrap0) { |
+ w.writeln("// Wrap a 0-arg dom-callback to bind it with the current isolate:\nfunction $wrap_call$0(fn) { return fn && fn.wrap$call$0(); }\nFunction.prototype.wrap$call$0 = function() {\n var isolateContext = $globalState.currentContext;\n var self = this;\n this.wrap$0 = function() {\n isolateContext.eval(self);\n $globalState.topEventLoop.run();\n };\n this.wrap$call$0 = function() { return this.wrap$0; };\n return this.wrap$0;\n}"/*null._WRAP_CALL0_FUNCTION*/); |
+ } |
+ if (this.useWrap1) { |
+ w.writeln("// Wrap a 1-arg dom-callback to bind it with the current isolate:\nfunction $wrap_call$1(fn) { return fn && fn.wrap$call$1(); }\nFunction.prototype.wrap$call$1 = function() {\n var isolateContext = $globalState.currentContext;\n var self = this;\n this.wrap$1 = function(arg) {\n isolateContext.eval(function() { self(arg); });\n $globalState.topEventLoop.run();\n };\n this.wrap$call$1 = function() { return this.wrap$1; };\n return this.wrap$1;\n}"/*null._WRAP_CALL1_FUNCTION*/); |
+ } |
+ w.writeln("var $globalThis = this;\nvar $globals = null;\nvar $globalState = null;"/*null._ISOLATE_INIT_CODE*/); |
+ } |
+ else { |
+ if (this.useWrap0) { |
+ w.writeln("function $wrap_call$0(fn) { return fn; }"/*null._EMPTY_WRAP_CALL0_FUNCTION*/); |
+ } |
+ if (this.useWrap1) { |
+ w.writeln("function $wrap_call$1(fn) { return fn; }"/*null._EMPTY_WRAP_CALL1_FUNCTION*/); |
+ } |
+ } |
+ var $$list = orderValuesByKeys(this._usedOperators); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var opImpl = $$list.$index($$i); |
+ w.writeln(opImpl); |
+ } |
+} |
+CoreJs.prototype.generate$1 = CoreJs.prototype.generate; |
+// ********** Code for Element ************** |
+function Element(name, _enclosingElement) { |
+ this.name = name; |
+ this._enclosingElement = _enclosingElement; |
+ // Initializers done |
+ this._jsname = $globals.world.toJsIdentifier(this.name); |
+} |
+Element.prototype.get$name = function() { return this.name; }; |
+Element.prototype.set$name = function(value) { return this.name = value; }; |
+Element.prototype.get$_jsname = function() { return this._jsname; }; |
+Element.prototype.set$_jsname = function(value) { return this._jsname = value; }; |
+Element.prototype.get$library = function() { |
+ return null; |
+} |
+Element.prototype.get$span = function() { |
+ return null; |
+} |
+Element.prototype.get$isNative = function() { |
+ return false; |
+} |
+Element.prototype.hashCode = function() { |
+ return this.name.hashCode(); |
+} |
+Element.prototype.get$jsname = function() { |
+ return this._jsname; |
+} |
+Element.prototype.resolve = function() { |
+ |
+} |
+Element.prototype.get$typeParameters = function() { |
+ return null; |
+} |
+Element.prototype.get$enclosingElement = function() { |
+ return this._enclosingElement == null ? this.get$library() : this._enclosingElement; |
+} |
+Element.prototype.set$enclosingElement = function(e) { |
+ return this._enclosingElement = e; |
+} |
+Element.prototype.resolveType = function(node, typeErrors) { |
+ if (node == null) return $globals.world.varType; |
+ if (node.type != null) return node.type; |
+ if ((node instanceof NameTypeReference)) { |
+ var typeRef = node; |
+ var name; |
+ if (typeRef.names != null) { |
+ name = typeRef.names.last().get$name(); |
+ } |
+ else { |
+ name = typeRef.name.name; |
+ } |
+ if (this.get$typeParameters() != null) { |
+ var $$list = this.get$typeParameters(); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var tp = $$list.$index($$i); |
+ if ($eq(tp.get$name(), name)) { |
+ typeRef.type = tp; |
+ } |
+ } |
+ } |
+ if (typeRef.type != null) { |
+ return typeRef.type; |
+ } |
+ return this.get$enclosingElement().resolveType(node, typeErrors); |
+ } |
+ else if ((node instanceof GenericTypeReference)) { |
+ var typeRef = node; |
+ var baseType = this.resolveType(typeRef.baseType, typeErrors); |
+ if (!baseType.get$isGeneric()) { |
+ $globals.world.error(('' + baseType.get$name() + ' is not generic'), typeRef.span); |
+ return null; |
+ } |
+ if (typeRef.typeArguments.length != baseType.get$typeParameters().length) { |
+ $globals.world.error('wrong number of type arguments', typeRef.span); |
+ return null; |
+ } |
+ var typeArgs = []; |
+ for (var i = 0; |
+ i < typeRef.typeArguments.length; i++) { |
+ typeArgs.add$1(this.resolveType(typeRef.typeArguments.$index(i), typeErrors)); |
+ } |
+ typeRef.type = baseType.getOrMakeConcreteType$1(typeArgs); |
+ } |
+ else if ((node instanceof FunctionTypeReference)) { |
+ var typeRef = node; |
+ var name = ''; |
+ if (typeRef.func.name != null) { |
+ name = typeRef.func.name.name; |
+ } |
+ typeRef.type = this.get$library().getOrAddFunctionType(this, name, typeRef.func); |
+ } |
+ else { |
+ $globals.world.internalError('unknown type reference', node.span); |
+ } |
+ return node.type; |
+} |
+Element.prototype.hashCode$0 = Element.prototype.hashCode; |
+Element.prototype.resolve$0 = Element.prototype.resolve; |
+// ********** Code for WorldGenerator ************** |
+function WorldGenerator(main, writer) { |
+ this.hasStatics = false |
+ this.main = main; |
+ this.writer = writer; |
+ this.globals = new HashMapImplementation(); |
+ this.corejs = new CoreJs(); |
+ // Initializers done |
+} |
+WorldGenerator.prototype.run = function() { |
+ var metaGen = new MethodGenerator(this.main, null); |
+ var mainTarget = new Value.type$ctor(this.main.declaringType, this.main.get$span()); |
+ var mainCall = this.main.invoke(metaGen, null, mainTarget, Arguments.get$EMPTY(), false); |
+ this.main.declaringType.markUsed(); |
+ if ($globals.options.compileAll) { |
+ this.markLibrariesUsed([$globals.world.get$coreimpl(), $globals.world.corelib, this.main.declaringType.get$library()]); |
+ } |
+ else { |
+ $globals.world.corelib.types.$index('BadNumberFormatException').markUsed$0(); |
+ $globals.world.get$coreimpl().types.$index('NumImplementation').markUsed$0(); |
+ $globals.world.get$coreimpl().types.$index('StringImplementation').markUsed$0(); |
+ this.genMethod($globals.world.get$coreimpl().types.$index('StringImplementation').getMember$1('contains')); |
+ } |
+ if ($globals.world.corelib.types.$index('Isolate').get$isUsed() || $globals.world.get$coreimpl().types.$index('ReceivePortImpl').get$isUsed()) { |
+ if (this.corejs.useWrap0 || this.corejs.useWrap1) { |
+ this.genMethod($globals.world.get$coreimpl().types.$index('IsolateContext').getMember$1('eval')); |
+ this.genMethod($globals.world.get$coreimpl().types.$index('EventLoop').getMember$1('run')); |
+ } |
+ this.corejs.useIsolates = true; |
+ var isolateMain = $globals.world.get$coreimpl().topType.resolveMember('startRootIsolate').members.$index(0); |
+ var isolateMainTarget = new Value.type$ctor($globals.world.get$coreimpl().topType, this.main.get$span()); |
+ mainCall = isolateMain.invoke(metaGen, null, isolateMainTarget, new Arguments(null, [this.main._get(metaGen, this.main.definition, null, false)]), false); |
+ } |
+ this.writeTypes($globals.world.get$coreimpl()); |
+ this.writeTypes($globals.world.corelib); |
+ this.writeTypes(this.main.declaringType.get$library()); |
+ if (this._mixins != null) this.writer.write(this._mixins.get$text()); |
+ this.writeGlobals(); |
+ this.writer.writeln(('' + mainCall.get$code() + ';')); |
+} |
+WorldGenerator.prototype.markLibrariesUsed = function(libs) { |
+ return this.getAllTypes(libs).forEach(this.get$markTypeUsed()); |
+} |
+WorldGenerator.prototype.markTypeUsed = function(type) { |
+ if (!type.get$isClass()) return; |
+ type.markUsed(); |
+ type.isTested = true; |
+ type.isTested = !type.get$isTop() && !(type.get$isNative() && type.get$members().getValues().every$1((function (m) { |
+ return m.get$isStatic() && !m.get$isFactory(); |
+ }) |
+ )); |
+ var members = ListFactory.ListFactory$from$factory(type.get$members().getValues()); |
+ members.addAll(type.get$constructors().getValues()); |
+ type.get$factories().forEach((function (f) { |
+ return members.add(f); |
+ }) |
+ ); |
+ for (var $$i = 0;$$i < members.length; $$i++) { |
+ var member = members.$index($$i); |
+ if ((member instanceof PropertyMember)) { |
+ if (member.get$getter() != null) this.genMethod(member.get$getter()); |
+ if (member.get$setter() != null) this.genMethod(member.get$setter()); |
+ } |
+ if ((member instanceof MethodMember)) this.genMethod(member); |
+ } |
+} |
+WorldGenerator.prototype.get$markTypeUsed = function() { |
+ return WorldGenerator.prototype.markTypeUsed.bind(this); |
+} |
+WorldGenerator.prototype.getAllTypes = function(libs) { |
+ var types = []; |
+ var seen = new HashSetImplementation(); |
+ for (var $$i = 0;$$i < libs.length; $$i++) { |
+ var mainLib = libs.$index($$i); |
+ var toCheck = DoubleLinkedQueue.DoubleLinkedQueue$from$factory([mainLib]); |
+ while (!toCheck.isEmpty()) { |
+ var lib = toCheck.removeFirst(); |
+ if (seen.contains(lib)) continue; |
+ seen.add(lib); |
+ lib.get$imports().forEach$1((function (lib, toCheck, i) { |
+ return toCheck.addLast(lib); |
+ }).bind(null, lib, toCheck) |
+ ); |
+ lib.get$types().getValues$0().forEach$1((function (t) { |
+ return types.add(t); |
+ }) |
+ ); |
+ } |
+ } |
+ return types; |
+} |
+WorldGenerator.prototype.globalForStaticField = function(field, fieldValue, dependencies) { |
+ this.hasStatics = true; |
+ var fullname = ("" + field.declaringType.get$jsname() + "." + field.get$jsname()); |
+ if (!this.globals.containsKey(fullname)) { |
+ this.globals.$setindex(fullname, GlobalValue.GlobalValue$fromStatic$factory(field, fieldValue, dependencies)); |
+ } |
+ return this.globals.$index(fullname); |
+} |
+WorldGenerator.prototype.globalForConst = function(exp, dependencies) { |
+ var key = exp.get$type().get$jsname() + ':' + exp.canonicalCode; |
+ if (!this.globals.containsKey(key)) { |
+ this.globals.$setindex(key, GlobalValue.GlobalValue$fromConst$factory(this.globals.get$length(), exp, dependencies)); |
+ } |
+ return this.globals.$index(key); |
+} |
+WorldGenerator.prototype.writeTypes = function(lib) { |
+ if (lib.isWritten) return; |
+ lib.isWritten = true; |
+ var $$list = lib.imports; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var import_ = $$list.$index($$i); |
+ this.writeTypes(import_.get$library()); |
+ } |
+ for (var i = 0; |
+ i < lib.sources.length; i++) { |
+ lib.sources.$index(i).set$orderInLibrary(i); |
+ } |
+ this.writer.comment(('// ********** Library ' + lib.name + ' **************')); |
+ if (lib.get$isCore()) { |
+ this.writer.comment('// ********** Natives dart:core **************'); |
+ this.corejs.generate(this.writer); |
+ } |
+ var $$list = lib.natives; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var file = $$list.$index($$i); |
+ var filename = basename(file.get$filename()); |
+ this.writer.comment(('// ********** Natives ' + filename + ' **************')); |
+ this.writer.writeln(file.get$text()); |
+ } |
+ lib.topType.markUsed(); |
+ var $$list = this._orderValues(lib.types); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var type = $$list.$index($$i); |
+ if ((type.get$isUsed() || $eq(type.get$library(), $globals.world.get$dom()) || type.get$isHiddenNativeType()) && type.get$isClass()) { |
+ this.writeType(type); |
+ if (type.get$isGeneric()) { |
+ var $list0 = this._orderValues(type.get$_concreteTypes()); |
+ for (var $i0 = 0;$i0 < $list0.length; $i0++) { |
+ var ct = $list0.$index($i0); |
+ this.writeType(ct); |
+ } |
+ } |
+ } |
+ else if (type.get$isFunction() && type.get$varStubs().length > 0) { |
+ this.writer.comment(('// ********** Code for ' + type.get$jsname() + ' **************')); |
+ this._writeDynamicStubs(type); |
+ } |
+ if (type.get$typeCheckCode() != null) { |
+ this.writer.writeln(type.get$typeCheckCode()); |
+ } |
+ } |
+} |
+WorldGenerator.prototype.genMethod = function(meth, enclosingMethod) { |
+ if (!meth.isGenerated && !meth.get$isAbstract() && meth.get$definition() != null) { |
+ new MethodGenerator(meth, enclosingMethod).run(); |
+ } |
+} |
+WorldGenerator.prototype._prototypeOf = function(type, name) { |
+ if (type.get$isSingletonNative()) { |
+ return ('' + type.get$jsname() + '.' + name); |
+ } |
+ else if (type.get$isHiddenNativeType()) { |
+ this.corejs.ensureDynamicProto(); |
+ return ('\$dynamic("' + name + '").' + type.get$jsname()); |
+ } |
+ else { |
+ return ('' + type.get$jsname() + '.prototype.' + name); |
+ } |
+} |
+WorldGenerator.prototype._maybeIsTest = function(onType, checkType) { |
+ var isSubtype = onType.isSubtypeOf(checkType); |
+ if (checkType.isTested) { |
+ this.writer.writeln(this._prototypeOf(onType, ('is\$' + checkType.get$jsname())) + (' = function(){return ' + isSubtype + '};')); |
+ } |
+ if (checkType.isChecked) { |
+ var body = 'return this'; |
+ var checkName = ('assert\$' + checkType.get$jsname()); |
+ if (!isSubtype) { |
+ body = $globals.world.objectType.varStubs.$index(checkName).get$body(); |
+ } |
+ else if (onType.name == 'StringImplementation' || onType.name == 'NumImplementation') { |
+ body = ('return ' + onType.get$nativeType().name + '(this)'); |
+ } |
+ this.writer.writeln(this._prototypeOf(onType, checkName) + (' = function(){' + body + '};')); |
+ } |
+} |
+WorldGenerator.prototype.writeType = function(type) { |
+ if (type.isWritten) return; |
+ type.isWritten = true; |
+ if (type.get$parent() != null && !type.get$isNative()) { |
+ this.writeType(type.get$parent()); |
+ } |
+ if (type.name != null && (type instanceof ConcreteType) && $eq(type.get$library(), $globals.world.get$coreimpl()) && type.name.startsWith('ListFactory')) { |
+ this.writer.writeln(('' + type.get$jsname() + ' = ' + type.get$genericType().get$jsname() + ';')); |
+ return; |
+ } |
+ var typeName = type.get$jsname() != null ? type.get$jsname() : 'top level'; |
+ this.writer.comment(('// ********** Code for ' + typeName + ' **************')); |
+ if (type.get$isNative() && !type.get$isTop()) { |
+ var nativeName = type.get$definition().get$nativeType().get$name(); |
+ if ($eq(nativeName, '')) { |
+ this.writer.writeln(('function ' + type.get$jsname() + '() {}')); |
+ } |
+ else if (type.get$jsname() != nativeName) { |
+ this.writer.writeln(('' + type.get$jsname() + ' = ' + nativeName + ';')); |
+ } |
+ } |
+ if (!type.get$isTop()) { |
+ if ((type instanceof ConcreteType)) { |
+ var c = type; |
+ this.corejs.ensureInheritsHelper(); |
+ this.writer.writeln(('\$inherits(' + c.get$jsname() + ', ' + c.genericType.get$jsname() + ');')); |
+ for (var p = c._parent; |
+ (p instanceof ConcreteType); p = p.get$_parent()) { |
+ this._ensureInheritMembersHelper(); |
+ this._mixins.writeln(('\$inheritsMembers(' + c.get$jsname() + ', ' + p.get$jsname() + ');')); |
+ } |
+ } |
+ else if (!type.get$isNative()) { |
+ if (type.get$parent() != null && !type.get$parent().get$isObject()) { |
+ this.corejs.ensureInheritsHelper(); |
+ this.writer.writeln(('\$inherits(' + type.get$jsname() + ', ' + type.get$parent().get$jsname() + ');')); |
+ } |
+ } |
+ } |
+ if (type.get$isTop()) { |
+ } |
+ else if (type.get$constructors().get$length() == 0) { |
+ if (!type.get$isNative()) { |
+ this.writer.writeln(('function ' + type.get$jsname() + '() {}')); |
+ } |
+ } |
+ else { |
+ var standardConstructor = type.get$constructors().$index(''); |
+ if (standardConstructor == null || standardConstructor.generator == null) { |
+ if (!type.get$isNative()) { |
+ this.writer.writeln(('function ' + type.get$jsname() + '() {}')); |
+ } |
+ } |
+ else { |
+ standardConstructor.generator.writeDefinition(this.writer, null); |
+ } |
+ var $$list = type.get$constructors().getValues(); |
+ for (var $$i = type.get$constructors().getValues().iterator$0(); $$i.hasNext$0(); ) { |
+ var c = $$i.next$0(); |
+ if (c.get$generator() != null && $ne(c, standardConstructor)) { |
+ c.get$generator().writeDefinition$2(this.writer); |
+ } |
+ } |
+ } |
+ if (!(type instanceof ConcreteType)) { |
+ this._maybeIsTest(type, type); |
+ } |
+ if (type.get$genericType()._concreteTypes != null) { |
+ var $$list = this._orderValues(type.get$genericType()._concreteTypes); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var ct = $$list.$index($$i); |
+ this._maybeIsTest(type, ct); |
+ } |
+ } |
+ if (type.get$interfaces() != null) { |
+ var seen = new HashSetImplementation(); |
+ var worklist = []; |
+ worklist.addAll(type.get$interfaces()); |
+ seen.addAll(type.get$interfaces()); |
+ while (!worklist.isEmpty()) { |
+ var interface_ = worklist.removeLast(); |
+ this._maybeIsTest(type, interface_.get$genericType()); |
+ if (interface_.get$genericType().get$_concreteTypes() != null) { |
+ var $$list = this._orderValues(interface_.get$genericType().get$_concreteTypes()); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var ct = $$list.$index($$i); |
+ this._maybeIsTest(type, ct); |
+ } |
+ } |
+ var $$list = interface_.get$interfaces(); |
+ for (var $$i = interface_.get$interfaces().iterator$0(); $$i.hasNext$0(); ) { |
+ var other = $$i.next$0(); |
+ if (!seen.contains(other)) { |
+ worklist.addLast(other); |
+ seen.add(other); |
+ } |
+ } |
+ } |
+ } |
+ type.get$factories().forEach(this.get$_writeMethod()); |
+ var $$list = this._orderValues(type.get$members()); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var member = $$list.$index($$i); |
+ if ((member instanceof FieldMember)) { |
+ this._writeField(member); |
+ } |
+ if ((member instanceof PropertyMember)) { |
+ this._writeProperty(member); |
+ } |
+ if (member.get$isMethod()) { |
+ this._writeMethod(member); |
+ } |
+ } |
+ this._writeDynamicStubs(type); |
+} |
+WorldGenerator.prototype._ensureInheritMembersHelper = function() { |
+ if (this._mixins != null) return; |
+ this._mixins = new CodeWriter(); |
+ this._mixins.comment('// ********** Generic Type Inheritance **************'); |
+ this._mixins.writeln("/** Implements extends for generic types. */\nfunction $inheritsMembers(child, parent) {\n child = child.prototype;\n parent = parent.prototype;\n Object.getOwnPropertyNames(parent).forEach(function(name) {\n if (typeof(child[name]) == 'undefined') child[name] = parent[name];\n });\n}"); |
+} |
+WorldGenerator.prototype._writeDynamicStubs = function(type) { |
+ var $$list = orderValuesByKeys(type.varStubs); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var stub = $$list.$index($$i); |
+ if (!stub.get$isGenerated()) stub.generate$1(this.writer); |
+ } |
+} |
+WorldGenerator.prototype._writeStaticField = function(field) { |
+ if (field.isFinal) return; |
+ var fullname = ("" + field.declaringType.get$jsname() + "." + field.get$jsname()); |
+ if (this.globals.containsKey(fullname)) { |
+ var value = this.globals.$index(fullname); |
+ if (field.declaringType.get$isTop() && !field.isNative) { |
+ this.writer.writeln(('\$globals.' + field.get$jsname() + ' = ' + value.get$exp().get$code() + ';')); |
+ } |
+ else { |
+ this.writer.writeln(('\$globals.' + field.declaringType.get$jsname() + '_' + field.get$jsname()) + (' = ' + value.get$exp().get$code() + ';')); |
+ } |
+ } |
+} |
+WorldGenerator.prototype._writeField = function(field) { |
+ if (field.declaringType.get$isTop() && !field.isNative && field.value == null) { |
+ this.writer.writeln(('var ' + field.get$jsname() + ';')); |
+ } |
+ if (field._providePropertySyntax) { |
+ this.writer.writeln(this._prototypeOf(field.declaringType, ('get\$' + field.get$jsname())) + (' = function() { return this.' + field.get$jsname() + '; };')); |
+ if (!field.isFinal) { |
+ this.writer.writeln(this._prototypeOf(field.declaringType, ('set\$' + field.get$jsname())) + (' = function(value) { return this.' + field.get$jsname() + ' = value; };')); |
+ } |
+ } |
+} |
+WorldGenerator.prototype._writeProperty = function(property) { |
+ if (property.getter != null) this._writeMethod(property.getter); |
+ if (property.setter != null) this._writeMethod(property.setter); |
+ if (property._provideFieldSyntax) { |
+ this.writer.enterBlock('Object.defineProperty(' + ('' + property.declaringType.get$jsname() + '.prototype, "' + property.get$jsname() + '", {')); |
+ if (property.getter != null) { |
+ this.writer.write(('get: ' + property.declaringType.get$jsname() + '.prototype.' + property.getter.get$jsname())); |
+ this.writer.writeln(property.setter == null ? '' : ','); |
+ } |
+ if (property.setter != null) { |
+ this.writer.writeln(('set: ' + property.declaringType.get$jsname() + '.prototype.' + property.setter.get$jsname())); |
+ } |
+ this.writer.exitBlock('});'); |
+ } |
+} |
+WorldGenerator.prototype._writeMethod = function(method) { |
+ if (method.generator != null) { |
+ method.generator.writeDefinition(this.writer, null); |
+ } |
+} |
+WorldGenerator.prototype.get$_writeMethod = function() { |
+ return WorldGenerator.prototype._writeMethod.bind(this); |
+} |
+WorldGenerator.prototype.writeGlobals = function() { |
+ if (this.globals.get$length() > 0) { |
+ this.writer.comment('// ********** Globals **************'); |
+ var list = this.globals.getValues(); |
+ list.sort$1((function (a, b) { |
+ return a.compareTo$1(b); |
+ }) |
+ ); |
+ this.writer.enterBlock('function \$static_init(){'); |
+ for (var $$i = list.iterator$0(); $$i.hasNext$0(); ) { |
+ var global = $$i.next$0(); |
+ if (global.get$field() != null) { |
+ this._writeStaticField(global.get$field()); |
+ } |
+ } |
+ this.writer.exitBlock('}'); |
+ for (var $$i = list.iterator$0(); $$i.hasNext$0(); ) { |
+ var global0 = $$i.next$0(); |
+ if (global0.get$field() == null) { |
+ this.writer.writeln(('var ' + global0.get$name() + ' = ' + global0.get$exp().get$code() + ';')); |
+ } |
+ } |
+ } |
+ if (!this.corejs.useIsolates) { |
+ if (this.hasStatics) { |
+ this.writer.writeln('var \$globals = {};'); |
+ } |
+ if (this.globals.get$length() > 0) { |
+ this.writer.writeln('\$static_init();'); |
+ } |
+ } |
+} |
+WorldGenerator.prototype._orderValues = function(map) { |
+ var values = map.getValues(); |
+ values.sort(this.get$_compareMembers()); |
+ return values; |
+} |
+WorldGenerator.prototype._compareMembers = function(x, y) { |
+ if (x.get$span() != null && y.get$span() != null) { |
+ var spans = x.get$span().compareTo$1(y.get$span()); |
+ if (spans != 0) return spans; |
+ } |
+ if (x.get$span() == null) return 1; |
+ if (y.get$span() == null) return -1; |
+ return x.get$name().compareTo$1(y.get$name()); |
+} |
+WorldGenerator.prototype.get$_compareMembers = function() { |
+ return WorldGenerator.prototype._compareMembers.bind(this); |
+} |
+// ********** Code for BlockScope ************** |
+function BlockScope(enclosingMethod, parent, reentrant) { |
+ this.enclosingMethod = enclosingMethod; |
+ this.parent = parent; |
+ this.reentrant = reentrant; |
+ this._vars = new HashMapImplementation(); |
+ this._jsNames = new HashSetImplementation(); |
+ // Initializers done |
+ if (this.get$isMethodScope()) { |
+ this._closedOver = new HashSetImplementation(); |
+ } |
+ else { |
+ this.reentrant = reentrant || this.parent.reentrant; |
+ } |
+} |
+BlockScope.prototype.get$enclosingMethod = function() { return this.enclosingMethod; }; |
+BlockScope.prototype.set$enclosingMethod = function(value) { return this.enclosingMethod = value; }; |
+BlockScope.prototype.get$parent = function() { return this.parent; }; |
+BlockScope.prototype.set$parent = function(value) { return this.parent = value; }; |
+BlockScope.prototype.get$_vars = function() { return this._vars; }; |
+BlockScope.prototype.set$_vars = function(value) { return this._vars = value; }; |
+BlockScope.prototype.get$_jsNames = function() { return this._jsNames; }; |
+BlockScope.prototype.set$_jsNames = function(value) { return this._jsNames = value; }; |
+BlockScope.prototype.get$_closedOver = function() { return this._closedOver; }; |
+BlockScope.prototype.set$_closedOver = function(value) { return this._closedOver = value; }; |
+BlockScope.prototype.get$rethrow = function() { return this.rethrow; }; |
+BlockScope.prototype.set$rethrow = function(value) { return this.rethrow = value; }; |
+BlockScope.prototype.get$reentrant = function() { return this.reentrant; }; |
+BlockScope.prototype.set$reentrant = function(value) { return this.reentrant = value; }; |
+BlockScope.prototype.get$isMethodScope = function() { |
+ return this.parent == null || $ne(this.parent.enclosingMethod, this.enclosingMethod); |
+} |
+BlockScope.prototype.get$methodScope = function() { |
+ var s = this; |
+ while (!s.get$isMethodScope()) s = s.get$parent(); |
+ return s; |
+} |
+BlockScope.prototype.lookup = function(name) { |
+ var ret = this._vars.$index(name); |
+ if (ret != null) return ret; |
+ for (var s = this.parent; |
+ s != null; s = s.get$parent()) { |
+ ret = s.get$_vars().$index(name); |
+ if (ret != null) { |
+ if ($ne(s.get$enclosingMethod(), this.enclosingMethod)) { |
+ s.get$methodScope().get$_closedOver().add$1(ret.get$code()); |
+ if (this.enclosingMethod.captures != null && s.get$reentrant()) { |
+ this.enclosingMethod.captures.add(ret.get$code()); |
+ } |
+ } |
+ return ret; |
+ } |
+ } |
+} |
+BlockScope.prototype._isDefinedInParent = function(name) { |
+ if (this.get$isMethodScope() && this._closedOver.contains(name)) return true; |
+ for (var s = this.parent; |
+ s != null; s = s.get$parent()) { |
+ if (s.get$_vars().containsKey$1(name)) return true; |
+ if (s.get$_jsNames().contains$1(name)) return true; |
+ if (s.get$isMethodScope() && s.get$_closedOver().contains$1(name)) return true; |
+ } |
+ var type = this.enclosingMethod.method.declaringType; |
+ if (type.get$library().lookup(name, null) != null) return true; |
+ return false; |
+} |
+BlockScope.prototype.create = function(name, type, span, isFinal, isParameter) { |
+ var jsName = $globals.world.toJsIdentifier(name); |
+ if (this._vars.containsKey(name)) { |
+ $globals.world.error(('duplicate name "' + name + '"'), span); |
+ } |
+ if (!isParameter) { |
+ var index = 0; |
+ while (this._isDefinedInParent(jsName)) { |
+ jsName = ('' + name + (index++)); |
+ } |
+ } |
+ var ret = new Value(type, jsName, span, false); |
+ ret.set$isFinal(isFinal); |
+ this._vars.$setindex(name, ret); |
+ if (name != jsName) this._jsNames.add(jsName); |
+ return ret; |
+} |
+BlockScope.prototype.declareParameter = function(p) { |
+ return this.create(p.name, p.type, p.definition.span, false, true); |
+} |
+BlockScope.prototype.declare = function(id) { |
+ var type = this.enclosingMethod.method.resolveType(id.type, false); |
+ return this.create(id.name.name, type, id.span, false, false); |
+} |
+BlockScope.prototype.getRethrow = function() { |
+ var scope = this; |
+ while (scope.get$rethrow() == null && scope.get$parent() != null) { |
+ scope = scope.get$parent(); |
+ } |
+ return scope.get$rethrow(); |
+} |
+// ********** Code for MethodGenerator ************** |
+function MethodGenerator(method, enclosingMethod) { |
+ this.method = method; |
+ this.enclosingMethod = enclosingMethod; |
+ this.writer = new CodeWriter(); |
+ this.needsThis = false; |
+ // Initializers done |
+ if (this.enclosingMethod != null) { |
+ this._scope = new BlockScope(this, this.enclosingMethod._scope, false); |
+ this.captures = new HashSetImplementation(); |
+ } |
+ else { |
+ this._scope = new BlockScope(this, null, false); |
+ } |
+ this._usedTemps = new HashSetImplementation(); |
+ this._freeTemps = []; |
+} |
+MethodGenerator.prototype.get$enclosingMethod = function() { return this.enclosingMethod; }; |
+MethodGenerator.prototype.set$enclosingMethod = function(value) { return this.enclosingMethod = value; }; |
+MethodGenerator.prototype.get$needsThis = function() { return this.needsThis; }; |
+MethodGenerator.prototype.set$needsThis = function(value) { return this.needsThis = value; }; |
+MethodGenerator.prototype.get$library = function() { |
+ return this.method.get$library(); |
+} |
+MethodGenerator.prototype.findMembers = function(name) { |
+ return this.get$library()._findMembers(name); |
+} |
+MethodGenerator.prototype.get$isClosure = function() { |
+ return (this.enclosingMethod != null); |
+} |
+MethodGenerator.prototype.get$isStatic = function() { |
+ return this.method.get$isStatic(); |
+} |
+MethodGenerator.prototype.getTemp = function(value) { |
+ return value.needsTemp ? this.forceTemp(value) : value; |
+} |
+MethodGenerator.prototype.forceTemp = function(value) { |
+ var name; |
+ if (this._freeTemps.length > 0) { |
+ name = this._freeTemps.removeLast(); |
+ } |
+ else { |
+ name = '\$' + this._usedTemps.get$length(); |
+ } |
+ this._usedTemps.add(name); |
+ return new Value(value.get$type(), name, value.span, false); |
+} |
+MethodGenerator.prototype.assignTemp = function(tmp, v) { |
+ if ($eq(tmp, v)) { |
+ return v; |
+ } |
+ else { |
+ return new Value(v.get$type(), ('(' + tmp.code + ' = ' + v.code + ')'), v.span, true); |
+ } |
+} |
+MethodGenerator.prototype.freeTemp = function(value) { |
+ if (this._usedTemps.remove(value.code)) { |
+ this._freeTemps.add(value.code); |
+ } |
+ else { |
+ $globals.world.internalError(('tried to free unused value or non-temp "' + value.code + '"')); |
+ } |
+} |
+MethodGenerator.prototype.run = function() { |
+ if (this.method.isGenerated) return; |
+ this.method.isGenerated = true; |
+ this.method.generator = this; |
+ this.writeBody(); |
+ if (this.method.get$definition().get$nativeBody() != null) { |
+ this.writer = new CodeWriter(); |
+ if ($eq(this.method.get$definition().get$nativeBody(), '')) { |
+ this.method.generator = null; |
+ } |
+ else { |
+ this._paramCode = map(this.method.get$parameters(), (function (p) { |
+ return p.get$name(); |
+ }) |
+ ); |
+ this.writer.write(this.method.get$definition().get$nativeBody()); |
+ } |
+ } |
+} |
+MethodGenerator.prototype.writeDefinition = function(defWriter, lambda) { |
+ var paramCode = this._paramCode; |
+ var names = null; |
+ if (this.captures != null && this.captures.get$length() > 0) { |
+ names = ListFactory.ListFactory$from$factory(this.captures); |
+ names.sort$1((function (x, y) { |
+ return x.compareTo$1(y); |
+ }) |
+ ); |
+ paramCode = ListFactory.ListFactory$from$factory(names); |
+ paramCode.addAll$1(this._paramCode); |
+ } |
+ var _params = ('(' + Strings.join(this._paramCode, ", ") + ')'); |
+ var params = ('(' + Strings.join(paramCode, ", ") + ')'); |
+ if (this.method.declaringType.get$isTop() && !this.get$isClosure()) { |
+ defWriter.enterBlock(('function ' + this.method.get$jsname() + params + ' {')); |
+ } |
+ else if (this.get$isClosure()) { |
+ if (this.method.name == '') { |
+ defWriter.enterBlock(('(function ' + params + ' {')); |
+ } |
+ else if (names != null) { |
+ if (lambda == null) { |
+ defWriter.enterBlock(('var ' + this.method.get$jsname() + ' = (function' + params + ' {')); |
+ } |
+ else { |
+ defWriter.enterBlock(('(function ' + this.method.get$jsname() + params + ' {')); |
+ } |
+ } |
+ else { |
+ defWriter.enterBlock(('function ' + this.method.get$jsname() + params + ' {')); |
+ } |
+ } |
+ else if (this.method.get$isConstructor()) { |
+ if (this.method.get$constructorName() == '') { |
+ defWriter.enterBlock(('function ' + this.method.declaringType.get$jsname() + params + ' {')); |
+ } |
+ else { |
+ defWriter.enterBlock(('' + this.method.declaringType.get$jsname() + '.' + this.method.get$constructorName() + '\$ctor = function' + params + ' {')); |
+ } |
+ } |
+ else if (this.method.get$isFactory()) { |
+ defWriter.enterBlock(('' + this.method.get$generatedFactoryName() + ' = function' + _params + ' {')); |
+ } |
+ else if (this.method.get$isStatic()) { |
+ defWriter.enterBlock(('' + this.method.declaringType.get$jsname() + '.' + this.method.get$jsname() + ' = function' + _params + ' {')); |
+ } |
+ else { |
+ defWriter.enterBlock($globals.world.gen._prototypeOf(this.method.declaringType, this.method.get$jsname()) + (' = function' + _params + ' {')); |
+ } |
+ if (this.needsThis) { |
+ defWriter.writeln('var \$this = this; // closure support'); |
+ } |
+ if (this._usedTemps.get$length() > 0 || this._freeTemps.length > 0) { |
+ this._freeTemps.addAll(this._usedTemps); |
+ this._freeTemps.sort((function (x, y) { |
+ return x.compareTo$1(y); |
+ }) |
+ ); |
+ defWriter.writeln(('var ' + Strings.join(this._freeTemps, ", ") + ';')); |
+ } |
+ defWriter.writeln(this.writer.get$text()); |
+ if (names != null) { |
+ defWriter.exitBlock(('}).bind(null, ' + Strings.join(names, ", ") + ')')); |
+ } |
+ else if (this.get$isClosure() && this.method.name == '') { |
+ defWriter.exitBlock('})'); |
+ } |
+ else { |
+ defWriter.exitBlock('}'); |
+ } |
+ if (this.method.get$isConstructor() && this.method.get$constructorName() != '') { |
+ defWriter.writeln(('' + this.method.declaringType.get$jsname() + '.' + this.method.get$constructorName() + '\$ctor.prototype = ') + ('' + this.method.declaringType.get$jsname() + '.prototype;')); |
+ } |
+ this._provideOptionalParamInfo(defWriter); |
+ if ((this.method instanceof MethodMember)) { |
+ var m = this.method; |
+ if (m._providePropertySyntax) { |
+ defWriter.enterBlock(('' + m.declaringType.get$jsname() + '.prototype') + ('.get\$' + m.get$jsname() + ' = function() {')); |
+ defWriter.writeln(('return ' + m.declaringType.get$jsname() + '.prototype.') + ('' + m.get$jsname() + '.bind(this);')); |
+ defWriter.exitBlock('}'); |
+ if (m._provideFieldSyntax) { |
+ $globals.world.internalError('bound m accessed with field syntax'); |
+ } |
+ } |
+ } |
+} |
+MethodGenerator.prototype._provideOptionalParamInfo = function(defWriter) { |
+ if ((this.method instanceof MethodMember)) { |
+ var meth = this.method; |
+ if (meth._provideOptionalParamInfo) { |
+ var optNames = []; |
+ var optValues = []; |
+ meth.genParameterValues(); |
+ var $$list = meth.parameters; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var param = $$list.$index($$i); |
+ if (param.get$isOptional()) { |
+ optNames.add$1(param.get$name()); |
+ optValues.add$1(MethodGenerator._escapeString(param.get$value().get$code())); |
+ } |
+ } |
+ if (optNames.length > 0) { |
+ var start = ''; |
+ if (meth.isStatic) { |
+ if (!meth.declaringType.get$isTop()) { |
+ start = meth.declaringType.get$jsname() + '.'; |
+ } |
+ } |
+ else { |
+ start = meth.declaringType.get$jsname() + '.prototype.'; |
+ } |
+ optNames.addAll$1(optValues); |
+ var optional = "['" + Strings.join(optNames, "', '") + "']"; |
+ defWriter.writeln(('' + start + meth.get$jsname() + '.\$optional = ' + optional)); |
+ } |
+ } |
+ } |
+} |
+MethodGenerator.prototype.writeBody = function() { |
+ var initializers = null; |
+ var initializedFields = null; |
+ var allMembers = null; |
+ if (this.method.get$isConstructor()) { |
+ initializers = []; |
+ initializedFields = new HashSetImplementation(); |
+ allMembers = $globals.world.gen._orderValues(this.method.declaringType.getAllMembers()); |
+ for (var $$i = allMembers.iterator$0(); $$i.hasNext$0(); ) { |
+ var f = $$i.next$0(); |
+ if (f.get$isField() && !f.get$isStatic()) { |
+ var cv = f.computeValue$0(); |
+ if (cv != null) { |
+ initializers.add$1(('this.' + f.get$jsname() + ' = ' + cv.get$code())); |
+ initializedFields.add$1(f.get$name()); |
+ } |
+ } |
+ } |
+ } |
+ this._paramCode = []; |
+ var $$list = this.method.get$parameters(); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var p = $$list.$index($$i); |
+ if (initializers != null && p.get$isInitializer()) { |
+ var field = this.method.declaringType.getMember(p.get$name()); |
+ if (field == null) { |
+ $globals.world.error('bad this parameter - no matching field', p.get$definition().get$span()); |
+ } |
+ if (!field.get$isField()) { |
+ $globals.world.error(('"this.' + p.get$name() + '" does not refer to a field'), p.get$definition().get$span()); |
+ } |
+ var paramValue = new Value(field.get$returnType(), p.get$name(), p.get$definition().get$span(), false); |
+ this._paramCode.add(paramValue.get$code()); |
+ initializers.add$1(('this.' + field.get$jsname() + ' = ' + paramValue.get$code() + ';')); |
+ initializedFields.add$1(p.get$name()); |
+ } |
+ else { |
+ var paramValue = this._scope.declareParameter(p); |
+ this._paramCode.add(paramValue.get$code()); |
+ } |
+ } |
+ var body = this.method.get$definition().get$body(); |
+ if (body == null && !this.method.get$isConstructor() && !this.method.get$isNative()) { |
+ $globals.world.error(('unexpected empty body for ' + this.method.name), this.method.get$definition().get$span()); |
+ } |
+ var initializerCall = null; |
+ var declaredInitializers = this.method.get$definition().get$initializers(); |
+ if (initializers != null) { |
+ for (var $$i = initializers.iterator$0(); $$i.hasNext$0(); ) { |
+ var i = $$i.next$0(); |
+ this.writer.writeln(i); |
+ } |
+ if (declaredInitializers != null) { |
+ for (var $$i = declaredInitializers.iterator$0(); $$i.hasNext$0(); ) { |
+ var init = $$i.next$0(); |
+ if ((init instanceof CallExpression)) { |
+ if (initializerCall != null) { |
+ $globals.world.error('only one initializer redirecting call is allowed', init.get$span()); |
+ } |
+ initializerCall = init; |
+ } |
+ else if ((init instanceof BinaryExpression) && TokenKind.kindFromAssign(init.get$op().get$kind()) == 0) { |
+ var left = init.get$x(); |
+ if (!((left instanceof DotExpression) && (left.get$self() instanceof ThisExpression) || (left instanceof VarExpression))) { |
+ $globals.world.error('invalid left side of initializer', left.get$span()); |
+ continue; |
+ } |
+ var f = this.method.declaringType.getMember(left.get$name().get$name()); |
+ if (f == null) { |
+ $globals.world.error('bad initializer - no matching field', left.get$span()); |
+ continue; |
+ } |
+ else if (!f.get$isField()) { |
+ $globals.world.error(('"' + left.get$name().get$name() + '" does not refer to a field'), left.get$span()); |
+ continue; |
+ } |
+ initializedFields.add$1(f.get$name()); |
+ this.writer.writeln(('this.' + f.get$jsname() + ' = ' + this.visitValue(init.get$y()).get$code() + ';')); |
+ } |
+ else { |
+ $globals.world.error('invalid initializer', init.get$span()); |
+ } |
+ } |
+ } |
+ this.writer.comment('// Initializers done'); |
+ } |
+ if (this.method.get$isConstructor() && initializerCall == null && !this.method.get$isNative()) { |
+ var parentType = this.method.declaringType.get$parent(); |
+ if (parentType != null && !parentType.get$isObject()) { |
+ initializerCall = new CallExpression(new SuperExpression(this.method.get$span()), [], this.method.get$span()); |
+ } |
+ } |
+ if (initializerCall != null) { |
+ var target = this._writeInitializerCall(initializerCall); |
+ if (!target.get$isSuper()) { |
+ if (initializers.length > 0) { |
+ var $$list = this.method.get$parameters(); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var p = $$list.$index($$i); |
+ if (p.get$isInitializer()) { |
+ $globals.world.error('no initialization allowed on redirecting constructors', p.get$definition().get$span()); |
+ break; |
+ } |
+ } |
+ } |
+ if (declaredInitializers != null && declaredInitializers.length > 1) { |
+ var init = $eq(declaredInitializers.$index(0), initializerCall) ? declaredInitializers.$index(1) : declaredInitializers.$index(0); |
+ $globals.world.error('no initialization allowed on redirecting constructors', init.get$span()); |
+ } |
+ initializedFields = null; |
+ } |
+ } |
+ if (initializedFields != null) { |
+ for (var $$i = allMembers.iterator$0(); $$i.hasNext$0(); ) { |
+ var member = $$i.next$0(); |
+ if (member.get$isField() && member.get$isFinal() && !member.get$isStatic() && !this.method.get$isNative() && !initializedFields.contains$1(member.get$name())) { |
+ $globals.world.error(('Field "' + member.get$name() + '" is final and was not initialized'), this.method.get$definition().get$span()); |
+ } |
+ } |
+ } |
+ this.visitStatementsInBlock(body); |
+} |
+MethodGenerator.prototype._writeInitializerCall = function(node) { |
+ var contructorName = ''; |
+ var targetExp = node.target; |
+ if ((targetExp instanceof DotExpression)) { |
+ var dot = targetExp; |
+ targetExp = dot.self; |
+ contructorName = dot.name.name; |
+ } |
+ var target = null; |
+ if ((targetExp instanceof SuperExpression)) { |
+ target = this._makeSuperValue(targetExp); |
+ } |
+ else if ((targetExp instanceof ThisExpression)) { |
+ target = this._makeThisValue(targetExp); |
+ } |
+ else { |
+ $globals.world.error('bad call in initializers', node.span); |
+ } |
+ target.set$allowDynamic(false); |
+ var m = target.get$type().getConstructor$1(contructorName); |
+ if (m == null) { |
+ $globals.world.error(('no matching constructor for ' + target.get$type().get$name()), node.span); |
+ } |
+ this.method.set$initDelegate(m); |
+ var other = m; |
+ while (other != null) { |
+ if ($eq(other, this.method)) { |
+ $globals.world.error('initialization cycle', node.span); |
+ break; |
+ } |
+ other = other.get$initDelegate(); |
+ } |
+ $globals.world.gen.genMethod(m); |
+ var value = m.invoke$4(this, node, target, this._makeArgs(node.arguments)); |
+ if ($ne(target.get$type(), $globals.world.objectType)) { |
+ this.writer.writeln(('' + value.get$code() + ';')); |
+ } |
+ return target; |
+} |
+MethodGenerator.prototype._makeArgs = function(arguments) { |
+ var args = []; |
+ var seenLabel = false; |
+ for (var $$i = 0;$$i < arguments.length; $$i++) { |
+ var arg = arguments.$index($$i); |
+ if (arg.get$label() != null) { |
+ seenLabel = true; |
+ } |
+ else if (seenLabel) { |
+ $globals.world.error('bare argument can not follow named arguments', arg.get$span()); |
+ } |
+ args.add$1(this.visitValue(arg.get$value())); |
+ } |
+ return new Arguments(arguments, args); |
+} |
+MethodGenerator.prototype._invokeNative = function(name, arguments) { |
+ var args = Arguments.get$EMPTY(); |
+ if (arguments.length > 0) { |
+ args = new Arguments(null, arguments); |
+ } |
+ var method = $globals.world.corelib.topType.members.$index(name); |
+ return method.invoke$4(this, method.get$definition(), new Value($globals.world.corelib.topType, null, null, true), args); |
+} |
+MethodGenerator._escapeString = function(text) { |
+ return text.replaceAll('\\', '\\\\').replaceAll('"', '\\"').replaceAll('\n', '\\n').replaceAll('\r', '\\r'); |
+} |
+MethodGenerator.prototype.visitStatementsInBlock = function(body) { |
+ if ((body instanceof BlockStatement)) { |
+ var block = body; |
+ var $$list = block.body; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var stmt = $$list.$index($$i); |
+ stmt.visit$1(this); |
+ } |
+ } |
+ else { |
+ if (body != null) body.visit(this); |
+ } |
+ return false; |
+} |
+MethodGenerator.prototype._pushBlock = function(reentrant) { |
+ this._scope = new BlockScope(this, this._scope, reentrant); |
+} |
+MethodGenerator.prototype._popBlock = function() { |
+ this._scope = this._scope.parent; |
+} |
+MethodGenerator.prototype._makeLambdaMethod = function(name, func) { |
+ var meth = new MethodMember(name, this.method.declaringType, func); |
+ meth.set$isLambda(true); |
+ meth.set$enclosingElement(this.method); |
+ meth.resolve$0(); |
+ return meth; |
+} |
+MethodGenerator.prototype.visitBool = function(node) { |
+ return this.visitValue(node).convertTo$3(this, $globals.world.nonNullBool, node); |
+} |
+MethodGenerator.prototype.visitValue = function(node) { |
+ if (node == null) return null; |
+ var value = node.visit(this); |
+ value.checkFirstClass$1(node.span); |
+ return value; |
+} |
+MethodGenerator.prototype.visitTypedValue = function(node, expectedType) { |
+ var val = this.visitValue(node); |
+ return expectedType == null ? val : val.convertTo$3(this, expectedType, node); |
+} |
+MethodGenerator.prototype.visitVoid = function(node) { |
+ if ((node instanceof PostfixExpression)) { |
+ var value = this.visitPostfixExpression(node, true); |
+ value.checkFirstClass$1(node.span); |
+ return value; |
+ } |
+ else if ((node instanceof BinaryExpression)) { |
+ var value = this.visitBinaryExpression(node, true); |
+ value.checkFirstClass$1(node.span); |
+ return value; |
+ } |
+ return this.visitValue(node); |
+} |
+MethodGenerator.prototype.visitDietStatement = function(node) { |
+ var parser = new Parser(node.span.file, false, false, false, node.span.start); |
+ this.visitStatementsInBlock(parser.block$0()); |
+ return false; |
+} |
+MethodGenerator.prototype.visitVariableDefinition = function(node) { |
+ var isFinal = false; |
+ if (node.modifiers != null && $eq(node.modifiers.$index(0).get$kind(), 98/*TokenKind.FINAL*/)) { |
+ isFinal = true; |
+ } |
+ this.writer.write('var '); |
+ var type = this.method.resolveType(node.type, false); |
+ for (var i = 0; |
+ i < node.names.length; i++) { |
+ var thisType = type; |
+ if (i > 0) { |
+ this.writer.write(', '); |
+ } |
+ var name = node.names.$index(i).get$name(); |
+ var value = this.visitValue(node.values.$index(i)); |
+ if (isFinal) { |
+ if (value == null) { |
+ $globals.world.error('no value specified for final variable', node.span); |
+ } |
+ else { |
+ if (thisType.get$isVar()) thisType = value.get$type(); |
+ } |
+ } |
+ var val = this._scope.create(name, thisType, node.names.$index(i).get$span(), isFinal, false); |
+ if (value == null) { |
+ if (this._scope.reentrant) { |
+ this.writer.write(('' + val.get$code() + ' = null')); |
+ } |
+ else { |
+ this.writer.write(('' + val.get$code())); |
+ } |
+ } |
+ else { |
+ value = value.convertTo$3(this, type, node.values.$index(i)); |
+ this.writer.write(('' + val.get$code() + ' = ' + value.get$code())); |
+ } |
+ } |
+ this.writer.writeln(';'); |
+ return false; |
+} |
+MethodGenerator.prototype.visitFunctionDefinition = function(node) { |
+ var meth = this._makeLambdaMethod(node.name.name, node); |
+ var funcValue = this._scope.create(meth.get$name(), meth.get$functionType(), this.method.get$definition().get$span(), true, false); |
+ $globals.world.gen.genMethod(meth, this); |
+ meth.get$generator().writeDefinition$2(this.writer); |
+ return false; |
+} |
+MethodGenerator.prototype.visitReturnStatement = function(node) { |
+ if (node.value == null) { |
+ this.writer.writeln('return;'); |
+ } |
+ else { |
+ if (this.method.get$isConstructor()) { |
+ $globals.world.error('return of value not allowed from constructor', node.span); |
+ } |
+ var value = this.visitTypedValue(node.value, this.method.get$returnType()); |
+ this.writer.writeln(('return ' + value.get$code() + ';')); |
+ } |
+ return true; |
+} |
+MethodGenerator.prototype.visitThrowStatement = function(node) { |
+ if (node.value != null) { |
+ var value = this.visitValue(node.value); |
+ value.invoke$4(this, 'toString', node, Arguments.get$EMPTY()); |
+ this.writer.writeln(('\$throw(' + value.get$code() + ');')); |
+ $globals.world.gen.corejs.useThrow = true; |
+ } |
+ else { |
+ var rethrow = this._scope.getRethrow(); |
+ if (rethrow == null) { |
+ $globals.world.error('rethrow outside of catch', node.span); |
+ } |
+ else { |
+ this.writer.writeln(('throw ' + rethrow.get$code() + ';')); |
+ } |
+ } |
+ return true; |
+} |
+MethodGenerator.prototype.visitAssertStatement = function(node) { |
+ var test = this.visitValue(node.test); |
+ if ($globals.options.enableAsserts) { |
+ var span = node.test.span; |
+ var line = span.get$file().getLine$1(span.get$start()) + 1; |
+ var column = span.get$file().getColumn$2(line - 1, span.get$start()) + 1; |
+ var args = [test, EvaluatedValue.EvaluatedValue$factory($globals.world.stringType, MethodGenerator._escapeString(span.get$text()), ('"' + MethodGenerator._escapeString(span.get$text()) + '"'), null), EvaluatedValue.EvaluatedValue$factory($globals.world.stringType, MethodGenerator._escapeString(span.get$file().get$filename()), ('"' + MethodGenerator._escapeString(span.get$file().get$filename()) + '"'), null), EvaluatedValue.EvaluatedValue$factory($globals.world.intType, line, line.toString$0(), null), EvaluatedValue.EvaluatedValue$factory($globals.world.intType, column, column.toString$0(), null)]; |
+ var tp = $globals.world.corelib.topType; |
+ var f = tp.getMember$1('_assert'); |
+ var value = f.invoke(this, node, new Value.type$ctor(tp, null), new Arguments(null, args), false); |
+ this.writer.writeln(('' + value.get$code() + ';')); |
+ } |
+ return false; |
+} |
+MethodGenerator.prototype.visitBreakStatement = function(node) { |
+ if (node.label == null) { |
+ this.writer.writeln('break;'); |
+ } |
+ else { |
+ this.writer.writeln(('break ' + node.label.name + ';')); |
+ } |
+ return true; |
+} |
+MethodGenerator.prototype.visitContinueStatement = function(node) { |
+ if (node.label == null) { |
+ this.writer.writeln('continue;'); |
+ } |
+ else { |
+ this.writer.writeln(('continue ' + node.label.name + ';')); |
+ } |
+ return true; |
+} |
+MethodGenerator.prototype.visitIfStatement = function(node) { |
+ var test = this.visitBool(node.test); |
+ this.writer.write(('if (' + test.get$code() + ') ')); |
+ var exit1 = node.trueBranch.visit(this); |
+ if (node.falseBranch != null) { |
+ this.writer.write('else '); |
+ if (node.falseBranch.visit(this) && exit1) { |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+MethodGenerator.prototype.visitWhileStatement = function(node) { |
+ var test = this.visitBool(node.test); |
+ this.writer.write(('while (' + test.get$code() + ') ')); |
+ this._pushBlock(true); |
+ node.body.visit(this); |
+ this._popBlock(); |
+ return false; |
+} |
+MethodGenerator.prototype.visitDoStatement = function(node) { |
+ this.writer.write('do '); |
+ this._pushBlock(true); |
+ node.body.visit(this); |
+ this._popBlock(); |
+ var test = this.visitBool(node.test); |
+ this.writer.writeln(('while (' + test.get$code() + ')')); |
+ return false; |
+} |
+MethodGenerator.prototype.visitForStatement = function(node) { |
+ this._pushBlock(false); |
+ this.writer.write('for ('); |
+ if (node.init != null) node.init.visit(this); |
+ else this.writer.write(';'); |
+ if (node.test != null) { |
+ var test = this.visitBool(node.test); |
+ this.writer.write((' ' + test.get$code() + '; ')); |
+ } |
+ else { |
+ this.writer.write('; '); |
+ } |
+ var needsComma = false; |
+ var $$list = node.step; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var s = $$list.$index($$i); |
+ if (needsComma) this.writer.write(', '); |
+ var sv = this.visitVoid(s); |
+ this.writer.write(sv.get$code()); |
+ needsComma = true; |
+ } |
+ this.writer.write(') '); |
+ this._pushBlock(true); |
+ node.body.visit(this); |
+ this._popBlock(); |
+ this._popBlock(); |
+ return false; |
+} |
+MethodGenerator.prototype._isFinal = function(typeRef) { |
+ if ((typeRef instanceof GenericTypeReference)) { |
+ typeRef = typeRef.get$baseType(); |
+ } |
+ return typeRef != null && typeRef.get$isFinal(); |
+} |
+MethodGenerator.prototype.visitForInStatement = function(node) { |
+ var itemType = this.method.resolveType(node.item.type, false); |
+ var itemName = node.item.name.name; |
+ var list = node.list.visit(this); |
+ this._pushBlock(true); |
+ var isFinal = this._isFinal(node.item.type); |
+ var item = this._scope.create(itemName, itemType, node.item.name.span, isFinal, false); |
+ var listVar = list; |
+ if (list.get$needsTemp()) { |
+ listVar = this._scope.create('\$list', list.get$type(), null, false, false); |
+ this.writer.writeln(('var ' + listVar.code + ' = ' + list.get$code() + ';')); |
+ } |
+ if (list.get$type().get$isList()) { |
+ var tmpi = this._scope.create('\$i', $globals.world.numType, null, false, false); |
+ this.writer.enterBlock(('for (var ' + tmpi.get$code() + ' = 0;') + ('' + tmpi.get$code() + ' < ' + listVar.code + '.length; ' + tmpi.get$code() + '++) {')); |
+ var value = listVar.invoke(this, ':index', node.list, new Arguments(null, [tmpi]), false); |
+ this.writer.writeln(('var ' + item.get$code() + ' = ' + value.get$code() + ';')); |
+ } |
+ else { |
+ this._pushBlock(false); |
+ var iterator = list.invoke$4(this, 'iterator', node.list, Arguments.get$EMPTY()); |
+ var tmpi = this._scope.create('\$i', iterator.get$type(), null, false, false); |
+ var hasNext = tmpi.invoke$4(this, 'hasNext', node.list, Arguments.get$EMPTY()); |
+ var next = tmpi.invoke$4(this, 'next', node.list, Arguments.get$EMPTY()); |
+ this.writer.enterBlock(('for (var ' + tmpi.get$code() + ' = ' + iterator.get$code() + '; ' + hasNext.get$code() + '; ) {')); |
+ this.writer.writeln(('var ' + item.get$code() + ' = ' + next.get$code() + ';')); |
+ } |
+ this.visitStatementsInBlock(node.body); |
+ this.writer.exitBlock('}'); |
+ this._popBlock(); |
+ return false; |
+} |
+MethodGenerator.prototype._genToDartException = function(ex, node) { |
+ var result = this._invokeNative("_toDartException", [ex]); |
+ this.writer.writeln(('' + ex.code + ' = ' + result.get$code() + ';')); |
+} |
+MethodGenerator.prototype.visitTryStatement = function(node) { |
+ this.writer.enterBlock('try {'); |
+ this._pushBlock(false); |
+ this.visitStatementsInBlock(node.body); |
+ this._popBlock(); |
+ if (node.catches.length == 1) { |
+ var catch_ = node.catches.$index(0); |
+ this._pushBlock(false); |
+ var exType = this.method.resolveType(catch_.get$exception().get$type(), false); |
+ var ex = this._scope.declare(catch_.get$exception()); |
+ this._scope.rethrow = ex; |
+ this.writer.nextBlock(('} catch (' + ex.get$code() + ') {')); |
+ if (catch_.get$trace() != null) { |
+ var trace = this._scope.declare(catch_.get$trace()); |
+ this.writer.writeln(('var ' + trace.get$code() + ' = \$stackTraceOf(' + ex.get$code() + ');')); |
+ $globals.world.gen.corejs.useStackTraceOf = true; |
+ } |
+ this._genToDartException(ex, node); |
+ if (!exType.get$isVarOrObject()) { |
+ var test = ex.instanceOf$3$isTrue$forceCheck(this, exType, catch_.get$exception().get$span(), false, true); |
+ this.writer.writeln(('if (' + test.get$code() + ') throw ' + ex.get$code() + ';')); |
+ } |
+ this.visitStatementsInBlock(node.catches.$index(0).get$body()); |
+ this._popBlock(); |
+ } |
+ else if (node.catches.length > 0) { |
+ this._pushBlock(false); |
+ var ex = this._scope.create('\$ex', $globals.world.varType, null, false, false); |
+ this._scope.rethrow = ex; |
+ this.writer.nextBlock(('} catch (' + ex.get$code() + ') {')); |
+ var trace = null; |
+ if (node.catches.some((function (c) { |
+ return c.get$trace() != null; |
+ }) |
+ )) { |
+ trace = this._scope.create('\$trace', $globals.world.varType, null, false, false); |
+ this.writer.writeln(('var ' + trace.get$code() + ' = \$stackTraceOf(' + ex.get$code() + ');')); |
+ $globals.world.gen.corejs.useStackTraceOf = true; |
+ } |
+ this._genToDartException(ex, node); |
+ var needsRethrow = true; |
+ for (var i = 0; |
+ i < node.catches.length; i++) { |
+ var catch_ = node.catches.$index(i); |
+ this._pushBlock(false); |
+ var tmpType = this.method.resolveType(catch_.get$exception().get$type(), false); |
+ var tmp = this._scope.declare(catch_.get$exception()); |
+ if (!tmpType.get$isVarOrObject()) { |
+ var test = ex.instanceOf$3$isTrue$forceCheck(this, tmpType, catch_.get$exception().get$span(), true, true); |
+ if (i == 0) { |
+ this.writer.enterBlock(('if (' + test.get$code() + ') {')); |
+ } |
+ else { |
+ this.writer.nextBlock(('} else if (' + test.get$code() + ') {')); |
+ } |
+ } |
+ else if (i > 0) { |
+ this.writer.nextBlock('} else {'); |
+ } |
+ this.writer.writeln(('var ' + tmp.get$code() + ' = ' + ex.get$code() + ';')); |
+ if (catch_.get$trace() != null) { |
+ var tmptrace = this._scope.declare(catch_.get$trace()); |
+ this.writer.writeln(('var ' + tmptrace.get$code() + ' = ' + trace.get$code() + ';')); |
+ } |
+ this.visitStatementsInBlock(catch_.get$body()); |
+ this._popBlock(); |
+ if (tmpType.get$isVarOrObject()) { |
+ if (i + 1 < node.catches.length) { |
+ $globals.world.error('Unreachable catch clause', node.catches.$index(i + 1).get$span()); |
+ } |
+ if (i > 0) { |
+ this.writer.exitBlock('}'); |
+ } |
+ needsRethrow = false; |
+ break; |
+ } |
+ } |
+ if (needsRethrow) { |
+ this.writer.nextBlock('} else {'); |
+ this.writer.writeln(('throw ' + ex.get$code() + ';')); |
+ this.writer.exitBlock('}'); |
+ } |
+ this._popBlock(); |
+ } |
+ if (node.finallyBlock != null) { |
+ this.writer.nextBlock('} finally {'); |
+ this._pushBlock(false); |
+ this.visitStatementsInBlock(node.finallyBlock); |
+ this._popBlock(); |
+ } |
+ this.writer.exitBlock('}'); |
+ return false; |
+} |
+MethodGenerator.prototype.visitSwitchStatement = function(node) { |
+ var test = this.visitValue(node.test); |
+ this.writer.enterBlock(('switch (' + test.get$code() + ') {')); |
+ var $$list = node.cases; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var case_ = $$list.$index($$i); |
+ if (case_.get$label() != null) { |
+ $globals.world.error('unimplemented: labeled case statement', case_.get$span()); |
+ } |
+ this._pushBlock(false); |
+ for (var i = 0; |
+ i < case_.get$cases().length; i++) { |
+ var expr = case_.get$cases().$index(i); |
+ if (expr == null) { |
+ if (i < case_.get$cases().length - 1) { |
+ $globals.world.error('default clause must be the last case', case_.get$span()); |
+ } |
+ this.writer.writeln('default:'); |
+ } |
+ else { |
+ var value = this.visitValue(expr); |
+ this.writer.writeln(('case ' + value.get$code() + ':')); |
+ } |
+ } |
+ this.writer.enterBlock(''); |
+ var caseExits = this._visitAllStatements(case_.get$statements(), false); |
+ if ($ne(case_, node.cases.$index(node.cases.length - 1)) && !caseExits) { |
+ var span = case_.get$statements().$index(case_.get$statements().length - 1).get$span(); |
+ this.writer.writeln('\$throw(new FallThroughError());'); |
+ $globals.world.gen.corejs.useThrow = true; |
+ } |
+ this.writer.exitBlock(''); |
+ this._popBlock(); |
+ } |
+ this.writer.exitBlock('}'); |
+ return false; |
+} |
+MethodGenerator.prototype._visitAllStatements = function(statementList, exits) { |
+ for (var i = 0; |
+ i < statementList.length; i++) { |
+ var stmt = statementList.$index(i); |
+ exits = stmt.visit$1(this); |
+ if ($ne(stmt, statementList.$index(statementList.length - 1)) && exits) { |
+ $globals.world.warning('unreachable code', statementList.$index(i + 1).get$span()); |
+ } |
+ } |
+ return exits; |
+} |
+MethodGenerator.prototype.visitBlockStatement = function(node) { |
+ this._pushBlock(false); |
+ this.writer.enterBlock('{'); |
+ var exits = this._visitAllStatements(node.body, false); |
+ this.writer.exitBlock('}'); |
+ this._popBlock(); |
+ return exits; |
+} |
+MethodGenerator.prototype.visitLabeledStatement = function(node) { |
+ this.writer.writeln(('' + node.name.name + ':')); |
+ node.body.visit(this); |
+ return false; |
+} |
+MethodGenerator.prototype.visitExpressionStatement = function(node) { |
+ if ((node.body instanceof VarExpression) || (node.body instanceof ThisExpression)) { |
+ $globals.world.warning('variable used as statement', node.span); |
+ } |
+ var value = this.visitVoid(node.body); |
+ this.writer.writeln(('' + value.get$code() + ';')); |
+ return false; |
+} |
+MethodGenerator.prototype.visitEmptyStatement = function(node) { |
+ this.writer.writeln(';'); |
+ return false; |
+} |
+MethodGenerator.prototype._checkNonStatic = function(node) { |
+ if (this.get$isStatic()) { |
+ $globals.world.warning('not allowed in static method', node.span); |
+ } |
+} |
+MethodGenerator.prototype._makeSuperValue = function(node) { |
+ var parentType = this.method.declaringType.get$parent(); |
+ this._checkNonStatic(node); |
+ if (parentType == null) { |
+ $globals.world.error('no super class', node.span); |
+ } |
+ var ret = new Value(parentType, 'this', node.span, false); |
+ ret.set$isSuper(true); |
+ return ret; |
+} |
+MethodGenerator.prototype._getOutermostMethod = function() { |
+ var result = this; |
+ while (result.get$enclosingMethod() != null) { |
+ result = result.get$enclosingMethod(); |
+ } |
+ return result; |
+} |
+MethodGenerator.prototype._makeThisCode = function() { |
+ if (this.enclosingMethod != null) { |
+ this._getOutermostMethod().set$needsThis(true); |
+ return '\$this'; |
+ } |
+ else { |
+ return 'this'; |
+ } |
+} |
+MethodGenerator.prototype._makeThisValue = function(node) { |
+ if (this.enclosingMethod != null) { |
+ var outermostMethod = this._getOutermostMethod(); |
+ outermostMethod._checkNonStatic$1(node); |
+ outermostMethod.set$needsThis(true); |
+ return new Value(outermostMethod.method.get$declaringType(), '\$this', node != null ? node.span : null, false); |
+ } |
+ else { |
+ this._checkNonStatic(node); |
+ return new Value(this.method.declaringType, 'this', node != null ? node.span : null, false); |
+ } |
+} |
+MethodGenerator.prototype.visitLambdaExpression = function(node) { |
+ var name = (node.func.name != null) ? node.func.name.name : ''; |
+ var meth = this._makeLambdaMethod(name, node.func); |
+ var lambdaGen = new MethodGenerator(meth, this); |
+ if ($ne(name, '')) { |
+ lambdaGen._scope.create(name, meth.get$functionType(), meth.definition.span, true, false); |
+ lambdaGen._pushBlock(false); |
+ } |
+ lambdaGen.run(); |
+ var w = new CodeWriter(); |
+ meth.generator.writeDefinition(w, node); |
+ return new Value(meth.get$functionType(), w.get$text(), node.span, true); |
+} |
+MethodGenerator.prototype.visitCallExpression = function(node) { |
+ var target; |
+ var position = node.target; |
+ var name = ':call'; |
+ if ((node.target instanceof DotExpression)) { |
+ var dot = node.target; |
+ target = dot.self.visit(this); |
+ name = dot.name.name; |
+ position = dot.name; |
+ } |
+ else if ((node.target instanceof VarExpression)) { |
+ var varExpr = node.target; |
+ name = varExpr.name.name; |
+ target = this._scope.lookup(name); |
+ if (target != null) { |
+ return target.invoke$4(this, ':call', node, this._makeArgs(node.arguments)); |
+ } |
+ target = this._makeThisOrType(varExpr.span); |
+ return target.invoke$4(this, name, node, this._makeArgs(node.arguments)); |
+ } |
+ else { |
+ target = node.target.visit(this); |
+ } |
+ return target.invoke$4(this, name, position, this._makeArgs(node.arguments)); |
+} |
+MethodGenerator.prototype.visitIndexExpression = function(node) { |
+ var target = this.visitValue(node.target); |
+ var index = this.visitValue(node.index); |
+ return target.invoke$4(this, ':index', node, new Arguments(null, [index])); |
+} |
+MethodGenerator.prototype.visitBinaryExpression = function(node, isVoid) { |
+ var kind = node.op.kind; |
+ if (kind == 35/*TokenKind.AND*/ || kind == 34/*TokenKind.OR*/) { |
+ var x = this.visitTypedValue(node.x, $globals.world.nonNullBool); |
+ var y = this.visitTypedValue(node.y, $globals.world.nonNullBool); |
+ var code = ('' + x.get$code() + ' ' + node.op + ' ' + y.get$code()); |
+ if (x.get$isConst() && y.get$isConst()) { |
+ var value = (kind == 35/*TokenKind.AND*/) ? x.get$actualValue() && y.get$actualValue() : x.get$actualValue() || y.get$actualValue(); |
+ return EvaluatedValue.EvaluatedValue$factory($globals.world.nonNullBool, value, ('' + value), node.span); |
+ } |
+ return new Value($globals.world.nonNullBool, code, node.span, true); |
+ } |
+ else if (kind == 50/*TokenKind.EQ_STRICT*/ || kind == 51/*TokenKind.NE_STRICT*/) { |
+ var x = this.visitValue(node.x); |
+ var y = this.visitValue(node.y); |
+ if (x.get$isConst() && y.get$isConst()) { |
+ var xVal = x.get$actualValue(); |
+ var yVal = y.get$actualValue(); |
+ if (x.get$type().get$isString() && y.get$type().get$isString() && $ne(xVal.$index(0), yVal.$index(0))) { |
+ if ($eq(xVal.$index(0), '"')) { |
+ xVal = xVal.substring$2(1, xVal.length - 1); |
+ yVal = toDoubleQuote(yVal.substring$2(1, yVal.length - 1)); |
+ } |
+ else { |
+ xVal = toDoubleQuote(xVal.substring$2(1, xVal.length - 1)); |
+ yVal = yVal.substring$2(1, yVal.length - 1); |
+ } |
+ } |
+ var value = kind == 50/*TokenKind.EQ_STRICT*/ ? $eq(xVal, yVal) : $ne(xVal, yVal); |
+ return EvaluatedValue.EvaluatedValue$factory($globals.world.nonNullBool, value, ("" + value), node.span); |
+ } |
+ if ($eq(x.get$code(), 'null') || $eq(y.get$code(), 'null')) { |
+ var op = node.op.toString().substring(0, 2); |
+ return new Value($globals.world.nonNullBool, ('' + x.get$code() + ' ' + op + ' ' + y.get$code()), node.span, true); |
+ } |
+ else { |
+ return new Value($globals.world.nonNullBool, ('' + x.get$code() + ' ' + node.op + ' ' + y.get$code()), node.span, true); |
+ } |
+ } |
+ var assignKind = TokenKind.kindFromAssign(node.op.kind); |
+ if (assignKind == -1) { |
+ var x = this.visitValue(node.x); |
+ var y = this.visitValue(node.y); |
+ var name = TokenKind.binaryMethodName(node.op.kind); |
+ if (node.op.kind == 49/*TokenKind.NE*/) { |
+ name = ':ne'; |
+ } |
+ if (name == null) { |
+ $globals.world.internalError(('unimplemented binary op ' + node.op), node.span); |
+ return; |
+ } |
+ return x.invoke$4(this, name, node, new Arguments(null, [y])); |
+ } |
+ else { |
+ return this._visitAssign(assignKind, node.x, node.y, node, to$call$1(null), isVoid); |
+ } |
+} |
+MethodGenerator.prototype._visitAssign = function(kind, xn, yn, position, captureOriginal, isVoid) { |
+ if (captureOriginal == null) { |
+ captureOriginal = (function (x) { |
+ return x; |
+ }) |
+ ; |
+ } |
+ if ((xn instanceof VarExpression)) { |
+ return this._visitVarAssign(kind, xn, yn, position, captureOriginal); |
+ } |
+ else if ((xn instanceof IndexExpression)) { |
+ return this._visitIndexAssign(kind, xn, yn, position, captureOriginal, isVoid); |
+ } |
+ else if ((xn instanceof DotExpression)) { |
+ return this._visitDotAssign(kind, xn, yn, position, captureOriginal); |
+ } |
+ else { |
+ $globals.world.error('illegal lhs', xn.span); |
+ } |
+} |
+MethodGenerator.prototype._visitVarAssign = function(kind, xn, yn, position, captureOriginal) { |
+ var name = xn.name.name; |
+ var x = this._scope.lookup(name); |
+ var y = this.visitValue(yn); |
+ if (x == null) { |
+ var members = this.method.declaringType.resolveMember(name); |
+ x = this._makeThisOrType(position.span); |
+ if (members != null) { |
+ if ($globals.options.forceDynamic && !members.get$isStatic()) { |
+ members = this.findMembers(xn.name.name); |
+ } |
+ if (kind == 0) { |
+ return x.set_$4(this, name, position, y); |
+ } |
+ else if (!members.get$treatAsField() || members.get$containsMethods()) { |
+ var right = x.get_$3(this, name, position); |
+ right = captureOriginal(right); |
+ y = right.invoke$4(this, TokenKind.binaryMethodName(kind), position, new Arguments(null, [y])); |
+ return x.set_$4(this, name, position, y); |
+ } |
+ else { |
+ x = x.get_$3(this, name, position); |
+ } |
+ } |
+ else { |
+ var member = this.get$library().lookup(name, xn.name.span); |
+ if (member == null) { |
+ $globals.world.warning(('can not resolve ' + name), xn.span); |
+ return this._makeMissingValue(name); |
+ } |
+ members = new MemberSet(member, false); |
+ if (!members.get$treatAsField() || members.get$containsMethods()) { |
+ if (kind != 0) { |
+ var right = members._get$3(this, position, x); |
+ right = captureOriginal(right); |
+ y = right.invoke$4(this, TokenKind.binaryMethodName(kind), position, new Arguments(null, [y])); |
+ } |
+ return members._set$4(this, position, x, y); |
+ } |
+ else { |
+ x = members._get$3(this, position, x); |
+ } |
+ } |
+ } |
+ if (x.get$isFinal()) { |
+ $globals.world.error(('final variable "' + x.get$code() + '" is not assignable'), position.span); |
+ } |
+ y = y.convertTo$3(this, x.get$type(), yn); |
+ if (kind == 0) { |
+ x = captureOriginal(x); |
+ return new Value(y.get$type(), ('' + x.get$code() + ' = ' + y.get$code()), position.span, true); |
+ } |
+ else if (x.get$type().get$isNum() && y.get$type().get$isNum() && (kind != 46/*TokenKind.TRUNCDIV*/)) { |
+ x = captureOriginal(x); |
+ var op = TokenKind.kindToString(kind); |
+ return new Value(y.get$type(), ('' + x.get$code() + ' ' + op + '= ' + y.get$code()), position.span, true); |
+ } |
+ else { |
+ var right = x; |
+ right = captureOriginal(right); |
+ y = right.invoke$4(this, TokenKind.binaryMethodName(kind), position, new Arguments(null, [y])); |
+ return new Value(y.get$type(), ('' + x.get$code() + ' = ' + y.get$code()), position.span, true); |
+ } |
+} |
+MethodGenerator.prototype._visitIndexAssign = function(kind, xn, yn, position, captureOriginal, isVoid) { |
+ var target = this.visitValue(xn.target); |
+ var index = this.visitValue(xn.index); |
+ var y = this.visitValue(yn); |
+ var tmptarget = target; |
+ var tmpindex = index; |
+ if (kind != 0) { |
+ tmptarget = this.getTemp(target); |
+ tmpindex = this.getTemp(index); |
+ index = this.assignTemp(tmpindex, index); |
+ var right = tmptarget.invoke$4(this, ':index', position, new Arguments(null, [tmpindex])); |
+ right = captureOriginal(right); |
+ y = right.invoke$4(this, TokenKind.binaryMethodName(kind), position, new Arguments(null, [y])); |
+ } |
+ var tmpy = null; |
+ if (!isVoid) { |
+ tmpy = this.getTemp(y); |
+ y = this.assignTemp(tmpy, y); |
+ } |
+ var ret = this.assignTemp(tmptarget, target).invoke(this, ':setindex', position, new Arguments(null, [index, y]), false); |
+ if (tmpy != null) { |
+ ret = new Value(ret.get$type(), ('(' + ret.get$code() + ', ' + tmpy.get$code() + ')'), ret.get$span(), true); |
+ if ($ne(tmpy, y)) this.freeTemp(tmpy); |
+ } |
+ if ($ne(tmptarget, target)) this.freeTemp(tmptarget); |
+ if ($ne(tmpindex, index)) this.freeTemp(tmpindex); |
+ return ret; |
+} |
+MethodGenerator.prototype._visitDotAssign = function(kind, xn, yn, position, captureOriginal) { |
+ var target = xn.self.visit(this); |
+ var y = this.visitValue(yn); |
+ var tmptarget = target; |
+ if (kind != 0) { |
+ tmptarget = this.getTemp(target); |
+ var right = tmptarget.get_$3(this, xn.name.name, xn.name); |
+ right = captureOriginal(right); |
+ y = right.invoke$4(this, TokenKind.binaryMethodName(kind), position, new Arguments(null, [y])); |
+ } |
+ var ret = this.assignTemp(tmptarget, target).set_(this, xn.name.name, xn.name, y, false); |
+ if ($ne(tmptarget, target)) this.freeTemp(tmptarget); |
+ return ret; |
+} |
+MethodGenerator.prototype.visitUnaryExpression = function(node) { |
+ var value = this.visitValue(node.self); |
+ switch (node.op.kind) { |
+ case 16/*TokenKind.INCR*/: |
+ case 17/*TokenKind.DECR*/: |
+ |
+ if (value.get$type().get$isNum()) { |
+ return new Value(value.get$type(), ('' + node.op + value.get$code()), node.span, true); |
+ } |
+ else { |
+ var kind = (16/*TokenKind.INCR*/ == node.op.kind ? 42/*TokenKind.ADD*/ : 43/*TokenKind.SUB*/); |
+ var operand = new LiteralExpression(1, new TypeReference(node.span, $globals.world.numType), '1', node.span); |
+ var assignValue = this._visitAssign(kind, node.self, operand, node, to$call$1(null), false); |
+ return new Value(assignValue.get$type(), ('(' + assignValue.get$code() + ')'), node.span, true); |
+ } |
+ |
+ case 19/*TokenKind.NOT*/: |
+ |
+ if (value.get$type().get$isBool() && value.get$isConst()) { |
+ var newVal = !value.get$actualValue(); |
+ return EvaluatedValue.EvaluatedValue$factory(value.get$type(), newVal, ('' + newVal), node.span); |
+ } |
+ else { |
+ var newVal = value.convertTo$3(this, $globals.world.nonNullBool, node); |
+ return new Value(newVal.get$type(), ('!' + newVal.get$code()), node.span, true); |
+ } |
+ |
+ case 42/*TokenKind.ADD*/: |
+ |
+ return value.convertTo$3(this, $globals.world.numType, node); |
+ |
+ case 43/*TokenKind.SUB*/: |
+ case 18/*TokenKind.BIT_NOT*/: |
+ |
+ if (node.op.kind == 18/*TokenKind.BIT_NOT*/) { |
+ return value.invoke$4(this, ':bit_not', node, Arguments.get$EMPTY()); |
+ } |
+ else if (node.op.kind == 43/*TokenKind.SUB*/) { |
+ return value.invoke$4(this, ':negate', node, Arguments.get$EMPTY()); |
+ } |
+ else { |
+ $globals.world.internalError(('unimplemented: unary ' + node.op), node.span); |
+ } |
+ $throw(new FallThroughError()); |
+ |
+ default: |
+ |
+ $globals.world.internalError(('unimplemented: ' + node.op), node.span); |
+ |
+ } |
+} |
+MethodGenerator.prototype.visitAwaitExpression = function(node) { |
+ $globals.world.internalError('Await expressions should have been eliminated before code generation', node.span); |
+} |
+MethodGenerator.prototype.visitPostfixExpression = function(node, isVoid) { |
+ var $this = this; // closure support |
+ var value = this.visitValue(node.body); |
+ if (value.get$type().get$isNum() && !value.get$isFinal()) { |
+ return new Value(value.get$type(), ('' + value.get$code() + node.op), node.span, true); |
+ } |
+ var kind = (16/*TokenKind.INCR*/ == node.op.kind) ? 42/*TokenKind.ADD*/ : 43/*TokenKind.SUB*/; |
+ var operand = new LiteralExpression(1, new TypeReference(node.span, $globals.world.numType), '1', node.span); |
+ var tmpleft = null, left = null; |
+ var ret = this._visitAssign(kind, node.body, operand, node, (function (l) { |
+ if (isVoid) { |
+ return l; |
+ } |
+ else { |
+ left = l; |
+ tmpleft = $this.forceTemp(l); |
+ return $this.assignTemp(tmpleft, left); |
+ } |
+ }) |
+ , false); |
+ if (tmpleft != null) { |
+ ret = new Value(ret.get$type(), ("(" + ret.get$code() + ", " + tmpleft.get$code() + ")"), node.span, true); |
+ } |
+ if ($ne(tmpleft, left)) { |
+ this.freeTemp(tmpleft); |
+ } |
+ return ret; |
+} |
+MethodGenerator.prototype.visitNewExpression = function(node) { |
+ var typeRef = node.type; |
+ var constructorName = ''; |
+ if (node.name != null) { |
+ constructorName = node.name.name; |
+ } |
+ if ($eq(constructorName, '') && !(typeRef instanceof GenericTypeReference) && typeRef.get$names() != null) { |
+ var names = ListFactory.ListFactory$from$factory(typeRef.get$names()); |
+ constructorName = names.removeLast$0().get$name(); |
+ if ($eq(names.length, 0)) names = null; |
+ typeRef = new NameTypeReference(typeRef.get$isFinal(), typeRef.get$name(), names, typeRef.get$span()); |
+ } |
+ var type = this.method.resolveType(typeRef, true); |
+ if (type.get$isTop()) { |
+ type = type.get$library().findTypeByName$1(constructorName); |
+ constructorName = ''; |
+ } |
+ if ((type instanceof ParameterType)) { |
+ $globals.world.error('cannot instantiate a type parameter', node.span); |
+ return this._makeMissingValue(constructorName); |
+ } |
+ var m = type.getConstructor$1(constructorName); |
+ if (m == null) { |
+ var name = type.get$jsname(); |
+ if (type.get$isVar()) { |
+ name = typeRef.get$name().get$name(); |
+ } |
+ $globals.world.error(('no matching constructor for ' + name), node.span); |
+ return this._makeMissingValue(name); |
+ } |
+ if (node.isConst) { |
+ if (!m.get$isConst()) { |
+ $globals.world.error('can\'t use const on a non-const constructor', node.span); |
+ } |
+ var $$list = node.arguments; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var arg = $$list.$index($$i); |
+ if (!this.visitValue(arg.get$value()).get$isConst()) { |
+ $globals.world.error('const constructor expects const arguments', arg.get$span()); |
+ } |
+ } |
+ } |
+ var target = new Value.type$ctor(type, typeRef.get$span()); |
+ return m.invoke$4(this, node, target, this._makeArgs(node.arguments)); |
+} |
+MethodGenerator.prototype.visitListExpression = function(node) { |
+ var argsCode = []; |
+ var argValues = []; |
+ var type = null; |
+ if (node.type != null) { |
+ type = this.method.resolveType(node.type, true).get$typeArgsInOrder().$index(0); |
+ if (node.isConst && ((type instanceof ParameterType) || type.get$hasTypeParams())) { |
+ $globals.world.error('type parameter cannot be used in const list literals'); |
+ } |
+ } |
+ var $$list = node.values; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var item = $$list.$index($$i); |
+ var arg = this.visitTypedValue(item, type); |
+ argValues.add$1(arg); |
+ if (node.isConst) { |
+ if (!arg.get$isConst()) { |
+ $globals.world.error('const list can only contain const values', item.get$span()); |
+ argsCode.add$1(arg.get$code()); |
+ } |
+ else { |
+ argsCode.add$1(arg.get$canonicalCode()); |
+ } |
+ } |
+ else { |
+ argsCode.add$1(arg.get$code()); |
+ } |
+ } |
+ $globals.world.get$coreimpl().types.$index('ListFactory').markUsed$0(); |
+ var code = ('[' + Strings.join(argsCode, ", ") + ']'); |
+ var value = new Value($globals.world.listType, code, node.span, true); |
+ if (node.isConst) { |
+ var immutableList = $globals.world.get$coreimpl().types.$index('ImmutableList'); |
+ var immutableListCtor = immutableList.getConstructor$1('from'); |
+ var result = immutableListCtor.invoke$4(this, node, new Value.type$ctor(value.get$type(), node.span), new Arguments(null, [value])); |
+ value = $globals.world.gen.globalForConst(ConstListValue.ConstListValue$factory(immutableList, argValues, ('const ' + code), result.get$code(), node.span), argValues); |
+ } |
+ return value; |
+} |
+MethodGenerator.prototype.visitMapExpression = function(node) { |
+ if (node.items.length == 0 && !node.isConst) { |
+ return $globals.world.mapType.getConstructor('').invoke$4(this, node, new Value.type$ctor($globals.world.mapType, node.span), Arguments.get$EMPTY()); |
+ } |
+ var argValues = []; |
+ var argsCode = []; |
+ var type = null; |
+ if (node.type != null) { |
+ type = this.method.resolveType(node.type, true).get$typeArgsInOrder().$index(1); |
+ if (node.isConst && ((type instanceof ParameterType) || type.get$hasTypeParams())) { |
+ $globals.world.error('type parameter cannot be used in const map literals'); |
+ } |
+ } |
+ for (var i = 0; |
+ i < node.items.length; i += 2) { |
+ var key = this.visitTypedValue(node.items.$index(i), $globals.world.stringType); |
+ var valueItem = node.items.$index(i + 1); |
+ var value = this.visitTypedValue(valueItem, type); |
+ argValues.add$1(key); |
+ argValues.add$1(value); |
+ if (node.isConst) { |
+ if (!key.get$isConst() || !value.get$isConst()) { |
+ $globals.world.error('const map can only contain const values', valueItem.get$span()); |
+ argsCode.add$1(key.get$code()); |
+ argsCode.add$1(value.get$code()); |
+ } |
+ else { |
+ argsCode.add$1(key.get$canonicalCode()); |
+ argsCode.add$1(value.get$canonicalCode()); |
+ } |
+ } |
+ else { |
+ argsCode.add$1(key.get$code()); |
+ argsCode.add$1(value.get$code()); |
+ } |
+ } |
+ var argList = ('[' + Strings.join(argsCode, ", ") + ']'); |
+ var items = new Value($globals.world.listType, argList, node.span, true); |
+ var tp = $globals.world.corelib.topType; |
+ var f = node.isConst ? tp.getMember$1('_constMap') : tp.getMember$1('_map'); |
+ var value = f.invoke(this, node, new Value.type$ctor(tp, null), new Arguments(null, [items]), false); |
+ if (node.isConst) { |
+ value = ConstMapValue.ConstMapValue$factory(value.get$type(), argValues, value.get$code(), value.get$code(), value.get$span()); |
+ return $globals.world.gen.globalForConst(value, argValues); |
+ } |
+ else { |
+ return value; |
+ } |
+} |
+MethodGenerator.prototype.visitConditionalExpression = function(node) { |
+ var test = this.visitBool(node.test); |
+ var trueBranch = this.visitValue(node.trueBranch); |
+ var falseBranch = this.visitValue(node.falseBranch); |
+ var code = ('' + test.get$code() + ' ? ' + trueBranch.get$code() + ' : ' + falseBranch.get$code()); |
+ return new Value(Type.union(trueBranch.get$type(), falseBranch.get$type()), code, node.span, true); |
+} |
+MethodGenerator.prototype.visitIsExpression = function(node) { |
+ var value = this.visitValue(node.x); |
+ var type = this.method.resolveType(node.type, false); |
+ return value.instanceOf$4(this, type, node.span, node.isTrue); |
+} |
+MethodGenerator.prototype.visitParenExpression = function(node) { |
+ var body = this.visitValue(node.body); |
+ if (body.get$isConst()) { |
+ return EvaluatedValue.EvaluatedValue$factory(body.get$type(), body.get$actualValue(), ('(' + body.get$canonicalCode() + ')'), node.span); |
+ } |
+ return new Value(body.get$type(), ('(' + body.get$code() + ')'), node.span, true); |
+} |
+MethodGenerator.prototype.visitDotExpression = function(node) { |
+ var target = node.self.visit(this); |
+ return target.get_$3(this, node.name.name, node.name); |
+} |
+MethodGenerator.prototype.visitVarExpression = function(node) { |
+ var name = node.name.name; |
+ var ret = this._scope.lookup(name); |
+ if (ret != null) return ret; |
+ return this._makeThisOrType(node.span).get_$3(this, name, node); |
+} |
+MethodGenerator.prototype._makeMissingValue = function(name) { |
+ return new Value($globals.world.varType, ('' + name + '()/*NotFound*/'), null, true); |
+} |
+MethodGenerator.prototype._makeThisOrType = function(span) { |
+ return new BareValue(this, this._getOutermostMethod(), span); |
+} |
+MethodGenerator.prototype.visitThisExpression = function(node) { |
+ return this._makeThisValue(node); |
+} |
+MethodGenerator.prototype.visitSuperExpression = function(node) { |
+ return this._makeSuperValue(node); |
+} |
+MethodGenerator.prototype.visitNullExpression = function(node) { |
+ return EvaluatedValue.EvaluatedValue$factory($globals.world.varType, null, 'null', null); |
+} |
+MethodGenerator.prototype._isUnaryIncrement = function(item) { |
+ if ((item instanceof UnaryExpression)) { |
+ var u = item; |
+ return u.op.kind == 16/*TokenKind.INCR*/ || u.op.kind == 17/*TokenKind.DECR*/; |
+ } |
+ else { |
+ return false; |
+ } |
+} |
+MethodGenerator.prototype.visitLiteralExpression = function(node) { |
+ var $0; |
+ var type = node.type.type; |
+ if (!!(($0 = node.value) && $0.is$List())) { |
+ var items = []; |
+ var $$list = node.value; |
+ for (var $$i = node.value.iterator$0(); $$i.hasNext$0(); ) { |
+ var item = $$i.next$0(); |
+ var val = this.visitValue(item); |
+ val.invoke$4(this, 'toString', item, Arguments.get$EMPTY()); |
+ var code = val.get$code(); |
+ if ((item instanceof BinaryExpression) || (item instanceof ConditionalExpression) || (item instanceof PostfixExpression) || this._isUnaryIncrement(item)) { |
+ code = ('(' + code + ')'); |
+ } |
+ if ($eq(items.length, 0) || ($ne(code, "''") && $ne(code, '""'))) { |
+ items.add$1(code); |
+ } |
+ } |
+ return new Value(type, ('(' + Strings.join(items, " + ") + ')'), node.span, true); |
+ } |
+ var text = node.text; |
+ if (type.get$isString()) { |
+ if (text.startsWith$1('@')) { |
+ text = MethodGenerator._escapeString(parseStringLiteral(text)); |
+ text = ('"' + text + '"'); |
+ } |
+ else if (isMultilineString(text)) { |
+ text = parseStringLiteral(text); |
+ text = text.replaceAll$2('\n', '\\n'); |
+ text = toDoubleQuote(text); |
+ text = ('"' + text + '"'); |
+ } |
+ if (text !== node.text) { |
+ node.value = text; |
+ node.text = text; |
+ } |
+ } |
+ return EvaluatedValue.EvaluatedValue$factory(type, node.value, node.text, null); |
+} |
+MethodGenerator.prototype._checkNonStatic$1 = MethodGenerator.prototype._checkNonStatic; |
+MethodGenerator.prototype.visitBinaryExpression$1 = function($0) { |
+ return this.visitBinaryExpression($0, false); |
+}; |
+MethodGenerator.prototype.visitPostfixExpression$1 = function($0) { |
+ return this.visitPostfixExpression($0, false); |
+}; |
+MethodGenerator.prototype.writeDefinition$2 = MethodGenerator.prototype.writeDefinition; |
+// ********** Code for Arguments ************** |
+function Arguments(nodes, values) { |
+ this.nodes = nodes; |
+ this.values = values; |
+ // Initializers done |
+} |
+Arguments.Arguments$bare$factory = function(arity) { |
+ var values = []; |
+ for (var i = 0; |
+ i < arity; i++) { |
+ values.add$1(new Value($globals.world.varType, ('\$' + i), null, false)); |
+ } |
+ return new Arguments(null, values); |
+} |
+Arguments.get$EMPTY = function() { |
+ if ($globals.Arguments__empty == null) { |
+ $globals.Arguments__empty = new Arguments(null, []); |
+ } |
+ return $globals.Arguments__empty; |
+} |
+Arguments.prototype.get$values = function() { return this.values; }; |
+Arguments.prototype.set$values = function(value) { return this.values = value; }; |
+Arguments.prototype.get$nameCount = function() { |
+ return this.get$length() - this.get$bareCount(); |
+} |
+Arguments.prototype.get$hasNames = function() { |
+ return this.get$bareCount() < this.get$length(); |
+} |
+Arguments.prototype.get$length = function() { |
+ return this.values.length; |
+} |
+Object.defineProperty(Arguments.prototype, "length", { |
+ get: Arguments.prototype.get$length |
+}); |
+Arguments.prototype.getName = function(i) { |
+ return this.nodes.$index(i).get$label().get$name(); |
+} |
+Arguments.prototype.getIndexOfName = function(name) { |
+ for (var i = this.get$bareCount(); |
+ i < this.get$length(); i++) { |
+ if (this.getName(i) == name) { |
+ return i; |
+ } |
+ } |
+ return -1; |
+} |
+Arguments.prototype.getValue = function(name) { |
+ var i = this.getIndexOfName(name); |
+ return i >= 0 ? this.values.$index(i) : null; |
+} |
+Arguments.prototype.get$bareCount = function() { |
+ if (this._bareCount == null) { |
+ this._bareCount = this.get$length(); |
+ if (this.nodes != null) { |
+ for (var i = 0; |
+ i < this.nodes.length; i++) { |
+ if (this.nodes.$index(i).get$label() != null) { |
+ this._bareCount = i; |
+ break; |
+ } |
+ } |
+ } |
+ } |
+ return this._bareCount; |
+} |
+Arguments.prototype.getCode = function() { |
+ var argsCode = []; |
+ for (var i = 0; |
+ i < this.get$length(); i++) { |
+ argsCode.add$1(this.values.$index(i).get$code()); |
+ } |
+ Arguments.removeTrailingNulls(argsCode); |
+ return Strings.join(argsCode, ", "); |
+} |
+Arguments.removeTrailingNulls = function(argsCode) { |
+ while (argsCode.length > 0 && $eq(argsCode.last(), 'null')) { |
+ argsCode.removeLast(); |
+ } |
+} |
+Arguments.prototype.getNames = function() { |
+ var names = []; |
+ for (var i = this.get$bareCount(); |
+ i < this.get$length(); i++) { |
+ names.add$1(this.getName(i)); |
+ } |
+ return names; |
+} |
+Arguments.prototype.toCallStubArgs = function() { |
+ var result = []; |
+ for (var i = 0; |
+ i < this.get$bareCount(); i++) { |
+ result.add$1(new Value($globals.world.varType, ('\$' + i), null, false)); |
+ } |
+ for (var i = this.get$bareCount(); |
+ i < this.get$length(); i++) { |
+ var name = this.getName(i); |
+ if (name == null) name = ('\$' + i); |
+ result.add$1(new Value($globals.world.varType, name, null, false)); |
+ } |
+ return new Arguments(this.nodes, result); |
+} |
+// ********** Code for LibraryImport ************** |
+function LibraryImport(library, prefix) { |
+ this.library = library; |
+ this.prefix = prefix; |
+ // Initializers done |
+} |
+LibraryImport.prototype.get$prefix = function() { return this.prefix; }; |
+LibraryImport.prototype.set$prefix = function(value) { return this.prefix = value; }; |
+LibraryImport.prototype.get$library = function() { return this.library; }; |
+LibraryImport.prototype.set$library = function(value) { return this.library = value; }; |
+// ********** Code for Library ************** |
+$inherits(Library, Element); |
+function Library(baseSource) { |
+ this.isWritten = false |
+ this.baseSource = baseSource; |
+ // Initializers done |
+ Element.call(this, null, null); |
+ this.sourceDir = dirname(this.baseSource.filename); |
+ this.topType = new DefinedType(null, this, null, true); |
+ this.types = _map(['', this.topType]); |
+ this.imports = []; |
+ this.natives = []; |
+ this.sources = []; |
+ this._privateMembers = new HashMapImplementation(); |
+} |
+Library.prototype.get$baseSource = function() { return this.baseSource; }; |
+Library.prototype.get$types = function() { return this.types; }; |
+Library.prototype.set$types = function(value) { return this.types = value; }; |
+Library.prototype.get$imports = function() { return this.imports; }; |
+Library.prototype.set$imports = function(value) { return this.imports = value; }; |
+Library.prototype.get$_privateMembers = function() { return this._privateMembers; }; |
+Library.prototype.set$_privateMembers = function(value) { return this._privateMembers = value; }; |
+Library.prototype.get$topType = function() { return this.topType; }; |
+Library.prototype.set$topType = function(value) { return this.topType = value; }; |
+Library.prototype.get$enclosingElement = function() { |
+ return null; |
+} |
+Library.prototype.get$library = function() { |
+ return this; |
+} |
+Library.prototype.get$isNative = function() { |
+ return this.topType.isNative; |
+} |
+Library.prototype.get$isCore = function() { |
+ return $eq(this, $globals.world.corelib); |
+} |
+Library.prototype.get$isCoreImpl = function() { |
+ return $eq(this, $globals.world.get$coreimpl()); |
+} |
+Library.prototype.get$span = function() { |
+ return new SourceSpan(this.baseSource, 0, 0); |
+} |
+Library.prototype.makeFullPath = function(filename) { |
+ if (filename.startsWith('dart:')) return filename; |
+ if (filename.startsWith('/')) return filename; |
+ if (filename.startsWith('file:///')) return filename; |
+ if (filename.startsWith('http://')) return filename; |
+ return joinPaths(this.sourceDir, filename); |
+} |
+Library.prototype.addImport = function(fullname, prefix) { |
+ var newLib = $globals.world.getOrAddLibrary(fullname); |
+ this.imports.add(new LibraryImport(newLib, prefix)); |
+ return newLib; |
+} |
+Library.prototype.addNative = function(fullname) { |
+ this.natives.add($globals.world.reader.readFile(fullname)); |
+} |
+Library.prototype._findMembers = function(name) { |
+ if (name.startsWith('_')) { |
+ return this._privateMembers.$index(name); |
+ } |
+ else { |
+ return $globals.world._members.$index(name); |
+ } |
+} |
+Library.prototype._addMember = function(member) { |
+ if (member.get$isPrivate()) { |
+ if (member.get$isStatic()) { |
+ if (member.declaringType.get$isTop()) { |
+ $globals.world._addTopName(member); |
+ } |
+ return; |
+ } |
+ var mset = this._privateMembers.$index(member.name); |
+ if (mset == null) { |
+ var $$list = $globals.world.libraries.getValues(); |
+ for (var $$i = $globals.world.libraries.getValues().iterator$0(); $$i.hasNext$0(); ) { |
+ var lib = $$i.next$0(); |
+ if (lib.get$_privateMembers().containsKey$1(member.get$jsname())) { |
+ member._jsname = ('_' + this.get$jsname() + member.get$jsname()); |
+ break; |
+ } |
+ } |
+ mset = new MemberSet(member, true); |
+ this._privateMembers.$setindex(member.name, mset); |
+ } |
+ else { |
+ mset.get$members().add$1(member); |
+ } |
+ } |
+ else { |
+ $globals.world._addMember(member); |
+ } |
+} |
+Library.prototype.getOrAddFunctionType = function(enclosingElement, name, func) { |
+ var def = new FunctionTypeDefinition(func, null, func.span); |
+ var type = new DefinedType(name, this, def, false); |
+ type.addMethod(':call', func); |
+ var m = type.members.$index(':call'); |
+ m.set$enclosingElement(enclosingElement); |
+ m.resolve$0(); |
+ type.interfaces = [$globals.world.functionType]; |
+ return type; |
+} |
+Library.prototype.addType = function(name, definition, isClass) { |
+ if (this.types.containsKey(name)) { |
+ var existingType = this.types.$index(name); |
+ if (this.get$isCore() && existingType.get$definition() == null) { |
+ existingType.setDefinition$1(definition); |
+ } |
+ else { |
+ $globals.world.warning(('duplicate definition of ' + name), definition.span, existingType.get$span()); |
+ } |
+ } |
+ else { |
+ this.types.$setindex(name, new DefinedType(name, this, definition, isClass)); |
+ } |
+ return this.types.$index(name); |
+} |
+Library.prototype.findType = function(type) { |
+ var result = this.findTypeByName(type.name.name); |
+ if (result == null) return null; |
+ if (type.names != null) { |
+ if (type.names.length > 1) { |
+ return null; |
+ } |
+ if (!result.get$isTop()) { |
+ return null; |
+ } |
+ return result.get$library().findTypeByName(type.names.$index(0).get$name()); |
+ } |
+ return result; |
+} |
+Library.prototype.findTypeByName = function(name) { |
+ var ret = this.types.$index(name); |
+ var $$list = this.imports; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var imported = $$list.$index($$i); |
+ var newRet = null; |
+ if (imported.get$prefix() == null) { |
+ newRet = imported.get$library().get$types().$index(name); |
+ } |
+ else if ($eq(imported.get$prefix(), name)) { |
+ newRet = imported.get$library().get$topType(); |
+ } |
+ if (newRet != null) { |
+ if (ret != null && $ne(ret, newRet)) { |
+ $globals.world.error(('conflicting types for "' + name + '"'), ret.get$span(), newRet.get$span()); |
+ } |
+ else { |
+ ret = newRet; |
+ } |
+ } |
+ } |
+ return ret; |
+} |
+Library.prototype.resolveType = function(node, typeErrors) { |
+ if (node == null) return $globals.world.varType; |
+ if (node.type != null) return node.type; |
+ node.type = this.findType(node); |
+ if (node.type == null) { |
+ var message = ('cannot find type ' + Library._getDottedName(node)); |
+ if (typeErrors) { |
+ $globals.world.error(message, node.span); |
+ node.type = $globals.world.objectType; |
+ } |
+ else { |
+ $globals.world.warning(message, node.span); |
+ node.type = $globals.world.varType; |
+ } |
+ } |
+ return node.type; |
+} |
+Library._getDottedName = function(type) { |
+ if (type.names != null) { |
+ var names = map(type.names, (function (n) { |
+ return n.get$name(); |
+ }) |
+ ); |
+ return type.name.name + '.' + Strings.join(names, '.'); |
+ } |
+ else { |
+ return type.name.name; |
+ } |
+} |
+Library.prototype.lookup = function(name, span) { |
+ var retType = this.findTypeByName(name); |
+ var ret = null; |
+ if (retType != null) { |
+ ret = retType.get$typeMember(); |
+ } |
+ var newRet = this.topType.getMember(name); |
+ if (newRet != null) { |
+ if (ret != null && $ne(ret, newRet)) { |
+ $globals.world.error(('conflicting members for "' + name + '"'), span, ret.get$span(), newRet.get$span()); |
+ } |
+ else { |
+ ret = newRet; |
+ } |
+ } |
+ var $$list = this.imports; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var imported = $$list.$index($$i); |
+ if (imported.get$prefix() == null) { |
+ newRet = imported.get$library().get$topType().getMember$1(name); |
+ if (newRet != null) { |
+ if (ret != null && $ne(ret, newRet)) { |
+ $globals.world.error(('conflicting members for "' + name + '"'), span, ret.get$span(), newRet.get$span()); |
+ } |
+ else { |
+ ret = newRet; |
+ } |
+ } |
+ } |
+ } |
+ return ret; |
+} |
+Library.prototype.resolve = function() { |
+ if (this.name == null) { |
+ this.name = this.baseSource.filename; |
+ var index = this.name.lastIndexOf('/', this.name.length); |
+ if (index >= 0) { |
+ this.name = this.name.substring(index + 1); |
+ } |
+ index = this.name.indexOf('.'); |
+ if (index > 0) { |
+ this.name = this.name.substring(0, index); |
+ } |
+ } |
+ this._jsname = this.name.replaceAll('.', '_').replaceAll(':', '_').replaceAll(' ', '_'); |
+ var $$list = this.types.getValues(); |
+ for (var $$i = this.types.getValues().iterator$0(); $$i.hasNext$0(); ) { |
+ var type = $$i.next$0(); |
+ type.resolve$0(); |
+ } |
+} |
+Library.prototype.visitSources = function() { |
+ var visitor = new _LibraryVisitor(this); |
+ visitor.addSource$1(this.baseSource); |
+} |
+Library.prototype.toString = function() { |
+ return this.baseSource.filename; |
+} |
+Library.prototype.hashCode = function() { |
+ return this.baseSource.filename.hashCode(); |
+} |
+Library.prototype.$eq = function(other) { |
+ return (other instanceof Library) && $eq(other.get$baseSource().get$filename(), this.baseSource.filename); |
+} |
+Library.prototype.findTypeByName$1 = Library.prototype.findTypeByName; |
+Library.prototype.hashCode$0 = Library.prototype.hashCode; |
+Library.prototype.resolve$0 = Library.prototype.resolve; |
+Library.prototype.toString$0 = Library.prototype.toString; |
+Library.prototype.visitSources$0 = Library.prototype.visitSources; |
+// ********** Code for _LibraryVisitor ************** |
+function _LibraryVisitor(library) { |
+ this.seenImport = false |
+ this.seenSource = false |
+ this.seenResource = false |
+ this.isTop = true |
+ this.library = library; |
+ // Initializers done |
+ this.currentType = this.library.topType; |
+ this.sources = []; |
+} |
+_LibraryVisitor.prototype.get$library = function() { return this.library; }; |
+_LibraryVisitor.prototype.get$isTop = function() { return this.isTop; }; |
+_LibraryVisitor.prototype.set$isTop = function(value) { return this.isTop = value; }; |
+_LibraryVisitor.prototype.addSourceFromName = function(name, span) { |
+ var filename = this.library.makeFullPath(name); |
+ if ($eq(filename, this.library.baseSource.filename)) { |
+ $globals.world.error('library can not source itself', span); |
+ return; |
+ } |
+ else if (this.sources.some((function (s) { |
+ return $eq(s.get$filename(), filename); |
+ }) |
+ )) { |
+ $globals.world.error(('file "' + filename + '" has already been sourced'), span); |
+ return; |
+ } |
+ var source = $globals.world.readFile(this.library.makeFullPath(name)); |
+ this.sources.add(source); |
+} |
+_LibraryVisitor.prototype.addSource = function(source) { |
+ var $this = this; // closure support |
+ if (this.library.sources.some((function (s) { |
+ return $eq(s.get$filename(), source.filename); |
+ }) |
+ )) { |
+ $globals.world.error(('duplicate source file "' + source.filename + '"')); |
+ return; |
+ } |
+ this.library.sources.add(source); |
+ var parser = new Parser(source, $globals.options.dietParse, false, false, 0); |
+ var unit = parser.compilationUnit(); |
+ unit.forEach((function (def) { |
+ return def.visit$1($this); |
+ }) |
+ ); |
+ this.isTop = false; |
+ var newSources = this.sources; |
+ this.sources = []; |
+ for (var $$i = newSources.iterator$0(); $$i.hasNext$0(); ) { |
+ var source0 = $$i.next$0(); |
+ this.addSource(source0); |
+ } |
+} |
+_LibraryVisitor.prototype.visitDirectiveDefinition = function(node) { |
+ if (!this.isTop) { |
+ $globals.world.error('directives not allowed in sourced file', node.span); |
+ return; |
+ } |
+ var name; |
+ switch (node.name.name) { |
+ case "library": |
+ |
+ name = this.getSingleStringArg(node); |
+ if (this.library.name == null) { |
+ this.library.name = name; |
+ if ($eq(name, 'node') || $eq(name, 'dom')) { |
+ this.library.topType.isNative = true; |
+ } |
+ if (this.seenImport || this.seenSource || this.seenResource) { |
+ $globals.world.error('#library must be first directive in file', node.span); |
+ } |
+ } |
+ else { |
+ $globals.world.error('already specified library name', node.span); |
+ } |
+ break; |
+ |
+ case "import": |
+ |
+ this.seenImport = true; |
+ name = this.getFirstStringArg(node); |
+ var prefix = this.tryGetNamedStringArg(node, 'prefix'); |
+ if (node.arguments.length > 2 || node.arguments.length == 2 && prefix == null) { |
+ $globals.world.error('expected at most one "name" argument and one optional "prefix"' + (' but found ' + node.arguments.length), node.span); |
+ } |
+ else if (prefix != null && prefix.indexOf$1('.') >= 0) { |
+ $globals.world.error('library prefix canot contain "."', node.span); |
+ } |
+ else if (this.seenSource || this.seenResource) { |
+ $globals.world.error('#imports must come before any #source or #resource', node.span); |
+ } |
+ if ($eq(prefix, '')) prefix = null; |
+ var filename = this.library.makeFullPath(name); |
+ if (this.library.imports.some((function (li) { |
+ return $eq(li.get$library().get$baseSource(), filename); |
+ }) |
+ )) { |
+ $globals.world.error(('duplicate import of "' + name + '"'), node.span); |
+ return; |
+ } |
+ var newLib = this.library.addImport(filename, prefix); |
+ break; |
+ |
+ case "source": |
+ |
+ this.seenSource = true; |
+ name = this.getSingleStringArg(node); |
+ this.addSourceFromName(name, node.span); |
+ if (this.seenResource) { |
+ $globals.world.error('#sources must come before any #resource', node.span); |
+ } |
+ break; |
+ |
+ case "native": |
+ |
+ name = this.getSingleStringArg(node); |
+ this.library.addNative(this.library.makeFullPath(name)); |
+ break; |
+ |
+ case "resource": |
+ |
+ this.seenResource = true; |
+ this.getFirstStringArg(node); |
+ break; |
+ |
+ default: |
+ |
+ $globals.world.error(('unknown directive: ' + node.name.name), node.span); |
+ |
+ } |
+} |
+_LibraryVisitor.prototype.getSingleStringArg = function(node) { |
+ if (node.arguments.length != 1) { |
+ $globals.world.error(('expected exactly one argument but found ' + node.arguments.length), node.span); |
+ } |
+ return this.getFirstStringArg(node); |
+} |
+_LibraryVisitor.prototype.getFirstStringArg = function(node) { |
+ if (node.arguments.length < 1) { |
+ $globals.world.error(('expected at least one argument but found ' + node.arguments.length), node.span); |
+ } |
+ var arg = node.arguments.$index(0); |
+ if (arg.get$label() != null) { |
+ $globals.world.error('label not allowed for directive', node.span); |
+ } |
+ return this._parseStringArgument(arg); |
+} |
+_LibraryVisitor.prototype.tryGetNamedStringArg = function(node, argName) { |
+ var args = node.arguments.filter((function (a) { |
+ return a.get$label() != null && $eq(a.get$label().get$name(), argName); |
+ }) |
+ ); |
+ if ($eq(args.length, 0)) { |
+ return null; |
+ } |
+ if (args.length > 1) { |
+ $globals.world.error(('expected at most one "' + argName + '" argument but found ') + node.arguments.length, node.span); |
+ } |
+ for (var $$i = args.iterator$0(); $$i.hasNext$0(); ) { |
+ var arg = $$i.next$0(); |
+ return this._parseStringArgument(arg); |
+ } |
+} |
+_LibraryVisitor.prototype._parseStringArgument = function(arg) { |
+ var expr = arg.value; |
+ if (!(expr instanceof LiteralExpression) || !expr.get$type().get$type().get$isString()) { |
+ $globals.world.error('expected string', expr.get$span()); |
+ } |
+ return parseStringLiteral(expr.get$value()); |
+} |
+_LibraryVisitor.prototype.visitTypeDefinition = function(node) { |
+ var oldType = this.currentType; |
+ this.currentType = this.library.addType(node.name.name, node, node.isClass); |
+ var $$list = node.body; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var member = $$list.$index($$i); |
+ member.visit$1(this); |
+ } |
+ this.currentType = oldType; |
+} |
+_LibraryVisitor.prototype.visitVariableDefinition = function(node) { |
+ this.currentType.addField(node); |
+} |
+_LibraryVisitor.prototype.visitFunctionDefinition = function(node) { |
+ this.currentType.addMethod(node.name.name, node); |
+} |
+_LibraryVisitor.prototype.visitFunctionTypeDefinition = function(node) { |
+ var type = this.library.addType(node.func.name.name, node, false); |
+ type.addMethod$2(':call', node.func); |
+} |
+_LibraryVisitor.prototype.addSource$1 = _LibraryVisitor.prototype.addSource; |
+// ********** Code for Parameter ************** |
+function Parameter(definition, method) { |
+ this.isInitializer = false |
+ this.definition = definition; |
+ this.method = method; |
+ // Initializers done |
+} |
+Parameter.prototype.get$definition = function() { return this.definition; }; |
+Parameter.prototype.set$definition = function(value) { return this.definition = value; }; |
+Parameter.prototype.get$name = function() { return this.name; }; |
+Parameter.prototype.set$name = function(value) { return this.name = value; }; |
+Parameter.prototype.get$type = function() { return this.type; }; |
+Parameter.prototype.set$type = function(value) { return this.type = value; }; |
+Parameter.prototype.get$isInitializer = function() { return this.isInitializer; }; |
+Parameter.prototype.set$isInitializer = function(value) { return this.isInitializer = value; }; |
+Parameter.prototype.get$value = function() { return this.value; }; |
+Parameter.prototype.set$value = function(value) { return this.value = value; }; |
+Parameter.prototype.resolve = function() { |
+ this.name = this.definition.name.name; |
+ if (this.name.startsWith('this.')) { |
+ this.name = this.name.substring(5); |
+ this.isInitializer = true; |
+ } |
+ this.type = this.method.resolveType(this.definition.type, false); |
+ if (this.definition.value != null) { |
+ if (!this.get$hasDefaultValue()) return; |
+ if (this.method.name == ':call') { |
+ if (this.method.get$definition().get$body() == null) { |
+ $globals.world.error('default value not allowed on function type', this.definition.span); |
+ } |
+ } |
+ else if (this.method.get$isAbstract()) { |
+ $globals.world.error('default value not allowed on abstract methods', this.definition.span); |
+ } |
+ } |
+ else if (this.isInitializer && !this.method.get$isConstructor()) { |
+ $globals.world.error('initializer parameters only allowed on constructors', this.definition.span); |
+ } |
+} |
+Parameter.prototype.genValue = function(method, context) { |
+ if (this.definition.value == null || this.value != null) return; |
+ if (context == null) { |
+ context = new MethodGenerator(method, null); |
+ } |
+ this.value = this.definition.value.visit(context); |
+ if (!this.value.get$isConst()) { |
+ $globals.world.error('default parameter values must be constant', this.value.span); |
+ } |
+ this.value = this.value.convertTo(context, this.type, this.definition.value, false); |
+} |
+Parameter.prototype.copyWithNewType = function(newMethod, newType) { |
+ var ret = new Parameter(this.definition, newMethod); |
+ ret.set$type(newType); |
+ ret.set$name(this.name); |
+ ret.set$isInitializer(this.isInitializer); |
+ return ret; |
+} |
+Parameter.prototype.get$isOptional = function() { |
+ return this.definition != null && this.definition.value != null; |
+} |
+Parameter.prototype.get$hasDefaultValue = function() { |
+ return !(this.definition.value instanceof NullExpression) || (this.definition.value.span.start != this.definition.span.start); |
+} |
+Parameter.prototype.copyWithNewType$2 = Parameter.prototype.copyWithNewType; |
+Parameter.prototype.genValue$2 = Parameter.prototype.genValue; |
+Parameter.prototype.resolve$0 = Parameter.prototype.resolve; |
+// ********** Code for Member ************** |
+$inherits(Member, Element); |
+function Member(name, declaringType) { |
+ this.isGenerated = false; |
+ this.declaringType = declaringType; |
+ // Initializers done |
+ Element.call(this, name, declaringType); |
+} |
+Member.prototype.get$declaringType = function() { return this.declaringType; }; |
+Member.prototype.get$isGenerated = function() { return this.isGenerated; }; |
+Member.prototype.set$isGenerated = function(value) { return this.isGenerated = value; }; |
+Member.prototype.get$generator = function() { return this.generator; }; |
+Member.prototype.set$generator = function(value) { return this.generator = value; }; |
+Member.prototype.get$library = function() { |
+ return this.declaringType.get$library(); |
+} |
+Member.prototype.get$isPrivate = function() { |
+ return this.name.startsWith('_'); |
+} |
+Member.prototype.get$isConstructor = function() { |
+ return false; |
+} |
+Member.prototype.get$isField = function() { |
+ return false; |
+} |
+Member.prototype.get$isMethod = function() { |
+ return false; |
+} |
+Member.prototype.get$isProperty = function() { |
+ return false; |
+} |
+Member.prototype.get$isAbstract = function() { |
+ return false; |
+} |
+Member.prototype.get$isFinal = function() { |
+ return false; |
+} |
+Member.prototype.get$isConst = function() { |
+ return false; |
+} |
+Member.prototype.get$isFactory = function() { |
+ return false; |
+} |
+Member.prototype.get$isOperator = function() { |
+ return this.name.startsWith(':'); |
+} |
+Member.prototype.get$isCallMethod = function() { |
+ return this.name == ':call'; |
+} |
+Member.prototype.get$prefersPropertySyntax = function() { |
+ return true; |
+} |
+Member.prototype.get$requiresFieldSyntax = function() { |
+ return false; |
+} |
+Member.prototype.get$isNative = function() { |
+ return false; |
+} |
+Member.prototype.get$constructorName = function() { |
+ $globals.world.internalError('can not be a constructor', this.get$span()); |
+} |
+Member.prototype.provideFieldSyntax = function() { |
+ |
+} |
+Member.prototype.providePropertySyntax = function() { |
+ |
+} |
+Member.prototype.get$initDelegate = function() { |
+ $globals.world.internalError('cannot have initializers', this.get$span()); |
+} |
+Member.prototype.set$initDelegate = function(ctor) { |
+ $globals.world.internalError('cannot have initializers', this.get$span()); |
+} |
+Member.prototype.computeValue = function() { |
+ $globals.world.internalError('cannot have value', this.get$span()); |
+} |
+Member.prototype.get$inferredResult = function() { |
+ var t = this.get$returnType(); |
+ if (t.get$isBool() && (this.get$library().get$isCore() || this.get$library().get$isCoreImpl())) { |
+ return $globals.world.nonNullBool; |
+ } |
+ return t; |
+} |
+Member.prototype.get$definition = function() { |
+ return null; |
+} |
+Member.prototype.get$parameters = function() { |
+ return []; |
+} |
+Member.prototype.canInvoke = function(context, args) { |
+ return this.get$canGet() && new Value(this.get$returnType(), null, null, true).canInvoke(context, ':call', args); |
+} |
+Member.prototype.invoke = function(context, node, target, args, isDynamic) { |
+ var newTarget = this._get(context, node, target, isDynamic); |
+ return newTarget.invoke$5(context, ':call', node, args, isDynamic); |
+} |
+Member.prototype.override = function(other) { |
+ if (this.get$isStatic()) { |
+ $globals.world.error('static members can not hide parent members', this.get$span(), other.get$span()); |
+ return false; |
+ } |
+ else if (other.get$isStatic()) { |
+ $globals.world.error('can not override static member', this.get$span(), other.get$span()); |
+ return false; |
+ } |
+ return true; |
+} |
+Member.prototype.get$generatedFactoryName = function() { |
+ var prefix = ('' + this.declaringType.get$jsname() + '.' + this.get$constructorName() + '\$'); |
+ if (this.name == '') { |
+ return ('' + prefix + 'factory'); |
+ } |
+ else { |
+ return ('' + prefix + this.name + '\$factory'); |
+ } |
+} |
+Member.prototype.hashCode = function() { |
+ var typeCode = this.declaringType == null ? 1 : this.declaringType.hashCode(); |
+ var nameCode = this.get$isConstructor() ? this.get$constructorName().hashCode() : this.name.hashCode(); |
+ return (typeCode << 4) ^ nameCode; |
+} |
+Member.prototype.$eq = function(other) { |
+ return (other instanceof Member) && $eq(this.get$isConstructor(), other.get$isConstructor()) && $eq(this.declaringType, other.get$declaringType()) && (this.get$isConstructor() ? this.get$constructorName() == other.get$constructorName() : this.name == other.get$name()); |
+} |
+Member.prototype._get$3 = Member.prototype._get; |
+Member.prototype._get$3$isDynamic = Member.prototype._get; |
+Member.prototype._get$4 = Member.prototype._get; |
+Member.prototype._set$4 = Member.prototype._set; |
+Member.prototype._set$4$isDynamic = Member.prototype._set; |
+Member.prototype._set$5 = Member.prototype._set; |
+Member.prototype.canInvoke$2 = Member.prototype.canInvoke; |
+Member.prototype.computeValue$0 = Member.prototype.computeValue; |
+Member.prototype.hashCode$0 = Member.prototype.hashCode; |
+Member.prototype.invoke$4 = function($0, $1, $2, $3) { |
+ return this.invoke($0, $1, $2, $3, false); |
+}; |
+Member.prototype.invoke$4$isDynamic = Member.prototype.invoke; |
+Member.prototype.invoke$5 = Member.prototype.invoke; |
+Member.prototype.provideFieldSyntax$0 = Member.prototype.provideFieldSyntax; |
+Member.prototype.providePropertySyntax$0 = Member.prototype.providePropertySyntax; |
+// ********** Code for TypeMember ************** |
+$inherits(TypeMember, Member); |
+function TypeMember(type) { |
+ this.type = type; |
+ // Initializers done |
+ Member.call(this, type.name, type.library.topType); |
+} |
+TypeMember.prototype.get$type = function() { return this.type; }; |
+TypeMember.prototype.get$span = function() { |
+ return this.type.definition.span; |
+} |
+TypeMember.prototype.get$isStatic = function() { |
+ return true; |
+} |
+TypeMember.prototype.get$returnType = function() { |
+ return $globals.world.varType; |
+} |
+TypeMember.prototype.canInvoke = function(context, args) { |
+ return false; |
+} |
+TypeMember.prototype.get$canGet = function() { |
+ return true; |
+} |
+TypeMember.prototype.get$canSet = function() { |
+ return false; |
+} |
+TypeMember.prototype.get$requiresFieldSyntax = function() { |
+ return true; |
+} |
+TypeMember.prototype._get = function(context, node, target, isDynamic) { |
+ return new Value.type$ctor(this.type, node.span); |
+} |
+TypeMember.prototype._set = function(context, node, target, value, isDynamic) { |
+ $globals.world.error('cannot set type', node.span); |
+} |
+TypeMember.prototype.invoke = function(context, node, target, args, isDynamic) { |
+ $globals.world.error('cannot invoke type', node.span); |
+} |
+TypeMember.prototype._get$3 = function($0, $1, $2) { |
+ return this._get($0, $1, $2, false); |
+}; |
+TypeMember.prototype._get$3$isDynamic = TypeMember.prototype._get; |
+TypeMember.prototype._get$4 = TypeMember.prototype._get; |
+TypeMember.prototype._set$4 = function($0, $1, $2, $3) { |
+ return this._set($0, $1, $2, $3, false); |
+}; |
+TypeMember.prototype._set$4$isDynamic = TypeMember.prototype._set; |
+TypeMember.prototype._set$5 = TypeMember.prototype._set; |
+TypeMember.prototype.canInvoke$2 = TypeMember.prototype.canInvoke; |
+TypeMember.prototype.invoke$4 = function($0, $1, $2, $3) { |
+ return this.invoke($0, $1, $2, $3, false); |
+}; |
+TypeMember.prototype.invoke$4$isDynamic = TypeMember.prototype.invoke; |
+TypeMember.prototype.invoke$5 = TypeMember.prototype.invoke; |
+// ********** Code for FieldMember ************** |
+$inherits(FieldMember, Member); |
+function FieldMember(name, declaringType, definition, value) { |
+ this._providePropertySyntax = false |
+ this._computing = false |
+ this.definition = definition; |
+ this.value = value; |
+ this.isNative = false; |
+ // Initializers done |
+ Member.call(this, name, declaringType); |
+} |
+FieldMember.prototype.get$definition = function() { return this.definition; }; |
+FieldMember.prototype.get$value = function() { return this.value; }; |
+FieldMember.prototype.get$type = function() { return this.type; }; |
+FieldMember.prototype.set$type = function(value) { return this.type = value; }; |
+FieldMember.prototype.get$isStatic = function() { return this.isStatic; }; |
+FieldMember.prototype.set$isStatic = function(value) { return this.isStatic = value; }; |
+FieldMember.prototype.get$isFinal = function() { return this.isFinal; }; |
+FieldMember.prototype.set$isFinal = function(value) { return this.isFinal = value; }; |
+FieldMember.prototype.get$isNative = function() { return this.isNative; }; |
+FieldMember.prototype.set$isNative = function(value) { return this.isNative = value; }; |
+FieldMember.prototype.override = function(other) { |
+ if (!Member.prototype.override.call(this, other)) return false; |
+ if (other.get$isProperty()) { |
+ return true; |
+ } |
+ else { |
+ $globals.world.error('field can not override anything but property', this.get$span(), other.get$span()); |
+ return false; |
+ } |
+} |
+FieldMember.prototype.get$prefersPropertySyntax = function() { |
+ return false; |
+} |
+FieldMember.prototype.get$requiresFieldSyntax = function() { |
+ return this.isNative; |
+} |
+FieldMember.prototype.provideFieldSyntax = function() { |
+ |
+} |
+FieldMember.prototype.providePropertySyntax = function() { |
+ this._providePropertySyntax = true; |
+} |
+FieldMember.prototype.get$span = function() { |
+ return this.definition == null ? null : this.definition.span; |
+} |
+FieldMember.prototype.get$returnType = function() { |
+ return this.type; |
+} |
+FieldMember.prototype.get$canGet = function() { |
+ return true; |
+} |
+FieldMember.prototype.get$canSet = function() { |
+ return !this.isFinal; |
+} |
+FieldMember.prototype.get$isField = function() { |
+ return true; |
+} |
+FieldMember.prototype.resolve = function() { |
+ this.isStatic = this.declaringType.get$isTop(); |
+ this.isFinal = false; |
+ if (this.definition.modifiers != null) { |
+ var $$list = this.definition.modifiers; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var mod = $$list.$index($$i); |
+ if ($eq(mod.get$kind(), 86/*TokenKind.STATIC*/)) { |
+ if (this.isStatic) { |
+ $globals.world.error('duplicate static modifier', mod.get$span()); |
+ } |
+ this.isStatic = true; |
+ } |
+ else if ($eq(mod.get$kind(), 98/*TokenKind.FINAL*/)) { |
+ if (this.isFinal) { |
+ $globals.world.error('duplicate final modifier', mod.get$span()); |
+ } |
+ this.isFinal = true; |
+ } |
+ else { |
+ $globals.world.error(('' + mod + ' modifier not allowed on field'), mod.get$span()); |
+ } |
+ } |
+ } |
+ this.type = this.resolveType(this.definition.type, false); |
+ if (this.isStatic && this.type.get$hasTypeParams()) { |
+ $globals.world.error('using type parameter in static context', this.definition.type.span); |
+ } |
+ if (this.isStatic && this.isFinal && this.value == null) { |
+ $globals.world.error('static final field is missing initializer', this.get$span()); |
+ } |
+ this.get$library()._addMember(this); |
+} |
+FieldMember.prototype.computeValue = function() { |
+ if (this.value == null) return null; |
+ if (this._computedValue == null) { |
+ if (this._computing) { |
+ $globals.world.error('circular reference', this.value.span); |
+ return null; |
+ } |
+ this._computing = true; |
+ var finalMethod = new MethodMember('final_context', this.declaringType, null); |
+ finalMethod.set$isStatic(true); |
+ var finalGen = new MethodGenerator(finalMethod, null); |
+ this._computedValue = this.value.visit(finalGen); |
+ if (!this._computedValue.get$isConst()) { |
+ if (this.isStatic) { |
+ $globals.world.error('non constant static field must be initialized in functions', this.value.span); |
+ } |
+ else { |
+ $globals.world.error('non constant field must be initialized in constructor', this.value.span); |
+ } |
+ } |
+ if (this.isStatic) { |
+ this._computedValue = $globals.world.gen.globalForStaticField(this, this._computedValue, [this._computedValue]); |
+ } |
+ this._computing = false; |
+ } |
+ return this._computedValue; |
+} |
+FieldMember.prototype._get = function(context, node, target, isDynamic) { |
+ if (this.isNative && this.get$returnType() != null) { |
+ this.get$returnType().markUsed(); |
+ if ((this.get$returnType() instanceof DefinedType)) { |
+ var factory_ = this.get$returnType().get$genericType().factory_; |
+ if (factory_ != null && factory_.get$isNative()) { |
+ factory_.markUsed$0(); |
+ } |
+ } |
+ } |
+ if (this.isStatic) { |
+ this.declaringType.markUsed(); |
+ var cv = this.computeValue(); |
+ if (this.isFinal) { |
+ return cv; |
+ } |
+ $globals.world.gen.hasStatics = true; |
+ if (this.declaringType.get$isTop()) { |
+ if ($eq(this.declaringType.get$library(), $globals.world.get$dom())) { |
+ return new Value(this.type, ('' + this.get$jsname()), node.span, true); |
+ } |
+ else { |
+ return new Value(this.type, ('\$globals.' + this.get$jsname()), node.span, true); |
+ } |
+ } |
+ else if (this.declaringType.get$isNative()) { |
+ if (this.declaringType.get$isHiddenNativeType()) { |
+ $globals.world.error('static field of hidden native type is inaccessible', node.span); |
+ } |
+ return new Value(this.type, ('' + this.declaringType.get$jsname() + '.' + this.get$jsname()), node.span, true); |
+ } |
+ else { |
+ return new Value(this.type, ('\$globals.' + this.declaringType.get$jsname() + '_' + this.get$jsname()), node.span, true); |
+ } |
+ } |
+ else if (target.get$isConst() && this.isFinal) { |
+ var constTarget = (target instanceof GlobalValue) ? target.get$dynamic().get$exp() : target; |
+ if ((constTarget instanceof ConstObjectValue)) { |
+ return constTarget.get$fields().$index(this.name); |
+ } |
+ else if ($eq(constTarget.get$type(), $globals.world.stringType) && this.name == 'length') { |
+ return new Value(this.type, ('' + constTarget.get$actualValue().length), node.span, true); |
+ } |
+ } |
+ return new Value(this.type, ('' + target.code + '.' + this.get$jsname()), node.span, true); |
+} |
+FieldMember.prototype._set = function(context, node, target, value, isDynamic) { |
+ var lhs = this._get(context, node, target, isDynamic); |
+ value = value.convertTo(context, this.type, node, isDynamic); |
+ return new Value(this.type, ('' + lhs.get$code() + ' = ' + value.code), node.span, true); |
+} |
+FieldMember.prototype._get$3 = function($0, $1, $2) { |
+ return this._get($0, $1, $2, false); |
+}; |
+FieldMember.prototype._get$3$isDynamic = FieldMember.prototype._get; |
+FieldMember.prototype._get$4 = FieldMember.prototype._get; |
+FieldMember.prototype._set$4 = function($0, $1, $2, $3) { |
+ return this._set($0, $1, $2, $3, false); |
+}; |
+FieldMember.prototype._set$4$isDynamic = FieldMember.prototype._set; |
+FieldMember.prototype._set$5 = FieldMember.prototype._set; |
+FieldMember.prototype.computeValue$0 = FieldMember.prototype.computeValue; |
+FieldMember.prototype.provideFieldSyntax$0 = FieldMember.prototype.provideFieldSyntax; |
+FieldMember.prototype.providePropertySyntax$0 = FieldMember.prototype.providePropertySyntax; |
+FieldMember.prototype.resolve$0 = FieldMember.prototype.resolve; |
+// ********** Code for PropertyMember ************** |
+$inherits(PropertyMember, Member); |
+function PropertyMember(name, declaringType) { |
+ this._provideFieldSyntax = false |
+ // Initializers done |
+ Member.call(this, name, declaringType); |
+} |
+PropertyMember.prototype.get$getter = function() { return this.getter; }; |
+PropertyMember.prototype.set$getter = function(value) { return this.getter = value; }; |
+PropertyMember.prototype.get$setter = function() { return this.setter; }; |
+PropertyMember.prototype.set$setter = function(value) { return this.setter = value; }; |
+PropertyMember.prototype.get$span = function() { |
+ return this.getter != null ? this.getter.get$span() : null; |
+} |
+PropertyMember.prototype.get$canGet = function() { |
+ return this.getter != null; |
+} |
+PropertyMember.prototype.get$canSet = function() { |
+ return this.setter != null; |
+} |
+PropertyMember.prototype.get$prefersPropertySyntax = function() { |
+ return true; |
+} |
+PropertyMember.prototype.get$requiresFieldSyntax = function() { |
+ return false; |
+} |
+PropertyMember.prototype.provideFieldSyntax = function() { |
+ this._provideFieldSyntax = true; |
+} |
+PropertyMember.prototype.providePropertySyntax = function() { |
+ |
+} |
+PropertyMember.prototype.get$isStatic = function() { |
+ return this.getter == null ? this.setter.isStatic : this.getter.isStatic; |
+} |
+PropertyMember.prototype.get$isProperty = function() { |
+ return true; |
+} |
+PropertyMember.prototype.get$returnType = function() { |
+ return this.getter == null ? this.setter.returnType : this.getter.returnType; |
+} |
+PropertyMember.prototype.override = function(other) { |
+ if (!Member.prototype.override.call(this, other)) return false; |
+ if (other.get$isProperty() || other.get$isField()) { |
+ if (other.get$isProperty()) this.addFromParent(other); |
+ else this._overriddenField = other; |
+ return true; |
+ } |
+ else { |
+ $globals.world.error('property can only override field or property', this.get$span(), other.get$span()); |
+ return false; |
+ } |
+} |
+PropertyMember.prototype._get = function(context, node, target, isDynamic) { |
+ if (this.getter == null) { |
+ if (this._overriddenField != null) { |
+ return this._overriddenField._get(context, node, target, isDynamic); |
+ } |
+ return target.invokeNoSuchMethod(context, ('get:' + this.name), node); |
+ } |
+ return this.getter.invoke(context, node, target, Arguments.get$EMPTY(), false); |
+} |
+PropertyMember.prototype._set = function(context, node, target, value, isDynamic) { |
+ if (this.setter == null) { |
+ if (this._overriddenField != null) { |
+ return this._overriddenField._set(context, node, target, value, isDynamic); |
+ } |
+ return target.invokeNoSuchMethod(context, ('set:' + this.name), node, new Arguments(null, [value])); |
+ } |
+ return this.setter.invoke(context, node, target, new Arguments(null, [value]), isDynamic); |
+} |
+PropertyMember.prototype.addFromParent = function(parentMember) { |
+ var parent; |
+ if ((parentMember instanceof ConcreteMember)) { |
+ var c = parentMember; |
+ parent = c.baseMember; |
+ } |
+ else { |
+ parent = parentMember; |
+ } |
+ if (this.getter == null) this.getter = parent.getter; |
+ if (this.setter == null) this.setter = parent.setter; |
+} |
+PropertyMember.prototype.resolve = function() { |
+ if (this.getter != null) { |
+ this.getter.resolve(); |
+ if (this.getter.parameters.length != 0) { |
+ $globals.world.error('getter methods should take no arguments', this.getter.definition.span); |
+ } |
+ if (this.getter.returnType.get$isVoid()) { |
+ $globals.world.warning('getter methods should not be void', this.getter.definition.returnType.span); |
+ } |
+ } |
+ if (this.setter != null) { |
+ this.setter.resolve(); |
+ if (this.setter.parameters.length != 1) { |
+ $globals.world.error('setter methods should take a single argument', this.setter.definition.span); |
+ } |
+ if (!this.setter.returnType.get$isVoid() && this.setter.definition.returnType != null) { |
+ $globals.world.warning('setter methods should be void', this.setter.definition.returnType.span); |
+ } |
+ } |
+ this.get$library()._addMember(this); |
+} |
+PropertyMember.prototype._get$3 = function($0, $1, $2) { |
+ return this._get($0, $1, $2, false); |
+}; |
+PropertyMember.prototype._get$3$isDynamic = PropertyMember.prototype._get; |
+PropertyMember.prototype._get$4 = PropertyMember.prototype._get; |
+PropertyMember.prototype._set$4 = function($0, $1, $2, $3) { |
+ return this._set($0, $1, $2, $3, false); |
+}; |
+PropertyMember.prototype._set$4$isDynamic = PropertyMember.prototype._set; |
+PropertyMember.prototype._set$5 = PropertyMember.prototype._set; |
+PropertyMember.prototype.provideFieldSyntax$0 = PropertyMember.prototype.provideFieldSyntax; |
+PropertyMember.prototype.providePropertySyntax$0 = PropertyMember.prototype.providePropertySyntax; |
+PropertyMember.prototype.resolve$0 = PropertyMember.prototype.resolve; |
+// ********** Code for ConcreteMember ************** |
+$inherits(ConcreteMember, Member); |
+function ConcreteMember(name, declaringType, baseMember) { |
+ this.baseMember = baseMember; |
+ // Initializers done |
+ Member.call(this, name, declaringType); |
+ this.parameters = []; |
+ this.returnType = this.baseMember.get$returnType().resolveTypeParams(declaringType); |
+ var $$list = this.baseMember.get$parameters(); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var p = $$list.$index($$i); |
+ var newType = p.get$type().resolveTypeParams$1(declaringType); |
+ if ($ne(newType, p.get$type())) { |
+ this.parameters.add(p.copyWithNewType$2(this, newType)); |
+ } |
+ else { |
+ this.parameters.add(p); |
+ } |
+ } |
+} |
+ConcreteMember.prototype.get$returnType = function() { return this.returnType; }; |
+ConcreteMember.prototype.set$returnType = function(value) { return this.returnType = value; }; |
+ConcreteMember.prototype.get$parameters = function() { return this.parameters; }; |
+ConcreteMember.prototype.set$parameters = function(value) { return this.parameters = value; }; |
+ConcreteMember.prototype.get$span = function() { |
+ return this.baseMember.get$span(); |
+} |
+ConcreteMember.prototype.get$isStatic = function() { |
+ return this.baseMember.get$isStatic(); |
+} |
+ConcreteMember.prototype.get$isAbstract = function() { |
+ return this.baseMember.get$isAbstract(); |
+} |
+ConcreteMember.prototype.get$isConst = function() { |
+ return this.baseMember.get$isConst(); |
+} |
+ConcreteMember.prototype.get$isFactory = function() { |
+ return this.baseMember.get$isFactory(); |
+} |
+ConcreteMember.prototype.get$isFinal = function() { |
+ return this.baseMember.get$isFinal(); |
+} |
+ConcreteMember.prototype.get$isNative = function() { |
+ return this.baseMember.get$isNative(); |
+} |
+ConcreteMember.prototype.get$jsname = function() { |
+ return this.baseMember.get$jsname(); |
+} |
+ConcreteMember.prototype.get$canGet = function() { |
+ return this.baseMember.get$canGet(); |
+} |
+ConcreteMember.prototype.get$canSet = function() { |
+ return this.baseMember.get$canSet(); |
+} |
+ConcreteMember.prototype.canInvoke = function(context, args) { |
+ return this.baseMember.canInvoke(context, args); |
+} |
+ConcreteMember.prototype.get$isField = function() { |
+ return this.baseMember.get$isField(); |
+} |
+ConcreteMember.prototype.get$isMethod = function() { |
+ return this.baseMember.get$isMethod(); |
+} |
+ConcreteMember.prototype.get$isProperty = function() { |
+ return this.baseMember.get$isProperty(); |
+} |
+ConcreteMember.prototype.get$prefersPropertySyntax = function() { |
+ return this.baseMember.get$prefersPropertySyntax(); |
+} |
+ConcreteMember.prototype.get$requiresFieldSyntax = function() { |
+ return this.baseMember.get$requiresFieldSyntax(); |
+} |
+ConcreteMember.prototype.provideFieldSyntax = function() { |
+ return this.baseMember.provideFieldSyntax(); |
+} |
+ConcreteMember.prototype.providePropertySyntax = function() { |
+ return this.baseMember.providePropertySyntax(); |
+} |
+ConcreteMember.prototype.get$isConstructor = function() { |
+ return this.name == this.declaringType.name; |
+} |
+ConcreteMember.prototype.get$constructorName = function() { |
+ return this.baseMember.get$constructorName(); |
+} |
+ConcreteMember.prototype.get$definition = function() { |
+ return this.baseMember.get$definition(); |
+} |
+ConcreteMember.prototype.get$initDelegate = function() { |
+ return this.baseMember.get$initDelegate(); |
+} |
+ConcreteMember.prototype.set$initDelegate = function(ctor) { |
+ this.baseMember.set$initDelegate(ctor); |
+} |
+ConcreteMember.prototype.resolveType = function(node, isRequired) { |
+ var type = this.baseMember.resolveType(node, isRequired); |
+ return type.resolveTypeParams$1(this.declaringType); |
+} |
+ConcreteMember.prototype.computeValue = function() { |
+ return this.baseMember.computeValue(); |
+} |
+ConcreteMember.prototype.override = function(other) { |
+ return this.baseMember.override(other); |
+} |
+ConcreteMember.prototype._get = function(context, node, target, isDynamic) { |
+ var ret = this.baseMember._get(context, node, target, isDynamic); |
+ return new Value(this.get$inferredResult(), ret.code, node.span, true); |
+} |
+ConcreteMember.prototype._set = function(context, node, target, value, isDynamic) { |
+ var ret = this.baseMember._set(context, node, target, value, isDynamic); |
+ return new Value(this.returnType, ret.code, node.span, true); |
+} |
+ConcreteMember.prototype.invoke = function(context, node, target, args, isDynamic) { |
+ var ret = this.baseMember.invoke(context, node, target, args, isDynamic); |
+ var code = ret.code; |
+ if (this.get$isConstructor()) { |
+ code = code.replaceFirst$2(this.declaringType.get$genericType().get$jsname(), this.declaringType.get$jsname()); |
+ } |
+ if ((this.baseMember instanceof MethodMember)) { |
+ this.declaringType.genMethod(this); |
+ } |
+ return new Value(this.get$inferredResult(), code, node.span, true); |
+} |
+ConcreteMember.prototype._get$3 = function($0, $1, $2) { |
+ return this._get($0, $1, $2, false); |
+}; |
+ConcreteMember.prototype._get$3$isDynamic = ConcreteMember.prototype._get; |
+ConcreteMember.prototype._get$4 = ConcreteMember.prototype._get; |
+ConcreteMember.prototype._set$4 = function($0, $1, $2, $3) { |
+ return this._set($0, $1, $2, $3, false); |
+}; |
+ConcreteMember.prototype._set$4$isDynamic = ConcreteMember.prototype._set; |
+ConcreteMember.prototype._set$5 = ConcreteMember.prototype._set; |
+ConcreteMember.prototype.canInvoke$2 = ConcreteMember.prototype.canInvoke; |
+ConcreteMember.prototype.computeValue$0 = ConcreteMember.prototype.computeValue; |
+ConcreteMember.prototype.invoke$4 = function($0, $1, $2, $3) { |
+ return this.invoke($0, $1, $2, $3, false); |
+}; |
+ConcreteMember.prototype.invoke$4$isDynamic = ConcreteMember.prototype.invoke; |
+ConcreteMember.prototype.invoke$5 = ConcreteMember.prototype.invoke; |
+ConcreteMember.prototype.provideFieldSyntax$0 = ConcreteMember.prototype.provideFieldSyntax; |
+ConcreteMember.prototype.providePropertySyntax$0 = ConcreteMember.prototype.providePropertySyntax; |
+// ********** Code for MethodMember ************** |
+$inherits(MethodMember, Member); |
+function MethodMember(name, declaringType, definition) { |
+ this.isStatic = false |
+ this.isAbstract = false |
+ this.isConst = false |
+ this.isFactory = false |
+ this.isLambda = false |
+ this._providePropertySyntax = false |
+ this._provideFieldSyntax = false |
+ this._provideOptionalParamInfo = false |
+ this.definition = definition; |
+ // Initializers done |
+ Member.call(this, name, declaringType); |
+} |
+MethodMember.prototype.get$definition = function() { return this.definition; }; |
+MethodMember.prototype.set$definition = function(value) { return this.definition = value; }; |
+MethodMember.prototype.get$returnType = function() { return this.returnType; }; |
+MethodMember.prototype.set$returnType = function(value) { return this.returnType = value; }; |
+MethodMember.prototype.get$parameters = function() { return this.parameters; }; |
+MethodMember.prototype.set$parameters = function(value) { return this.parameters = value; }; |
+MethodMember.prototype.get$typeParameters = function() { return this.typeParameters; }; |
+MethodMember.prototype.set$typeParameters = function(value) { return this.typeParameters = value; }; |
+MethodMember.prototype.get$isStatic = function() { return this.isStatic; }; |
+MethodMember.prototype.set$isStatic = function(value) { return this.isStatic = value; }; |
+MethodMember.prototype.get$isAbstract = function() { return this.isAbstract; }; |
+MethodMember.prototype.set$isAbstract = function(value) { return this.isAbstract = value; }; |
+MethodMember.prototype.get$isConst = function() { return this.isConst; }; |
+MethodMember.prototype.set$isConst = function(value) { return this.isConst = value; }; |
+MethodMember.prototype.get$isFactory = function() { return this.isFactory; }; |
+MethodMember.prototype.set$isFactory = function(value) { return this.isFactory = value; }; |
+MethodMember.prototype.get$isLambda = function() { return this.isLambda; }; |
+MethodMember.prototype.set$isLambda = function(value) { return this.isLambda = value; }; |
+MethodMember.prototype.get$initDelegate = function() { return this.initDelegate; }; |
+MethodMember.prototype.set$initDelegate = function(value) { return this.initDelegate = value; }; |
+MethodMember.prototype.get$isConstructor = function() { |
+ return this.name == this.declaringType.name; |
+} |
+MethodMember.prototype.get$isMethod = function() { |
+ return !this.get$isConstructor(); |
+} |
+MethodMember.prototype.get$isNative = function() { |
+ return this.definition.nativeBody != null; |
+} |
+MethodMember.prototype.get$canGet = function() { |
+ return false; |
+} |
+MethodMember.prototype.get$canSet = function() { |
+ return false; |
+} |
+MethodMember.prototype.get$span = function() { |
+ return this.definition == null ? null : this.definition.span; |
+} |
+MethodMember.prototype.get$constructorName = function() { |
+ var returnType = this.definition.returnType; |
+ if (returnType == null) return ''; |
+ if ((returnType instanceof GenericTypeReference)) { |
+ return ''; |
+ } |
+ if (returnType.get$names() != null) { |
+ return returnType.get$names().$index(0).get$name(); |
+ } |
+ else if (returnType.get$name() != null) { |
+ return returnType.get$name().get$name(); |
+ } |
+ $globals.world.internalError('no valid constructor name', this.definition.span); |
+} |
+MethodMember.prototype.get$functionType = function() { |
+ if (this._functionType == null) { |
+ this._functionType = this.get$library().getOrAddFunctionType(this.declaringType, this.name, this.definition); |
+ if (this.parameters == null) { |
+ this.resolve(); |
+ } |
+ } |
+ return this._functionType; |
+} |
+MethodMember.prototype.override = function(other) { |
+ if (!Member.prototype.override.call(this, other)) return false; |
+ if (other.get$isMethod()) { |
+ return true; |
+ } |
+ else { |
+ $globals.world.error('method can only override methods', this.get$span(), other.get$span()); |
+ return false; |
+ } |
+} |
+MethodMember.prototype.canInvoke = function(context, args) { |
+ var bareCount = args.get$bareCount(); |
+ if (bareCount > this.parameters.length) return false; |
+ if (bareCount == this.parameters.length) { |
+ if (bareCount != args.get$length()) return false; |
+ } |
+ else { |
+ if (!this.parameters.$index(bareCount).get$isOptional()) return false; |
+ for (var i = bareCount; |
+ i < args.get$length(); i++) { |
+ if (this.indexOfParameter(args.getName(i)) < 0) { |
+ return false; |
+ } |
+ } |
+ } |
+ return true; |
+} |
+MethodMember.prototype.indexOfParameter = function(name) { |
+ for (var i = 0; |
+ i < this.parameters.length; i++) { |
+ var p = this.parameters.$index(i); |
+ if (p.get$isOptional() && $eq(p.get$name(), name)) { |
+ return i; |
+ } |
+ } |
+ return -1; |
+} |
+MethodMember.prototype.get$prefersPropertySyntax = function() { |
+ return true; |
+} |
+MethodMember.prototype.get$requiresFieldSyntax = function() { |
+ return false; |
+} |
+MethodMember.prototype.provideFieldSyntax = function() { |
+ this._provideFieldSyntax = true; |
+} |
+MethodMember.prototype.providePropertySyntax = function() { |
+ this._providePropertySyntax = true; |
+} |
+MethodMember.prototype._set = function(context, node, target, value, isDynamic) { |
+ $globals.world.error('cannot set method', node.span); |
+} |
+MethodMember.prototype._get = function(context, node, target, isDynamic) { |
+ this.declaringType.genMethod(this); |
+ this._provideOptionalParamInfo = true; |
+ if (this.isStatic) { |
+ this.declaringType.markUsed(); |
+ var type = this.declaringType.get$isTop() ? '' : ('' + this.declaringType.get$jsname() + '.'); |
+ return new Value(this.get$functionType(), ('' + type + this.get$jsname()), node.span, true); |
+ } |
+ this._providePropertySyntax = true; |
+ return new Value(this.get$functionType(), ('' + target.code + '.get\$' + this.get$jsname() + '()'), node.span, true); |
+} |
+MethodMember.prototype.namesInOrder = function(args) { |
+ if (!args.get$hasNames()) return true; |
+ var lastParameter = null; |
+ for (var i = args.get$bareCount(); |
+ i < this.parameters.length; i++) { |
+ var p = args.getIndexOfName(this.parameters.$index(i).get$name()); |
+ if (p >= 0 && args.values.$index(p).get$needsTemp()) { |
+ if (lastParameter != null && lastParameter > p) { |
+ return false; |
+ } |
+ lastParameter = p; |
+ } |
+ } |
+ return true; |
+} |
+MethodMember.prototype.needsArgumentConversion = function(args) { |
+ var bareCount = args.get$bareCount(); |
+ for (var i = 0; |
+ i < bareCount; i++) { |
+ var arg = args.values.$index(i); |
+ if (arg.needsConversion$1(this.parameters.$index(i).get$type())) { |
+ return true; |
+ } |
+ } |
+ if (bareCount < this.parameters.length) { |
+ this.genParameterValues(); |
+ for (var i = bareCount; |
+ i < this.parameters.length; i++) { |
+ var arg = args.getValue(this.parameters.$index(i).get$name()); |
+ if (arg != null && arg.needsConversion$1(this.parameters.$index(i).get$type())) { |
+ return true; |
+ } |
+ } |
+ } |
+ return false; |
+} |
+MethodMember._argCountMsg = function(actual, expected, atLeast) { |
+ return 'wrong number of positional arguments, expected ' + ('' + (atLeast ? "at least " : "") + expected + ' but found ' + actual); |
+} |
+MethodMember.prototype._argError = function(context, node, target, args, msg, span) { |
+ if (this.isStatic || this.get$isConstructor()) { |
+ $globals.world.error(msg, span); |
+ } |
+ else { |
+ $globals.world.warning(msg, span); |
+ } |
+ return target.invokeNoSuchMethod(context, this.name, node, args); |
+} |
+MethodMember.prototype.genParameterValues = function() { |
+ var $$list = this.parameters; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var p = $$list.$index($$i); |
+ p.genValue$2(this, this.generator); |
+ } |
+} |
+MethodMember.prototype.invoke = function(context, node, target, args, isDynamic) { |
+ if (this.parameters == null) { |
+ $globals.world.info(('surprised to need to resolve: ' + this.declaringType.name + '.' + this.name)); |
+ this.resolve(); |
+ } |
+ this.declaringType.genMethod(this); |
+ if (this.isStatic || this.isFactory) { |
+ this.declaringType.markUsed(); |
+ } |
+ if (this.get$isNative() && this.returnType != null) this.returnType.markUsed(); |
+ if (!this.namesInOrder(args)) { |
+ return context.findMembers(this.name).invokeOnVar(context, node, target, args); |
+ } |
+ var argsCode = []; |
+ if (!target.isType && (this.get$isConstructor() || target.isSuper)) { |
+ argsCode.add$1('this'); |
+ } |
+ var bareCount = args.get$bareCount(); |
+ for (var i = 0; |
+ i < bareCount; i++) { |
+ var arg = args.values.$index(i); |
+ if (i >= this.parameters.length) { |
+ var msg = MethodMember._argCountMsg(args.get$length(), this.parameters.length, false); |
+ return this._argError(context, node, target, args, msg, args.nodes.$index(i).get$span()); |
+ } |
+ arg = arg.convertTo$4(context, this.parameters.$index(i).get$type(), node, isDynamic); |
+ if (this.isConst && arg.get$isConst()) { |
+ argsCode.add$1(arg.get$canonicalCode()); |
+ } |
+ else { |
+ argsCode.add$1(arg.get$code()); |
+ } |
+ } |
+ var namedArgsUsed = 0; |
+ if (bareCount < this.parameters.length) { |
+ this.genParameterValues(); |
+ for (var i = bareCount; |
+ i < this.parameters.length; i++) { |
+ var arg = args.getValue(this.parameters.$index(i).get$name()); |
+ if (arg == null) { |
+ arg = this.parameters.$index(i).get$value(); |
+ } |
+ else { |
+ arg = arg.convertTo$4(context, this.parameters.$index(i).get$type(), node, isDynamic); |
+ namedArgsUsed++; |
+ } |
+ if (arg == null || !this.parameters.$index(i).get$isOptional()) { |
+ var msg = MethodMember._argCountMsg(Math.min(i, args.get$length()), i + 1, true); |
+ return this._argError(context, node, target, args, msg, args.nodes.$index(i).get$span()); |
+ } |
+ else { |
+ argsCode.add$1(this.isConst && arg.get$isConst() ? arg.get$canonicalCode() : arg.get$code()); |
+ } |
+ } |
+ Arguments.removeTrailingNulls(argsCode); |
+ } |
+ if (namedArgsUsed < args.get$nameCount()) { |
+ var seen = new HashSetImplementation(); |
+ for (var i = bareCount; |
+ i < args.get$length(); i++) { |
+ var name = args.getName(i); |
+ if (seen.contains$1(name)) { |
+ return this._argError(context, node, target, args, ('duplicate argument "' + name + '"'), args.nodes.$index(i).get$span()); |
+ } |
+ seen.add$1(name); |
+ var p = this.indexOfParameter(name); |
+ if (p < 0) { |
+ return this._argError(context, node, target, args, ('method does not have optional parameter "' + name + '"'), args.nodes.$index(i).get$span()); |
+ } |
+ else if (p < bareCount) { |
+ return this._argError(context, node, target, args, ('argument "' + name + '" passed as positional and named'), args.nodes.$index(p).get$span()); |
+ } |
+ } |
+ $globals.world.internalError(('wrong named arguments calling ' + this.name), node.span); |
+ } |
+ var argsString = Strings.join(argsCode, ', '); |
+ if (this.get$isConstructor()) { |
+ return this._invokeConstructor(context, node, target, args, argsString); |
+ } |
+ if (target.isSuper) { |
+ return new Value(this.get$inferredResult(), ('' + this.declaringType.get$jsname() + '.prototype.' + this.get$jsname() + '.call(' + argsString + ')'), node.span, true); |
+ } |
+ if (this.get$isOperator()) { |
+ return this._invokeBuiltin(context, node, target, args, argsCode, isDynamic); |
+ } |
+ if (this.isFactory) { |
+ return new Value(target.get$type(), ('' + this.get$generatedFactoryName() + '(' + argsString + ')'), node.span, true); |
+ } |
+ if (this.isStatic) { |
+ if (this.declaringType.get$isTop()) { |
+ return new Value(this.get$inferredResult(), ('' + this.get$jsname() + '(' + argsString + ')'), node != null ? node.span : node, true); |
+ } |
+ return new Value(this.get$inferredResult(), ('' + this.declaringType.get$jsname() + '.' + this.get$jsname() + '(' + argsString + ')'), node.span, true); |
+ } |
+ var code = ('' + target.code + '.' + this.get$jsname() + '(' + argsString + ')'); |
+ if (target.get$isConst()) { |
+ if ((target instanceof GlobalValue)) { |
+ target = target.get$dynamic().get$exp(); |
+ } |
+ if (this.name == 'get:length') { |
+ if ((target instanceof ConstListValue) || (target instanceof ConstMapValue)) { |
+ code = ('' + target.get$dynamic().get$values().length); |
+ } |
+ } |
+ else if (this.name == 'isEmpty') { |
+ if ((target instanceof ConstListValue) || (target instanceof ConstMapValue)) { |
+ code = ('' + target.get$dynamic().get$values().isEmpty$0()); |
+ } |
+ } |
+ } |
+ if (this.name == 'get:typeName' && $eq(this.declaringType.get$library(), $globals.world.get$dom())) { |
+ $globals.world.gen.corejs.ensureTypeNameOf(); |
+ } |
+ return new Value(this.get$inferredResult(), code, node.span, true); |
+} |
+MethodMember.prototype._invokeConstructor = function(context, node, target, args, argsString) { |
+ this.declaringType.markUsed(); |
+ if (!target.isType) { |
+ var code = (this.get$constructorName() != '') ? ('' + this.declaringType.get$jsname() + '.' + this.get$constructorName() + '\$ctor.call(' + argsString + ')') : ('' + this.declaringType.get$jsname() + '.call(' + argsString + ')'); |
+ return new Value(target.get$type(), code, node.span, true); |
+ } |
+ else { |
+ var code = (this.get$constructorName() != '') ? ('new ' + this.declaringType.get$jsname() + '.' + this.get$constructorName() + '\$ctor(' + argsString + ')') : ('new ' + this.declaringType.get$jsname() + '(' + argsString + ')'); |
+ if (this.isConst && (node instanceof NewExpression) && node.get$dynamic().get$isConst()) { |
+ return this._invokeConstConstructor(node, code, target, args); |
+ } |
+ else { |
+ return new Value(target.get$type(), code, node.span, true); |
+ } |
+ } |
+} |
+MethodMember.prototype._invokeConstConstructor = function(node, code, target, args) { |
+ var fields = new HashMapImplementation(); |
+ for (var i = 0; |
+ i < this.parameters.length; i++) { |
+ var param = this.parameters.$index(i); |
+ if (param.get$isInitializer()) { |
+ var value = null; |
+ if (i < args.get$length()) { |
+ value = args.values.$index(i); |
+ } |
+ else { |
+ value = args.getValue(param.get$name()); |
+ if (value == null) { |
+ value = param.get$value(); |
+ } |
+ } |
+ fields.$setindex(param.get$name(), value); |
+ } |
+ } |
+ if (this.definition.initializers != null) { |
+ this.generator._pushBlock(false); |
+ for (var j = 0; |
+ j < this.definition.formals.length; j++) { |
+ var name = this.definition.formals.$index(j).get$name().get$name(); |
+ var value = null; |
+ if (j < args.get$length()) { |
+ value = args.values.$index(j); |
+ } |
+ else { |
+ value = args.getValue(this.parameters.$index(j).get$name()); |
+ if (value == null) { |
+ value = this.parameters.$index(j).get$value(); |
+ } |
+ } |
+ this.generator._scope._vars.$setindex(name, value); |
+ } |
+ var $$list = this.definition.initializers; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var init = $$list.$index($$i); |
+ if ((init instanceof CallExpression)) { |
+ var delegateArgs = this.generator._makeArgs(init.get$arguments()); |
+ var value = this.initDelegate.invoke(this.generator, node, target, delegateArgs, false); |
+ if ((init.get$target() instanceof ThisExpression)) { |
+ return value; |
+ } |
+ else { |
+ if ((value instanceof GlobalValue)) { |
+ value = value.get$exp(); |
+ } |
+ var $list0 = value.get$fields().getKeys$0(); |
+ for (var $i0 = value.get$fields().getKeys$0().iterator$0(); $i0.hasNext$0(); ) { |
+ var fname = $i0.next$0(); |
+ fields.$setindex(fname, value.get$fields().$index(fname)); |
+ } |
+ } |
+ } |
+ else { |
+ var assign = init; |
+ var x = assign.x; |
+ var fname = x.get$name().get$name(); |
+ var val = this.generator.visitValue(assign.y); |
+ if (!val.get$isConst()) { |
+ $globals.world.error('invalid non-const initializer in const constructor', assign.y.span); |
+ } |
+ fields.$setindex(fname, val); |
+ } |
+ } |
+ this.generator._popBlock(); |
+ } |
+ var $$list = this.declaringType.get$members().getValues(); |
+ for (var $$i = this.declaringType.get$members().getValues().iterator$0(); $$i.hasNext$0(); ) { |
+ var f = $$i.next$0(); |
+ if ((f instanceof FieldMember) && !f.get$isStatic() && !fields.containsKey(f.get$name())) { |
+ if (!f.get$isFinal()) { |
+ $globals.world.error(('const class "' + this.declaringType.name + '" has non-final ') + ('field "' + f.get$name() + '"'), f.get$span()); |
+ } |
+ if (f.get$value() != null) { |
+ fields.$setindex(f.get$name(), f.computeValue$0()); |
+ } |
+ } |
+ } |
+ return $globals.world.gen.globalForConst(ConstObjectValue.ConstObjectValue$factory(target.get$type(), fields, code, node.span), args.values); |
+} |
+MethodMember.prototype._invokeBuiltin = function(context, node, target, args, argsCode, isDynamic) { |
+ var allConst = target.get$isConst() && args.values.every((function (arg) { |
+ return arg.get$isConst(); |
+ }) |
+ ); |
+ if (this.declaringType.get$isNum()) { |
+ if (!allConst) { |
+ var code; |
+ if (this.name == ':negate') { |
+ code = ('-' + target.code); |
+ } |
+ else if (this.name == ':bit_not') { |
+ code = ('~' + target.code); |
+ } |
+ else if (this.name == ':truncdiv' || this.name == ':mod') { |
+ $globals.world.gen.corejs.useOperator(this.name); |
+ code = ('' + this.get$jsname() + '(' + target.code + ', ' + argsCode.$index(0) + ')'); |
+ } |
+ else { |
+ var op = TokenKind.rawOperatorFromMethod(this.name); |
+ code = ('' + target.code + ' ' + op + ' ' + argsCode.$index(0)); |
+ } |
+ return new Value(this.get$inferredResult(), code, node.span, true); |
+ } |
+ else { |
+ var value; |
+ var val0, val1, ival0, ival1; |
+ val0 = target.get$dynamic().get$actualValue(); |
+ ival0 = val0.toInt(); |
+ if (args.values.length > 0) { |
+ val1 = args.values.$index(0).get$dynamic().get$actualValue(); |
+ ival1 = val1.toInt(); |
+ } |
+ switch (this.name) { |
+ case ':negate': |
+ |
+ value = -val0; |
+ break; |
+ |
+ case ':add': |
+ |
+ value = val0 + val1; |
+ break; |
+ |
+ case ':sub': |
+ |
+ value = val0 - val1; |
+ break; |
+ |
+ case ':mul': |
+ |
+ value = val0 * val1; |
+ break; |
+ |
+ case ':div': |
+ |
+ value = val0 / val1; |
+ break; |
+ |
+ case ':truncdiv': |
+ |
+ value = $truncdiv(val0, val1); |
+ break; |
+ |
+ case ':mod': |
+ |
+ value = $mod(val0, val1); |
+ break; |
+ |
+ case ':eq': |
+ |
+ value = val0 == val1; |
+ break; |
+ |
+ case ':lt': |
+ |
+ value = val0 < val1; |
+ break; |
+ |
+ case ':gt': |
+ |
+ value = val0 > val1; |
+ break; |
+ |
+ case ':lte': |
+ |
+ value = val0 <= val1; |
+ break; |
+ |
+ case ':gte': |
+ |
+ value = val0 >= val1; |
+ break; |
+ |
+ case ':ne': |
+ |
+ value = val0 != val1; |
+ break; |
+ |
+ case ':bit_not': |
+ |
+ value = (~ival0).toDouble(); |
+ break; |
+ |
+ case ':bit_or': |
+ |
+ value = (ival0 | ival1).toDouble(); |
+ break; |
+ |
+ case ':bit_xor': |
+ |
+ value = (ival0 ^ ival1).toDouble(); |
+ break; |
+ |
+ case ':bit_and': |
+ |
+ value = (ival0 & ival1).toDouble(); |
+ break; |
+ |
+ case ':shl': |
+ |
+ value = (ival0 << ival1).toDouble(); |
+ break; |
+ |
+ case ':sar': |
+ |
+ value = (ival0 >> ival1).toDouble(); |
+ break; |
+ |
+ case ':shr': |
+ |
+ value = (ival0 >>> ival1).toDouble(); |
+ break; |
+ |
+ } |
+ return EvaluatedValue.EvaluatedValue$factory(this.get$inferredResult(), value, ("" + value), node.span); |
+ } |
+ } |
+ else if (this.declaringType.get$isString()) { |
+ if (this.name == ':index') { |
+ return new Value(this.declaringType, ('' + target.code + '[' + argsCode.$index(0) + ']'), node.span, true); |
+ } |
+ else if (this.name == ':add') { |
+ if (allConst) { |
+ var value = this._normConcat(target, args.values.$index(0)); |
+ return EvaluatedValue.EvaluatedValue$factory($globals.world.stringType, value, value, node.span); |
+ } |
+ return new Value(this.declaringType, ('' + target.code + ' + ' + argsCode.$index(0)), node.span, true); |
+ } |
+ } |
+ else if (this.declaringType.get$isNative()) { |
+ if (this.name == ':index') { |
+ return new Value(this.returnType, ('' + target.code + '[' + argsCode.$index(0) + ']'), node.span, true); |
+ } |
+ else if (this.name == ':setindex') { |
+ return new Value(this.returnType, ('' + target.code + '[' + argsCode.$index(0) + '] = ' + argsCode.$index(1)), node.span, true); |
+ } |
+ } |
+ if (this.name == ':eq' || this.name == ':ne') { |
+ var op = this.name == ':eq' ? '==' : '!='; |
+ if (this.name == ':ne') { |
+ target.invoke(context, ':eq', node, args, isDynamic); |
+ } |
+ if (allConst) { |
+ var val0 = target.get$dynamic().get$actualValue(); |
+ var val1 = args.values.$index(0).get$dynamic().get$actualValue(); |
+ var newVal = this.name == ':eq' ? $eq(val0, val1) : $ne(val0, val1); |
+ return EvaluatedValue.EvaluatedValue$factory($globals.world.nonNullBool, newVal, ("" + newVal), node.span); |
+ } |
+ if ($eq(argsCode.$index(0), 'null')) { |
+ return new Value(this.get$inferredResult(), ('' + target.code + ' ' + op + ' null'), node.span, true); |
+ } |
+ else if (target.get$type().get$isNum() || target.get$type().get$isString()) { |
+ return new Value(this.get$inferredResult(), ('' + target.code + ' ' + op + ' ' + argsCode.$index(0)), node.span, true); |
+ } |
+ $globals.world.gen.corejs.useOperator(this.name); |
+ return new Value(this.get$inferredResult(), ('' + this.get$jsname() + '(' + target.code + ', ' + argsCode.$index(0) + ')'), node.span, true); |
+ } |
+ if (this.get$isCallMethod()) { |
+ this.declaringType.markUsed(); |
+ return new Value(this.get$inferredResult(), ('' + target.code + '(' + Strings.join(argsCode, ", ") + ')'), node.span, true); |
+ } |
+ if (this.name == ':index') { |
+ $globals.world.gen.corejs.useIndex = true; |
+ } |
+ else if (this.name == ':setindex') { |
+ $globals.world.gen.corejs.useSetIndex = true; |
+ } |
+ var argsString = Strings.join(argsCode, ', '); |
+ return new Value(this.get$inferredResult(), ('' + target.code + '.' + this.get$jsname() + '(' + argsString + ')'), node.span, true); |
+} |
+MethodMember.prototype._normConcat = function(a, b) { |
+ var val0 = a.get$dynamic().get$actualValue(); |
+ var quote0 = val0.$index(0); |
+ val0 = val0.substring$2(1, val0.length - 1); |
+ var val1 = b.get$dynamic().get$actualValue(); |
+ var quote1 = null; |
+ if (b.get$type().get$isString()) { |
+ quote1 = val1.$index(0); |
+ val1 = val1.substring$2(1, val1.length - 1); |
+ } |
+ var value; |
+ if ($eq(quote0, quote1) || quote1 == null) { |
+ value = ('' + quote0 + val0 + val1 + quote0); |
+ } |
+ else if ($eq(quote0, '"')) { |
+ value = ('' + quote0 + val0 + toDoubleQuote(val1) + quote0); |
+ } |
+ else { |
+ value = ('' + quote1 + toDoubleQuote(val0) + val1 + quote1); |
+ } |
+ return value; |
+} |
+MethodMember.prototype.resolve = function() { |
+ this.isStatic = this.declaringType.get$isTop(); |
+ this.isConst = false; |
+ this.isFactory = false; |
+ this.isAbstract = !this.declaringType.get$isClass(); |
+ if (this.definition.modifiers != null) { |
+ var $$list = this.definition.modifiers; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var mod = $$list.$index($$i); |
+ if ($eq(mod.get$kind(), 86/*TokenKind.STATIC*/)) { |
+ if (this.isStatic) { |
+ $globals.world.error('duplicate static modifier', mod.get$span()); |
+ } |
+ this.isStatic = true; |
+ } |
+ else if (this.get$isConstructor() && $eq(mod.get$kind(), 92/*TokenKind.CONST*/)) { |
+ if (this.isConst) { |
+ $globals.world.error('duplicate const modifier', mod.get$span()); |
+ } |
+ this.isConst = true; |
+ } |
+ else if ($eq(mod.get$kind(), 75/*TokenKind.FACTORY*/)) { |
+ if (this.isFactory) { |
+ $globals.world.error('duplicate factory modifier', mod.get$span()); |
+ } |
+ this.isFactory = true; |
+ } |
+ else if ($eq(mod.get$kind(), 71/*TokenKind.ABSTRACT*/)) { |
+ if (this.isAbstract) { |
+ if (this.declaringType.get$isClass()) { |
+ $globals.world.error('duplicate abstract modifier', mod.get$span()); |
+ } |
+ else { |
+ $globals.world.error('abstract modifier not allowed on interface members', mod.get$span()); |
+ } |
+ } |
+ this.isAbstract = true; |
+ } |
+ else { |
+ $globals.world.error(('' + mod + ' modifier not allowed on method'), mod.get$span()); |
+ } |
+ } |
+ } |
+ if (this.isFactory) { |
+ this.isStatic = true; |
+ } |
+ if (this.definition.typeParameters != null) { |
+ if (!this.isFactory) { |
+ $globals.world.error('Only factories are allowed to have explicit type parameters', this.definition.typeParameters.$index(0).get$span()); |
+ } |
+ else { |
+ this.typeParameters = this.definition.typeParameters; |
+ var $$list = this.definition.typeParameters; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var tp = $$list.$index($$i); |
+ tp.set$enclosingElement(this); |
+ tp.resolve$0(); |
+ } |
+ } |
+ } |
+ if (this.get$isOperator() && this.isStatic && !this.get$isCallMethod()) { |
+ $globals.world.error(('operator method may not be static "' + this.name + '"'), this.get$span()); |
+ } |
+ if (this.isAbstract) { |
+ if (this.definition.body != null && !(this.declaringType.get$definition() instanceof FunctionTypeDefinition)) { |
+ $globals.world.error('abstract method can not have a body', this.get$span()); |
+ } |
+ if (this.isStatic && !(this.declaringType.get$definition() instanceof FunctionTypeDefinition)) { |
+ $globals.world.error('static method can not be abstract', this.get$span()); |
+ } |
+ } |
+ else { |
+ if (this.definition.body == null && !this.get$isConstructor() && !this.get$isNative()) { |
+ $globals.world.error('method needs a body', this.get$span()); |
+ } |
+ } |
+ if (this.get$isConstructor() && !this.isFactory) { |
+ this.returnType = this.declaringType; |
+ } |
+ else { |
+ this.returnType = this.resolveType(this.definition.returnType, false); |
+ } |
+ this.parameters = []; |
+ var $$list = this.definition.formals; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var formal = $$list.$index($$i); |
+ var param = new Parameter(formal, this); |
+ param.resolve$0(); |
+ this.parameters.add(param); |
+ } |
+ if (!this.isLambda) { |
+ this.get$library()._addMember(this); |
+ } |
+} |
+MethodMember.prototype.resolveType = function(node, typeErrors) { |
+ var t = Element.prototype.resolveType.call(this, node, typeErrors); |
+ if (this.isStatic && (t instanceof ParameterType) && (this.typeParameters == null || !this.typeParameters.some((function (p) { |
+ return p === t; |
+ }) |
+ ))) { |
+ $globals.world.error('using type parameter in static context.', node.span); |
+ } |
+ return t; |
+} |
+MethodMember.prototype._get$3 = function($0, $1, $2) { |
+ return this._get($0, $1, $2, false); |
+}; |
+MethodMember.prototype._get$3$isDynamic = MethodMember.prototype._get; |
+MethodMember.prototype._get$4 = MethodMember.prototype._get; |
+MethodMember.prototype._set$4 = function($0, $1, $2, $3) { |
+ return this._set($0, $1, $2, $3, false); |
+}; |
+MethodMember.prototype._set$4$isDynamic = MethodMember.prototype._set; |
+MethodMember.prototype._set$5 = MethodMember.prototype._set; |
+MethodMember.prototype.canInvoke$2 = MethodMember.prototype.canInvoke; |
+MethodMember.prototype.invoke$4 = function($0, $1, $2, $3) { |
+ return this.invoke($0, $1, $2, $3, false); |
+}; |
+MethodMember.prototype.invoke$4$isDynamic = MethodMember.prototype.invoke; |
+MethodMember.prototype.invoke$5 = MethodMember.prototype.invoke; |
+MethodMember.prototype.namesInOrder$1 = MethodMember.prototype.namesInOrder; |
+MethodMember.prototype.provideFieldSyntax$0 = MethodMember.prototype.provideFieldSyntax; |
+MethodMember.prototype.providePropertySyntax$0 = MethodMember.prototype.providePropertySyntax; |
+MethodMember.prototype.resolve$0 = MethodMember.prototype.resolve; |
+// ********** Code for MemberSet ************** |
+function MemberSet(member, isVar) { |
+ this.name = member.name; |
+ this.members = [member]; |
+ this.jsname = member.get$jsname(); |
+ this.isVar = isVar; |
+ // Initializers done |
+} |
+MemberSet.prototype.get$name = function() { return this.name; }; |
+MemberSet.prototype.get$members = function() { return this.members; }; |
+MemberSet.prototype.get$jsname = function() { return this.jsname; }; |
+MemberSet.prototype.get$isVar = function() { return this.isVar; }; |
+MemberSet.prototype.toString = function() { |
+ return ('' + this.name + ':' + this.members.length); |
+} |
+MemberSet.prototype.get$containsMethods = function() { |
+ return this.members.some((function (m) { |
+ return (m instanceof MethodMember); |
+ }) |
+ ); |
+} |
+MemberSet.prototype.add = function(member) { |
+ return this.members.add(member); |
+} |
+MemberSet.prototype.get$isStatic = function() { |
+ return this.members.length == 1 && this.members.$index(0).get$isStatic(); |
+} |
+MemberSet.prototype.get$isOperator = function() { |
+ return this.members.$index(0).get$isOperator(); |
+} |
+MemberSet.prototype.canInvoke = function(context, args) { |
+ return this.members.some((function (m) { |
+ return m.canInvoke$2(context, args); |
+ }) |
+ ); |
+} |
+MemberSet.prototype._makeError = function(node, target, action) { |
+ if (!target.get$type().get$isVar()) { |
+ $globals.world.warning(('could not find applicable ' + action + ' for "' + this.name + '"'), node.span); |
+ } |
+ return new Value($globals.world.varType, ('' + target.code + '.' + this.jsname + '() /*no applicable ' + action + '*/'), node.span, true); |
+} |
+MemberSet.prototype.get$treatAsField = function() { |
+ if (this._treatAsField == null) { |
+ this._treatAsField = !this.isVar; |
+ var $$list = this.members; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var member = $$list.$index($$i); |
+ if (member.get$requiresFieldSyntax()) { |
+ this._treatAsField = true; |
+ break; |
+ } |
+ if (member.get$prefersPropertySyntax()) { |
+ this._treatAsField = false; |
+ } |
+ } |
+ var $$list = this.members; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var member = $$list.$index($$i); |
+ if (this._treatAsField) { |
+ member.provideFieldSyntax$0(); |
+ } |
+ else { |
+ member.providePropertySyntax$0(); |
+ } |
+ } |
+ } |
+ return this._treatAsField; |
+} |
+MemberSet.prototype._get = function(context, node, target, isDynamic) { |
+ var returnValue; |
+ var targets = this.members.filter((function (m) { |
+ return m.get$canGet(); |
+ }) |
+ ); |
+ if (this.isVar) { |
+ targets.forEach$1((function (m) { |
+ return m._get$3$isDynamic(context, node, target, true); |
+ }) |
+ ); |
+ returnValue = new Value(this._foldTypes(targets), null, node.span, true); |
+ } |
+ else { |
+ if (this.members.length == 1) { |
+ return this.members.$index(0)._get$4(context, node, target, isDynamic); |
+ } |
+ else if ($eq(targets.length, 1)) { |
+ return targets.$index(0)._get$4(context, node, target, isDynamic); |
+ } |
+ for (var $$i = targets.iterator$0(); $$i.hasNext$0(); ) { |
+ var member = $$i.next$0(); |
+ var value = member._get$3$isDynamic(context, node, target, true); |
+ returnValue = this._tryUnion(returnValue, value, node); |
+ } |
+ if (returnValue == null) { |
+ return this._makeError(node, target, 'getter'); |
+ } |
+ } |
+ if (returnValue.code == null) { |
+ if (this.get$treatAsField()) { |
+ return new Value(returnValue.get$type(), ('' + target.code + '.' + this.jsname), node.span, true); |
+ } |
+ else { |
+ return new Value(returnValue.get$type(), ('' + target.code + '.get\$' + this.jsname + '()'), node.span, true); |
+ } |
+ } |
+ return returnValue; |
+} |
+MemberSet.prototype._set = function(context, node, target, value, isDynamic) { |
+ var returnValue; |
+ var targets = this.members.filter((function (m) { |
+ return m.get$canSet(); |
+ }) |
+ ); |
+ if (this.isVar) { |
+ targets.forEach$1((function (m) { |
+ return m._set$4$isDynamic(context, node, target, value, true); |
+ }) |
+ ); |
+ returnValue = new Value(this._foldTypes(targets), null, node.span, true); |
+ } |
+ else { |
+ if (this.members.length == 1) { |
+ return this.members.$index(0)._set$5(context, node, target, value, isDynamic); |
+ } |
+ else if ($eq(targets.length, 1)) { |
+ return targets.$index(0)._set$5(context, node, target, value, isDynamic); |
+ } |
+ for (var $$i = targets.iterator$0(); $$i.hasNext$0(); ) { |
+ var member = $$i.next$0(); |
+ var res = member._set$4$isDynamic(context, node, target, value, true); |
+ returnValue = this._tryUnion(returnValue, res, node); |
+ } |
+ if (returnValue == null) { |
+ return this._makeError(node, target, 'setter'); |
+ } |
+ } |
+ if (returnValue.code == null) { |
+ if (this.get$treatAsField()) { |
+ return new Value(returnValue.get$type(), ('' + target.code + '.' + this.jsname + ' = ' + value.code), node.span, true); |
+ } |
+ else { |
+ return new Value(returnValue.get$type(), ('' + target.code + '.set\$' + this.jsname + '(' + value.code + ')'), node.span, true); |
+ } |
+ } |
+ return returnValue; |
+} |
+MemberSet.prototype.invoke = function(context, node, target, args, isDynamic) { |
+ if (this.isVar && !this.get$isOperator()) { |
+ return this.invokeOnVar(context, node, target, args); |
+ } |
+ if (this.members.length == 1) { |
+ return this.members.$index(0).invoke$5(context, node, target, args, isDynamic); |
+ } |
+ var targets = this.members.filter((function (m) { |
+ return m.canInvoke$2(context, args); |
+ }) |
+ ); |
+ if ($eq(targets.length, 1)) { |
+ return targets.$index(0).invoke$5(context, node, target, args, isDynamic); |
+ } |
+ var returnValue = null; |
+ for (var $$i = targets.iterator$0(); $$i.hasNext$0(); ) { |
+ var member = $$i.next$0(); |
+ var res = member.invoke$4$isDynamic(context, node, target, args, true); |
+ returnValue = this._tryUnion(returnValue, res, node); |
+ } |
+ if (returnValue == null) { |
+ return this._makeError(node, target, 'method'); |
+ } |
+ if (returnValue.code == null) { |
+ if (this.name == ':call') { |
+ return target._varCall(context, args); |
+ } |
+ else if (this.get$isOperator()) { |
+ return this.invokeSpecial(target, args, returnValue.get$type()); |
+ } |
+ else { |
+ return this.invokeOnVar(context, node, target, args); |
+ } |
+ } |
+ return returnValue; |
+} |
+MemberSet.prototype.invokeSpecial = function(target, args, returnType) { |
+ var argsString = args.getCode(); |
+ if (this.name == ':index' || this.name == ':setindex') { |
+ return new Value(returnType, ('' + target.code + '.' + this.jsname + '(' + argsString + ')'), target.span, true); |
+ } |
+ else { |
+ if (argsString.length > 0) argsString = (', ' + argsString); |
+ $globals.world.gen.corejs.useOperator(this.name); |
+ return new Value(returnType, ('' + this.jsname + '(' + target.code + argsString + ')'), target.span, true); |
+ } |
+} |
+MemberSet.prototype.invokeOnVar = function(context, node, target, args) { |
+ var member = this.getVarMember(context, node, args); |
+ return member.invoke$4(context, node, target, args); |
+} |
+MemberSet.prototype._tryUnion = function(x, y, node) { |
+ if (x == null) return y; |
+ var type = Type.union(x.get$type(), y.get$type()); |
+ if (x.code == y.code) { |
+ if ($eq(type, x.get$type())) { |
+ return x; |
+ } |
+ else if (x.get$isConst() || y.get$isConst()) { |
+ $globals.world.internalError("unexpected: union of const values "); |
+ } |
+ else { |
+ var ret = new Value(type, x.code, node.span, true); |
+ ret.set$isSuper(x.isSuper && y.isSuper); |
+ ret.set$needsTemp(x.needsTemp || y.needsTemp); |
+ ret.set$isType(x.isType && y.isType); |
+ return ret; |
+ } |
+ } |
+ else { |
+ return new Value(type, null, node.span, true); |
+ } |
+} |
+MemberSet.prototype.getVarMember = function(context, node, args) { |
+ if ($globals.world.objectType.varStubs == null) { |
+ $globals.world.objectType.varStubs = new HashMapImplementation(); |
+ } |
+ var stubName = _getCallStubName(this.name, args); |
+ var stub = $globals.world.objectType.varStubs.$index(stubName); |
+ if (stub == null) { |
+ var mset = context.findMembers(this.name).members; |
+ var targets = mset.filter((function (m) { |
+ return m.canInvoke$2(context, args); |
+ }) |
+ ); |
+ stub = new VarMethodSet(this.name, stubName, targets, args, this._foldTypes(targets)); |
+ $globals.world.objectType.varStubs.$setindex(stubName, stub); |
+ } |
+ return stub; |
+} |
+MemberSet.prototype._foldTypes = function(targets) { |
+ return reduce(map(targets, (function (t) { |
+ return t.get$returnType(); |
+ }) |
+ ), Type.union, $globals.world.varType); |
+} |
+MemberSet.prototype._get$3 = function($0, $1, $2) { |
+ return this._get($0, $1, $2, false); |
+}; |
+MemberSet.prototype._get$3$isDynamic = MemberSet.prototype._get; |
+MemberSet.prototype._get$4 = MemberSet.prototype._get; |
+MemberSet.prototype._set$4 = function($0, $1, $2, $3) { |
+ return this._set($0, $1, $2, $3, false); |
+}; |
+MemberSet.prototype._set$4$isDynamic = MemberSet.prototype._set; |
+MemberSet.prototype._set$5 = MemberSet.prototype._set; |
+MemberSet.prototype.add$1 = MemberSet.prototype.add; |
+MemberSet.prototype.canInvoke$2 = MemberSet.prototype.canInvoke; |
+MemberSet.prototype.invoke$4 = function($0, $1, $2, $3) { |
+ return this.invoke($0, $1, $2, $3, false); |
+}; |
+MemberSet.prototype.invoke$4$isDynamic = MemberSet.prototype.invoke; |
+MemberSet.prototype.invoke$5 = MemberSet.prototype.invoke; |
+MemberSet.prototype.toString$0 = MemberSet.prototype.toString; |
+// ********** Code for FactoryMap ************** |
+function FactoryMap() { |
+ this.factories = new HashMapImplementation(); |
+ // Initializers done |
+} |
+FactoryMap.prototype.getFactoriesFor = function(typeName) { |
+ var ret = this.factories.$index(typeName); |
+ if (ret == null) { |
+ ret = new HashMapImplementation(); |
+ this.factories.$setindex(typeName, ret); |
+ } |
+ return ret; |
+} |
+FactoryMap.prototype.addFactory = function(typeName, name, member) { |
+ this.getFactoriesFor(typeName).$setindex(name, member); |
+} |
+FactoryMap.prototype.getFactory = function(typeName, name) { |
+ return this.getFactoriesFor(typeName).$index(name); |
+} |
+FactoryMap.prototype.forEach = function(f) { |
+ this.factories.forEach((function (_, constructors) { |
+ constructors.forEach((function (_, member) { |
+ f(member); |
+ }) |
+ ); |
+ }) |
+ ); |
+} |
+FactoryMap.prototype.forEach$1 = function($0) { |
+ return this.forEach(to$call$1($0)); |
+}; |
+FactoryMap.prototype.getFactory$2 = FactoryMap.prototype.getFactory; |
+// ********** Code for Token ************** |
+function Token(kind, source, start, end) { |
+ this.kind = kind; |
+ this.source = source; |
+ this.start = start; |
+ this.end = end; |
+ // Initializers done |
+} |
+Token.prototype.get$kind = function() { return this.kind; }; |
+Token.prototype.get$end = function() { return this.end; }; |
+Token.prototype.get$start = function() { return this.start; }; |
+Token.prototype.get$text = function() { |
+ return this.source.get$text().substring(this.start, this.end); |
+} |
+Token.prototype.toString = function() { |
+ var kindText = TokenKind.kindToString(this.kind); |
+ var actualText = this.get$text(); |
+ if ($ne(kindText, actualText)) { |
+ if (actualText.length > 10) { |
+ actualText = actualText.substring$2(0, 8) + '...'; |
+ } |
+ return ('' + kindText + '(' + actualText + ')'); |
+ } |
+ else { |
+ return kindText; |
+ } |
+} |
+Token.prototype.get$span = function() { |
+ return new SourceSpan(this.source, this.start, this.end); |
+} |
+Token.prototype.end$0 = function() { |
+ return this.end(); |
+}; |
+Token.prototype.start$0 = function() { |
+ return this.start(); |
+}; |
+Token.prototype.toString$0 = Token.prototype.toString; |
+// ********** Code for ErrorToken ************** |
+$inherits(ErrorToken, Token); |
+function ErrorToken(kind, source, start, end, message) { |
+ this.message = message; |
+ // Initializers done |
+ Token.call(this, kind, source, start, end); |
+} |
+ErrorToken.prototype.get$message = function() { return this.message; }; |
+ErrorToken.prototype.set$message = function(value) { return this.message = value; }; |
+// ********** Code for SourceFile ************** |
+function SourceFile(filename, _text) { |
+ this.filename = filename; |
+ this._text = _text; |
+ // Initializers done |
+} |
+SourceFile.prototype.get$filename = function() { return this.filename; }; |
+SourceFile.prototype.get$orderInLibrary = function() { return this.orderInLibrary; }; |
+SourceFile.prototype.set$orderInLibrary = function(value) { return this.orderInLibrary = value; }; |
+SourceFile.prototype.get$text = function() { |
+ return this._text; |
+} |
+SourceFile.prototype.get$lineStarts = function() { |
+ if (this._lineStarts == null) { |
+ var starts = [0]; |
+ var index = 0; |
+ while (index < this.get$text().length) { |
+ index = this.get$text().indexOf('\n', index) + 1; |
+ if (index <= 0) break; |
+ starts.add$1(index); |
+ } |
+ starts.add$1(this.get$text().length + 1); |
+ this._lineStarts = starts; |
+ } |
+ return this._lineStarts; |
+} |
+SourceFile.prototype.getLine = function(position) { |
+ var starts = this.get$lineStarts(); |
+ for (var i = 0; |
+ i < starts.length; i++) { |
+ if (starts.$index(i) > position) return i - 1; |
+ } |
+ $globals.world.internalError('bad position'); |
+} |
+SourceFile.prototype.getColumn = function(line, position) { |
+ return position - this.get$lineStarts().$index(line); |
+} |
+SourceFile.prototype.getLocationMessage = function(message, start, end, includeText) { |
+ var line = this.getLine(start); |
+ var column = this.getColumn(line, start); |
+ var buf = new StringBufferImpl(('' + this.filename + ':' + (line + 1) + ':' + (column + 1) + ': ' + message)); |
+ if (includeText) { |
+ buf.add$1('\n'); |
+ var textLine; |
+ if ((line + 2) < this._lineStarts.length) { |
+ textLine = this.get$text().substring(this._lineStarts.$index(line), this._lineStarts.$index(line + 1)); |
+ } |
+ else { |
+ textLine = this.get$text().substring(this._lineStarts.$index(line)) + '\n'; |
+ } |
+ var toColumn = Math.min(column + (end - start), textLine.length); |
+ if ($globals.options.useColors) { |
+ buf.add$1(textLine.substring$2(0, column)); |
+ buf.add$1($globals._RED_COLOR); |
+ buf.add$1(textLine.substring$2(column, toColumn)); |
+ buf.add$1($globals._NO_COLOR); |
+ buf.add$1(textLine.substring$1(toColumn)); |
+ } |
+ else { |
+ buf.add$1(textLine); |
+ } |
+ var i = 0; |
+ for (; i < column; i++) { |
+ buf.add$1(' '); |
+ } |
+ if ($globals.options.useColors) buf.add$1($globals._RED_COLOR); |
+ for (; i < toColumn; i++) { |
+ buf.add$1('^'); |
+ } |
+ if ($globals.options.useColors) buf.add$1($globals._NO_COLOR); |
+ } |
+ return buf.toString$0(); |
+} |
+SourceFile.prototype.compareTo = function(other) { |
+ if (this.orderInLibrary != null && other.orderInLibrary != null) { |
+ return this.orderInLibrary - other.orderInLibrary; |
+ } |
+ else { |
+ return this.filename.compareTo(other.filename); |
+ } |
+} |
+SourceFile.prototype.compareTo$1 = SourceFile.prototype.compareTo; |
+SourceFile.prototype.getColumn$2 = SourceFile.prototype.getColumn; |
+SourceFile.prototype.getLine$1 = SourceFile.prototype.getLine; |
+// ********** Code for SourceSpan ************** |
+function SourceSpan(file, start, end) { |
+ this.file = file; |
+ this.start = start; |
+ this.end = end; |
+ // Initializers done |
+} |
+SourceSpan.prototype.get$file = function() { return this.file; }; |
+SourceSpan.prototype.get$start = function() { return this.start; }; |
+SourceSpan.prototype.get$end = function() { return this.end; }; |
+SourceSpan.prototype.get$text = function() { |
+ return this.file.get$text().substring(this.start, this.end); |
+} |
+SourceSpan.prototype.toMessageString = function(message) { |
+ return this.file.getLocationMessage(message, this.start, this.end, true); |
+} |
+SourceSpan.prototype.get$locationText = function() { |
+ var line = this.file.getLine(this.start); |
+ var column = this.file.getColumn(line, this.start); |
+ return ('' + this.file.filename + ':' + (line + 1) + ':' + (column + 1)); |
+} |
+SourceSpan.prototype.compareTo = function(other) { |
+ if ($eq(this.file, other.file)) { |
+ var d = this.start - other.start; |
+ return d == 0 ? (this.end - other.end) : d; |
+ } |
+ return this.file.compareTo(other.file); |
+} |
+SourceSpan.prototype.compareTo$1 = SourceSpan.prototype.compareTo; |
+SourceSpan.prototype.end$0 = function() { |
+ return this.end(); |
+}; |
+SourceSpan.prototype.start$0 = function() { |
+ return this.start(); |
+}; |
+// ********** Code for InterpStack ************** |
+function InterpStack(previous, quote, isMultiline) { |
+ this.previous = previous; |
+ this.quote = quote; |
+ this.isMultiline = isMultiline; |
+ this.depth = -1; |
+ // Initializers done |
+} |
+InterpStack.prototype.get$previous = function() { return this.previous; }; |
+InterpStack.prototype.set$previous = function(value) { return this.previous = value; }; |
+InterpStack.prototype.get$quote = function() { return this.quote; }; |
+InterpStack.prototype.get$isMultiline = function() { return this.isMultiline; }; |
+InterpStack.prototype.get$depth = function() { return this.depth; }; |
+InterpStack.prototype.set$depth = function(value) { return this.depth = value; }; |
+InterpStack.prototype.pop = function() { |
+ return this.previous; |
+} |
+InterpStack.push = function(stack, quote, isMultiline) { |
+ var newStack = new InterpStack(stack, quote, isMultiline); |
+ if (stack != null) newStack.set$previous(stack); |
+ return newStack; |
+} |
+InterpStack.prototype.next$0 = function() { |
+ return this.next(); |
+}; |
+// ********** Code for TokenizerHelpers ************** |
+function TokenizerHelpers() { |
+ // Initializers done |
+} |
+TokenizerHelpers.isIdentifierStart = function(c) { |
+ return ((c >= 97 && c <= 122) || (c >= 65 && c <= 90) || c == 95); |
+} |
+TokenizerHelpers.isDigit = function(c) { |
+ return (c >= 48 && c <= 57); |
+} |
+TokenizerHelpers.isHexDigit = function(c) { |
+ return (TokenizerHelpers.isDigit(c) || (c >= 97 && c <= 102) || (c >= 65 && c <= 70)); |
+} |
+TokenizerHelpers.isIdentifierPart = function(c) { |
+ return (TokenizerHelpers.isIdentifierStart(c) || TokenizerHelpers.isDigit(c) || c == 36); |
+} |
+TokenizerHelpers.isInterpIdentifierPart = function(c) { |
+ return (TokenizerHelpers.isIdentifierStart(c) || TokenizerHelpers.isDigit(c)); |
+} |
+// ********** Code for TokenizerBase ************** |
+$inherits(TokenizerBase, TokenizerHelpers); |
+function TokenizerBase(_source, _skipWhitespace, index) { |
+ this._source = _source; |
+ this._skipWhitespace = _skipWhitespace; |
+ this._index = index; |
+ // Initializers done |
+ TokenizerHelpers.call(this); |
+ this._text = this._source.get$text(); |
+} |
+TokenizerBase.prototype._nextChar = function() { |
+ if (this._index < this._text.length) { |
+ return this._text.charCodeAt(this._index++); |
+ } |
+ else { |
+ return 0; |
+ } |
+} |
+TokenizerBase.prototype._peekChar = function() { |
+ if (this._index < this._text.length) { |
+ return this._text.charCodeAt(this._index); |
+ } |
+ else { |
+ return 0; |
+ } |
+} |
+TokenizerBase.prototype._maybeEatChar = function(ch) { |
+ if (this._index < this._text.length) { |
+ if (this._text.charCodeAt(this._index) == ch) { |
+ this._index++; |
+ return true; |
+ } |
+ else { |
+ return false; |
+ } |
+ } |
+ else { |
+ return false; |
+ } |
+} |
+TokenizerBase.prototype._finishToken = function(kind) { |
+ return new Token(kind, this._source, this._startIndex, this._index); |
+} |
+TokenizerBase.prototype._errorToken = function(message) { |
+ return new ErrorToken(65/*TokenKind.ERROR*/, this._source, this._startIndex, this._index, message); |
+} |
+TokenizerBase.prototype.finishWhitespace = function() { |
+ this._index--; |
+ while (this._index < this._text.length) { |
+ var ch = this._text.charCodeAt(this._index++); |
+ if (ch == 32 || ch == 9 || ch == 13) { |
+ } |
+ else if (ch == 10) { |
+ if (!this._skipWhitespace) { |
+ return this._finishToken(63/*TokenKind.WHITESPACE*/); |
+ } |
+ } |
+ else { |
+ this._index--; |
+ if (this._skipWhitespace) { |
+ return this.next(); |
+ } |
+ else { |
+ return this._finishToken(63/*TokenKind.WHITESPACE*/); |
+ } |
+ } |
+ } |
+ return this._finishToken(1/*TokenKind.END_OF_FILE*/); |
+} |
+TokenizerBase.prototype.finishHashBang = function() { |
+ while (true) { |
+ var ch = this._nextChar(); |
+ if (ch == 0 || ch == 10 || ch == 13) { |
+ return this._finishToken(13/*TokenKind.HASHBANG*/); |
+ } |
+ } |
+} |
+TokenizerBase.prototype.finishSingleLineComment = function() { |
+ while (true) { |
+ var ch = this._nextChar(); |
+ if (ch == 0 || ch == 10 || ch == 13) { |
+ if (this._skipWhitespace) { |
+ return this.next(); |
+ } |
+ else { |
+ return this._finishToken(64/*TokenKind.COMMENT*/); |
+ } |
+ } |
+ } |
+} |
+TokenizerBase.prototype.finishMultiLineComment = function() { |
+ while (true) { |
+ var ch = this._nextChar(); |
+ if (ch == 0) { |
+ return this._finishToken(67/*TokenKind.INCOMPLETE_COMMENT*/); |
+ } |
+ else if (ch == 42) { |
+ if (this._maybeEatChar(47)) { |
+ if (this._skipWhitespace) { |
+ return this.next(); |
+ } |
+ else { |
+ return this._finishToken(64/*TokenKind.COMMENT*/); |
+ } |
+ } |
+ } |
+ } |
+ return this._errorToken(); |
+} |
+TokenizerBase.prototype.eatDigits = function() { |
+ while (this._index < this._text.length) { |
+ if (TokenizerHelpers.isDigit(this._text.charCodeAt(this._index))) { |
+ this._index++; |
+ } |
+ else { |
+ return; |
+ } |
+ } |
+} |
+TokenizerBase.prototype.eatHexDigits = function() { |
+ while (this._index < this._text.length) { |
+ if (TokenizerHelpers.isHexDigit(this._text.charCodeAt(this._index))) { |
+ this._index++; |
+ } |
+ else { |
+ return; |
+ } |
+ } |
+} |
+TokenizerBase.prototype.maybeEatHexDigit = function() { |
+ if (this._index < this._text.length && TokenizerHelpers.isHexDigit(this._text.charCodeAt(this._index))) { |
+ this._index++; |
+ return true; |
+ } |
+ return false; |
+} |
+TokenizerBase.prototype.finishHex = function() { |
+ this.eatHexDigits(); |
+ return this._finishToken(61/*TokenKind.HEX_INTEGER*/); |
+} |
+TokenizerBase.prototype.finishNumber = function() { |
+ this.eatDigits(); |
+ if (this._peekChar() == 46) { |
+ this._nextChar(); |
+ if (TokenizerHelpers.isDigit(this._peekChar())) { |
+ this.eatDigits(); |
+ return this.finishNumberExtra(62/*TokenKind.DOUBLE*/); |
+ } |
+ else { |
+ this._index--; |
+ } |
+ } |
+ return this.finishNumberExtra(60/*TokenKind.INTEGER*/); |
+} |
+TokenizerBase.prototype.finishNumberExtra = function(kind) { |
+ if (this._maybeEatChar(101) || this._maybeEatChar(69)) { |
+ kind = 62/*TokenKind.DOUBLE*/; |
+ this._maybeEatChar(45); |
+ this._maybeEatChar(43); |
+ this.eatDigits(); |
+ } |
+ if (this._peekChar() != 0 && TokenizerHelpers.isIdentifierStart(this._peekChar())) { |
+ this._nextChar(); |
+ return this._errorToken("illegal character in number"); |
+ } |
+ return this._finishToken(kind); |
+} |
+TokenizerBase.prototype.finishMultilineString = function(quote) { |
+ while (true) { |
+ var ch = this._nextChar(); |
+ if (ch == 0) { |
+ var kind = quote == 34 ? 68/*TokenKind.INCOMPLETE_MULTILINE_STRING_DQ*/ : 69/*TokenKind.INCOMPLETE_MULTILINE_STRING_SQ*/; |
+ return this._finishToken(kind); |
+ } |
+ else if (ch == quote) { |
+ if (this._maybeEatChar(quote)) { |
+ if (this._maybeEatChar(quote)) { |
+ return this._finishToken(58/*TokenKind.STRING*/); |
+ } |
+ } |
+ } |
+ else if (ch == 36) { |
+ this._interpStack = InterpStack.push(this._interpStack, quote, true); |
+ return this._finishToken(66/*TokenKind.INCOMPLETE_STRING*/); |
+ } |
+ else if (ch == 92) { |
+ if (!this.eatEscapeSequence()) { |
+ return this._errorToken("invalid hex escape sequence"); |
+ } |
+ } |
+ } |
+} |
+TokenizerBase.prototype._finishOpenBrace = function() { |
+ var $0; |
+ if (this._interpStack != null) { |
+ if (this._interpStack.depth == -1) { |
+ this._interpStack.depth = 1; |
+ } |
+ else { |
+ ($0 = this._interpStack).depth = $0.depth + 1; |
+ } |
+ } |
+ return this._finishToken(6/*TokenKind.LBRACE*/); |
+} |
+TokenizerBase.prototype._finishCloseBrace = function() { |
+ var $0; |
+ if (this._interpStack != null) { |
+ ($0 = this._interpStack).depth = $0.depth - 1; |
+ } |
+ return this._finishToken(7/*TokenKind.RBRACE*/); |
+} |
+TokenizerBase.prototype.finishString = function(quote) { |
+ if (this._maybeEatChar(quote)) { |
+ if (this._maybeEatChar(quote)) { |
+ return this.finishMultilineString(quote); |
+ } |
+ else { |
+ return this._finishToken(58/*TokenKind.STRING*/); |
+ } |
+ } |
+ return this.finishStringBody(quote); |
+} |
+TokenizerBase.prototype.finishRawString = function(quote) { |
+ if (this._maybeEatChar(quote)) { |
+ if (this._maybeEatChar(quote)) { |
+ return this.finishMultilineRawString(quote); |
+ } |
+ else { |
+ return this._finishToken(58/*TokenKind.STRING*/); |
+ } |
+ } |
+ while (true) { |
+ var ch = this._nextChar(); |
+ if (ch == quote) { |
+ return this._finishToken(58/*TokenKind.STRING*/); |
+ } |
+ else if (ch == 0) { |
+ return this._finishToken(66/*TokenKind.INCOMPLETE_STRING*/); |
+ } |
+ } |
+} |
+TokenizerBase.prototype.finishMultilineRawString = function(quote) { |
+ while (true) { |
+ var ch = this._nextChar(); |
+ if (ch == 0) { |
+ var kind = quote == 34 ? 68/*TokenKind.INCOMPLETE_MULTILINE_STRING_DQ*/ : 69/*TokenKind.INCOMPLETE_MULTILINE_STRING_SQ*/; |
+ return this._finishToken(kind); |
+ } |
+ else if (ch == quote && this._maybeEatChar(quote) && this._maybeEatChar(quote)) { |
+ return this._finishToken(58/*TokenKind.STRING*/); |
+ } |
+ } |
+} |
+TokenizerBase.prototype.finishStringBody = function(quote) { |
+ while (true) { |
+ var ch = this._nextChar(); |
+ if (ch == quote) { |
+ return this._finishToken(58/*TokenKind.STRING*/); |
+ } |
+ else if (ch == 36) { |
+ this._interpStack = InterpStack.push(this._interpStack, quote, false); |
+ return this._finishToken(66/*TokenKind.INCOMPLETE_STRING*/); |
+ } |
+ else if (ch == 0) { |
+ return this._finishToken(66/*TokenKind.INCOMPLETE_STRING*/); |
+ } |
+ else if (ch == 92) { |
+ if (!this.eatEscapeSequence()) { |
+ return this._errorToken("invalid hex escape sequence"); |
+ } |
+ } |
+ } |
+} |
+TokenizerBase.prototype.eatEscapeSequence = function() { |
+ var hex; |
+ switch (this._nextChar()) { |
+ case 120: |
+ |
+ return this.maybeEatHexDigit() && this.maybeEatHexDigit(); |
+ |
+ case 117: |
+ |
+ if (this._maybeEatChar(123)) { |
+ var start = this._index; |
+ this.eatHexDigits(); |
+ var chars = this._index - start; |
+ if (chars > 0 && chars <= 6 && this._maybeEatChar(125)) { |
+ hex = this._text.substring(start, start + chars); |
+ break; |
+ } |
+ else { |
+ return false; |
+ } |
+ } |
+ else { |
+ if (this.maybeEatHexDigit() && this.maybeEatHexDigit() && this.maybeEatHexDigit() && this.maybeEatHexDigit()) { |
+ hex = this._text.substring(this._index - 4, this._index); |
+ break; |
+ } |
+ else { |
+ return false; |
+ } |
+ } |
+ |
+ default: |
+ |
+ return true; |
+ |
+ } |
+ var n = Parser.parseHex(hex); |
+ return n < 0xD800 || n > 0xDFFF && n <= 0x10FFFF; |
+} |
+TokenizerBase.prototype.finishDot = function() { |
+ if (TokenizerHelpers.isDigit(this._peekChar())) { |
+ this.eatDigits(); |
+ return this.finishNumberExtra(62/*TokenKind.DOUBLE*/); |
+ } |
+ else { |
+ return this._finishToken(14/*TokenKind.DOT*/); |
+ } |
+} |
+TokenizerBase.prototype.finishIdentifier = function(ch) { |
+ if (this._interpStack != null && this._interpStack.depth == -1) { |
+ this._interpStack.depth = 0; |
+ if (ch == 36) { |
+ return this._errorToken("illegal character after $ in string interpolation"); |
+ } |
+ while (this._index < this._text.length) { |
+ if (!TokenizerHelpers.isInterpIdentifierPart(this._text.charCodeAt(this._index++))) { |
+ this._index--; |
+ break; |
+ } |
+ } |
+ } |
+ else { |
+ while (this._index < this._text.length) { |
+ if (!TokenizerHelpers.isIdentifierPart(this._text.charCodeAt(this._index++))) { |
+ this._index--; |
+ break; |
+ } |
+ } |
+ } |
+ var kind = this.getIdentifierKind(); |
+ if (kind == 70/*TokenKind.IDENTIFIER*/) { |
+ return this._finishToken(70/*TokenKind.IDENTIFIER*/); |
+ } |
+ else { |
+ return this._finishToken(kind); |
+ } |
+} |
+TokenizerBase.prototype.next$0 = TokenizerBase.prototype.next; |
+// ********** Code for Tokenizer ************** |
+$inherits(Tokenizer, TokenizerBase); |
+function Tokenizer(source, skipWhitespace, index) { |
+ // Initializers done |
+ TokenizerBase.call(this, source, skipWhitespace, index); |
+} |
+Tokenizer.prototype.next = function() { |
+ this._startIndex = this._index; |
+ if (this._interpStack != null && this._interpStack.depth == 0) { |
+ var istack = this._interpStack; |
+ this._interpStack = this._interpStack.pop(); |
+ if (istack.get$isMultiline()) { |
+ return this.finishMultilineString(istack.get$quote()); |
+ } |
+ else { |
+ return this.finishStringBody(istack.get$quote()); |
+ } |
+ } |
+ var ch; |
+ ch = this._nextChar(); |
+ switch (ch) { |
+ case 0: |
+ |
+ return this._finishToken(1/*TokenKind.END_OF_FILE*/); |
+ |
+ case 32: |
+ case 9: |
+ case 10: |
+ case 13: |
+ |
+ return this.finishWhitespace(); |
+ |
+ case 33: |
+ |
+ if (this._maybeEatChar(61)) { |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(51/*TokenKind.NE_STRICT*/); |
+ } |
+ else { |
+ return this._finishToken(49/*TokenKind.NE*/); |
+ } |
+ } |
+ else { |
+ return this._finishToken(19/*TokenKind.NOT*/); |
+ } |
+ |
+ case 34: |
+ |
+ return this.finishString(34); |
+ |
+ case 35: |
+ |
+ if (this._maybeEatChar(33)) { |
+ return this.finishHashBang(); |
+ } |
+ else { |
+ return this._finishToken(12/*TokenKind.HASH*/); |
+ } |
+ |
+ case 36: |
+ |
+ if (this._maybeEatChar(34)) { |
+ return this.finishString(34); |
+ } |
+ else if (this._maybeEatChar(39)) { |
+ return this.finishString(39); |
+ } |
+ else { |
+ return this.finishIdentifier(36); |
+ } |
+ |
+ case 37: |
+ |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(32/*TokenKind.ASSIGN_MOD*/); |
+ } |
+ else { |
+ return this._finishToken(47/*TokenKind.MOD*/); |
+ } |
+ |
+ case 38: |
+ |
+ if (this._maybeEatChar(38)) { |
+ return this._finishToken(35/*TokenKind.AND*/); |
+ } |
+ else if (this._maybeEatChar(61)) { |
+ return this._finishToken(23/*TokenKind.ASSIGN_AND*/); |
+ } |
+ else { |
+ return this._finishToken(38/*TokenKind.BIT_AND*/); |
+ } |
+ |
+ case 39: |
+ |
+ return this.finishString(39); |
+ |
+ case 40: |
+ |
+ return this._finishToken(2/*TokenKind.LPAREN*/); |
+ |
+ case 41: |
+ |
+ return this._finishToken(3/*TokenKind.RPAREN*/); |
+ |
+ case 42: |
+ |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(29/*TokenKind.ASSIGN_MUL*/); |
+ } |
+ else { |
+ return this._finishToken(44/*TokenKind.MUL*/); |
+ } |
+ |
+ case 43: |
+ |
+ if (this._maybeEatChar(43)) { |
+ return this._finishToken(16/*TokenKind.INCR*/); |
+ } |
+ else if (this._maybeEatChar(61)) { |
+ return this._finishToken(27/*TokenKind.ASSIGN_ADD*/); |
+ } |
+ else { |
+ return this._finishToken(42/*TokenKind.ADD*/); |
+ } |
+ |
+ case 44: |
+ |
+ return this._finishToken(11/*TokenKind.COMMA*/); |
+ |
+ case 45: |
+ |
+ if (this._maybeEatChar(45)) { |
+ return this._finishToken(17/*TokenKind.DECR*/); |
+ } |
+ else if (this._maybeEatChar(61)) { |
+ return this._finishToken(28/*TokenKind.ASSIGN_SUB*/); |
+ } |
+ else { |
+ return this._finishToken(43/*TokenKind.SUB*/); |
+ } |
+ |
+ case 46: |
+ |
+ if (this._maybeEatChar(46)) { |
+ if (this._maybeEatChar(46)) { |
+ return this._finishToken(15/*TokenKind.ELLIPSIS*/); |
+ } |
+ else { |
+ return this._errorToken(); |
+ } |
+ } |
+ else { |
+ return this.finishDot(); |
+ } |
+ |
+ case 47: |
+ |
+ if (this._maybeEatChar(42)) { |
+ return this.finishMultiLineComment(); |
+ } |
+ else if (this._maybeEatChar(47)) { |
+ return this.finishSingleLineComment(); |
+ } |
+ else if (this._maybeEatChar(61)) { |
+ return this._finishToken(30/*TokenKind.ASSIGN_DIV*/); |
+ } |
+ else { |
+ return this._finishToken(45/*TokenKind.DIV*/); |
+ } |
+ |
+ case 48: |
+ |
+ if (this._maybeEatChar(88)) { |
+ return this.finishHex(); |
+ } |
+ else if (this._maybeEatChar(120)) { |
+ return this.finishHex(); |
+ } |
+ else { |
+ return this.finishNumber(); |
+ } |
+ |
+ case 58: |
+ |
+ return this._finishToken(8/*TokenKind.COLON*/); |
+ |
+ case 59: |
+ |
+ return this._finishToken(10/*TokenKind.SEMICOLON*/); |
+ |
+ case 60: |
+ |
+ if (this._maybeEatChar(60)) { |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(24/*TokenKind.ASSIGN_SHL*/); |
+ } |
+ else { |
+ return this._finishToken(39/*TokenKind.SHL*/); |
+ } |
+ } |
+ else if (this._maybeEatChar(61)) { |
+ return this._finishToken(54/*TokenKind.LTE*/); |
+ } |
+ else { |
+ return this._finishToken(52/*TokenKind.LT*/); |
+ } |
+ |
+ case 61: |
+ |
+ if (this._maybeEatChar(61)) { |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(50/*TokenKind.EQ_STRICT*/); |
+ } |
+ else { |
+ return this._finishToken(48/*TokenKind.EQ*/); |
+ } |
+ } |
+ else if (this._maybeEatChar(62)) { |
+ return this._finishToken(9/*TokenKind.ARROW*/); |
+ } |
+ else { |
+ return this._finishToken(20/*TokenKind.ASSIGN*/); |
+ } |
+ |
+ case 62: |
+ |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(55/*TokenKind.GTE*/); |
+ } |
+ else if (this._maybeEatChar(62)) { |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(25/*TokenKind.ASSIGN_SAR*/); |
+ } |
+ else if (this._maybeEatChar(62)) { |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(26/*TokenKind.ASSIGN_SHR*/); |
+ } |
+ else { |
+ return this._finishToken(41/*TokenKind.SHR*/); |
+ } |
+ } |
+ else { |
+ return this._finishToken(40/*TokenKind.SAR*/); |
+ } |
+ } |
+ else { |
+ return this._finishToken(53/*TokenKind.GT*/); |
+ } |
+ |
+ case 63: |
+ |
+ return this._finishToken(33/*TokenKind.CONDITIONAL*/); |
+ |
+ case 64: |
+ |
+ if (this._maybeEatChar(34)) { |
+ return this.finishRawString(34); |
+ } |
+ else if (this._maybeEatChar(39)) { |
+ return this.finishRawString(39); |
+ } |
+ else { |
+ return this._errorToken(); |
+ } |
+ |
+ case 91: |
+ |
+ if (this._maybeEatChar(93)) { |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(57/*TokenKind.SETINDEX*/); |
+ } |
+ else { |
+ return this._finishToken(56/*TokenKind.INDEX*/); |
+ } |
+ } |
+ else { |
+ return this._finishToken(4/*TokenKind.LBRACK*/); |
+ } |
+ |
+ case 93: |
+ |
+ return this._finishToken(5/*TokenKind.RBRACK*/); |
+ |
+ case 94: |
+ |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(22/*TokenKind.ASSIGN_XOR*/); |
+ } |
+ else { |
+ return this._finishToken(37/*TokenKind.BIT_XOR*/); |
+ } |
+ |
+ case 123: |
+ |
+ return this._finishOpenBrace(); |
+ |
+ case 124: |
+ |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(21/*TokenKind.ASSIGN_OR*/); |
+ } |
+ else if (this._maybeEatChar(124)) { |
+ return this._finishToken(34/*TokenKind.OR*/); |
+ } |
+ else { |
+ return this._finishToken(36/*TokenKind.BIT_OR*/); |
+ } |
+ |
+ case 125: |
+ |
+ return this._finishCloseBrace(); |
+ |
+ case 126: |
+ |
+ if (this._maybeEatChar(47)) { |
+ if (this._maybeEatChar(61)) { |
+ return this._finishToken(31/*TokenKind.ASSIGN_TRUNCDIV*/); |
+ } |
+ else { |
+ return this._finishToken(46/*TokenKind.TRUNCDIV*/); |
+ } |
+ } |
+ else { |
+ return this._finishToken(18/*TokenKind.BIT_NOT*/); |
+ } |
+ |
+ default: |
+ |
+ if (TokenizerHelpers.isIdentifierStart(ch)) { |
+ return this.finishIdentifier(ch); |
+ } |
+ else if (TokenizerHelpers.isDigit(ch)) { |
+ return this.finishNumber(); |
+ } |
+ else { |
+ return this._errorToken(); |
+ } |
+ |
+ } |
+} |
+Tokenizer.prototype.getIdentifierKind = function() { |
+ var i0 = this._startIndex; |
+ switch (this._index - i0) { |
+ case 2: |
+ |
+ if (this._text.charCodeAt(i0) == 100) { |
+ if (this._text.charCodeAt(i0 + 1) == 111) return 95/*TokenKind.DO*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 105) { |
+ if (this._text.charCodeAt(i0 + 1) == 102) { |
+ return 101/*TokenKind.IF*/; |
+ } |
+ else if (this._text.charCodeAt(i0 + 1) == 110) { |
+ return 102/*TokenKind.IN*/; |
+ } |
+ else if (this._text.charCodeAt(i0 + 1) == 115) { |
+ return 103/*TokenKind.IS*/; |
+ } |
+ } |
+ return 70/*TokenKind.IDENTIFIER*/; |
+ |
+ case 3: |
+ |
+ if (this._text.charCodeAt(i0) == 102) { |
+ if (this._text.charCodeAt(i0 + 1) == 111 && this._text.charCodeAt(i0 + 2) == 114) return 100/*TokenKind.FOR*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 103) { |
+ if (this._text.charCodeAt(i0 + 1) == 101 && this._text.charCodeAt(i0 + 2) == 116) return 76/*TokenKind.GET*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 110) { |
+ if (this._text.charCodeAt(i0 + 1) == 101 && this._text.charCodeAt(i0 + 2) == 119) return 104/*TokenKind.NEW*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 115) { |
+ if (this._text.charCodeAt(i0 + 1) == 101 && this._text.charCodeAt(i0 + 2) == 116) return 84/*TokenKind.SET*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 116) { |
+ if (this._text.charCodeAt(i0 + 1) == 114 && this._text.charCodeAt(i0 + 2) == 121) return 112/*TokenKind.TRY*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 118) { |
+ if (this._text.charCodeAt(i0 + 1) == 97 && this._text.charCodeAt(i0 + 2) == 114) return 113/*TokenKind.VAR*/; |
+ } |
+ return 70/*TokenKind.IDENTIFIER*/; |
+ |
+ case 4: |
+ |
+ if (this._text.charCodeAt(i0) == 99) { |
+ if (this._text.charCodeAt(i0 + 1) == 97 && this._text.charCodeAt(i0 + 2) == 115 && this._text.charCodeAt(i0 + 3) == 101) return 90/*TokenKind.CASE*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 101) { |
+ if (this._text.charCodeAt(i0 + 1) == 108 && this._text.charCodeAt(i0 + 2) == 115 && this._text.charCodeAt(i0 + 3) == 101) return 96/*TokenKind.ELSE*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 110) { |
+ if (this._text.charCodeAt(i0 + 1) == 117 && this._text.charCodeAt(i0 + 2) == 108 && this._text.charCodeAt(i0 + 3) == 108) return 105/*TokenKind.NULL*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 116) { |
+ if (this._text.charCodeAt(i0 + 1) == 104) { |
+ if (this._text.charCodeAt(i0 + 2) == 105 && this._text.charCodeAt(i0 + 3) == 115) return 109/*TokenKind.THIS*/; |
+ } |
+ else if (this._text.charCodeAt(i0 + 1) == 114) { |
+ if (this._text.charCodeAt(i0 + 2) == 117 && this._text.charCodeAt(i0 + 3) == 101) return 111/*TokenKind.TRUE*/; |
+ } |
+ } |
+ else if (this._text.charCodeAt(i0) == 118) { |
+ if (this._text.charCodeAt(i0 + 1) == 111 && this._text.charCodeAt(i0 + 2) == 105 && this._text.charCodeAt(i0 + 3) == 100) return 114/*TokenKind.VOID*/; |
+ } |
+ return 70/*TokenKind.IDENTIFIER*/; |
+ |
+ case 5: |
+ |
+ if (this._text.charCodeAt(i0) == 97) { |
+ if (this._text.charCodeAt(i0 + 1) == 119 && this._text.charCodeAt(i0 + 2) == 97 && this._text.charCodeAt(i0 + 3) == 105 && this._text.charCodeAt(i0 + 4) == 116) return 88/*TokenKind.AWAIT*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 98) { |
+ if (this._text.charCodeAt(i0 + 1) == 114 && this._text.charCodeAt(i0 + 2) == 101 && this._text.charCodeAt(i0 + 3) == 97 && this._text.charCodeAt(i0 + 4) == 107) return 89/*TokenKind.BREAK*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 99) { |
+ if (this._text.charCodeAt(i0 + 1) == 97) { |
+ if (this._text.charCodeAt(i0 + 2) == 116 && this._text.charCodeAt(i0 + 3) == 99 && this._text.charCodeAt(i0 + 4) == 104) return 91/*TokenKind.CATCH*/; |
+ } |
+ else if (this._text.charCodeAt(i0 + 1) == 108) { |
+ if (this._text.charCodeAt(i0 + 2) == 97 && this._text.charCodeAt(i0 + 3) == 115 && this._text.charCodeAt(i0 + 4) == 115) return 73/*TokenKind.CLASS*/; |
+ } |
+ else if (this._text.charCodeAt(i0 + 1) == 111) { |
+ if (this._text.charCodeAt(i0 + 2) == 110 && this._text.charCodeAt(i0 + 3) == 115 && this._text.charCodeAt(i0 + 4) == 116) return 92/*TokenKind.CONST*/; |
+ } |
+ } |
+ else if (this._text.charCodeAt(i0) == 102) { |
+ if (this._text.charCodeAt(i0 + 1) == 97) { |
+ if (this._text.charCodeAt(i0 + 2) == 108 && this._text.charCodeAt(i0 + 3) == 115 && this._text.charCodeAt(i0 + 4) == 101) return 97/*TokenKind.FALSE*/; |
+ } |
+ else if (this._text.charCodeAt(i0 + 1) == 105) { |
+ if (this._text.charCodeAt(i0 + 2) == 110 && this._text.charCodeAt(i0 + 3) == 97 && this._text.charCodeAt(i0 + 4) == 108) return 98/*TokenKind.FINAL*/; |
+ } |
+ } |
+ else if (this._text.charCodeAt(i0) == 115) { |
+ if (this._text.charCodeAt(i0 + 1) == 117 && this._text.charCodeAt(i0 + 2) == 112 && this._text.charCodeAt(i0 + 3) == 101 && this._text.charCodeAt(i0 + 4) == 114) return 107/*TokenKind.SUPER*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 116) { |
+ if (this._text.charCodeAt(i0 + 1) == 104 && this._text.charCodeAt(i0 + 2) == 114 && this._text.charCodeAt(i0 + 3) == 111 && this._text.charCodeAt(i0 + 4) == 119) return 110/*TokenKind.THROW*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 119) { |
+ if (this._text.charCodeAt(i0 + 1) == 104 && this._text.charCodeAt(i0 + 2) == 105 && this._text.charCodeAt(i0 + 3) == 108 && this._text.charCodeAt(i0 + 4) == 101) return 115/*TokenKind.WHILE*/; |
+ } |
+ return 70/*TokenKind.IDENTIFIER*/; |
+ |
+ case 6: |
+ |
+ if (this._text.charCodeAt(i0) == 97) { |
+ if (this._text.charCodeAt(i0 + 1) == 115 && this._text.charCodeAt(i0 + 2) == 115 && this._text.charCodeAt(i0 + 3) == 101 && this._text.charCodeAt(i0 + 4) == 114 && this._text.charCodeAt(i0 + 5) == 116) return 72/*TokenKind.ASSERT*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 105) { |
+ if (this._text.charCodeAt(i0 + 1) == 109 && this._text.charCodeAt(i0 + 2) == 112 && this._text.charCodeAt(i0 + 3) == 111 && this._text.charCodeAt(i0 + 4) == 114 && this._text.charCodeAt(i0 + 5) == 116) return 78/*TokenKind.IMPORT*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 110) { |
+ if (this._text.charCodeAt(i0 + 1) == 97) { |
+ if (this._text.charCodeAt(i0 + 2) == 116 && this._text.charCodeAt(i0 + 3) == 105 && this._text.charCodeAt(i0 + 4) == 118 && this._text.charCodeAt(i0 + 5) == 101) return 81/*TokenKind.NATIVE*/; |
+ } |
+ else if (this._text.charCodeAt(i0 + 1) == 101) { |
+ if (this._text.charCodeAt(i0 + 2) == 103 && this._text.charCodeAt(i0 + 3) == 97 && this._text.charCodeAt(i0 + 4) == 116 && this._text.charCodeAt(i0 + 5) == 101) return 82/*TokenKind.NEGATE*/; |
+ } |
+ } |
+ else if (this._text.charCodeAt(i0) == 114) { |
+ if (this._text.charCodeAt(i0 + 1) == 101 && this._text.charCodeAt(i0 + 2) == 116 && this._text.charCodeAt(i0 + 3) == 117 && this._text.charCodeAt(i0 + 4) == 114 && this._text.charCodeAt(i0 + 5) == 110) return 106/*TokenKind.RETURN*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 115) { |
+ if (this._text.charCodeAt(i0 + 1) == 111) { |
+ if (this._text.charCodeAt(i0 + 2) == 117 && this._text.charCodeAt(i0 + 3) == 114 && this._text.charCodeAt(i0 + 4) == 99 && this._text.charCodeAt(i0 + 5) == 101) return 85/*TokenKind.SOURCE*/; |
+ } |
+ else if (this._text.charCodeAt(i0 + 1) == 116) { |
+ if (this._text.charCodeAt(i0 + 2) == 97 && this._text.charCodeAt(i0 + 3) == 116 && this._text.charCodeAt(i0 + 4) == 105 && this._text.charCodeAt(i0 + 5) == 99) return 86/*TokenKind.STATIC*/; |
+ } |
+ else if (this._text.charCodeAt(i0 + 1) == 119) { |
+ if (this._text.charCodeAt(i0 + 2) == 105 && this._text.charCodeAt(i0 + 3) == 116 && this._text.charCodeAt(i0 + 4) == 99 && this._text.charCodeAt(i0 + 5) == 104) return 108/*TokenKind.SWITCH*/; |
+ } |
+ } |
+ return 70/*TokenKind.IDENTIFIER*/; |
+ |
+ case 7: |
+ |
+ if (this._text.charCodeAt(i0) == 100) { |
+ if (this._text.charCodeAt(i0 + 1) == 101 && this._text.charCodeAt(i0 + 2) == 102 && this._text.charCodeAt(i0 + 3) == 97 && this._text.charCodeAt(i0 + 4) == 117 && this._text.charCodeAt(i0 + 5) == 108 && this._text.charCodeAt(i0 + 6) == 116) return 94/*TokenKind.DEFAULT*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 101) { |
+ if (this._text.charCodeAt(i0 + 1) == 120 && this._text.charCodeAt(i0 + 2) == 116 && this._text.charCodeAt(i0 + 3) == 101 && this._text.charCodeAt(i0 + 4) == 110 && this._text.charCodeAt(i0 + 5) == 100 && this._text.charCodeAt(i0 + 6) == 115) return 74/*TokenKind.EXTENDS*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 102) { |
+ if (this._text.charCodeAt(i0 + 1) == 97) { |
+ if (this._text.charCodeAt(i0 + 2) == 99 && this._text.charCodeAt(i0 + 3) == 116 && this._text.charCodeAt(i0 + 4) == 111 && this._text.charCodeAt(i0 + 5) == 114 && this._text.charCodeAt(i0 + 6) == 121) return 75/*TokenKind.FACTORY*/; |
+ } |
+ else if (this._text.charCodeAt(i0 + 1) == 105) { |
+ if (this._text.charCodeAt(i0 + 2) == 110 && this._text.charCodeAt(i0 + 3) == 97 && this._text.charCodeAt(i0 + 4) == 108 && this._text.charCodeAt(i0 + 5) == 108 && this._text.charCodeAt(i0 + 6) == 121) return 99/*TokenKind.FINALLY*/; |
+ } |
+ } |
+ else if (this._text.charCodeAt(i0) == 108) { |
+ if (this._text.charCodeAt(i0 + 1) == 105 && this._text.charCodeAt(i0 + 2) == 98 && this._text.charCodeAt(i0 + 3) == 114 && this._text.charCodeAt(i0 + 4) == 97 && this._text.charCodeAt(i0 + 5) == 114 && this._text.charCodeAt(i0 + 6) == 121) return 80/*TokenKind.LIBRARY*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 116) { |
+ if (this._text.charCodeAt(i0 + 1) == 121 && this._text.charCodeAt(i0 + 2) == 112 && this._text.charCodeAt(i0 + 3) == 101 && this._text.charCodeAt(i0 + 4) == 100 && this._text.charCodeAt(i0 + 5) == 101 && this._text.charCodeAt(i0 + 6) == 102) return 87/*TokenKind.TYPEDEF*/; |
+ } |
+ return 70/*TokenKind.IDENTIFIER*/; |
+ |
+ case 8: |
+ |
+ if (this._text.charCodeAt(i0) == 97) { |
+ if (this._text.charCodeAt(i0 + 1) == 98 && this._text.charCodeAt(i0 + 2) == 115 && this._text.charCodeAt(i0 + 3) == 116 && this._text.charCodeAt(i0 + 4) == 114 && this._text.charCodeAt(i0 + 5) == 97 && this._text.charCodeAt(i0 + 6) == 99 && this._text.charCodeAt(i0 + 7) == 116) return 71/*TokenKind.ABSTRACT*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 99) { |
+ if (this._text.charCodeAt(i0 + 1) == 111 && this._text.charCodeAt(i0 + 2) == 110 && this._text.charCodeAt(i0 + 3) == 116 && this._text.charCodeAt(i0 + 4) == 105 && this._text.charCodeAt(i0 + 5) == 110 && this._text.charCodeAt(i0 + 6) == 117 && this._text.charCodeAt(i0 + 7) == 101) return 93/*TokenKind.CONTINUE*/; |
+ } |
+ else if (this._text.charCodeAt(i0) == 111) { |
+ if (this._text.charCodeAt(i0 + 1) == 112 && this._text.charCodeAt(i0 + 2) == 101 && this._text.charCodeAt(i0 + 3) == 114 && this._text.charCodeAt(i0 + 4) == 97 && this._text.charCodeAt(i0 + 5) == 116 && this._text.charCodeAt(i0 + 6) == 111 && this._text.charCodeAt(i0 + 7) == 114) return 83/*TokenKind.OPERATOR*/; |
+ } |
+ return 70/*TokenKind.IDENTIFIER*/; |
+ |
+ case 9: |
+ |
+ if (this._text.charCodeAt(i0) == 105 && this._text.charCodeAt(i0 + 1) == 110 && this._text.charCodeAt(i0 + 2) == 116 && this._text.charCodeAt(i0 + 3) == 101 && this._text.charCodeAt(i0 + 4) == 114 && this._text.charCodeAt(i0 + 5) == 102 && this._text.charCodeAt(i0 + 6) == 97 && this._text.charCodeAt(i0 + 7) == 99 && this._text.charCodeAt(i0 + 8) == 101) return 79/*TokenKind.INTERFACE*/; |
+ return 70/*TokenKind.IDENTIFIER*/; |
+ |
+ case 10: |
+ |
+ if (this._text.charCodeAt(i0) == 105 && this._text.charCodeAt(i0 + 1) == 109 && this._text.charCodeAt(i0 + 2) == 112 && this._text.charCodeAt(i0 + 3) == 108 && this._text.charCodeAt(i0 + 4) == 101 && this._text.charCodeAt(i0 + 5) == 109 && this._text.charCodeAt(i0 + 6) == 101 && this._text.charCodeAt(i0 + 7) == 110 && this._text.charCodeAt(i0 + 8) == 116 && this._text.charCodeAt(i0 + 9) == 115) return 77/*TokenKind.IMPLEMENTS*/; |
+ return 70/*TokenKind.IDENTIFIER*/; |
+ |
+ default: |
+ |
+ return 70/*TokenKind.IDENTIFIER*/; |
+ |
+ } |
+} |
+Tokenizer.prototype.next$0 = Tokenizer.prototype.next; |
+// ********** Code for TokenKind ************** |
+function TokenKind() {} |
+TokenKind.kindToString = function(kind) { |
+ switch (kind) { |
+ case 1/*TokenKind.END_OF_FILE*/: |
+ |
+ return "end of file"; |
+ |
+ case 2/*TokenKind.LPAREN*/: |
+ |
+ return "("; |
+ |
+ case 3/*TokenKind.RPAREN*/: |
+ |
+ return ")"; |
+ |
+ case 4/*TokenKind.LBRACK*/: |
+ |
+ return "["; |
+ |
+ case 5/*TokenKind.RBRACK*/: |
+ |
+ return "]"; |
+ |
+ case 6/*TokenKind.LBRACE*/: |
+ |
+ return "{"; |
+ |
+ case 7/*TokenKind.RBRACE*/: |
+ |
+ return "}"; |
+ |
+ case 8/*TokenKind.COLON*/: |
+ |
+ return ":"; |
+ |
+ case 9/*TokenKind.ARROW*/: |
+ |
+ return "=>"; |
+ |
+ case 10/*TokenKind.SEMICOLON*/: |
+ |
+ return ";"; |
+ |
+ case 11/*TokenKind.COMMA*/: |
+ |
+ return ","; |
+ |
+ case 12/*TokenKind.HASH*/: |
+ |
+ return "#"; |
+ |
+ case 13/*TokenKind.HASHBANG*/: |
+ |
+ return "#!"; |
+ |
+ case 14/*TokenKind.DOT*/: |
+ |
+ return "."; |
+ |
+ case 15/*TokenKind.ELLIPSIS*/: |
+ |
+ return "..."; |
+ |
+ case 16/*TokenKind.INCR*/: |
+ |
+ return "++"; |
+ |
+ case 17/*TokenKind.DECR*/: |
+ |
+ return "--"; |
+ |
+ case 18/*TokenKind.BIT_NOT*/: |
+ |
+ return "~"; |
+ |
+ case 19/*TokenKind.NOT*/: |
+ |
+ return "!"; |
+ |
+ case 20/*TokenKind.ASSIGN*/: |
+ |
+ return "="; |
+ |
+ case 21/*TokenKind.ASSIGN_OR*/: |
+ |
+ return "|="; |
+ |
+ case 22/*TokenKind.ASSIGN_XOR*/: |
+ |
+ return "^="; |
+ |
+ case 23/*TokenKind.ASSIGN_AND*/: |
+ |
+ return "&="; |
+ |
+ case 24/*TokenKind.ASSIGN_SHL*/: |
+ |
+ return "<<="; |
+ |
+ case 25/*TokenKind.ASSIGN_SAR*/: |
+ |
+ return ">>="; |
+ |
+ case 26/*TokenKind.ASSIGN_SHR*/: |
+ |
+ return ">>>="; |
+ |
+ case 27/*TokenKind.ASSIGN_ADD*/: |
+ |
+ return "+="; |
+ |
+ case 28/*TokenKind.ASSIGN_SUB*/: |
+ |
+ return "-="; |
+ |
+ case 29/*TokenKind.ASSIGN_MUL*/: |
+ |
+ return "*="; |
+ |
+ case 30/*TokenKind.ASSIGN_DIV*/: |
+ |
+ return "/="; |
+ |
+ case 31/*TokenKind.ASSIGN_TRUNCDIV*/: |
+ |
+ return "~/="; |
+ |
+ case 32/*TokenKind.ASSIGN_MOD*/: |
+ |
+ return "%="; |
+ |
+ case 33/*TokenKind.CONDITIONAL*/: |
+ |
+ return "?"; |
+ |
+ case 34/*TokenKind.OR*/: |
+ |
+ return "||"; |
+ |
+ case 35/*TokenKind.AND*/: |
+ |
+ return "&&"; |
+ |
+ case 36/*TokenKind.BIT_OR*/: |
+ |
+ return "|"; |
+ |
+ case 37/*TokenKind.BIT_XOR*/: |
+ |
+ return "^"; |
+ |
+ case 38/*TokenKind.BIT_AND*/: |
+ |
+ return "&"; |
+ |
+ case 39/*TokenKind.SHL*/: |
+ |
+ return "<<"; |
+ |
+ case 40/*TokenKind.SAR*/: |
+ |
+ return ">>"; |
+ |
+ case 41/*TokenKind.SHR*/: |
+ |
+ return ">>>"; |
+ |
+ case 42/*TokenKind.ADD*/: |
+ |
+ return "+"; |
+ |
+ case 43/*TokenKind.SUB*/: |
+ |
+ return "-"; |
+ |
+ case 44/*TokenKind.MUL*/: |
+ |
+ return "*"; |
+ |
+ case 45/*TokenKind.DIV*/: |
+ |
+ return "/"; |
+ |
+ case 46/*TokenKind.TRUNCDIV*/: |
+ |
+ return "~/"; |
+ |
+ case 47/*TokenKind.MOD*/: |
+ |
+ return "%"; |
+ |
+ case 48/*TokenKind.EQ*/: |
+ |
+ return "=="; |
+ |
+ case 49/*TokenKind.NE*/: |
+ |
+ return "!="; |
+ |
+ case 50/*TokenKind.EQ_STRICT*/: |
+ |
+ return "==="; |
+ |
+ case 51/*TokenKind.NE_STRICT*/: |
+ |
+ return "!=="; |
+ |
+ case 52/*TokenKind.LT*/: |
+ |
+ return "<"; |
+ |
+ case 53/*TokenKind.GT*/: |
+ |
+ return ">"; |
+ |
+ case 54/*TokenKind.LTE*/: |
+ |
+ return "<="; |
+ |
+ case 55/*TokenKind.GTE*/: |
+ |
+ return ">="; |
+ |
+ case 56/*TokenKind.INDEX*/: |
+ |
+ return "[]"; |
+ |
+ case 57/*TokenKind.SETINDEX*/: |
+ |
+ return "[]="; |
+ |
+ case 58/*TokenKind.STRING*/: |
+ |
+ return "string"; |
+ |
+ case 59/*TokenKind.STRING_PART*/: |
+ |
+ return "string part"; |
+ |
+ case 60/*TokenKind.INTEGER*/: |
+ |
+ return "integer"; |
+ |
+ case 61/*TokenKind.HEX_INTEGER*/: |
+ |
+ return "hex integer"; |
+ |
+ case 62/*TokenKind.DOUBLE*/: |
+ |
+ return "double"; |
+ |
+ case 63/*TokenKind.WHITESPACE*/: |
+ |
+ return "whitespace"; |
+ |
+ case 64/*TokenKind.COMMENT*/: |
+ |
+ return "comment"; |
+ |
+ case 65/*TokenKind.ERROR*/: |
+ |
+ return "error"; |
+ |
+ case 66/*TokenKind.INCOMPLETE_STRING*/: |
+ |
+ return "incomplete string"; |
+ |
+ case 67/*TokenKind.INCOMPLETE_COMMENT*/: |
+ |
+ return "incomplete comment"; |
+ |
+ case 68/*TokenKind.INCOMPLETE_MULTILINE_STRING_DQ*/: |
+ |
+ return "incomplete multiline string dq"; |
+ |
+ case 69/*TokenKind.INCOMPLETE_MULTILINE_STRING_SQ*/: |
+ |
+ return "incomplete multiline string sq"; |
+ |
+ case 70/*TokenKind.IDENTIFIER*/: |
+ |
+ return "identifier"; |
+ |
+ case 71/*TokenKind.ABSTRACT*/: |
+ |
+ return "pseudo-keyword 'abstract'"; |
+ |
+ case 72/*TokenKind.ASSERT*/: |
+ |
+ return "pseudo-keyword 'assert'"; |
+ |
+ case 73/*TokenKind.CLASS*/: |
+ |
+ return "pseudo-keyword 'class'"; |
+ |
+ case 74/*TokenKind.EXTENDS*/: |
+ |
+ return "pseudo-keyword 'extends'"; |
+ |
+ case 75/*TokenKind.FACTORY*/: |
+ |
+ return "pseudo-keyword 'factory'"; |
+ |
+ case 76/*TokenKind.GET*/: |
+ |
+ return "pseudo-keyword 'get'"; |
+ |
+ case 77/*TokenKind.IMPLEMENTS*/: |
+ |
+ return "pseudo-keyword 'implements'"; |
+ |
+ case 78/*TokenKind.IMPORT*/: |
+ |
+ return "pseudo-keyword 'import'"; |
+ |
+ case 79/*TokenKind.INTERFACE*/: |
+ |
+ return "pseudo-keyword 'interface'"; |
+ |
+ case 80/*TokenKind.LIBRARY*/: |
+ |
+ return "pseudo-keyword 'library'"; |
+ |
+ case 81/*TokenKind.NATIVE*/: |
+ |
+ return "pseudo-keyword 'native'"; |
+ |
+ case 82/*TokenKind.NEGATE*/: |
+ |
+ return "pseudo-keyword 'negate'"; |
+ |
+ case 83/*TokenKind.OPERATOR*/: |
+ |
+ return "pseudo-keyword 'operator'"; |
+ |
+ case 84/*TokenKind.SET*/: |
+ |
+ return "pseudo-keyword 'set'"; |
+ |
+ case 85/*TokenKind.SOURCE*/: |
+ |
+ return "pseudo-keyword 'source'"; |
+ |
+ case 86/*TokenKind.STATIC*/: |
+ |
+ return "pseudo-keyword 'static'"; |
+ |
+ case 87/*TokenKind.TYPEDEF*/: |
+ |
+ return "pseudo-keyword 'typedef'"; |
+ |
+ case 88/*TokenKind.AWAIT*/: |
+ |
+ return "keyword 'await'"; |
+ |
+ case 89/*TokenKind.BREAK*/: |
+ |
+ return "keyword 'break'"; |
+ |
+ case 90/*TokenKind.CASE*/: |
+ |
+ return "keyword 'case'"; |
+ |
+ case 91/*TokenKind.CATCH*/: |
+ |
+ return "keyword 'catch'"; |
+ |
+ case 92/*TokenKind.CONST*/: |
+ |
+ return "keyword 'const'"; |
+ |
+ case 93/*TokenKind.CONTINUE*/: |
+ |
+ return "keyword 'continue'"; |
+ |
+ case 94/*TokenKind.DEFAULT*/: |
+ |
+ return "keyword 'default'"; |
+ |
+ case 95/*TokenKind.DO*/: |
+ |
+ return "keyword 'do'"; |
+ |
+ case 96/*TokenKind.ELSE*/: |
+ |
+ return "keyword 'else'"; |
+ |
+ case 97/*TokenKind.FALSE*/: |
+ |
+ return "keyword 'false'"; |
+ |
+ case 98/*TokenKind.FINAL*/: |
+ |
+ return "keyword 'final'"; |
+ |
+ case 99/*TokenKind.FINALLY*/: |
+ |
+ return "keyword 'finally'"; |
+ |
+ case 100/*TokenKind.FOR*/: |
+ |
+ return "keyword 'for'"; |
+ |
+ case 101/*TokenKind.IF*/: |
+ |
+ return "keyword 'if'"; |
+ |
+ case 102/*TokenKind.IN*/: |
+ |
+ return "keyword 'in'"; |
+ |
+ case 103/*TokenKind.IS*/: |
+ |
+ return "keyword 'is'"; |
+ |
+ case 104/*TokenKind.NEW*/: |
+ |
+ return "keyword 'new'"; |
+ |
+ case 105/*TokenKind.NULL*/: |
+ |
+ return "keyword 'null'"; |
+ |
+ case 106/*TokenKind.RETURN*/: |
+ |
+ return "keyword 'return'"; |
+ |
+ case 107/*TokenKind.SUPER*/: |
+ |
+ return "keyword 'super'"; |
+ |
+ case 108/*TokenKind.SWITCH*/: |
+ |
+ return "keyword 'switch'"; |
+ |
+ case 109/*TokenKind.THIS*/: |
+ |
+ return "keyword 'this'"; |
+ |
+ case 110/*TokenKind.THROW*/: |
+ |
+ return "keyword 'throw'"; |
+ |
+ case 111/*TokenKind.TRUE*/: |
+ |
+ return "keyword 'true'"; |
+ |
+ case 112/*TokenKind.TRY*/: |
+ |
+ return "keyword 'try'"; |
+ |
+ case 113/*TokenKind.VAR*/: |
+ |
+ return "keyword 'var'"; |
+ |
+ case 114/*TokenKind.VOID*/: |
+ |
+ return "keyword 'void'"; |
+ |
+ case 115/*TokenKind.WHILE*/: |
+ |
+ return "keyword 'while'"; |
+ |
+ default: |
+ |
+ return "TokenKind(" + kind.toString() + ")"; |
+ |
+ } |
+} |
+TokenKind.isIdentifier = function(kind) { |
+ return kind >= 70/*TokenKind.IDENTIFIER*/ && kind < 88/*TokenKind.AWAIT*/; |
+} |
+TokenKind.infixPrecedence = function(kind) { |
+ switch (kind) { |
+ case 20/*TokenKind.ASSIGN*/: |
+ |
+ return 2; |
+ |
+ case 21/*TokenKind.ASSIGN_OR*/: |
+ |
+ return 2; |
+ |
+ case 22/*TokenKind.ASSIGN_XOR*/: |
+ |
+ return 2; |
+ |
+ case 23/*TokenKind.ASSIGN_AND*/: |
+ |
+ return 2; |
+ |
+ case 24/*TokenKind.ASSIGN_SHL*/: |
+ |
+ return 2; |
+ |
+ case 25/*TokenKind.ASSIGN_SAR*/: |
+ |
+ return 2; |
+ |
+ case 26/*TokenKind.ASSIGN_SHR*/: |
+ |
+ return 2; |
+ |
+ case 27/*TokenKind.ASSIGN_ADD*/: |
+ |
+ return 2; |
+ |
+ case 28/*TokenKind.ASSIGN_SUB*/: |
+ |
+ return 2; |
+ |
+ case 29/*TokenKind.ASSIGN_MUL*/: |
+ |
+ return 2; |
+ |
+ case 30/*TokenKind.ASSIGN_DIV*/: |
+ |
+ return 2; |
+ |
+ case 31/*TokenKind.ASSIGN_TRUNCDIV*/: |
+ |
+ return 2; |
+ |
+ case 32/*TokenKind.ASSIGN_MOD*/: |
+ |
+ return 2; |
+ |
+ case 33/*TokenKind.CONDITIONAL*/: |
+ |
+ return 3; |
+ |
+ case 34/*TokenKind.OR*/: |
+ |
+ return 4; |
+ |
+ case 35/*TokenKind.AND*/: |
+ |
+ return 5; |
+ |
+ case 36/*TokenKind.BIT_OR*/: |
+ |
+ return 6; |
+ |
+ case 37/*TokenKind.BIT_XOR*/: |
+ |
+ return 7; |
+ |
+ case 38/*TokenKind.BIT_AND*/: |
+ |
+ return 8; |
+ |
+ case 39/*TokenKind.SHL*/: |
+ |
+ return 11; |
+ |
+ case 40/*TokenKind.SAR*/: |
+ |
+ return 11; |
+ |
+ case 41/*TokenKind.SHR*/: |
+ |
+ return 11; |
+ |
+ case 42/*TokenKind.ADD*/: |
+ |
+ return 12; |
+ |
+ case 43/*TokenKind.SUB*/: |
+ |
+ return 12; |
+ |
+ case 44/*TokenKind.MUL*/: |
+ |
+ return 13; |
+ |
+ case 45/*TokenKind.DIV*/: |
+ |
+ return 13; |
+ |
+ case 46/*TokenKind.TRUNCDIV*/: |
+ |
+ return 13; |
+ |
+ case 47/*TokenKind.MOD*/: |
+ |
+ return 13; |
+ |
+ case 48/*TokenKind.EQ*/: |
+ |
+ return 9; |
+ |
+ case 49/*TokenKind.NE*/: |
+ |
+ return 9; |
+ |
+ case 50/*TokenKind.EQ_STRICT*/: |
+ |
+ return 9; |
+ |
+ case 51/*TokenKind.NE_STRICT*/: |
+ |
+ return 9; |
+ |
+ case 52/*TokenKind.LT*/: |
+ |
+ return 10; |
+ |
+ case 53/*TokenKind.GT*/: |
+ |
+ return 10; |
+ |
+ case 54/*TokenKind.LTE*/: |
+ |
+ return 10; |
+ |
+ case 55/*TokenKind.GTE*/: |
+ |
+ return 10; |
+ |
+ case 103/*TokenKind.IS*/: |
+ |
+ return 10; |
+ |
+ default: |
+ |
+ return -1; |
+ |
+ } |
+} |
+TokenKind.rawOperatorFromMethod = function(name) { |
+ switch (name) { |
+ case ':bit_not': |
+ |
+ return '~'; |
+ |
+ case ':bit_or': |
+ |
+ return '|'; |
+ |
+ case ':bit_xor': |
+ |
+ return '^'; |
+ |
+ case ':bit_and': |
+ |
+ return '&'; |
+ |
+ case ':shl': |
+ |
+ return '<<'; |
+ |
+ case ':sar': |
+ |
+ return '>>'; |
+ |
+ case ':shr': |
+ |
+ return '>>>'; |
+ |
+ case ':add': |
+ |
+ return '+'; |
+ |
+ case ':sub': |
+ |
+ return '-'; |
+ |
+ case ':mul': |
+ |
+ return '*'; |
+ |
+ case ':div': |
+ |
+ return '/'; |
+ |
+ case ':truncdiv': |
+ |
+ return '~/'; |
+ |
+ case ':mod': |
+ |
+ return '%'; |
+ |
+ case ':eq': |
+ |
+ return '=='; |
+ |
+ case ':lt': |
+ |
+ return '<'; |
+ |
+ case ':gt': |
+ |
+ return '>'; |
+ |
+ case ':lte': |
+ |
+ return '<='; |
+ |
+ case ':gte': |
+ |
+ return '>='; |
+ |
+ case ':index': |
+ |
+ return '[]'; |
+ |
+ case ':setindex': |
+ |
+ return '[]='; |
+ |
+ case ':ne': |
+ |
+ return '!='; |
+ |
+ } |
+} |
+TokenKind.binaryMethodName = function(kind) { |
+ switch (kind) { |
+ case 18/*TokenKind.BIT_NOT*/: |
+ |
+ return ':bit_not'; |
+ |
+ case 36/*TokenKind.BIT_OR*/: |
+ |
+ return ':bit_or'; |
+ |
+ case 37/*TokenKind.BIT_XOR*/: |
+ |
+ return ':bit_xor'; |
+ |
+ case 38/*TokenKind.BIT_AND*/: |
+ |
+ return ':bit_and'; |
+ |
+ case 39/*TokenKind.SHL*/: |
+ |
+ return ':shl'; |
+ |
+ case 40/*TokenKind.SAR*/: |
+ |
+ return ':sar'; |
+ |
+ case 41/*TokenKind.SHR*/: |
+ |
+ return ':shr'; |
+ |
+ case 42/*TokenKind.ADD*/: |
+ |
+ return ':add'; |
+ |
+ case 43/*TokenKind.SUB*/: |
+ |
+ return ':sub'; |
+ |
+ case 44/*TokenKind.MUL*/: |
+ |
+ return ':mul'; |
+ |
+ case 45/*TokenKind.DIV*/: |
+ |
+ return ':div'; |
+ |
+ case 46/*TokenKind.TRUNCDIV*/: |
+ |
+ return ':truncdiv'; |
+ |
+ case 47/*TokenKind.MOD*/: |
+ |
+ return ':mod'; |
+ |
+ case 48/*TokenKind.EQ*/: |
+ |
+ return ':eq'; |
+ |
+ case 52/*TokenKind.LT*/: |
+ |
+ return ':lt'; |
+ |
+ case 53/*TokenKind.GT*/: |
+ |
+ return ':gt'; |
+ |
+ case 54/*TokenKind.LTE*/: |
+ |
+ return ':lte'; |
+ |
+ case 55/*TokenKind.GTE*/: |
+ |
+ return ':gte'; |
+ |
+ case 56/*TokenKind.INDEX*/: |
+ |
+ return ':index'; |
+ |
+ case 57/*TokenKind.SETINDEX*/: |
+ |
+ return ':setindex'; |
+ |
+ } |
+} |
+TokenKind.kindFromAssign = function(kind) { |
+ if (kind == 20/*TokenKind.ASSIGN*/) return 0; |
+ if (kind > 20/*TokenKind.ASSIGN*/ && kind <= 32/*TokenKind.ASSIGN_MOD*/) { |
+ return kind + (15)/*(ADD - ASSIGN_ADD)*/; |
+ } |
+ return -1; |
+} |
+// ********** Code for Parser ************** |
+function Parser(source, diet, throwOnIncomplete, optionalSemicolons, startOffset) { |
+ this._inhibitLambda = false |
+ this._afterParensIndex = 0 |
+ this._recover = false |
+ this.source = source; |
+ this.diet = diet; |
+ this.throwOnIncomplete = throwOnIncomplete; |
+ this.optionalSemicolons = optionalSemicolons; |
+ // Initializers done |
+ this.tokenizer = new Tokenizer(this.source, true, startOffset); |
+ this._peekToken = this.tokenizer.next(); |
+ this._afterParens = []; |
+} |
+Parser.prototype.get$enableAwait = function() { |
+ return $globals.experimentalAwaitPhase != null; |
+} |
+Parser.prototype.isPrematureEndOfFile = function() { |
+ if (this.throwOnIncomplete && this._maybeEat(1/*TokenKind.END_OF_FILE*/) || this._maybeEat(68/*TokenKind.INCOMPLETE_MULTILINE_STRING_DQ*/) || this._maybeEat(69/*TokenKind.INCOMPLETE_MULTILINE_STRING_SQ*/)) { |
+ $throw(new IncompleteSourceException(this._previousToken)); |
+ } |
+ else if (this._maybeEat(1/*TokenKind.END_OF_FILE*/)) { |
+ this._lang_error('unexpected end of file', this._peekToken.get$span()); |
+ return true; |
+ } |
+ else { |
+ return false; |
+ } |
+} |
+Parser.prototype._recoverTo = function(kind1, kind2, kind3) { |
+ while (!this.isPrematureEndOfFile()) { |
+ var kind = this._peek(); |
+ if (kind == kind1 || kind == kind2 || kind == kind3) { |
+ this._recover = false; |
+ return true; |
+ } |
+ this._lang_next(); |
+ } |
+ return false; |
+} |
+Parser.prototype._peek = function() { |
+ return this._peekToken.kind; |
+} |
+Parser.prototype._lang_next = function() { |
+ this._previousToken = this._peekToken; |
+ this._peekToken = this.tokenizer.next(); |
+ return this._previousToken; |
+} |
+Parser.prototype._peekKind = function(kind) { |
+ return this._peekToken.kind == kind; |
+} |
+Parser.prototype._peekIdentifier = function() { |
+ return this._isIdentifier(this._peekToken.kind); |
+} |
+Parser.prototype._isIdentifier = function(kind) { |
+ return TokenKind.isIdentifier(kind) || (!this.get$enableAwait() && $eq(kind, 88/*TokenKind.AWAIT*/)); |
+} |
+Parser.prototype._maybeEat = function(kind) { |
+ if (this._peekToken.kind == kind) { |
+ this._previousToken = this._peekToken; |
+ this._peekToken = this.tokenizer.next(); |
+ return true; |
+ } |
+ else { |
+ return false; |
+ } |
+} |
+Parser.prototype._eat = function(kind) { |
+ if (!this._maybeEat(kind)) { |
+ this._errorExpected(TokenKind.kindToString(kind)); |
+ } |
+} |
+Parser.prototype._eatSemicolon = function() { |
+ if (this.optionalSemicolons && this._peekKind(1/*TokenKind.END_OF_FILE*/)) return; |
+ this._eat(10/*TokenKind.SEMICOLON*/); |
+} |
+Parser.prototype._errorExpected = function(expected) { |
+ if (this.throwOnIncomplete) this.isPrematureEndOfFile(); |
+ var tok = this._lang_next(); |
+ if ((tok instanceof ErrorToken) && tok.get$message() != null) { |
+ this._lang_error(tok.get$message(), tok.get$span()); |
+ } |
+ else { |
+ this._lang_error(('expected ' + expected + ', but found ' + tok), tok.get$span()); |
+ } |
+} |
+Parser.prototype._lang_error = function(message, location) { |
+ if (this._recover) return; |
+ if (location == null) { |
+ location = this._peekToken.get$span(); |
+ } |
+ $globals.world.fatal(message, location); |
+ this._recover = true; |
+} |
+Parser.prototype._skipBlock = function() { |
+ var depth = 1; |
+ this._eat(6/*TokenKind.LBRACE*/); |
+ while (true) { |
+ var tok = this._lang_next(); |
+ if ($eq(tok.get$kind(), 6/*TokenKind.LBRACE*/)) { |
+ depth += 1; |
+ } |
+ else if ($eq(tok.get$kind(), 7/*TokenKind.RBRACE*/)) { |
+ depth -= 1; |
+ if (depth == 0) return; |
+ } |
+ else if ($eq(tok.get$kind(), 1/*TokenKind.END_OF_FILE*/)) { |
+ this._lang_error('unexpected end of file during diet parse', tok.get$span()); |
+ return; |
+ } |
+ } |
+} |
+Parser.prototype._makeSpan = function(start) { |
+ return new SourceSpan(this.source, start, this._previousToken.end); |
+} |
+Parser.prototype.compilationUnit = function() { |
+ var ret = []; |
+ this._maybeEat(13/*TokenKind.HASHBANG*/); |
+ while (this._peekKind(12/*TokenKind.HASH*/)) { |
+ ret.add$1(this.directive()); |
+ } |
+ this._recover = false; |
+ while (!this._maybeEat(1/*TokenKind.END_OF_FILE*/)) { |
+ ret.add$1(this.topLevelDefinition()); |
+ } |
+ this._recover = false; |
+ return ret; |
+} |
+Parser.prototype.directive = function() { |
+ var start = this._peekToken.start; |
+ this._eat(12/*TokenKind.HASH*/); |
+ var name = this.identifier(); |
+ var args = this.arguments(); |
+ this._eatSemicolon(); |
+ return new DirectiveDefinition(name, args, this._makeSpan(start)); |
+} |
+Parser.prototype.topLevelDefinition = function() { |
+ switch (this._peek()) { |
+ case 73/*TokenKind.CLASS*/: |
+ |
+ return this.classDefinition(73/*TokenKind.CLASS*/); |
+ |
+ case 79/*TokenKind.INTERFACE*/: |
+ |
+ return this.classDefinition(79/*TokenKind.INTERFACE*/); |
+ |
+ case 87/*TokenKind.TYPEDEF*/: |
+ |
+ return this.functionTypeAlias(); |
+ |
+ default: |
+ |
+ return this.declaration(true); |
+ |
+ } |
+} |
+Parser.prototype.classDefinition = function(kind) { |
+ var start = this._peekToken.start; |
+ this._eat(kind); |
+ var name = this.identifier(); |
+ var typeParams = null; |
+ if (this._peekKind(52/*TokenKind.LT*/)) { |
+ typeParams = this.typeParameters(); |
+ } |
+ var _extends = null; |
+ if (this._maybeEat(74/*TokenKind.EXTENDS*/)) { |
+ _extends = this.typeList(); |
+ } |
+ var _implements = null; |
+ if (this._maybeEat(77/*TokenKind.IMPLEMENTS*/)) { |
+ _implements = this.typeList(); |
+ } |
+ var _native = null; |
+ if (this._maybeEat(81/*TokenKind.NATIVE*/)) { |
+ _native = this.maybeStringLiteral(); |
+ if (_native != null) _native = new NativeType(_native); |
+ } |
+ var _factory = null; |
+ if (this._maybeEat(75/*TokenKind.FACTORY*/)) { |
+ _factory = this.nameTypeReference(); |
+ if (this._peekKind(52/*TokenKind.LT*/)) { |
+ this.typeParameters(); |
+ } |
+ } |
+ var body = []; |
+ if (this._maybeEat(6/*TokenKind.LBRACE*/)) { |
+ while (!this._maybeEat(7/*TokenKind.RBRACE*/)) { |
+ body.add$1(this.declaration(true)); |
+ if (this._recover) { |
+ if (!this._recoverTo(7/*TokenKind.RBRACE*/, 10/*TokenKind.SEMICOLON*/)) break; |
+ this._maybeEat(10/*TokenKind.SEMICOLON*/); |
+ } |
+ } |
+ } |
+ else { |
+ this._errorExpected('block starting with "{" or ";"'); |
+ } |
+ return new TypeDefinition(kind == 73/*TokenKind.CLASS*/, name, typeParams, _extends, _implements, _native, _factory, body, this._makeSpan(start)); |
+} |
+Parser.prototype.functionTypeAlias = function() { |
+ var start = this._peekToken.start; |
+ this._eat(87/*TokenKind.TYPEDEF*/); |
+ var di = this.declaredIdentifier(false); |
+ var typeParams = null; |
+ if (this._peekKind(52/*TokenKind.LT*/)) { |
+ typeParams = this.typeParameters(); |
+ } |
+ var formals = this.formalParameterList(); |
+ this._eatSemicolon(); |
+ var func = new FunctionDefinition(null, di.get$type(), di.get$name(), formals, null, null, null, null, this._makeSpan(start)); |
+ return new FunctionTypeDefinition(func, typeParams, this._makeSpan(start)); |
+} |
+Parser.prototype.initializers = function() { |
+ this._inhibitLambda = true; |
+ var ret = []; |
+ do { |
+ ret.add$1(this.expression()); |
+ } |
+ while (this._maybeEat(11/*TokenKind.COMMA*/)) |
+ this._inhibitLambda = false; |
+ return ret; |
+} |
+Parser.prototype.get$initializers = function() { |
+ return Parser.prototype.initializers.bind(this); |
+} |
+Parser.prototype.functionBody = function(inExpression) { |
+ var start = this._peekToken.start; |
+ if (this._maybeEat(9/*TokenKind.ARROW*/)) { |
+ var expr = this.expression(); |
+ if (!inExpression) { |
+ this._eatSemicolon(); |
+ } |
+ return new ReturnStatement(expr, this._makeSpan(start)); |
+ } |
+ else if (this._peekKind(6/*TokenKind.LBRACE*/)) { |
+ if (this.diet) { |
+ this._skipBlock(); |
+ return new DietStatement(this._makeSpan(start)); |
+ } |
+ else { |
+ return this.block(); |
+ } |
+ } |
+ else if (!inExpression) { |
+ if (this._maybeEat(10/*TokenKind.SEMICOLON*/)) { |
+ return null; |
+ } |
+ } |
+ this._lang_error('Expected function body (neither { nor => found)'); |
+} |
+Parser.prototype.finishField = function(start, modifiers, typeParams, type, name, value) { |
+ if (typeParams != null) { |
+ $globals.world.internalError('trying to create a generic field', this._makeSpan(start)); |
+ } |
+ var names = [name]; |
+ var values = [value]; |
+ while (this._maybeEat(11/*TokenKind.COMMA*/)) { |
+ names.add$1(this.identifier()); |
+ if (this._maybeEat(20/*TokenKind.ASSIGN*/)) { |
+ values.add$1(this.expression()); |
+ } |
+ else { |
+ values.add$1(); |
+ } |
+ } |
+ this._eatSemicolon(); |
+ return new VariableDefinition(modifiers, type, names, values, this._makeSpan(start)); |
+} |
+Parser.prototype.finishDefinition = function(start, modifiers, di, typeParams) { |
+ switch (this._peek()) { |
+ case 2/*TokenKind.LPAREN*/: |
+ |
+ var formals = this.formalParameterList(); |
+ var inits = null, native_ = null; |
+ if (this._maybeEat(8/*TokenKind.COLON*/)) { |
+ inits = this.initializers(); |
+ } |
+ if (this._maybeEat(81/*TokenKind.NATIVE*/)) { |
+ native_ = this.maybeStringLiteral(); |
+ if (native_ == null) native_ = ''; |
+ } |
+ var body = this.functionBody(false); |
+ if (di.get$name() == null) { |
+ di.set$name(di.get$type().get$name()); |
+ } |
+ return new FunctionDefinition(modifiers, di.get$type(), di.get$name(), formals, typeParams, inits, native_, body, this._makeSpan(start)); |
+ |
+ case 20/*TokenKind.ASSIGN*/: |
+ |
+ this._eat(20/*TokenKind.ASSIGN*/); |
+ var value = this.expression(); |
+ return this.finishField(start, modifiers, typeParams, di.get$type(), di.get$name(), value); |
+ |
+ case 11/*TokenKind.COMMA*/: |
+ case 10/*TokenKind.SEMICOLON*/: |
+ |
+ return this.finishField(start, modifiers, typeParams, di.get$type(), di.get$name(), null); |
+ |
+ default: |
+ |
+ this._errorExpected('declaration'); |
+ return null; |
+ |
+ } |
+} |
+Parser.prototype.declaration = function(includeOperators) { |
+ var start = this._peekToken.start; |
+ if (this._peekKind(75/*TokenKind.FACTORY*/)) { |
+ return this.factoryConstructorDeclaration(); |
+ } |
+ var modifiers = this._readModifiers(); |
+ return this.finishDefinition(start, modifiers, this.declaredIdentifier(includeOperators), null); |
+} |
+Parser.prototype.factoryConstructorDeclaration = function() { |
+ var start = this._peekToken.start; |
+ var factoryToken = this._lang_next(); |
+ var names = [this.identifier()]; |
+ while (this._maybeEat(14/*TokenKind.DOT*/)) { |
+ names.add$1(this.identifier()); |
+ } |
+ var typeParams = null; |
+ if (this._peekKind(52/*TokenKind.LT*/)) { |
+ typeParams = this.typeParameters(); |
+ } |
+ var name = null; |
+ var type = null; |
+ if (this._maybeEat(14/*TokenKind.DOT*/)) { |
+ name = this.identifier(); |
+ } |
+ else if (typeParams == null) { |
+ if (names.length > 1) { |
+ name = names.removeLast$0(); |
+ } |
+ else { |
+ name = new Identifier('', names.$index(0).get$span()); |
+ } |
+ } |
+ else { |
+ name = new Identifier('', names.$index(0).get$span()); |
+ } |
+ if (names.length > 1) { |
+ this._lang_error('unsupported qualified name for factory', names.$index(0).get$span()); |
+ } |
+ type = new NameTypeReference(false, names.$index(0), null, names.$index(0).get$span()); |
+ var di = new DeclaredIdentifier(type, name, this._makeSpan(start)); |
+ return this.finishDefinition(start, [factoryToken], di, typeParams); |
+} |
+Parser.prototype.statement = function() { |
+ switch (this._peek()) { |
+ case 89/*TokenKind.BREAK*/: |
+ |
+ return this.breakStatement(); |
+ |
+ case 93/*TokenKind.CONTINUE*/: |
+ |
+ return this.continueStatement(); |
+ |
+ case 106/*TokenKind.RETURN*/: |
+ |
+ return this.returnStatement(); |
+ |
+ case 110/*TokenKind.THROW*/: |
+ |
+ return this.throwStatement(); |
+ |
+ case 72/*TokenKind.ASSERT*/: |
+ |
+ return this.assertStatement(); |
+ |
+ case 115/*TokenKind.WHILE*/: |
+ |
+ return this.whileStatement(); |
+ |
+ case 95/*TokenKind.DO*/: |
+ |
+ return this.doStatement(); |
+ |
+ case 100/*TokenKind.FOR*/: |
+ |
+ return this.forStatement(); |
+ |
+ case 101/*TokenKind.IF*/: |
+ |
+ return this.ifStatement(); |
+ |
+ case 108/*TokenKind.SWITCH*/: |
+ |
+ return this.switchStatement(); |
+ |
+ case 112/*TokenKind.TRY*/: |
+ |
+ return this.tryStatement(); |
+ |
+ case 6/*TokenKind.LBRACE*/: |
+ |
+ return this.block(); |
+ |
+ case 10/*TokenKind.SEMICOLON*/: |
+ |
+ return this.emptyStatement(); |
+ |
+ case 98/*TokenKind.FINAL*/: |
+ |
+ return this.declaration(false); |
+ |
+ case 113/*TokenKind.VAR*/: |
+ |
+ return this.declaration(false); |
+ |
+ default: |
+ |
+ return this.finishExpressionAsStatement(this.expression()); |
+ |
+ } |
+} |
+Parser.prototype.finishExpressionAsStatement = function(expr) { |
+ var start = expr.get$span().get$start(); |
+ if (this._maybeEat(8/*TokenKind.COLON*/)) { |
+ var label = this._makeLabel(expr); |
+ return new LabeledStatement(label, this.statement(), this._makeSpan(start)); |
+ } |
+ if ((expr instanceof LambdaExpression)) { |
+ if (!(expr.get$func().get$body() instanceof BlockStatement)) { |
+ this._eatSemicolon(); |
+ expr.get$func().set$span(this._makeSpan(start)); |
+ } |
+ return expr.get$func(); |
+ } |
+ else if ((expr instanceof DeclaredIdentifier)) { |
+ var value = null; |
+ if (this._maybeEat(20/*TokenKind.ASSIGN*/)) { |
+ value = this.expression(); |
+ } |
+ return this.finishField(start, null, null, expr.get$type(), expr.get$name(), value); |
+ } |
+ else if (this._isBin(expr, 20/*TokenKind.ASSIGN*/) && ((expr.get$x() instanceof DeclaredIdentifier))) { |
+ var di = expr.get$x(); |
+ return this.finishField(start, null, null, di.type, di.name, expr.get$y()); |
+ } |
+ else if (this._isBin(expr, 52/*TokenKind.LT*/) && this._maybeEat(11/*TokenKind.COMMA*/)) { |
+ var baseType = this._makeType(expr.get$x()); |
+ var typeArgs = [this._makeType(expr.get$y())]; |
+ var gt = this._finishTypeArguments(baseType, 0, typeArgs); |
+ var name = this.identifier(); |
+ var value = null; |
+ if (this._maybeEat(20/*TokenKind.ASSIGN*/)) { |
+ value = this.expression(); |
+ } |
+ return this.finishField(expr.get$span().get$start(), null, null, gt, name, value); |
+ } |
+ else { |
+ this._eatSemicolon(); |
+ return new ExpressionStatement(expr, this._makeSpan(expr.get$span().get$start())); |
+ } |
+} |
+Parser.prototype.testCondition = function() { |
+ this._eatLeftParen(); |
+ var ret = this.expression(); |
+ this._eat(3/*TokenKind.RPAREN*/); |
+ return ret; |
+} |
+Parser.prototype.block = function() { |
+ var start = this._peekToken.start; |
+ this._eat(6/*TokenKind.LBRACE*/); |
+ var stmts = []; |
+ while (!this._maybeEat(7/*TokenKind.RBRACE*/)) { |
+ stmts.add$1(this.statement()); |
+ if (this._recover && !this._recoverTo(7/*TokenKind.RBRACE*/, 10/*TokenKind.SEMICOLON*/)) break; |
+ } |
+ this._recover = false; |
+ return new BlockStatement(stmts, this._makeSpan(start)); |
+} |
+Parser.prototype.emptyStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(10/*TokenKind.SEMICOLON*/); |
+ return new EmptyStatement(this._makeSpan(start)); |
+} |
+Parser.prototype.ifStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(101/*TokenKind.IF*/); |
+ var test = this.testCondition(); |
+ var trueBranch = this.statement(); |
+ var falseBranch = null; |
+ if (this._maybeEat(96/*TokenKind.ELSE*/)) { |
+ falseBranch = this.statement(); |
+ } |
+ return new IfStatement(test, trueBranch, falseBranch, this._makeSpan(start)); |
+} |
+Parser.prototype.whileStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(115/*TokenKind.WHILE*/); |
+ var test = this.testCondition(); |
+ var body = this.statement(); |
+ return new WhileStatement(test, body, this._makeSpan(start)); |
+} |
+Parser.prototype.doStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(95/*TokenKind.DO*/); |
+ var body = this.statement(); |
+ this._eat(115/*TokenKind.WHILE*/); |
+ var test = this.testCondition(); |
+ this._eatSemicolon(); |
+ return new DoStatement(body, test, this._makeSpan(start)); |
+} |
+Parser.prototype.forStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(100/*TokenKind.FOR*/); |
+ this._eatLeftParen(); |
+ var init = this.forInitializerStatement(start); |
+ if ((init instanceof ForInStatement)) { |
+ return init; |
+ } |
+ var test = null; |
+ if (!this._maybeEat(10/*TokenKind.SEMICOLON*/)) { |
+ test = this.expression(); |
+ this._eatSemicolon(); |
+ } |
+ var step = []; |
+ if (!this._maybeEat(3/*TokenKind.RPAREN*/)) { |
+ step.add$1(this.expression()); |
+ while (this._maybeEat(11/*TokenKind.COMMA*/)) { |
+ step.add$1(this.expression()); |
+ } |
+ this._eat(3/*TokenKind.RPAREN*/); |
+ } |
+ var body = this.statement(); |
+ return new ForStatement(init, test, step, body, this._makeSpan(start)); |
+} |
+Parser.prototype.forInitializerStatement = function(start) { |
+ if (this._maybeEat(10/*TokenKind.SEMICOLON*/)) { |
+ return null; |
+ } |
+ else { |
+ var init = this.expression(); |
+ if (this._peekKind(11/*TokenKind.COMMA*/) && this._isBin(init, 52/*TokenKind.LT*/)) { |
+ this._eat(11/*TokenKind.COMMA*/); |
+ var baseType = this._makeType(init.get$x()); |
+ var typeArgs = [this._makeType(init.get$y())]; |
+ var gt = this._finishTypeArguments(baseType, 0, typeArgs); |
+ var name = this.identifier(); |
+ init = new DeclaredIdentifier(gt, name, this._makeSpan(init.get$span().get$start())); |
+ } |
+ if (this._maybeEat(102/*TokenKind.IN*/)) { |
+ return this._finishForIn(start, this._makeDeclaredIdentifier(init)); |
+ } |
+ else { |
+ return this.finishExpressionAsStatement(init); |
+ } |
+ } |
+} |
+Parser.prototype._finishForIn = function(start, di) { |
+ var expr = this.expression(); |
+ this._eat(3/*TokenKind.RPAREN*/); |
+ var body = this.statement(); |
+ return new ForInStatement(di, expr, body, this._makeSpan(start)); |
+} |
+Parser.prototype.tryStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(112/*TokenKind.TRY*/); |
+ var body = this.block(); |
+ var catches = []; |
+ while (this._peekKind(91/*TokenKind.CATCH*/)) { |
+ catches.add$1(this.catchNode()); |
+ } |
+ var finallyBlock = null; |
+ if (this._maybeEat(99/*TokenKind.FINALLY*/)) { |
+ finallyBlock = this.block(); |
+ } |
+ return new TryStatement(body, catches, finallyBlock, this._makeSpan(start)); |
+} |
+Parser.prototype.catchNode = function() { |
+ var start = this._peekToken.start; |
+ this._eat(91/*TokenKind.CATCH*/); |
+ this._eatLeftParen(); |
+ var exc = this.declaredIdentifier(false); |
+ var trace = null; |
+ if (this._maybeEat(11/*TokenKind.COMMA*/)) { |
+ trace = this.declaredIdentifier(false); |
+ } |
+ this._eat(3/*TokenKind.RPAREN*/); |
+ var body = this.block(); |
+ return new CatchNode(exc, trace, body, this._makeSpan(start)); |
+} |
+Parser.prototype.switchStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(108/*TokenKind.SWITCH*/); |
+ var test = this.testCondition(); |
+ var cases = []; |
+ this._eat(6/*TokenKind.LBRACE*/); |
+ while (!this._maybeEat(7/*TokenKind.RBRACE*/)) { |
+ cases.add$1(this.caseNode()); |
+ } |
+ return new SwitchStatement(test, cases, this._makeSpan(start)); |
+} |
+Parser.prototype._peekCaseEnd = function() { |
+ var kind = this._peek(); |
+ return $eq(kind, 7/*TokenKind.RBRACE*/) || $eq(kind, 90/*TokenKind.CASE*/) || $eq(kind, 94/*TokenKind.DEFAULT*/); |
+} |
+Parser.prototype.caseNode = function() { |
+ var start = this._peekToken.start; |
+ var label = null; |
+ if (this._peekIdentifier()) { |
+ label = this.identifier(); |
+ this._eat(8/*TokenKind.COLON*/); |
+ } |
+ var cases = []; |
+ while (true) { |
+ if (this._maybeEat(90/*TokenKind.CASE*/)) { |
+ cases.add$1(this.expression()); |
+ this._eat(8/*TokenKind.COLON*/); |
+ } |
+ else if (this._maybeEat(94/*TokenKind.DEFAULT*/)) { |
+ cases.add$1(); |
+ this._eat(8/*TokenKind.COLON*/); |
+ } |
+ else { |
+ break; |
+ } |
+ } |
+ if ($eq(cases.length, 0)) { |
+ this._lang_error('case or default'); |
+ } |
+ var stmts = []; |
+ while (!this._peekCaseEnd()) { |
+ stmts.add$1(this.statement()); |
+ if (this._recover && !this._recoverTo(7/*TokenKind.RBRACE*/, 90/*TokenKind.CASE*/, 94/*TokenKind.DEFAULT*/)) { |
+ break; |
+ } |
+ } |
+ return new CaseNode(label, cases, stmts, this._makeSpan(start)); |
+} |
+Parser.prototype.returnStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(106/*TokenKind.RETURN*/); |
+ var expr; |
+ if (this._maybeEat(10/*TokenKind.SEMICOLON*/)) { |
+ expr = null; |
+ } |
+ else { |
+ expr = this.expression(); |
+ this._eatSemicolon(); |
+ } |
+ return new ReturnStatement(expr, this._makeSpan(start)); |
+} |
+Parser.prototype.throwStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(110/*TokenKind.THROW*/); |
+ var expr; |
+ if (this._maybeEat(10/*TokenKind.SEMICOLON*/)) { |
+ expr = null; |
+ } |
+ else { |
+ expr = this.expression(); |
+ this._eatSemicolon(); |
+ } |
+ return new ThrowStatement(expr, this._makeSpan(start)); |
+} |
+Parser.prototype.assertStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(72/*TokenKind.ASSERT*/); |
+ this._eatLeftParen(); |
+ var expr = this.expression(); |
+ this._eat(3/*TokenKind.RPAREN*/); |
+ this._eatSemicolon(); |
+ return new AssertStatement(expr, this._makeSpan(start)); |
+} |
+Parser.prototype.breakStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(89/*TokenKind.BREAK*/); |
+ var name = null; |
+ if (this._peekIdentifier()) { |
+ name = this.identifier(); |
+ } |
+ this._eatSemicolon(); |
+ return new BreakStatement(name, this._makeSpan(start)); |
+} |
+Parser.prototype.continueStatement = function() { |
+ var start = this._peekToken.start; |
+ this._eat(93/*TokenKind.CONTINUE*/); |
+ var name = null; |
+ if (this._peekIdentifier()) { |
+ name = this.identifier(); |
+ } |
+ this._eatSemicolon(); |
+ return new ContinueStatement(name, this._makeSpan(start)); |
+} |
+Parser.prototype.expression = function() { |
+ return this.infixExpression(0); |
+} |
+Parser.prototype._makeType = function(expr) { |
+ if ((expr instanceof VarExpression)) { |
+ return new NameTypeReference(false, expr.get$name(), null, expr.get$span()); |
+ } |
+ else if ((expr instanceof DotExpression)) { |
+ var type = this._makeType(expr.get$self()); |
+ if (type.get$names() == null) { |
+ type.set$names([expr.get$name()]); |
+ } |
+ else { |
+ type.get$names().add$1(expr.get$name()); |
+ } |
+ type.set$span(expr.get$span()); |
+ return type; |
+ } |
+ else { |
+ this._lang_error('expected type reference'); |
+ return null; |
+ } |
+} |
+Parser.prototype.infixExpression = function(precedence) { |
+ return this.finishInfixExpression(this.unaryExpression(), precedence); |
+} |
+Parser.prototype._finishDeclaredId = function(type) { |
+ var name = this.identifier(); |
+ return this.finishPostfixExpression(new DeclaredIdentifier(type, name, this._makeSpan(type.get$span().get$start()))); |
+} |
+Parser.prototype._fixAsType = function(x) { |
+ if (this._maybeEat(53/*TokenKind.GT*/)) { |
+ var base = this._makeType(x.x); |
+ var typeParam = this._makeType(x.y); |
+ var type = new GenericTypeReference(base, [typeParam], 0, this._makeSpan(x.span.start)); |
+ return this._finishDeclaredId(type); |
+ } |
+ else { |
+ var base = this._makeType(x.x); |
+ var paramBase = this._makeType(x.y); |
+ var firstParam = this.addTypeArguments(paramBase, 1); |
+ var type; |
+ if (firstParam.get$depth() <= 0) { |
+ type = new GenericTypeReference(base, [firstParam], 0, this._makeSpan(x.span.start)); |
+ } |
+ else if (this._maybeEat(11/*TokenKind.COMMA*/)) { |
+ type = this._finishTypeArguments(base, 0, [firstParam]); |
+ } |
+ else { |
+ this._eat(53/*TokenKind.GT*/); |
+ type = new GenericTypeReference(base, [firstParam], 0, this._makeSpan(x.span.start)); |
+ } |
+ return this._finishDeclaredId(type); |
+ } |
+} |
+Parser.prototype.finishInfixExpression = function(x, precedence) { |
+ while (true) { |
+ var kind = this._peek(); |
+ var prec = TokenKind.infixPrecedence(this._peek()); |
+ if (prec >= precedence) { |
+ if (kind == 52/*TokenKind.LT*/ || kind == 53/*TokenKind.GT*/) { |
+ if (this._isBin(x, 52/*TokenKind.LT*/)) { |
+ return this._fixAsType(x); |
+ } |
+ } |
+ var op = this._lang_next(); |
+ if ($eq(op.get$kind(), 103/*TokenKind.IS*/)) { |
+ var isTrue = !this._maybeEat(19/*TokenKind.NOT*/); |
+ var typeRef = this.type(0); |
+ x = new IsExpression(isTrue, x, typeRef, this._makeSpan(x.span.start)); |
+ continue; |
+ } |
+ var y = this.infixExpression($eq(prec, 2) ? prec : prec + 1); |
+ if ($eq(op.get$kind(), 33/*TokenKind.CONDITIONAL*/)) { |
+ this._eat(8/*TokenKind.COLON*/); |
+ var z = this.infixExpression(prec); |
+ x = new ConditionalExpression(x, y, z, this._makeSpan(x.span.start)); |
+ } |
+ else { |
+ x = new BinaryExpression(op, x, y, this._makeSpan(x.span.start)); |
+ } |
+ } |
+ else { |
+ break; |
+ } |
+ } |
+ return x; |
+} |
+Parser.prototype._isPrefixUnaryOperator = function(kind) { |
+ switch (kind) { |
+ case 42/*TokenKind.ADD*/: |
+ case 43/*TokenKind.SUB*/: |
+ case 19/*TokenKind.NOT*/: |
+ case 18/*TokenKind.BIT_NOT*/: |
+ case 16/*TokenKind.INCR*/: |
+ case 17/*TokenKind.DECR*/: |
+ |
+ return true; |
+ |
+ default: |
+ |
+ return false; |
+ |
+ } |
+} |
+Parser.prototype.unaryExpression = function() { |
+ var start = this._peekToken.start; |
+ if (this._isPrefixUnaryOperator(this._peek())) { |
+ var tok = this._lang_next(); |
+ var expr = this.unaryExpression(); |
+ return new UnaryExpression(tok, expr, this._makeSpan(start)); |
+ } |
+ else if (this.get$enableAwait() && this._maybeEat(88/*TokenKind.AWAIT*/)) { |
+ var expr = this.unaryExpression(); |
+ return new AwaitExpression(expr, this._makeSpan(start)); |
+ } |
+ return this.finishPostfixExpression(this.primary()); |
+} |
+Parser.prototype.argument = function() { |
+ var start = this._peekToken.start; |
+ var expr; |
+ var label = null; |
+ if (this._maybeEat(15/*TokenKind.ELLIPSIS*/)) { |
+ label = new Identifier('...', this._makeSpan(start)); |
+ } |
+ expr = this.expression(); |
+ if (label == null && this._maybeEat(8/*TokenKind.COLON*/)) { |
+ label = this._makeLabel(expr); |
+ expr = this.expression(); |
+ } |
+ return new ArgumentNode(label, expr, this._makeSpan(start)); |
+} |
+Parser.prototype.arguments = function() { |
+ var args = []; |
+ this._eatLeftParen(); |
+ var saved = this._inhibitLambda; |
+ this._inhibitLambda = false; |
+ if (!this._maybeEat(3/*TokenKind.RPAREN*/)) { |
+ do { |
+ args.add$1(this.argument()); |
+ } |
+ while (this._maybeEat(11/*TokenKind.COMMA*/)) |
+ this._eat(3/*TokenKind.RPAREN*/); |
+ } |
+ this._inhibitLambda = saved; |
+ return args; |
+} |
+Parser.prototype.get$arguments = function() { |
+ return Parser.prototype.arguments.bind(this); |
+} |
+Parser.prototype.finishPostfixExpression = function(expr) { |
+ switch (this._peek()) { |
+ case 2/*TokenKind.LPAREN*/: |
+ |
+ return this.finishCallOrLambdaExpression(expr); |
+ |
+ case 4/*TokenKind.LBRACK*/: |
+ |
+ this._eat(4/*TokenKind.LBRACK*/); |
+ var index = this.expression(); |
+ this._eat(5/*TokenKind.RBRACK*/); |
+ return this.finishPostfixExpression(new IndexExpression(expr, index, this._makeSpan(expr.get$span().get$start()))); |
+ |
+ case 14/*TokenKind.DOT*/: |
+ |
+ this._eat(14/*TokenKind.DOT*/); |
+ var name = this.identifier(); |
+ var ret = new DotExpression(expr, name, this._makeSpan(expr.get$span().get$start())); |
+ return this.finishPostfixExpression(ret); |
+ |
+ case 16/*TokenKind.INCR*/: |
+ case 17/*TokenKind.DECR*/: |
+ |
+ var tok = this._lang_next(); |
+ return new PostfixExpression(expr, tok, this._makeSpan(expr.get$span().get$start())); |
+ |
+ case 9/*TokenKind.ARROW*/: |
+ case 6/*TokenKind.LBRACE*/: |
+ |
+ return expr; |
+ |
+ default: |
+ |
+ if (this._peekIdentifier()) { |
+ return this.finishPostfixExpression(new DeclaredIdentifier(this._makeType(expr), this.identifier(), this._makeSpan(expr.get$span().get$start()))); |
+ } |
+ else { |
+ return expr; |
+ } |
+ |
+ } |
+} |
+Parser.prototype.finishCallOrLambdaExpression = function(expr) { |
+ if (this._atClosureParameters()) { |
+ var formals = this.formalParameterList(); |
+ var body = this.functionBody(true); |
+ return this._makeFunction(expr, formals, body); |
+ } |
+ else { |
+ if ((expr instanceof DeclaredIdentifier)) { |
+ this._lang_error('illegal target for call, did you mean to declare a function?', expr.get$span()); |
+ } |
+ var args = this.arguments(); |
+ return this.finishPostfixExpression(new CallExpression(expr, args, this._makeSpan(expr.get$span().get$start()))); |
+ } |
+} |
+Parser.prototype._isBin = function(expr, kind) { |
+ return (expr instanceof BinaryExpression) && $eq(expr.get$op().get$kind(), kind); |
+} |
+Parser.prototype._boolTypeRef = function(span) { |
+ return new TypeReference(span, $globals.world.nonNullBool); |
+} |
+Parser.prototype._intTypeRef = function(span) { |
+ return new TypeReference(span, $globals.world.intType); |
+} |
+Parser.prototype._doubleTypeRef = function(span) { |
+ return new TypeReference(span, $globals.world.doubleType); |
+} |
+Parser.prototype._stringTypeRef = function(span) { |
+ return new TypeReference(span, $globals.world.stringType); |
+} |
+Parser.prototype.primary = function() { |
+ var start = this._peekToken.start; |
+ switch (this._peek()) { |
+ case 109/*TokenKind.THIS*/: |
+ |
+ this._eat(109/*TokenKind.THIS*/); |
+ return new ThisExpression(this._makeSpan(start)); |
+ |
+ case 107/*TokenKind.SUPER*/: |
+ |
+ this._eat(107/*TokenKind.SUPER*/); |
+ return new SuperExpression(this._makeSpan(start)); |
+ |
+ case 92/*TokenKind.CONST*/: |
+ |
+ this._eat(92/*TokenKind.CONST*/); |
+ if (this._peekKind(4/*TokenKind.LBRACK*/) || this._peekKind(56/*TokenKind.INDEX*/)) { |
+ return this.finishListLiteral(start, true, null); |
+ } |
+ else if (this._peekKind(6/*TokenKind.LBRACE*/)) { |
+ return this.finishMapLiteral(start, true, null); |
+ } |
+ else if (this._peekKind(52/*TokenKind.LT*/)) { |
+ return this.finishTypedLiteral(start, true); |
+ } |
+ else { |
+ return this.finishNewExpression(start, true); |
+ } |
+ |
+ case 104/*TokenKind.NEW*/: |
+ |
+ this._eat(104/*TokenKind.NEW*/); |
+ return this.finishNewExpression(start, false); |
+ |
+ case 2/*TokenKind.LPAREN*/: |
+ |
+ return this._parenOrLambda(); |
+ |
+ case 4/*TokenKind.LBRACK*/: |
+ case 56/*TokenKind.INDEX*/: |
+ |
+ return this.finishListLiteral(start, false, null); |
+ |
+ case 6/*TokenKind.LBRACE*/: |
+ |
+ return this.finishMapLiteral(start, false, null); |
+ |
+ case 105/*TokenKind.NULL*/: |
+ |
+ this._eat(105/*TokenKind.NULL*/); |
+ return new NullExpression(this._makeSpan(start)); |
+ |
+ case 111/*TokenKind.TRUE*/: |
+ |
+ this._eat(111/*TokenKind.TRUE*/); |
+ return new LiteralExpression(true, this._boolTypeRef(this._makeSpan(start)), 'true', this._makeSpan(start)); |
+ |
+ case 97/*TokenKind.FALSE*/: |
+ |
+ this._eat(97/*TokenKind.FALSE*/); |
+ return new LiteralExpression(false, this._boolTypeRef(this._makeSpan(start)), 'false', this._makeSpan(start)); |
+ |
+ case 61/*TokenKind.HEX_INTEGER*/: |
+ |
+ var t = this._lang_next(); |
+ return new LiteralExpression(Parser.parseHex(t.get$text().substring$1(2)), this._intTypeRef(this._makeSpan(start)), t.get$text(), this._makeSpan(start)); |
+ |
+ case 60/*TokenKind.INTEGER*/: |
+ |
+ var t = this._lang_next(); |
+ return new LiteralExpression(Math.parseInt(t.get$text()), this._intTypeRef(this._makeSpan(start)), t.get$text(), this._makeSpan(start)); |
+ |
+ case 62/*TokenKind.DOUBLE*/: |
+ |
+ var t = this._lang_next(); |
+ return new LiteralExpression(Math.parseDouble(t.get$text()), this._doubleTypeRef(this._makeSpan(start)), t.get$text(), this._makeSpan(start)); |
+ |
+ case 58/*TokenKind.STRING*/: |
+ |
+ return this.stringLiteralExpr(); |
+ |
+ case 66/*TokenKind.INCOMPLETE_STRING*/: |
+ |
+ return this.stringInterpolation(); |
+ |
+ case 52/*TokenKind.LT*/: |
+ |
+ return this.finishTypedLiteral(start, false); |
+ |
+ case 114/*TokenKind.VOID*/: |
+ case 113/*TokenKind.VAR*/: |
+ case 98/*TokenKind.FINAL*/: |
+ |
+ return this.declaredIdentifier(false); |
+ |
+ default: |
+ |
+ if (!this._peekIdentifier()) { |
+ this._errorExpected('expression'); |
+ } |
+ return new VarExpression(this.identifier(), this._makeSpan(start)); |
+ |
+ } |
+} |
+Parser.prototype.stringInterpolation = function() { |
+ var start = this._peekToken.start; |
+ var lits = []; |
+ var startQuote = null, endQuote = null; |
+ while (this._peekKind(66/*TokenKind.INCOMPLETE_STRING*/)) { |
+ var token = this._lang_next(); |
+ var text = token.get$text(); |
+ if (startQuote == null) { |
+ if (isMultilineString(text)) { |
+ endQuote = text.substring$2(0, 3); |
+ startQuote = endQuote + '\n'; |
+ } |
+ else { |
+ startQuote = endQuote = text.$index(0); |
+ } |
+ text = text.substring$2(0, text.length - 1) + endQuote; |
+ } |
+ else { |
+ text = startQuote + text.substring$2(0, text.length - 1) + endQuote; |
+ } |
+ lits.add$1(this.makeStringLiteral(text, token.get$span())); |
+ if (this._maybeEat(6/*TokenKind.LBRACE*/)) { |
+ lits.add$1(this.expression()); |
+ this._eat(7/*TokenKind.RBRACE*/); |
+ } |
+ else if (this._maybeEat(109/*TokenKind.THIS*/)) { |
+ lits.add$1(new ThisExpression(this._previousToken.get$span())); |
+ } |
+ else { |
+ var id = this.identifier(); |
+ lits.add$1(new VarExpression(id, id.get$span())); |
+ } |
+ } |
+ var tok = this._lang_next(); |
+ if ($ne(tok.get$kind(), 58/*TokenKind.STRING*/)) { |
+ this._errorExpected('interpolated string'); |
+ } |
+ var text = startQuote + tok.get$text(); |
+ lits.add$1(this.makeStringLiteral(text, tok.get$span())); |
+ var span = this._makeSpan(start); |
+ return new LiteralExpression(lits, this._stringTypeRef(span), '\$\$\$', span); |
+} |
+Parser.prototype.makeStringLiteral = function(text, span) { |
+ return new LiteralExpression(text, this._stringTypeRef(span), text, span); |
+} |
+Parser.prototype.stringLiteralExpr = function() { |
+ var token = this._lang_next(); |
+ return this.makeStringLiteral(token.get$text(), token.get$span()); |
+} |
+Parser.prototype.maybeStringLiteral = function() { |
+ var kind = this._peek(); |
+ if ($eq(kind, 58/*TokenKind.STRING*/)) { |
+ return parseStringLiteral(this._lang_next().get$text()); |
+ } |
+ else if ($eq(kind, 59/*TokenKind.STRING_PART*/)) { |
+ this._lang_next(); |
+ this._errorExpected('string literal, but found interpolated string start'); |
+ } |
+ else if ($eq(kind, 66/*TokenKind.INCOMPLETE_STRING*/)) { |
+ this._lang_next(); |
+ this._errorExpected('string literal, but found incomplete string'); |
+ } |
+ return null; |
+} |
+Parser.prototype._parenOrLambda = function() { |
+ var start = this._peekToken.start; |
+ if (this._atClosureParameters()) { |
+ var formals = this.formalParameterList(); |
+ var body = this.functionBody(true); |
+ var func = new FunctionDefinition(null, null, null, formals, null, null, null, body, this._makeSpan(start)); |
+ return new LambdaExpression(func, func.get$span()); |
+ } |
+ else { |
+ this._eatLeftParen(); |
+ var saved = this._inhibitLambda; |
+ this._inhibitLambda = false; |
+ var expr = this.expression(); |
+ this._eat(3/*TokenKind.RPAREN*/); |
+ this._inhibitLambda = saved; |
+ return new ParenExpression(expr, this._makeSpan(start)); |
+ } |
+} |
+Parser.prototype._atClosureParameters = function() { |
+ if (this._inhibitLambda) return false; |
+ var after = this._peekAfterCloseParen(); |
+ return after.kind == 9/*TokenKind.ARROW*/ || after.kind == 6/*TokenKind.LBRACE*/; |
+} |
+Parser.prototype._eatLeftParen = function() { |
+ this._eat(2/*TokenKind.LPAREN*/); |
+ this._afterParensIndex++; |
+} |
+Parser.prototype._peekAfterCloseParen = function() { |
+ if (this._afterParensIndex < this._afterParens.length) { |
+ return this._afterParens.$index(this._afterParensIndex); |
+ } |
+ this._afterParensIndex = 0; |
+ this._afterParens.clear(); |
+ var tokens = [this._lang_next()]; |
+ this._lookaheadAfterParens(tokens); |
+ var after = this._peekToken; |
+ tokens.add$1(after); |
+ this.tokenizer = new DivertedTokenSource(tokens, this, this.tokenizer); |
+ this._lang_next(); |
+ return after; |
+} |
+Parser.prototype._lookaheadAfterParens = function(tokens) { |
+ var saved = this._afterParens.length; |
+ this._afterParens.add(null); |
+ while (true) { |
+ var token = this._lang_next(); |
+ tokens.add(token); |
+ var kind = token.kind; |
+ if (kind == 3/*TokenKind.RPAREN*/ || kind == 1/*TokenKind.END_OF_FILE*/) { |
+ this._afterParens.$setindex(saved, this._peekToken); |
+ return; |
+ } |
+ else if (kind == 2/*TokenKind.LPAREN*/) { |
+ this._lookaheadAfterParens(tokens); |
+ } |
+ } |
+} |
+Parser.prototype._typeAsIdentifier = function(type) { |
+ return type.get$name(); |
+} |
+Parser.prototype._specialIdentifier = function(includeOperators) { |
+ var start = this._peekToken.start; |
+ var name; |
+ switch (this._peek()) { |
+ case 15/*TokenKind.ELLIPSIS*/: |
+ |
+ this._eat(15/*TokenKind.ELLIPSIS*/); |
+ this._lang_error('rest no longer supported', this._previousToken.get$span()); |
+ name = this.identifier().get$name(); |
+ break; |
+ |
+ case 109/*TokenKind.THIS*/: |
+ |
+ this._eat(109/*TokenKind.THIS*/); |
+ this._eat(14/*TokenKind.DOT*/); |
+ name = ('this.' + this.identifier().get$name()); |
+ break; |
+ |
+ case 76/*TokenKind.GET*/: |
+ |
+ if (!includeOperators) return null; |
+ this._eat(76/*TokenKind.GET*/); |
+ if (this._peekIdentifier()) { |
+ name = ('get:' + this.identifier().get$name()); |
+ } |
+ else { |
+ name = 'get'; |
+ } |
+ break; |
+ |
+ case 84/*TokenKind.SET*/: |
+ |
+ if (!includeOperators) return null; |
+ this._eat(84/*TokenKind.SET*/); |
+ if (this._peekIdentifier()) { |
+ name = ('set:' + this.identifier().get$name()); |
+ } |
+ else { |
+ name = 'set'; |
+ } |
+ break; |
+ |
+ case 83/*TokenKind.OPERATOR*/: |
+ |
+ if (!includeOperators) return null; |
+ this._eat(83/*TokenKind.OPERATOR*/); |
+ var kind = this._peek(); |
+ if ($eq(kind, 82/*TokenKind.NEGATE*/)) { |
+ name = ':negate'; |
+ this._lang_next(); |
+ } |
+ else { |
+ name = TokenKind.binaryMethodName(kind); |
+ if (name == null) { |
+ name = 'operator'; |
+ } |
+ else { |
+ this._lang_next(); |
+ } |
+ } |
+ break; |
+ |
+ default: |
+ |
+ return null; |
+ |
+ } |
+ return new Identifier(name, this._makeSpan(start)); |
+} |
+Parser.prototype.declaredIdentifier = function(includeOperators) { |
+ var start = this._peekToken.start; |
+ var myType = null; |
+ var name = this._specialIdentifier(includeOperators); |
+ if (name == null) { |
+ myType = this.type(0); |
+ name = this._specialIdentifier(includeOperators); |
+ if (name == null) { |
+ if (this._peekIdentifier()) { |
+ name = this.identifier(); |
+ } |
+ else if ((myType instanceof NameTypeReference) && myType.get$names() == null) { |
+ name = this._typeAsIdentifier(myType); |
+ myType = null; |
+ } |
+ else { |
+ } |
+ } |
+ } |
+ return new DeclaredIdentifier(myType, name, this._makeSpan(start)); |
+} |
+Parser._hexDigit = function(c) { |
+ if (c >= 48 && c <= 57) { |
+ return c - 48; |
+ } |
+ else if (c >= 97 && c <= 102) { |
+ return c - 87; |
+ } |
+ else if (c >= 65 && c <= 70) { |
+ return c - 55; |
+ } |
+ else { |
+ return -1; |
+ } |
+} |
+Parser.parseHex = function(hex) { |
+ var result = 0; |
+ for (var i = 0; |
+ i < hex.length; i++) { |
+ var digit = Parser._hexDigit(hex.charCodeAt(i)); |
+ result = (result * 16) + digit; |
+ } |
+ return result; |
+} |
+Parser.prototype.finishNewExpression = function(start, isConst) { |
+ var type = this.type(0); |
+ var name = null; |
+ if (this._maybeEat(14/*TokenKind.DOT*/)) { |
+ name = this.identifier(); |
+ } |
+ var args = this.arguments(); |
+ return new NewExpression(isConst, type, name, args, this._makeSpan(start)); |
+} |
+Parser.prototype.finishListLiteral = function(start, isConst, type) { |
+ if (this._maybeEat(56/*TokenKind.INDEX*/)) { |
+ return new ListExpression(isConst, type, [], this._makeSpan(start)); |
+ } |
+ var values = []; |
+ this._eat(4/*TokenKind.LBRACK*/); |
+ while (!this._maybeEat(5/*TokenKind.RBRACK*/)) { |
+ values.add$1(this.expression()); |
+ if (this._recover && !this._recoverTo(5/*TokenKind.RBRACK*/, 11/*TokenKind.COMMA*/)) break; |
+ if (!this._maybeEat(11/*TokenKind.COMMA*/)) { |
+ this._eat(5/*TokenKind.RBRACK*/); |
+ break; |
+ } |
+ } |
+ return new ListExpression(isConst, type, values, this._makeSpan(start)); |
+} |
+Parser.prototype.finishMapLiteral = function(start, isConst, type) { |
+ var items = []; |
+ this._eat(6/*TokenKind.LBRACE*/); |
+ while (!this._maybeEat(7/*TokenKind.RBRACE*/)) { |
+ items.add$1(this.expression()); |
+ this._eat(8/*TokenKind.COLON*/); |
+ items.add$1(this.expression()); |
+ if (this._recover && !this._recoverTo(7/*TokenKind.RBRACE*/, 11/*TokenKind.COMMA*/)) break; |
+ if (!this._maybeEat(11/*TokenKind.COMMA*/)) { |
+ this._eat(7/*TokenKind.RBRACE*/); |
+ break; |
+ } |
+ } |
+ return new MapExpression(isConst, type, items, this._makeSpan(start)); |
+} |
+Parser.prototype.finishTypedLiteral = function(start, isConst) { |
+ var span = this._makeSpan(start); |
+ var typeToBeNamedLater = new NameTypeReference(false, null, null, span); |
+ var genericType = this.addTypeArguments(typeToBeNamedLater, 0); |
+ if (this._peekKind(4/*TokenKind.LBRACK*/) || this._peekKind(56/*TokenKind.INDEX*/)) { |
+ genericType.set$baseType(new TypeReference(span, $globals.world.listType)); |
+ return this.finishListLiteral(start, isConst, genericType); |
+ } |
+ else if (this._peekKind(6/*TokenKind.LBRACE*/)) { |
+ genericType.set$baseType(new TypeReference(span, $globals.world.mapType)); |
+ var typeArgs = genericType.get$typeArguments(); |
+ if ($eq(typeArgs.length, 1)) { |
+ genericType.set$typeArguments([new TypeReference(span, $globals.world.stringType), typeArgs.$index(0)]); |
+ } |
+ else if ($eq(typeArgs.length, 2)) { |
+ var keyType = typeArgs.$index(0); |
+ if (!(keyType instanceof NameTypeReference) || $ne(keyType.get$name().get$name(), "String")) { |
+ $globals.world.error('the key type of a map literal is implicitly "String"', keyType.get$span()); |
+ } |
+ else { |
+ $globals.world.warning('a map literal takes one type argument specifying the value type', keyType.get$span()); |
+ } |
+ } |
+ return this.finishMapLiteral(start, isConst, genericType); |
+ } |
+ else { |
+ this._errorExpected('array or map literal'); |
+ } |
+} |
+Parser.prototype._readModifiers = function() { |
+ var modifiers = null; |
+ while (true) { |
+ switch (this._peek()) { |
+ case 86/*TokenKind.STATIC*/: |
+ case 98/*TokenKind.FINAL*/: |
+ case 92/*TokenKind.CONST*/: |
+ case 71/*TokenKind.ABSTRACT*/: |
+ case 75/*TokenKind.FACTORY*/: |
+ |
+ if (modifiers == null) modifiers = []; |
+ modifiers.add$1(this._lang_next()); |
+ break; |
+ |
+ default: |
+ |
+ return modifiers; |
+ |
+ } |
+ } |
+ return null; |
+} |
+Parser.prototype.typeParameter = function() { |
+ var start = this._peekToken.start; |
+ var name = this.identifier(); |
+ var myType = null; |
+ if (this._maybeEat(74/*TokenKind.EXTENDS*/)) { |
+ myType = this.type(1); |
+ } |
+ var tp = new TypeParameter(name, myType, this._makeSpan(start)); |
+ return new ParameterType(name.get$name(), tp); |
+} |
+Parser.prototype.get$typeParameter = function() { |
+ return Parser.prototype.typeParameter.bind(this); |
+} |
+Parser.prototype.typeParameters = function() { |
+ this._eat(52/*TokenKind.LT*/); |
+ var closed = false; |
+ var ret = []; |
+ do { |
+ var tp = this.typeParameter(); |
+ ret.add$1(tp); |
+ if ((tp.get$typeParameter().get$extendsType() instanceof GenericTypeReference) && $eq(tp.get$typeParameter().get$extendsType().get$depth(), 0)) { |
+ closed = true; |
+ break; |
+ } |
+ } |
+ while (this._maybeEat(11/*TokenKind.COMMA*/)) |
+ if (!closed) { |
+ this._eat(53/*TokenKind.GT*/); |
+ } |
+ return ret; |
+} |
+Parser.prototype.get$typeParameters = function() { |
+ return Parser.prototype.typeParameters.bind(this); |
+} |
+Parser.prototype._eatClosingAngle = function(depth) { |
+ if (this._maybeEat(53/*TokenKind.GT*/)) { |
+ return depth; |
+ } |
+ else if (depth > 0 && this._maybeEat(40/*TokenKind.SAR*/)) { |
+ return depth - 1; |
+ } |
+ else if (depth > 1 && this._maybeEat(41/*TokenKind.SHR*/)) { |
+ return depth - 2; |
+ } |
+ else { |
+ this._errorExpected('>'); |
+ return depth; |
+ } |
+} |
+Parser.prototype.addTypeArguments = function(baseType, depth) { |
+ this._eat(52/*TokenKind.LT*/); |
+ return this._finishTypeArguments(baseType, depth, []); |
+} |
+Parser.prototype._finishTypeArguments = function(baseType, depth, types) { |
+ var delta = -1; |
+ do { |
+ var myType = this.type(depth + 1); |
+ types.add$1(myType); |
+ if ((myType instanceof GenericTypeReference) && myType.get$depth() <= depth) { |
+ delta = depth - myType.get$depth(); |
+ break; |
+ } |
+ } |
+ while (this._maybeEat(11/*TokenKind.COMMA*/)) |
+ if (delta >= 0) { |
+ depth = depth - delta; |
+ } |
+ else { |
+ depth = this._eatClosingAngle(depth); |
+ } |
+ var span = this._makeSpan(baseType.span.start); |
+ return new GenericTypeReference(baseType, types, depth, span); |
+} |
+Parser.prototype.typeList = function() { |
+ var types = []; |
+ do { |
+ types.add$1(this.type(0)); |
+ } |
+ while (this._maybeEat(11/*TokenKind.COMMA*/)) |
+ return types; |
+} |
+Parser.prototype.nameTypeReference = function() { |
+ var start = this._peekToken.start; |
+ var name; |
+ var names = null; |
+ var typeArgs = null; |
+ var isFinal = false; |
+ switch (this._peek()) { |
+ case 114/*TokenKind.VOID*/: |
+ |
+ return new TypeReference(this._lang_next().get$span(), $globals.world.voidType); |
+ |
+ case 113/*TokenKind.VAR*/: |
+ |
+ return new TypeReference(this._lang_next().get$span(), $globals.world.varType); |
+ |
+ case 98/*TokenKind.FINAL*/: |
+ |
+ this._eat(98/*TokenKind.FINAL*/); |
+ isFinal = true; |
+ name = this.identifier(); |
+ break; |
+ |
+ default: |
+ |
+ name = this.identifier(); |
+ break; |
+ |
+ } |
+ while (this._maybeEat(14/*TokenKind.DOT*/)) { |
+ if (names == null) names = []; |
+ names.add$1(this.identifier()); |
+ } |
+ return new NameTypeReference(isFinal, name, names, this._makeSpan(start)); |
+} |
+Parser.prototype.type = function(depth) { |
+ var typeRef = this.nameTypeReference(); |
+ if (this._peekKind(52/*TokenKind.LT*/)) { |
+ return this.addTypeArguments(typeRef, depth); |
+ } |
+ else { |
+ return typeRef; |
+ } |
+} |
+Parser.prototype.get$type = function() { |
+ return Parser.prototype.type.bind(this); |
+} |
+Parser.prototype.formalParameter = function(inOptionalBlock) { |
+ var start = this._peekToken.start; |
+ var isThis = false; |
+ var isRest = false; |
+ var di = this.declaredIdentifier(false); |
+ var type = di.get$type(); |
+ var name = di.get$name(); |
+ var value = null; |
+ if (this._maybeEat(20/*TokenKind.ASSIGN*/)) { |
+ if (!inOptionalBlock) { |
+ this._lang_error('default values only allowed inside [optional] section'); |
+ } |
+ value = this.expression(); |
+ } |
+ else if (this._peekKind(2/*TokenKind.LPAREN*/)) { |
+ var formals = this.formalParameterList(); |
+ var func = new FunctionDefinition(null, type, name, formals, null, null, null, null, this._makeSpan(start)); |
+ type = new FunctionTypeReference(false, func, func.get$span()); |
+ } |
+ if (inOptionalBlock && value == null) { |
+ value = new NullExpression(this._makeSpan(start)); |
+ } |
+ return new FormalNode(isThis, isRest, type, name, value, this._makeSpan(start)); |
+} |
+Parser.prototype.formalParameterList = function() { |
+ this._eatLeftParen(); |
+ var formals = []; |
+ var inOptionalBlock = false; |
+ if (!this._maybeEat(3/*TokenKind.RPAREN*/)) { |
+ if (this._maybeEat(4/*TokenKind.LBRACK*/)) { |
+ inOptionalBlock = true; |
+ } |
+ formals.add$1(this.formalParameter(inOptionalBlock)); |
+ while (this._maybeEat(11/*TokenKind.COMMA*/)) { |
+ if (this._maybeEat(4/*TokenKind.LBRACK*/)) { |
+ if (inOptionalBlock) { |
+ this._lang_error('already inside an optional block', this._previousToken.get$span()); |
+ } |
+ inOptionalBlock = true; |
+ } |
+ formals.add$1(this.formalParameter(inOptionalBlock)); |
+ } |
+ if (inOptionalBlock) { |
+ this._eat(5/*TokenKind.RBRACK*/); |
+ } |
+ this._eat(3/*TokenKind.RPAREN*/); |
+ } |
+ return formals; |
+} |
+Parser.prototype.identifier = function() { |
+ var tok = this._lang_next(); |
+ if (!this._isIdentifier(tok.get$kind())) { |
+ this._lang_error(('expected identifier, but found ' + tok), tok.get$span()); |
+ } |
+ return new Identifier(tok.get$text(), this._makeSpan(tok.get$start())); |
+} |
+Parser.prototype._makeFunction = function(expr, formals, body) { |
+ var name, type; |
+ if ((expr instanceof VarExpression)) { |
+ name = expr.get$name(); |
+ type = null; |
+ } |
+ else if ((expr instanceof DeclaredIdentifier)) { |
+ name = expr.get$name(); |
+ type = expr.get$type(); |
+ } |
+ else { |
+ this._lang_error('bad function body', expr.get$span()); |
+ } |
+ var span = new SourceSpan(expr.get$span().get$file(), expr.get$span().get$start(), body.get$span().get$end()); |
+ var func = new FunctionDefinition(null, type, name, formals, null, null, null, body, span); |
+ return new LambdaExpression(func, func.get$span()); |
+} |
+Parser.prototype._makeDeclaredIdentifier = function(e) { |
+ if ((e instanceof VarExpression)) { |
+ return new DeclaredIdentifier(null, e.get$name(), e.get$span()); |
+ } |
+ else if ((e instanceof DeclaredIdentifier)) { |
+ return e; |
+ } |
+ else { |
+ this._lang_error('expected declared identifier'); |
+ return new DeclaredIdentifier(null, null, e.get$span()); |
+ } |
+} |
+Parser.prototype._makeLabel = function(expr) { |
+ if ((expr instanceof VarExpression)) { |
+ return expr.get$name(); |
+ } |
+ else { |
+ this._errorExpected('label'); |
+ return null; |
+ } |
+} |
+Parser.prototype.block$0 = Parser.prototype.block; |
+// ********** Code for IncompleteSourceException ************** |
+function IncompleteSourceException(token) { |
+ this.token = token; |
+ // Initializers done |
+} |
+IncompleteSourceException.prototype.toString = function() { |
+ if (this.token.get$span() == null) return ('Unexpected ' + this.token); |
+ return this.token.get$span().toMessageString(('Unexpected ' + this.token)); |
+} |
+IncompleteSourceException.prototype.toString$0 = IncompleteSourceException.prototype.toString; |
+// ********** Code for DivertedTokenSource ************** |
+function DivertedTokenSource(tokens, parser, previousTokenizer) { |
+ this._lang_pos = 0 |
+ this.tokens = tokens; |
+ this.parser = parser; |
+ this.previousTokenizer = previousTokenizer; |
+ // Initializers done |
+} |
+DivertedTokenSource.prototype.next = function() { |
+ var token = this.tokens.$index(this._lang_pos); |
+ ++this._lang_pos; |
+ if (this._lang_pos == this.tokens.length) { |
+ this.parser.tokenizer = this.previousTokenizer; |
+ } |
+ return token; |
+} |
+DivertedTokenSource.prototype.next$0 = DivertedTokenSource.prototype.next; |
+// ********** Code for Node ************** |
+function Node(span) { |
+ this.span = span; |
+ // Initializers done |
+} |
+Node.prototype.get$span = function() { return this.span; }; |
+Node.prototype.set$span = function(value) { return this.span = value; }; |
+Node.prototype.visit$1 = Node.prototype.visit; |
+// ********** Code for Statement ************** |
+$inherits(Statement, Node); |
+function Statement(span) { |
+ // Initializers done |
+ Node.call(this, span); |
+} |
+// ********** Code for Definition ************** |
+$inherits(Definition, Statement); |
+function Definition(span) { |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+Definition.prototype.get$typeParameters = function() { |
+ return null; |
+} |
+Definition.prototype.get$nativeType = function() { |
+ return null; |
+} |
+// ********** Code for Expression ************** |
+$inherits(Expression, Node); |
+function Expression(span) { |
+ // Initializers done |
+ Node.call(this, span); |
+} |
+// ********** Code for TypeReference ************** |
+$inherits(TypeReference, Node); |
+function TypeReference(span, type) { |
+ this.type = type; |
+ // Initializers done |
+ Node.call(this, span); |
+} |
+TypeReference.prototype.get$type = function() { return this.type; }; |
+TypeReference.prototype.set$type = function(value) { return this.type = value; }; |
+TypeReference.prototype.visit = function(visitor) { |
+ return visitor.visitTypeReference(this); |
+} |
+TypeReference.prototype.get$isFinal = function() { |
+ return false; |
+} |
+TypeReference.prototype.visit$1 = TypeReference.prototype.visit; |
+// ********** Code for DirectiveDefinition ************** |
+$inherits(DirectiveDefinition, Definition); |
+function DirectiveDefinition(name, arguments, span) { |
+ this.name = name; |
+ this.arguments = arguments; |
+ // Initializers done |
+ Definition.call(this, span); |
+} |
+DirectiveDefinition.prototype.get$name = function() { return this.name; }; |
+DirectiveDefinition.prototype.set$name = function(value) { return this.name = value; }; |
+DirectiveDefinition.prototype.get$arguments = function() { return this.arguments; }; |
+DirectiveDefinition.prototype.set$arguments = function(value) { return this.arguments = value; }; |
+DirectiveDefinition.prototype.visit = function(visitor) { |
+ return visitor.visitDirectiveDefinition(this); |
+} |
+DirectiveDefinition.prototype.visit$1 = DirectiveDefinition.prototype.visit; |
+// ********** Code for TypeDefinition ************** |
+$inherits(TypeDefinition, Definition); |
+function TypeDefinition(isClass, name, typeParameters, extendsTypes, implementsTypes, nativeType, factoryType, body, span) { |
+ this.isClass = isClass; |
+ this.name = name; |
+ this.typeParameters = typeParameters; |
+ this.extendsTypes = extendsTypes; |
+ this.implementsTypes = implementsTypes; |
+ this.nativeType = nativeType; |
+ this.factoryType = factoryType; |
+ this.body = body; |
+ // Initializers done |
+ Definition.call(this, span); |
+} |
+TypeDefinition.prototype.get$isClass = function() { return this.isClass; }; |
+TypeDefinition.prototype.set$isClass = function(value) { return this.isClass = value; }; |
+TypeDefinition.prototype.get$name = function() { return this.name; }; |
+TypeDefinition.prototype.set$name = function(value) { return this.name = value; }; |
+TypeDefinition.prototype.get$typeParameters = function() { return this.typeParameters; }; |
+TypeDefinition.prototype.set$typeParameters = function(value) { return this.typeParameters = value; }; |
+TypeDefinition.prototype.get$nativeType = function() { return this.nativeType; }; |
+TypeDefinition.prototype.set$nativeType = function(value) { return this.nativeType = value; }; |
+TypeDefinition.prototype.get$body = function() { return this.body; }; |
+TypeDefinition.prototype.set$body = function(value) { return this.body = value; }; |
+TypeDefinition.prototype.visit = function(visitor) { |
+ return visitor.visitTypeDefinition(this); |
+} |
+TypeDefinition.prototype.visit$1 = TypeDefinition.prototype.visit; |
+// ********** Code for FunctionTypeDefinition ************** |
+$inherits(FunctionTypeDefinition, Definition); |
+function FunctionTypeDefinition(func, typeParameters, span) { |
+ this.func = func; |
+ this.typeParameters = typeParameters; |
+ // Initializers done |
+ Definition.call(this, span); |
+} |
+FunctionTypeDefinition.prototype.get$func = function() { return this.func; }; |
+FunctionTypeDefinition.prototype.set$func = function(value) { return this.func = value; }; |
+FunctionTypeDefinition.prototype.get$typeParameters = function() { return this.typeParameters; }; |
+FunctionTypeDefinition.prototype.set$typeParameters = function(value) { return this.typeParameters = value; }; |
+FunctionTypeDefinition.prototype.visit = function(visitor) { |
+ return visitor.visitFunctionTypeDefinition(this); |
+} |
+FunctionTypeDefinition.prototype.visit$1 = FunctionTypeDefinition.prototype.visit; |
+// ********** Code for VariableDefinition ************** |
+$inherits(VariableDefinition, Definition); |
+function VariableDefinition(modifiers, type, names, values, span) { |
+ this.modifiers = modifiers; |
+ this.type = type; |
+ this.names = names; |
+ this.values = values; |
+ // Initializers done |
+ Definition.call(this, span); |
+} |
+VariableDefinition.prototype.get$type = function() { return this.type; }; |
+VariableDefinition.prototype.set$type = function(value) { return this.type = value; }; |
+VariableDefinition.prototype.get$names = function() { return this.names; }; |
+VariableDefinition.prototype.set$names = function(value) { return this.names = value; }; |
+VariableDefinition.prototype.get$values = function() { return this.values; }; |
+VariableDefinition.prototype.set$values = function(value) { return this.values = value; }; |
+VariableDefinition.prototype.visit = function(visitor) { |
+ return visitor.visitVariableDefinition(this); |
+} |
+VariableDefinition.prototype.visit$1 = VariableDefinition.prototype.visit; |
+// ********** Code for FunctionDefinition ************** |
+$inherits(FunctionDefinition, Definition); |
+function FunctionDefinition(modifiers, returnType, name, formals, typeParameters, initializers, nativeBody, body, span) { |
+ this.modifiers = modifiers; |
+ this.returnType = returnType; |
+ this.name = name; |
+ this.formals = formals; |
+ this.typeParameters = typeParameters; |
+ this.initializers = initializers; |
+ this.nativeBody = nativeBody; |
+ this.body = body; |
+ // Initializers done |
+ Definition.call(this, span); |
+} |
+FunctionDefinition.prototype.get$returnType = function() { return this.returnType; }; |
+FunctionDefinition.prototype.set$returnType = function(value) { return this.returnType = value; }; |
+FunctionDefinition.prototype.get$name = function() { return this.name; }; |
+FunctionDefinition.prototype.set$name = function(value) { return this.name = value; }; |
+FunctionDefinition.prototype.get$typeParameters = function() { return this.typeParameters; }; |
+FunctionDefinition.prototype.set$typeParameters = function(value) { return this.typeParameters = value; }; |
+FunctionDefinition.prototype.get$initializers = function() { return this.initializers; }; |
+FunctionDefinition.prototype.set$initializers = function(value) { return this.initializers = value; }; |
+FunctionDefinition.prototype.get$nativeBody = function() { return this.nativeBody; }; |
+FunctionDefinition.prototype.set$nativeBody = function(value) { return this.nativeBody = value; }; |
+FunctionDefinition.prototype.get$body = function() { return this.body; }; |
+FunctionDefinition.prototype.set$body = function(value) { return this.body = value; }; |
+FunctionDefinition.prototype.visit = function(visitor) { |
+ return visitor.visitFunctionDefinition(this); |
+} |
+FunctionDefinition.prototype.visit$1 = FunctionDefinition.prototype.visit; |
+// ********** Code for ReturnStatement ************** |
+$inherits(ReturnStatement, Statement); |
+function ReturnStatement(value, span) { |
+ this.value = value; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+ReturnStatement.prototype.get$value = function() { return this.value; }; |
+ReturnStatement.prototype.set$value = function(value) { return this.value = value; }; |
+ReturnStatement.prototype.visit = function(visitor) { |
+ return visitor.visitReturnStatement(this); |
+} |
+ReturnStatement.prototype.visit$1 = ReturnStatement.prototype.visit; |
+// ********** Code for ThrowStatement ************** |
+$inherits(ThrowStatement, Statement); |
+function ThrowStatement(value, span) { |
+ this.value = value; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+ThrowStatement.prototype.get$value = function() { return this.value; }; |
+ThrowStatement.prototype.set$value = function(value) { return this.value = value; }; |
+ThrowStatement.prototype.visit = function(visitor) { |
+ return visitor.visitThrowStatement(this); |
+} |
+ThrowStatement.prototype.visit$1 = ThrowStatement.prototype.visit; |
+// ********** Code for AssertStatement ************** |
+$inherits(AssertStatement, Statement); |
+function AssertStatement(test, span) { |
+ this.test = test; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+AssertStatement.prototype.visit = function(visitor) { |
+ return visitor.visitAssertStatement(this); |
+} |
+AssertStatement.prototype.visit$1 = AssertStatement.prototype.visit; |
+// ********** Code for BreakStatement ************** |
+$inherits(BreakStatement, Statement); |
+function BreakStatement(label, span) { |
+ this.label = label; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+BreakStatement.prototype.get$label = function() { return this.label; }; |
+BreakStatement.prototype.set$label = function(value) { return this.label = value; }; |
+BreakStatement.prototype.visit = function(visitor) { |
+ return visitor.visitBreakStatement(this); |
+} |
+BreakStatement.prototype.visit$1 = BreakStatement.prototype.visit; |
+// ********** Code for ContinueStatement ************** |
+$inherits(ContinueStatement, Statement); |
+function ContinueStatement(label, span) { |
+ this.label = label; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+ContinueStatement.prototype.get$label = function() { return this.label; }; |
+ContinueStatement.prototype.set$label = function(value) { return this.label = value; }; |
+ContinueStatement.prototype.visit = function(visitor) { |
+ return visitor.visitContinueStatement(this); |
+} |
+ContinueStatement.prototype.visit$1 = ContinueStatement.prototype.visit; |
+// ********** Code for IfStatement ************** |
+$inherits(IfStatement, Statement); |
+function IfStatement(test, trueBranch, falseBranch, span) { |
+ this.test = test; |
+ this.trueBranch = trueBranch; |
+ this.falseBranch = falseBranch; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+IfStatement.prototype.visit = function(visitor) { |
+ return visitor.visitIfStatement(this); |
+} |
+IfStatement.prototype.visit$1 = IfStatement.prototype.visit; |
+// ********** Code for WhileStatement ************** |
+$inherits(WhileStatement, Statement); |
+function WhileStatement(test, body, span) { |
+ this.test = test; |
+ this.body = body; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+WhileStatement.prototype.get$body = function() { return this.body; }; |
+WhileStatement.prototype.set$body = function(value) { return this.body = value; }; |
+WhileStatement.prototype.visit = function(visitor) { |
+ return visitor.visitWhileStatement(this); |
+} |
+WhileStatement.prototype.visit$1 = WhileStatement.prototype.visit; |
+// ********** Code for DoStatement ************** |
+$inherits(DoStatement, Statement); |
+function DoStatement(body, test, span) { |
+ this.body = body; |
+ this.test = test; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+DoStatement.prototype.get$body = function() { return this.body; }; |
+DoStatement.prototype.set$body = function(value) { return this.body = value; }; |
+DoStatement.prototype.visit = function(visitor) { |
+ return visitor.visitDoStatement(this); |
+} |
+DoStatement.prototype.visit$1 = DoStatement.prototype.visit; |
+// ********** Code for ForStatement ************** |
+$inherits(ForStatement, Statement); |
+function ForStatement(init, test, step, body, span) { |
+ this.init = init; |
+ this.test = test; |
+ this.step = step; |
+ this.body = body; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+ForStatement.prototype.get$body = function() { return this.body; }; |
+ForStatement.prototype.set$body = function(value) { return this.body = value; }; |
+ForStatement.prototype.visit = function(visitor) { |
+ return visitor.visitForStatement(this); |
+} |
+ForStatement.prototype.visit$1 = ForStatement.prototype.visit; |
+// ********** Code for ForInStatement ************** |
+$inherits(ForInStatement, Statement); |
+function ForInStatement(item, list, body, span) { |
+ this.item = item; |
+ this.list = list; |
+ this.body = body; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+ForInStatement.prototype.get$body = function() { return this.body; }; |
+ForInStatement.prototype.set$body = function(value) { return this.body = value; }; |
+ForInStatement.prototype.visit = function(visitor) { |
+ return visitor.visitForInStatement(this); |
+} |
+ForInStatement.prototype.visit$1 = ForInStatement.prototype.visit; |
+// ********** Code for TryStatement ************** |
+$inherits(TryStatement, Statement); |
+function TryStatement(body, catches, finallyBlock, span) { |
+ this.body = body; |
+ this.catches = catches; |
+ this.finallyBlock = finallyBlock; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+TryStatement.prototype.get$body = function() { return this.body; }; |
+TryStatement.prototype.set$body = function(value) { return this.body = value; }; |
+TryStatement.prototype.visit = function(visitor) { |
+ return visitor.visitTryStatement(this); |
+} |
+TryStatement.prototype.visit$1 = TryStatement.prototype.visit; |
+// ********** Code for SwitchStatement ************** |
+$inherits(SwitchStatement, Statement); |
+function SwitchStatement(test, cases, span) { |
+ this.test = test; |
+ this.cases = cases; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+SwitchStatement.prototype.get$cases = function() { return this.cases; }; |
+SwitchStatement.prototype.set$cases = function(value) { return this.cases = value; }; |
+SwitchStatement.prototype.visit = function(visitor) { |
+ return visitor.visitSwitchStatement(this); |
+} |
+SwitchStatement.prototype.visit$1 = SwitchStatement.prototype.visit; |
+// ********** Code for BlockStatement ************** |
+$inherits(BlockStatement, Statement); |
+function BlockStatement(body, span) { |
+ this.body = body; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+BlockStatement.prototype.get$body = function() { return this.body; }; |
+BlockStatement.prototype.set$body = function(value) { return this.body = value; }; |
+BlockStatement.prototype.visit = function(visitor) { |
+ return visitor.visitBlockStatement(this); |
+} |
+BlockStatement.prototype.visit$1 = BlockStatement.prototype.visit; |
+// ********** Code for LabeledStatement ************** |
+$inherits(LabeledStatement, Statement); |
+function LabeledStatement(name, body, span) { |
+ this.name = name; |
+ this.body = body; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+LabeledStatement.prototype.get$name = function() { return this.name; }; |
+LabeledStatement.prototype.set$name = function(value) { return this.name = value; }; |
+LabeledStatement.prototype.get$body = function() { return this.body; }; |
+LabeledStatement.prototype.set$body = function(value) { return this.body = value; }; |
+LabeledStatement.prototype.visit = function(visitor) { |
+ return visitor.visitLabeledStatement(this); |
+} |
+LabeledStatement.prototype.visit$1 = LabeledStatement.prototype.visit; |
+// ********** Code for ExpressionStatement ************** |
+$inherits(ExpressionStatement, Statement); |
+function ExpressionStatement(body, span) { |
+ this.body = body; |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+ExpressionStatement.prototype.get$body = function() { return this.body; }; |
+ExpressionStatement.prototype.set$body = function(value) { return this.body = value; }; |
+ExpressionStatement.prototype.visit = function(visitor) { |
+ return visitor.visitExpressionStatement(this); |
+} |
+ExpressionStatement.prototype.visit$1 = ExpressionStatement.prototype.visit; |
+// ********** Code for EmptyStatement ************** |
+$inherits(EmptyStatement, Statement); |
+function EmptyStatement(span) { |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+EmptyStatement.prototype.visit = function(visitor) { |
+ return visitor.visitEmptyStatement(this); |
+} |
+EmptyStatement.prototype.visit$1 = EmptyStatement.prototype.visit; |
+// ********** Code for DietStatement ************** |
+$inherits(DietStatement, Statement); |
+function DietStatement(span) { |
+ // Initializers done |
+ Statement.call(this, span); |
+} |
+DietStatement.prototype.visit = function(visitor) { |
+ return visitor.visitDietStatement(this); |
+} |
+DietStatement.prototype.visit$1 = DietStatement.prototype.visit; |
+// ********** Code for LambdaExpression ************** |
+$inherits(LambdaExpression, Expression); |
+function LambdaExpression(func, span) { |
+ this.func = func; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+LambdaExpression.prototype.get$func = function() { return this.func; }; |
+LambdaExpression.prototype.set$func = function(value) { return this.func = value; }; |
+LambdaExpression.prototype.visit = function(visitor) { |
+ return visitor.visitLambdaExpression(this); |
+} |
+LambdaExpression.prototype.visit$1 = LambdaExpression.prototype.visit; |
+// ********** Code for CallExpression ************** |
+$inherits(CallExpression, Expression); |
+function CallExpression(target, arguments, span) { |
+ this.target = target; |
+ this.arguments = arguments; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+CallExpression.prototype.get$target = function() { return this.target; }; |
+CallExpression.prototype.set$target = function(value) { return this.target = value; }; |
+CallExpression.prototype.get$arguments = function() { return this.arguments; }; |
+CallExpression.prototype.set$arguments = function(value) { return this.arguments = value; }; |
+CallExpression.prototype.visit = function(visitor) { |
+ return visitor.visitCallExpression(this); |
+} |
+CallExpression.prototype.visit$1 = CallExpression.prototype.visit; |
+// ********** Code for IndexExpression ************** |
+$inherits(IndexExpression, Expression); |
+function IndexExpression(target, index, span) { |
+ this.target = target; |
+ this.index = index; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+IndexExpression.prototype.get$target = function() { return this.target; }; |
+IndexExpression.prototype.set$target = function(value) { return this.target = value; }; |
+IndexExpression.prototype.visit = function(visitor) { |
+ return visitor.visitIndexExpression(this); |
+} |
+IndexExpression.prototype.visit$1 = IndexExpression.prototype.visit; |
+// ********** Code for BinaryExpression ************** |
+$inherits(BinaryExpression, Expression); |
+function BinaryExpression(op, x, y, span) { |
+ this.op = op; |
+ this.x = x; |
+ this.y = y; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+BinaryExpression.prototype.get$op = function() { return this.op; }; |
+BinaryExpression.prototype.set$op = function(value) { return this.op = value; }; |
+BinaryExpression.prototype.get$x = function() { return this.x; }; |
+BinaryExpression.prototype.set$x = function(value) { return this.x = value; }; |
+BinaryExpression.prototype.get$y = function() { return this.y; }; |
+BinaryExpression.prototype.set$y = function(value) { return this.y = value; }; |
+BinaryExpression.prototype.visit = function(visitor) { |
+ return visitor.visitBinaryExpression$1(this); |
+} |
+BinaryExpression.prototype.visit$1 = BinaryExpression.prototype.visit; |
+// ********** Code for UnaryExpression ************** |
+$inherits(UnaryExpression, Expression); |
+function UnaryExpression(op, self, span) { |
+ this.op = op; |
+ this.self = self; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+UnaryExpression.prototype.get$op = function() { return this.op; }; |
+UnaryExpression.prototype.set$op = function(value) { return this.op = value; }; |
+UnaryExpression.prototype.get$self = function() { return this.self; }; |
+UnaryExpression.prototype.set$self = function(value) { return this.self = value; }; |
+UnaryExpression.prototype.visit = function(visitor) { |
+ return visitor.visitUnaryExpression(this); |
+} |
+UnaryExpression.prototype.visit$1 = UnaryExpression.prototype.visit; |
+// ********** Code for PostfixExpression ************** |
+$inherits(PostfixExpression, Expression); |
+function PostfixExpression(body, op, span) { |
+ this.body = body; |
+ this.op = op; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+PostfixExpression.prototype.get$body = function() { return this.body; }; |
+PostfixExpression.prototype.set$body = function(value) { return this.body = value; }; |
+PostfixExpression.prototype.get$op = function() { return this.op; }; |
+PostfixExpression.prototype.set$op = function(value) { return this.op = value; }; |
+PostfixExpression.prototype.visit = function(visitor) { |
+ return visitor.visitPostfixExpression$1(this); |
+} |
+PostfixExpression.prototype.visit$1 = PostfixExpression.prototype.visit; |
+// ********** Code for NewExpression ************** |
+$inherits(NewExpression, Expression); |
+function NewExpression(isConst, type, name, arguments, span) { |
+ this.isConst = isConst; |
+ this.type = type; |
+ this.name = name; |
+ this.arguments = arguments; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+NewExpression.prototype.get$isConst = function() { return this.isConst; }; |
+NewExpression.prototype.set$isConst = function(value) { return this.isConst = value; }; |
+NewExpression.prototype.get$type = function() { return this.type; }; |
+NewExpression.prototype.set$type = function(value) { return this.type = value; }; |
+NewExpression.prototype.get$name = function() { return this.name; }; |
+NewExpression.prototype.set$name = function(value) { return this.name = value; }; |
+NewExpression.prototype.get$arguments = function() { return this.arguments; }; |
+NewExpression.prototype.set$arguments = function(value) { return this.arguments = value; }; |
+NewExpression.prototype.visit = function(visitor) { |
+ return visitor.visitNewExpression(this); |
+} |
+NewExpression.prototype.visit$1 = NewExpression.prototype.visit; |
+// ********** Code for ListExpression ************** |
+$inherits(ListExpression, Expression); |
+function ListExpression(isConst, type, values, span) { |
+ this.isConst = isConst; |
+ this.type = type; |
+ this.values = values; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+ListExpression.prototype.get$isConst = function() { return this.isConst; }; |
+ListExpression.prototype.set$isConst = function(value) { return this.isConst = value; }; |
+ListExpression.prototype.get$type = function() { return this.type; }; |
+ListExpression.prototype.set$type = function(value) { return this.type = value; }; |
+ListExpression.prototype.get$values = function() { return this.values; }; |
+ListExpression.prototype.set$values = function(value) { return this.values = value; }; |
+ListExpression.prototype.visit = function(visitor) { |
+ return visitor.visitListExpression(this); |
+} |
+ListExpression.prototype.visit$1 = ListExpression.prototype.visit; |
+// ********** Code for MapExpression ************** |
+$inherits(MapExpression, Expression); |
+function MapExpression(isConst, type, items, span) { |
+ this.isConst = isConst; |
+ this.type = type; |
+ this.items = items; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+MapExpression.prototype.get$isConst = function() { return this.isConst; }; |
+MapExpression.prototype.set$isConst = function(value) { return this.isConst = value; }; |
+MapExpression.prototype.get$type = function() { return this.type; }; |
+MapExpression.prototype.set$type = function(value) { return this.type = value; }; |
+MapExpression.prototype.visit = function(visitor) { |
+ return visitor.visitMapExpression(this); |
+} |
+MapExpression.prototype.visit$1 = MapExpression.prototype.visit; |
+// ********** Code for ConditionalExpression ************** |
+$inherits(ConditionalExpression, Expression); |
+function ConditionalExpression(test, trueBranch, falseBranch, span) { |
+ this.test = test; |
+ this.trueBranch = trueBranch; |
+ this.falseBranch = falseBranch; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+ConditionalExpression.prototype.visit = function(visitor) { |
+ return visitor.visitConditionalExpression(this); |
+} |
+ConditionalExpression.prototype.visit$1 = ConditionalExpression.prototype.visit; |
+// ********** Code for IsExpression ************** |
+$inherits(IsExpression, Expression); |
+function IsExpression(isTrue, x, type, span) { |
+ this.isTrue = isTrue; |
+ this.x = x; |
+ this.type = type; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+IsExpression.prototype.get$x = function() { return this.x; }; |
+IsExpression.prototype.set$x = function(value) { return this.x = value; }; |
+IsExpression.prototype.get$type = function() { return this.type; }; |
+IsExpression.prototype.set$type = function(value) { return this.type = value; }; |
+IsExpression.prototype.visit = function(visitor) { |
+ return visitor.visitIsExpression(this); |
+} |
+IsExpression.prototype.visit$1 = IsExpression.prototype.visit; |
+// ********** Code for ParenExpression ************** |
+$inherits(ParenExpression, Expression); |
+function ParenExpression(body, span) { |
+ this.body = body; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+ParenExpression.prototype.get$body = function() { return this.body; }; |
+ParenExpression.prototype.set$body = function(value) { return this.body = value; }; |
+ParenExpression.prototype.visit = function(visitor) { |
+ return visitor.visitParenExpression(this); |
+} |
+ParenExpression.prototype.visit$1 = ParenExpression.prototype.visit; |
+// ********** Code for AwaitExpression ************** |
+$inherits(AwaitExpression, Expression); |
+function AwaitExpression(body, span) { |
+ this.body = body; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+AwaitExpression.prototype.get$body = function() { return this.body; }; |
+AwaitExpression.prototype.set$body = function(value) { return this.body = value; }; |
+AwaitExpression.prototype.visit = function(visitor) { |
+ return visitor.visitAwaitExpression(this); |
+} |
+AwaitExpression.prototype.visit$1 = AwaitExpression.prototype.visit; |
+// ********** Code for DotExpression ************** |
+$inherits(DotExpression, Expression); |
+function DotExpression(self, name, span) { |
+ this.self = self; |
+ this.name = name; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+DotExpression.prototype.get$self = function() { return this.self; }; |
+DotExpression.prototype.set$self = function(value) { return this.self = value; }; |
+DotExpression.prototype.get$name = function() { return this.name; }; |
+DotExpression.prototype.set$name = function(value) { return this.name = value; }; |
+DotExpression.prototype.visit = function(visitor) { |
+ return visitor.visitDotExpression(this); |
+} |
+DotExpression.prototype.visit$1 = DotExpression.prototype.visit; |
+// ********** Code for VarExpression ************** |
+$inherits(VarExpression, Expression); |
+function VarExpression(name, span) { |
+ this.name = name; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+VarExpression.prototype.get$name = function() { return this.name; }; |
+VarExpression.prototype.set$name = function(value) { return this.name = value; }; |
+VarExpression.prototype.visit = function(visitor) { |
+ return visitor.visitVarExpression(this); |
+} |
+VarExpression.prototype.visit$1 = VarExpression.prototype.visit; |
+// ********** Code for ThisExpression ************** |
+$inherits(ThisExpression, Expression); |
+function ThisExpression(span) { |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+ThisExpression.prototype.visit = function(visitor) { |
+ return visitor.visitThisExpression(this); |
+} |
+ThisExpression.prototype.visit$1 = ThisExpression.prototype.visit; |
+// ********** Code for SuperExpression ************** |
+$inherits(SuperExpression, Expression); |
+function SuperExpression(span) { |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+SuperExpression.prototype.visit = function(visitor) { |
+ return visitor.visitSuperExpression(this); |
+} |
+SuperExpression.prototype.visit$1 = SuperExpression.prototype.visit; |
+// ********** Code for NullExpression ************** |
+$inherits(NullExpression, Expression); |
+function NullExpression(span) { |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+NullExpression.prototype.visit = function(visitor) { |
+ return visitor.visitNullExpression(this); |
+} |
+NullExpression.prototype.visit$1 = NullExpression.prototype.visit; |
+// ********** Code for LiteralExpression ************** |
+$inherits(LiteralExpression, Expression); |
+function LiteralExpression(value, type, text, span) { |
+ this.value = value; |
+ this.type = type; |
+ this.text = text; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+LiteralExpression.prototype.get$value = function() { return this.value; }; |
+LiteralExpression.prototype.set$value = function(value) { return this.value = value; }; |
+LiteralExpression.prototype.get$type = function() { return this.type; }; |
+LiteralExpression.prototype.set$type = function(value) { return this.type = value; }; |
+LiteralExpression.prototype.get$text = function() { return this.text; }; |
+LiteralExpression.prototype.set$text = function(value) { return this.text = value; }; |
+LiteralExpression.prototype.visit = function(visitor) { |
+ return visitor.visitLiteralExpression(this); |
+} |
+LiteralExpression.prototype.visit$1 = LiteralExpression.prototype.visit; |
+// ********** Code for NameTypeReference ************** |
+$inherits(NameTypeReference, TypeReference); |
+function NameTypeReference(isFinal, name, names, span) { |
+ this.isFinal = isFinal; |
+ this.name = name; |
+ this.names = names; |
+ // Initializers done |
+ TypeReference.call(this, span); |
+} |
+NameTypeReference.prototype.get$isFinal = function() { return this.isFinal; }; |
+NameTypeReference.prototype.set$isFinal = function(value) { return this.isFinal = value; }; |
+NameTypeReference.prototype.get$name = function() { return this.name; }; |
+NameTypeReference.prototype.set$name = function(value) { return this.name = value; }; |
+NameTypeReference.prototype.get$names = function() { return this.names; }; |
+NameTypeReference.prototype.set$names = function(value) { return this.names = value; }; |
+NameTypeReference.prototype.visit = function(visitor) { |
+ return visitor.visitNameTypeReference(this); |
+} |
+NameTypeReference.prototype.visit$1 = NameTypeReference.prototype.visit; |
+// ********** Code for GenericTypeReference ************** |
+$inherits(GenericTypeReference, TypeReference); |
+function GenericTypeReference(baseType, typeArguments, depth, span) { |
+ this.baseType = baseType; |
+ this.typeArguments = typeArguments; |
+ this.depth = depth; |
+ // Initializers done |
+ TypeReference.call(this, span); |
+} |
+GenericTypeReference.prototype.get$baseType = function() { return this.baseType; }; |
+GenericTypeReference.prototype.set$baseType = function(value) { return this.baseType = value; }; |
+GenericTypeReference.prototype.get$typeArguments = function() { return this.typeArguments; }; |
+GenericTypeReference.prototype.set$typeArguments = function(value) { return this.typeArguments = value; }; |
+GenericTypeReference.prototype.get$depth = function() { return this.depth; }; |
+GenericTypeReference.prototype.set$depth = function(value) { return this.depth = value; }; |
+GenericTypeReference.prototype.visit = function(visitor) { |
+ return visitor.visitGenericTypeReference(this); |
+} |
+GenericTypeReference.prototype.visit$1 = GenericTypeReference.prototype.visit; |
+// ********** Code for FunctionTypeReference ************** |
+$inherits(FunctionTypeReference, TypeReference); |
+function FunctionTypeReference(isFinal, func, span) { |
+ this.isFinal = isFinal; |
+ this.func = func; |
+ // Initializers done |
+ TypeReference.call(this, span); |
+} |
+FunctionTypeReference.prototype.get$isFinal = function() { return this.isFinal; }; |
+FunctionTypeReference.prototype.set$isFinal = function(value) { return this.isFinal = value; }; |
+FunctionTypeReference.prototype.get$func = function() { return this.func; }; |
+FunctionTypeReference.prototype.set$func = function(value) { return this.func = value; }; |
+FunctionTypeReference.prototype.visit = function(visitor) { |
+ return visitor.visitFunctionTypeReference(this); |
+} |
+FunctionTypeReference.prototype.visit$1 = FunctionTypeReference.prototype.visit; |
+// ********** Code for ArgumentNode ************** |
+$inherits(ArgumentNode, Node); |
+function ArgumentNode(label, value, span) { |
+ this.label = label; |
+ this.value = value; |
+ // Initializers done |
+ Node.call(this, span); |
+} |
+ArgumentNode.prototype.get$label = function() { return this.label; }; |
+ArgumentNode.prototype.set$label = function(value) { return this.label = value; }; |
+ArgumentNode.prototype.get$value = function() { return this.value; }; |
+ArgumentNode.prototype.set$value = function(value) { return this.value = value; }; |
+ArgumentNode.prototype.visit = function(visitor) { |
+ return visitor.visitArgumentNode(this); |
+} |
+ArgumentNode.prototype.visit$1 = ArgumentNode.prototype.visit; |
+// ********** Code for FormalNode ************** |
+$inherits(FormalNode, Node); |
+function FormalNode(isThis, isRest, type, name, value, span) { |
+ this.isThis = isThis; |
+ this.isRest = isRest; |
+ this.type = type; |
+ this.name = name; |
+ this.value = value; |
+ // Initializers done |
+ Node.call(this, span); |
+} |
+FormalNode.prototype.get$type = function() { return this.type; }; |
+FormalNode.prototype.set$type = function(value) { return this.type = value; }; |
+FormalNode.prototype.get$name = function() { return this.name; }; |
+FormalNode.prototype.set$name = function(value) { return this.name = value; }; |
+FormalNode.prototype.get$value = function() { return this.value; }; |
+FormalNode.prototype.set$value = function(value) { return this.value = value; }; |
+FormalNode.prototype.visit = function(visitor) { |
+ return visitor.visitFormalNode(this); |
+} |
+FormalNode.prototype.visit$1 = FormalNode.prototype.visit; |
+// ********** Code for CatchNode ************** |
+$inherits(CatchNode, Node); |
+function CatchNode(exception, trace, body, span) { |
+ this.exception = exception; |
+ this.trace = trace; |
+ this.body = body; |
+ // Initializers done |
+ Node.call(this, span); |
+} |
+CatchNode.prototype.get$exception = function() { return this.exception; }; |
+CatchNode.prototype.set$exception = function(value) { return this.exception = value; }; |
+CatchNode.prototype.get$trace = function() { return this.trace; }; |
+CatchNode.prototype.set$trace = function(value) { return this.trace = value; }; |
+CatchNode.prototype.get$body = function() { return this.body; }; |
+CatchNode.prototype.set$body = function(value) { return this.body = value; }; |
+CatchNode.prototype.visit = function(visitor) { |
+ return visitor.visitCatchNode(this); |
+} |
+CatchNode.prototype.visit$1 = CatchNode.prototype.visit; |
+// ********** Code for CaseNode ************** |
+$inherits(CaseNode, Node); |
+function CaseNode(label, cases, statements, span) { |
+ this.label = label; |
+ this.cases = cases; |
+ this.statements = statements; |
+ // Initializers done |
+ Node.call(this, span); |
+} |
+CaseNode.prototype.get$label = function() { return this.label; }; |
+CaseNode.prototype.set$label = function(value) { return this.label = value; }; |
+CaseNode.prototype.get$cases = function() { return this.cases; }; |
+CaseNode.prototype.set$cases = function(value) { return this.cases = value; }; |
+CaseNode.prototype.get$statements = function() { return this.statements; }; |
+CaseNode.prototype.set$statements = function(value) { return this.statements = value; }; |
+CaseNode.prototype.visit = function(visitor) { |
+ return visitor.visitCaseNode(this); |
+} |
+CaseNode.prototype.visit$1 = CaseNode.prototype.visit; |
+// ********** Code for TypeParameter ************** |
+$inherits(TypeParameter, Node); |
+function TypeParameter(name, extendsType, span) { |
+ this.name = name; |
+ this.extendsType = extendsType; |
+ // Initializers done |
+ Node.call(this, span); |
+} |
+TypeParameter.prototype.get$name = function() { return this.name; }; |
+TypeParameter.prototype.set$name = function(value) { return this.name = value; }; |
+TypeParameter.prototype.get$extendsType = function() { return this.extendsType; }; |
+TypeParameter.prototype.set$extendsType = function(value) { return this.extendsType = value; }; |
+TypeParameter.prototype.visit = function(visitor) { |
+ return visitor.visitTypeParameter(this); |
+} |
+TypeParameter.prototype.visit$1 = TypeParameter.prototype.visit; |
+// ********** Code for Identifier ************** |
+$inherits(Identifier, Node); |
+function Identifier(name, span) { |
+ this.name = name; |
+ // Initializers done |
+ Node.call(this, span); |
+} |
+Identifier.prototype.get$name = function() { return this.name; }; |
+Identifier.prototype.set$name = function(value) { return this.name = value; }; |
+Identifier.prototype.visit = function(visitor) { |
+ return visitor.visitIdentifier(this); |
+} |
+Identifier.prototype.visit$1 = Identifier.prototype.visit; |
+// ********** Code for DeclaredIdentifier ************** |
+$inherits(DeclaredIdentifier, Expression); |
+function DeclaredIdentifier(type, name, span) { |
+ this.type = type; |
+ this.name = name; |
+ // Initializers done |
+ Expression.call(this, span); |
+} |
+DeclaredIdentifier.prototype.get$type = function() { return this.type; }; |
+DeclaredIdentifier.prototype.set$type = function(value) { return this.type = value; }; |
+DeclaredIdentifier.prototype.get$name = function() { return this.name; }; |
+DeclaredIdentifier.prototype.set$name = function(value) { return this.name = value; }; |
+DeclaredIdentifier.prototype.visit = function(visitor) { |
+ return visitor.visitDeclaredIdentifier(this); |
+} |
+DeclaredIdentifier.prototype.visit$1 = DeclaredIdentifier.prototype.visit; |
+// ********** Code for Type ************** |
+$inherits(Type, Element); |
+function Type(name) { |
+ this.isTested = false |
+ this.isChecked = false |
+ this.isWritten = false |
+ this._resolvedMembers = new HashMapImplementation(); |
+ this.varStubs = new HashMapImplementation(); |
+ // Initializers done |
+ Element.call(this, name, null); |
+} |
+Type.prototype.get$typeCheckCode = function() { return this.typeCheckCode; }; |
+Type.prototype.set$typeCheckCode = function(value) { return this.typeCheckCode = value; }; |
+Type.prototype.get$varStubs = function() { return this.varStubs; }; |
+Type.prototype.set$varStubs = function(value) { return this.varStubs = value; }; |
+Type.prototype.markUsed = function() { |
+ |
+} |
+Type.prototype.get$typeMember = function() { |
+ if (this._typeMember == null) { |
+ this._typeMember = new TypeMember(this); |
+ } |
+ return this._typeMember; |
+} |
+Type.prototype.getMember = function(name) { |
+ return null; |
+} |
+Type.prototype.get$subtypes = function() { |
+ return null; |
+} |
+Type.prototype.get$isVar = function() { |
+ return false; |
+} |
+Type.prototype.get$isTop = function() { |
+ return false; |
+} |
+Type.prototype.get$isObject = function() { |
+ return false; |
+} |
+Type.prototype.get$isString = function() { |
+ return false; |
+} |
+Type.prototype.get$isBool = function() { |
+ return false; |
+} |
+Type.prototype.get$isFunction = function() { |
+ return false; |
+} |
+Type.prototype.get$isList = function() { |
+ return false; |
+} |
+Type.prototype.get$isNum = function() { |
+ return false; |
+} |
+Type.prototype.get$isVoid = function() { |
+ return false; |
+} |
+Type.prototype.get$isNullable = function() { |
+ return true; |
+} |
+Type.prototype.get$isVarOrFunction = function() { |
+ return this.get$isVar() || this.get$isFunction(); |
+} |
+Type.prototype.get$isVarOrObject = function() { |
+ return this.get$isVar() || this.get$isObject(); |
+} |
+Type.prototype.getCallMethod = function() { |
+ return null; |
+} |
+Type.prototype.get$isClosed = function() { |
+ return this.get$isString() || this.get$isBool() || this.get$isNum() || this.get$isFunction() || this.get$isVar(); |
+} |
+Type.prototype.get$isUsed = function() { |
+ return false; |
+} |
+Type.prototype.get$isGeneric = function() { |
+ return false; |
+} |
+Type.prototype.get$nativeType = function() { |
+ return null; |
+} |
+Type.prototype.get$isHiddenNativeType = function() { |
+ return (this.get$nativeType() != null && this.get$nativeType().isConstructorHidden); |
+} |
+Type.prototype.get$isSingletonNative = function() { |
+ return (this.get$nativeType() != null && this.get$nativeType().isSingleton); |
+} |
+Type.prototype.get$isJsGlobalObject = function() { |
+ return (this.get$nativeType() != null && this.get$nativeType().isJsGlobalObject); |
+} |
+Type.prototype.get$hasTypeParams = function() { |
+ return false; |
+} |
+Type.prototype.get$typeofName = function() { |
+ return null; |
+} |
+Type.prototype.get$members = function() { |
+ return null; |
+} |
+Type.prototype.get$definition = function() { |
+ return null; |
+} |
+Type.prototype.get$factories = function() { |
+ return null; |
+} |
+Type.prototype.get$typeArgsInOrder = function() { |
+ return null; |
+} |
+Type.prototype.get$genericType = function() { |
+ return this; |
+} |
+Type.prototype.get$interfaces = function() { |
+ return null; |
+} |
+Type.prototype.get$parent = function() { |
+ return null; |
+} |
+Type.prototype.getAllMembers = function() { |
+ return new HashMapImplementation(); |
+} |
+Type.prototype.get$hasNativeSubtypes = function() { |
+ if (this._hasNativeSubtypes == null) { |
+ this._hasNativeSubtypes = this.get$subtypes().some((function (t) { |
+ return t.get$isNative(); |
+ }) |
+ ); |
+ } |
+ return this._hasNativeSubtypes; |
+} |
+Type.prototype._checkExtends = function() { |
+ var typeParams = this.get$genericType().typeParameters; |
+ if (typeParams != null && this.get$typeArgsInOrder() != null) { |
+ var args = this.get$typeArgsInOrder().iterator$0(); |
+ var params = typeParams.iterator$0(); |
+ while (args.hasNext$0() && params.hasNext$0()) { |
+ var typeParam = params.next$0(); |
+ var typeArg = args.next$0(); |
+ if (typeParam.get$extendsType() != null && typeArg != null) { |
+ typeArg.ensureSubtypeOf$3(typeParam.get$extendsType(), typeParam.get$span(), true); |
+ } |
+ } |
+ } |
+ if (this.get$interfaces() != null) { |
+ var $$list = this.get$interfaces(); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var i = $$list.$index($$i); |
+ i._checkExtends$0(); |
+ } |
+ } |
+} |
+Type.prototype._checkOverride = function(member) { |
+ var parentMember = this._getMemberInParents(member.name); |
+ if (parentMember != null) { |
+ if (!member.get$isPrivate() || $eq(member.get$library(), parentMember.get$library())) { |
+ member.override(parentMember); |
+ } |
+ } |
+} |
+Type.prototype._createNotEqualMember = function() { |
+ var eq = this.get$members().$index(':eq'); |
+ if (eq == null) { |
+ return; |
+ } |
+ var ne = new MethodMember(':ne', this, eq.definition); |
+ ne.isGenerated = true; |
+ ne.returnType = eq.returnType; |
+ ne.parameters = eq.parameters; |
+ ne.isStatic = eq.isStatic; |
+ ne.isAbstract = eq.isAbstract; |
+ this.get$members().$setindex(':ne', ne); |
+} |
+Type.prototype._getMemberInParents = function(memberName) { |
+ if (this.get$isClass()) { |
+ if (this.get$parent() != null) { |
+ return this.get$parent().getMember(memberName); |
+ } |
+ else { |
+ return null; |
+ } |
+ } |
+ else { |
+ if (this.get$interfaces() != null && this.get$interfaces().length > 0) { |
+ var $$list = this.get$interfaces(); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var i = $$list.$index($$i); |
+ var ret = i.getMember$1(memberName); |
+ if (ret != null) { |
+ return ret; |
+ } |
+ } |
+ } |
+ return $globals.world.objectType.getMember(memberName); |
+ } |
+} |
+Type.prototype.resolveMember = function(memberName) { |
+ var ret = this._resolvedMembers.$index(memberName); |
+ if (ret != null) return ret; |
+ var member = this.getMember(memberName); |
+ if (member == null) { |
+ return null; |
+ } |
+ ret = new MemberSet(member, false); |
+ this._resolvedMembers.$setindex(memberName, ret); |
+ if (member.get$isStatic()) { |
+ return ret; |
+ } |
+ else { |
+ var $$list = this.get$subtypes(); |
+ for (var $$i = this.get$subtypes().iterator(); $$i.hasNext$0(); ) { |
+ var t = $$i.next$0(); |
+ if (!this.get$isClass() && t.get$isClass()) { |
+ var m = t.getMember$1(memberName); |
+ if (m != null && ret.members.indexOf(m) == -1) { |
+ ret.add(m); |
+ } |
+ } |
+ else { |
+ var m = t.get$members().$index(memberName); |
+ if (m != null) ret.add(m); |
+ } |
+ } |
+ return ret; |
+ } |
+} |
+Type.prototype.ensureSubtypeOf = function(other, span, typeErrors) { |
+ if (!this.isSubtypeOf(other)) { |
+ var msg = ('type ' + this.name + ' is not a subtype of ' + other.name); |
+ if (typeErrors) { |
+ $globals.world.error(msg, span); |
+ } |
+ else { |
+ $globals.world.warning(msg, span); |
+ } |
+ } |
+} |
+Type.prototype.needsVarCall = function(args) { |
+ if (this.get$isVarOrFunction()) { |
+ return true; |
+ } |
+ var call = this.getCallMethod(); |
+ if (call != null) { |
+ if (args.get$length() != call.get$parameters().length || !call.namesInOrder$1(args)) { |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+Type.union = function(x, y) { |
+ if ($eq(x, y)) return x; |
+ if (x.get$isNum() && y.get$isNum()) return $globals.world.numType; |
+ if (x.get$isString() && y.get$isString()) return $globals.world.stringType; |
+ return $globals.world.varType; |
+} |
+Type.prototype.isAssignable = function(other) { |
+ return this.isSubtypeOf(other) || other.isSubtypeOf(this); |
+} |
+Type.prototype._isDirectSupertypeOf = function(other) { |
+ var $this = this; // closure support |
+ if (other.get$isClass()) { |
+ return $eq(other.get$parent(), this) || this.get$isObject() && other.get$parent() == null; |
+ } |
+ else { |
+ if (other.get$interfaces() == null || other.get$interfaces().isEmpty()) { |
+ return this.get$isObject(); |
+ } |
+ else { |
+ return other.get$interfaces().some((function (i) { |
+ return $eq(i, $this); |
+ }) |
+ ); |
+ } |
+ } |
+} |
+Type.prototype.isSubtypeOf = function(other) { |
+ if ((other instanceof ParameterType)) { |
+ return true; |
+ } |
+ if ($eq(this, other)) return true; |
+ if (this.get$isVar()) return true; |
+ if (other.get$isVar()) return true; |
+ if (other._isDirectSupertypeOf(this)) return true; |
+ var call = this.getCallMethod(); |
+ var otherCall = other.getCallMethod(); |
+ if (call != null && otherCall != null) { |
+ return Type._isFunctionSubtypeOf(call, otherCall); |
+ } |
+ if ($eq(this.get$genericType(), other.get$genericType()) && this.get$typeArgsInOrder() != null && other.get$typeArgsInOrder() != null && $eq(this.get$typeArgsInOrder().length, other.get$typeArgsInOrder().length)) { |
+ var t = this.get$typeArgsInOrder().iterator$0(); |
+ var s = other.get$typeArgsInOrder().iterator$0(); |
+ while (t.hasNext$0()) { |
+ if (!t.next$0().isSubtypeOf$1(s.next$0())) return false; |
+ } |
+ return true; |
+ } |
+ if (this.get$parent() != null && this.get$parent().isSubtypeOf(other)) { |
+ return true; |
+ } |
+ if (this.get$interfaces() != null && this.get$interfaces().some((function (i) { |
+ return i.isSubtypeOf$1(other); |
+ }) |
+ )) { |
+ return true; |
+ } |
+ return false; |
+} |
+Type.prototype.hashCode = function() { |
+ var libraryCode = this.get$library() == null ? 1 : this.get$library().hashCode(); |
+ var nameCode = this.name == null ? 1 : this.name.hashCode(); |
+ return (libraryCode << 4) ^ nameCode; |
+} |
+Type.prototype.$eq = function(other) { |
+ return (other instanceof Type) && $eq(other.get$name(), this.name) && $eq(this.get$library(), other.get$library()); |
+} |
+Type._isFunctionSubtypeOf = function(t, s) { |
+ if (!s.returnType.get$isVoid() && !s.returnType.isAssignable(t.returnType)) { |
+ return false; |
+ } |
+ var tp = t.parameters; |
+ var sp = s.parameters; |
+ if (tp.length < sp.length) return false; |
+ for (var i = 0; |
+ i < sp.length; i++) { |
+ if ($ne(tp.$index(i).get$isOptional(), sp.$index(i).get$isOptional())) return false; |
+ if (tp.$index(i).get$isOptional() && $ne(tp.$index(i).get$name(), sp.$index(i).get$name())) return false; |
+ if (!tp.$index(i).get$type().isAssignable$1(sp.$index(i).get$type())) return false; |
+ } |
+ if (tp.length > sp.length && !tp.$index(sp.length).get$isOptional()) return false; |
+ return true; |
+} |
+Type.prototype._checkExtends$0 = Type.prototype._checkExtends; |
+Type.prototype.addDirectSubtype$1 = Type.prototype.addDirectSubtype; |
+Type.prototype.ensureSubtypeOf$3 = Type.prototype.ensureSubtypeOf; |
+Type.prototype.getConstructor$1 = Type.prototype.getConstructor; |
+Type.prototype.getFactory$2 = Type.prototype.getFactory; |
+Type.prototype.getMember$1 = Type.prototype.getMember; |
+Type.prototype.getOrMakeConcreteType$1 = Type.prototype.getOrMakeConcreteType; |
+Type.prototype.hashCode$0 = Type.prototype.hashCode; |
+Type.prototype.isAssignable$1 = Type.prototype.isAssignable; |
+Type.prototype.isSubtypeOf$1 = Type.prototype.isSubtypeOf; |
+Type.prototype.markUsed$0 = Type.prototype.markUsed; |
+Type.prototype.resolveTypeParams$1 = Type.prototype.resolveTypeParams; |
+// ********** Code for ParameterType ************** |
+$inherits(ParameterType, Type); |
+function ParameterType(name, typeParameter) { |
+ this.typeParameter = typeParameter; |
+ // Initializers done |
+ Type.call(this, name); |
+} |
+ParameterType.prototype.get$typeParameter = function() { return this.typeParameter; }; |
+ParameterType.prototype.set$typeParameter = function(value) { return this.typeParameter = value; }; |
+ParameterType.prototype.get$extendsType = function() { return this.extendsType; }; |
+ParameterType.prototype.set$extendsType = function(value) { return this.extendsType = value; }; |
+ParameterType.prototype.get$isClass = function() { |
+ return false; |
+} |
+ParameterType.prototype.get$library = function() { |
+ return null; |
+} |
+ParameterType.prototype.get$span = function() { |
+ return this.typeParameter.span; |
+} |
+ParameterType.prototype.get$constructors = function() { |
+ $globals.world.internalError('no constructors on type parameters yet'); |
+} |
+ParameterType.prototype.getCallMethod = function() { |
+ return this.extendsType.getCallMethod(); |
+} |
+ParameterType.prototype.genMethod = function(method) { |
+ this.extendsType.genMethod(method); |
+} |
+ParameterType.prototype.isSubtypeOf = function(other) { |
+ return true; |
+} |
+ParameterType.prototype.resolveMember = function(memberName) { |
+ return this.extendsType.resolveMember(memberName); |
+} |
+ParameterType.prototype.getConstructor = function(constructorName) { |
+ $globals.world.internalError('no constructors on type parameters yet'); |
+} |
+ParameterType.prototype.getOrMakeConcreteType = function(typeArgs) { |
+ $globals.world.internalError('no concrete types of type parameters yet', this.get$span()); |
+} |
+ParameterType.prototype.resolveTypeParams = function(inType) { |
+ return inType.typeArguments.$index(this.name); |
+} |
+ParameterType.prototype.addDirectSubtype = function(type) { |
+ $globals.world.internalError('no subtypes of type parameters yet', this.get$span()); |
+} |
+ParameterType.prototype.resolve = function() { |
+ if (this.typeParameter.extendsType != null) { |
+ this.extendsType = this.get$enclosingElement().resolveType(this.typeParameter.extendsType, true); |
+ } |
+ else { |
+ this.extendsType = $globals.world.objectType; |
+ } |
+} |
+ParameterType.prototype.addDirectSubtype$1 = ParameterType.prototype.addDirectSubtype; |
+ParameterType.prototype.getConstructor$1 = ParameterType.prototype.getConstructor; |
+ParameterType.prototype.getOrMakeConcreteType$1 = ParameterType.prototype.getOrMakeConcreteType; |
+ParameterType.prototype.isSubtypeOf$1 = ParameterType.prototype.isSubtypeOf; |
+ParameterType.prototype.resolve$0 = ParameterType.prototype.resolve; |
+ParameterType.prototype.resolveTypeParams$1 = ParameterType.prototype.resolveTypeParams; |
+// ********** Code for NonNullableType ************** |
+$inherits(NonNullableType, Type); |
+function NonNullableType(type) { |
+ this.type = type; |
+ // Initializers done |
+ Type.call(this, type.name); |
+} |
+NonNullableType.prototype.get$type = function() { return this.type; }; |
+NonNullableType.prototype.get$isNullable = function() { |
+ return false; |
+} |
+NonNullableType.prototype.get$isBool = function() { |
+ return this.type.get$isBool(); |
+} |
+NonNullableType.prototype.get$isUsed = function() { |
+ return false; |
+} |
+NonNullableType.prototype.isSubtypeOf = function(other) { |
+ return $eq(this, other) || $eq(this.type, other) || this.type.isSubtypeOf(other); |
+} |
+NonNullableType.prototype.resolveType = function(node, isRequired) { |
+ return this.type.resolveType(node, isRequired); |
+} |
+NonNullableType.prototype.resolveTypeParams = function(inType) { |
+ return this.type.resolveTypeParams(inType); |
+} |
+NonNullableType.prototype.addDirectSubtype = function(subtype) { |
+ this.type.addDirectSubtype(subtype); |
+} |
+NonNullableType.prototype.markUsed = function() { |
+ this.type.markUsed(); |
+} |
+NonNullableType.prototype.genMethod = function(method) { |
+ this.type.genMethod(method); |
+} |
+NonNullableType.prototype.get$span = function() { |
+ return this.type.get$span(); |
+} |
+NonNullableType.prototype.resolveMember = function(name) { |
+ return this.type.resolveMember(name); |
+} |
+NonNullableType.prototype.getMember = function(name) { |
+ return this.type.getMember(name); |
+} |
+NonNullableType.prototype.getConstructor = function(name) { |
+ return this.type.getConstructor(name); |
+} |
+NonNullableType.prototype.getFactory = function(t, name) { |
+ return this.type.getFactory(t, name); |
+} |
+NonNullableType.prototype.getOrMakeConcreteType = function(typeArgs) { |
+ return this.type.getOrMakeConcreteType(typeArgs); |
+} |
+NonNullableType.prototype.get$constructors = function() { |
+ return this.type.get$constructors(); |
+} |
+NonNullableType.prototype.get$isClass = function() { |
+ return this.type.get$isClass(); |
+} |
+NonNullableType.prototype.get$library = function() { |
+ return this.type.get$library(); |
+} |
+NonNullableType.prototype.getCallMethod = function() { |
+ return this.type.getCallMethod(); |
+} |
+NonNullableType.prototype.get$isGeneric = function() { |
+ return this.type.get$isGeneric(); |
+} |
+NonNullableType.prototype.get$hasTypeParams = function() { |
+ return this.type.get$hasTypeParams(); |
+} |
+NonNullableType.prototype.get$typeofName = function() { |
+ return this.type.get$typeofName(); |
+} |
+NonNullableType.prototype.get$jsname = function() { |
+ return this.type.get$jsname(); |
+} |
+NonNullableType.prototype.get$members = function() { |
+ return this.type.get$members(); |
+} |
+NonNullableType.prototype.get$definition = function() { |
+ return this.type.get$definition(); |
+} |
+NonNullableType.prototype.get$factories = function() { |
+ return this.type.get$factories(); |
+} |
+NonNullableType.prototype.get$typeArgsInOrder = function() { |
+ return this.type.get$typeArgsInOrder(); |
+} |
+NonNullableType.prototype.get$genericType = function() { |
+ return this.type.get$genericType(); |
+} |
+NonNullableType.prototype.get$interfaces = function() { |
+ return this.type.get$interfaces(); |
+} |
+NonNullableType.prototype.get$parent = function() { |
+ return this.type.get$parent(); |
+} |
+NonNullableType.prototype.getAllMembers = function() { |
+ return this.type.getAllMembers(); |
+} |
+NonNullableType.prototype.get$isNative = function() { |
+ return this.type.get$isNative(); |
+} |
+NonNullableType.prototype.addDirectSubtype$1 = NonNullableType.prototype.addDirectSubtype; |
+NonNullableType.prototype.getConstructor$1 = NonNullableType.prototype.getConstructor; |
+NonNullableType.prototype.getFactory$2 = NonNullableType.prototype.getFactory; |
+NonNullableType.prototype.getMember$1 = NonNullableType.prototype.getMember; |
+NonNullableType.prototype.getOrMakeConcreteType$1 = NonNullableType.prototype.getOrMakeConcreteType; |
+NonNullableType.prototype.isSubtypeOf$1 = NonNullableType.prototype.isSubtypeOf; |
+NonNullableType.prototype.markUsed$0 = NonNullableType.prototype.markUsed; |
+NonNullableType.prototype.resolveTypeParams$1 = NonNullableType.prototype.resolveTypeParams; |
+// ********** Code for ConcreteType ************** |
+$inherits(ConcreteType, Type); |
+function ConcreteType(name, genericType, typeArguments, typeArgsInOrder) { |
+ this.isUsed = false |
+ this.genericType = genericType; |
+ this.typeArguments = typeArguments; |
+ this.typeArgsInOrder = typeArgsInOrder; |
+ this.constructors = new HashMapImplementation(); |
+ this.members = new HashMapImplementation(); |
+ this.factories = new FactoryMap(); |
+ // Initializers done |
+ Type.call(this, name); |
+} |
+ConcreteType.prototype.get$genericType = function() { return this.genericType; }; |
+ConcreteType.prototype.get$typeArguments = function() { return this.typeArguments; }; |
+ConcreteType.prototype.set$typeArguments = function(value) { return this.typeArguments = value; }; |
+ConcreteType.prototype.get$_parent = function() { return this._parent; }; |
+ConcreteType.prototype.set$_parent = function(value) { return this._parent = value; }; |
+ConcreteType.prototype.get$typeArgsInOrder = function() { return this.typeArgsInOrder; }; |
+ConcreteType.prototype.set$typeArgsInOrder = function(value) { return this.typeArgsInOrder = value; }; |
+ConcreteType.prototype.get$isList = function() { |
+ return this.genericType.get$isList(); |
+} |
+ConcreteType.prototype.get$isClass = function() { |
+ return this.genericType.isClass; |
+} |
+ConcreteType.prototype.get$library = function() { |
+ return this.genericType.library; |
+} |
+ConcreteType.prototype.get$span = function() { |
+ return this.genericType.get$span(); |
+} |
+ConcreteType.prototype.get$hasTypeParams = function() { |
+ return this.typeArguments.getValues().some$1((function (e) { |
+ return (e instanceof ParameterType); |
+ }) |
+ ); |
+} |
+ConcreteType.prototype.get$isUsed = function() { return this.isUsed; }; |
+ConcreteType.prototype.set$isUsed = function(value) { return this.isUsed = value; }; |
+ConcreteType.prototype.get$members = function() { return this.members; }; |
+ConcreteType.prototype.set$members = function(value) { return this.members = value; }; |
+ConcreteType.prototype.get$constructors = function() { return this.constructors; }; |
+ConcreteType.prototype.set$constructors = function(value) { return this.constructors = value; }; |
+ConcreteType.prototype.get$factories = function() { return this.factories; }; |
+ConcreteType.prototype.set$factories = function(value) { return this.factories = value; }; |
+ConcreteType.prototype.resolveTypeParams = function(inType) { |
+ var newTypeArgs = []; |
+ var needsNewType = false; |
+ var $$list = this.typeArgsInOrder; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var t = $$list.$index($$i); |
+ var newType = t.resolveTypeParams$1(inType); |
+ if ($ne(newType, t)) needsNewType = true; |
+ newTypeArgs.add$1(newType); |
+ } |
+ if (!needsNewType) return this; |
+ return this.genericType.getOrMakeConcreteType(newTypeArgs); |
+} |
+ConcreteType.prototype.getOrMakeConcreteType = function(typeArgs) { |
+ return this.genericType.getOrMakeConcreteType(typeArgs); |
+} |
+ConcreteType.prototype.get$parent = function() { |
+ if (this._parent == null && this.genericType.get$parent() != null) { |
+ this._parent = this.genericType.get$parent().resolveTypeParams(this); |
+ } |
+ return this._parent; |
+} |
+ConcreteType.prototype.get$interfaces = function() { |
+ if (this._interfaces == null && this.genericType.interfaces != null) { |
+ this._interfaces = []; |
+ var $$list = this.genericType.interfaces; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var i = $$list.$index($$i); |
+ this._interfaces.add(i.resolveTypeParams$1(this)); |
+ } |
+ } |
+ return this._interfaces; |
+} |
+ConcreteType.prototype.get$subtypes = function() { |
+ if (this._subtypes == null) { |
+ this._subtypes = new HashSetImplementation(); |
+ var $$list = this.genericType.get$subtypes(); |
+ for (var $$i = this.genericType.get$subtypes().iterator(); $$i.hasNext$0(); ) { |
+ var s = $$i.next$0(); |
+ this._subtypes.add(s.resolveTypeParams$1(this)); |
+ } |
+ } |
+ return this._subtypes; |
+} |
+ConcreteType.prototype.getCallMethod = function() { |
+ return this.genericType.getCallMethod(); |
+} |
+ConcreteType.prototype.getAllMembers = function() { |
+ var result = this.genericType.getAllMembers(); |
+ var $$list = result.getKeys$0(); |
+ for (var $$i = result.getKeys$0().iterator$0(); $$i.hasNext$0(); ) { |
+ var memberName = $$i.next$0(); |
+ var myMember = this.members.$index(memberName); |
+ if (myMember != null) { |
+ result.$setindex(memberName, myMember); |
+ } |
+ } |
+ return result; |
+} |
+ConcreteType.prototype.markUsed = function() { |
+ if (this.isUsed) return; |
+ this.isUsed = true; |
+ this._checkExtends(); |
+ this.genericType.markUsed(); |
+} |
+ConcreteType.prototype.genMethod = function(method) { |
+ return this.genericType.genMethod(method); |
+} |
+ConcreteType.prototype.getFactory = function(type, constructorName) { |
+ return this.genericType.getFactory(type, constructorName); |
+} |
+ConcreteType.prototype.getConstructor = function(constructorName) { |
+ var ret = this.constructors.$index(constructorName); |
+ if (ret != null) return ret; |
+ ret = this.factories.getFactory(this.name, constructorName); |
+ if (ret != null) return ret; |
+ var genericMember = this.genericType.getConstructor(constructorName); |
+ if (genericMember == null) return null; |
+ if ($ne(genericMember.get$declaringType(), this.genericType)) { |
+ if (!genericMember.get$declaringType().get$isGeneric()) return genericMember; |
+ var newDeclaringType = genericMember.get$declaringType().getOrMakeConcreteType$1(this.typeArgsInOrder); |
+ var factory = newDeclaringType.getFactory$2(this.genericType, constructorName); |
+ if (factory != null) return factory; |
+ return newDeclaringType.getConstructor$1(constructorName); |
+ } |
+ if (genericMember.get$isFactory()) { |
+ ret = new ConcreteMember(genericMember.get$name(), this, genericMember); |
+ this.factories.addFactory(this.name, constructorName, ret); |
+ } |
+ else { |
+ ret = new ConcreteMember(this.name, this, genericMember); |
+ this.constructors.$setindex(constructorName, ret); |
+ } |
+ return ret; |
+} |
+ConcreteType.prototype.getMember = function(memberName) { |
+ var member = this.members.$index(memberName); |
+ if (member != null) { |
+ this._checkOverride(member); |
+ return member; |
+ } |
+ var genericMember = this.genericType.members.$index(memberName); |
+ if (genericMember != null) { |
+ member = new ConcreteMember(genericMember.get$name(), this, genericMember); |
+ this.members.$setindex(memberName, member); |
+ return member; |
+ } |
+ return this._getMemberInParents(memberName); |
+} |
+ConcreteType.prototype.resolveType = function(node, isRequired) { |
+ var ret = this.genericType.resolveType(node, isRequired); |
+ return ret; |
+} |
+ConcreteType.prototype.addDirectSubtype = function(type) { |
+ this.genericType.addDirectSubtype(type); |
+} |
+ConcreteType.prototype.addDirectSubtype$1 = ConcreteType.prototype.addDirectSubtype; |
+ConcreteType.prototype.getConstructor$1 = ConcreteType.prototype.getConstructor; |
+ConcreteType.prototype.getFactory$2 = ConcreteType.prototype.getFactory; |
+ConcreteType.prototype.getMember$1 = ConcreteType.prototype.getMember; |
+ConcreteType.prototype.getOrMakeConcreteType$1 = ConcreteType.prototype.getOrMakeConcreteType; |
+ConcreteType.prototype.markUsed$0 = ConcreteType.prototype.markUsed; |
+ConcreteType.prototype.resolveTypeParams$1 = ConcreteType.prototype.resolveTypeParams; |
+// ********** Code for DefinedType ************** |
+$inherits(DefinedType, Type); |
+function DefinedType(name, library, definition, isClass) { |
+ this.isUsed = false |
+ this.isNative = false |
+ this.library = library; |
+ this.isClass = isClass; |
+ this.directSubtypes = new HashSetImplementation(); |
+ this.constructors = new HashMapImplementation(); |
+ this.members = new HashMapImplementation(); |
+ this.factories = new FactoryMap(); |
+ // Initializers done |
+ Type.call(this, name); |
+ this.setDefinition(definition); |
+} |
+DefinedType.prototype.get$definition = function() { return this.definition; }; |
+DefinedType.prototype.set$definition = function(value) { return this.definition = value; }; |
+DefinedType.prototype.get$library = function() { return this.library; }; |
+DefinedType.prototype.get$isClass = function() { return this.isClass; }; |
+DefinedType.prototype.get$_parent = function() { return this._parent; }; |
+DefinedType.prototype.set$_parent = function(value) { return this._parent = value; }; |
+DefinedType.prototype.get$parent = function() { |
+ return this._parent; |
+} |
+DefinedType.prototype.set$parent = function(p) { |
+ this._parent = p; |
+} |
+DefinedType.prototype.get$interfaces = function() { return this.interfaces; }; |
+DefinedType.prototype.set$interfaces = function(value) { return this.interfaces = value; }; |
+DefinedType.prototype.get$typeParameters = function() { return this.typeParameters; }; |
+DefinedType.prototype.set$typeParameters = function(value) { return this.typeParameters = value; }; |
+DefinedType.prototype.get$constructors = function() { return this.constructors; }; |
+DefinedType.prototype.set$constructors = function(value) { return this.constructors = value; }; |
+DefinedType.prototype.get$members = function() { return this.members; }; |
+DefinedType.prototype.set$members = function(value) { return this.members = value; }; |
+DefinedType.prototype.get$factories = function() { return this.factories; }; |
+DefinedType.prototype.set$factories = function(value) { return this.factories = value; }; |
+DefinedType.prototype.get$_concreteTypes = function() { return this._concreteTypes; }; |
+DefinedType.prototype.set$_concreteTypes = function(value) { return this._concreteTypes = value; }; |
+DefinedType.prototype.get$isUsed = function() { return this.isUsed; }; |
+DefinedType.prototype.set$isUsed = function(value) { return this.isUsed = value; }; |
+DefinedType.prototype.get$isNative = function() { return this.isNative; }; |
+DefinedType.prototype.set$isNative = function(value) { return this.isNative = value; }; |
+DefinedType.prototype.setDefinition = function(def) { |
+ this.definition = def; |
+ if ((this.definition instanceof TypeDefinition) && this.definition.get$nativeType() != null) { |
+ this.isNative = true; |
+ } |
+ if (this.definition != null && this.definition.get$typeParameters() != null) { |
+ this._concreteTypes = new HashMapImplementation(); |
+ this.typeParameters = this.definition.get$typeParameters(); |
+ } |
+} |
+DefinedType.prototype.get$nativeType = function() { |
+ return (this.definition != null ? this.definition.get$nativeType() : null); |
+} |
+DefinedType.prototype.get$typeArgsInOrder = function() { |
+ if (this.typeParameters == null) return null; |
+ if (this._typeArgsInOrder == null) { |
+ this._typeArgsInOrder = new FixedCollection_Type($globals.world.varType, this.typeParameters.length); |
+ } |
+ return this._typeArgsInOrder; |
+} |
+DefinedType.prototype.get$isVar = function() { |
+ return $eq(this, $globals.world.varType); |
+} |
+DefinedType.prototype.get$isVoid = function() { |
+ return $eq(this, $globals.world.voidType); |
+} |
+DefinedType.prototype.get$isTop = function() { |
+ return this.name == null; |
+} |
+DefinedType.prototype.get$isObject = function() { |
+ return this.library.get$isCore() && this.name == 'Object'; |
+} |
+DefinedType.prototype.get$isString = function() { |
+ return this.library.get$isCore() && this.name == 'String' || this.library.get$isCoreImpl() && this.name == 'StringImplementation'; |
+} |
+DefinedType.prototype.get$isBool = function() { |
+ return this.library.get$isCore() && this.name == 'bool'; |
+} |
+DefinedType.prototype.get$isFunction = function() { |
+ return this.library.get$isCore() && this.name == 'Function'; |
+} |
+DefinedType.prototype.get$isList = function() { |
+ return this.library.get$isCore() && this.name == 'List'; |
+} |
+DefinedType.prototype.get$isGeneric = function() { |
+ return this.typeParameters != null; |
+} |
+DefinedType.prototype.get$span = function() { |
+ return this.definition == null ? null : this.definition.span; |
+} |
+DefinedType.prototype.get$typeofName = function() { |
+ if (!this.library.get$isCore()) return null; |
+ if (this.get$isBool()) return 'boolean'; |
+ else if (this.get$isNum()) return 'number'; |
+ else if (this.get$isString()) return 'string'; |
+ else if (this.get$isFunction()) return 'function'; |
+ else return null; |
+} |
+DefinedType.prototype.get$isNum = function() { |
+ return this.library != null && this.library.get$isCore() && (this.name == 'num' || this.name == 'int' || this.name == 'double'); |
+} |
+DefinedType.prototype.getCallMethod = function() { |
+ return this.members.$index(':call'); |
+} |
+DefinedType.prototype.getAllMembers = function() { |
+ return HashMapImplementation.HashMapImplementation$from$factory(this.members); |
+} |
+DefinedType.prototype.markUsed = function() { |
+ if (this.isUsed) return; |
+ this.isUsed = true; |
+ this._checkExtends(); |
+ if (this._lazyGenMethods != null) { |
+ var $$list = orderValuesByKeys(this._lazyGenMethods); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var method = $$list.$index($$i); |
+ $globals.world.gen.genMethod(method); |
+ } |
+ this._lazyGenMethods = null; |
+ } |
+ if (this.get$parent() != null) this.get$parent().markUsed(); |
+} |
+DefinedType.prototype.genMethod = function(method) { |
+ if (this.isUsed) { |
+ $globals.world.gen.genMethod(method); |
+ } |
+ else if (this.isClass) { |
+ if (this._lazyGenMethods == null) this._lazyGenMethods = new HashMapImplementation(); |
+ this._lazyGenMethods.$setindex(method.name, method); |
+ } |
+} |
+DefinedType.prototype._resolveInterfaces = function(types) { |
+ if (types == null) return []; |
+ var interfaces = []; |
+ for (var $$i = 0;$$i < types.length; $$i++) { |
+ var type = types.$index($$i); |
+ var resolvedInterface = this.resolveType(type, true); |
+ if (resolvedInterface.get$isClosed() && !(this.library.get$isCore() || this.library.get$isCoreImpl())) { |
+ $globals.world.error(('can not implement "' + resolvedInterface.get$name() + '": ') + 'only native implementation allowed', type.get$span()); |
+ } |
+ resolvedInterface.addDirectSubtype$1(this); |
+ interfaces.add$1(resolvedInterface); |
+ } |
+ return interfaces; |
+} |
+DefinedType.prototype.addDirectSubtype = function(type) { |
+ this.directSubtypes.add(type); |
+} |
+DefinedType.prototype.get$subtypes = function() { |
+ if (this._subtypes == null) { |
+ this._subtypes = new HashSetImplementation(); |
+ var $$list = this.directSubtypes; |
+ for (var $$i = this.directSubtypes.iterator(); $$i.hasNext$0(); ) { |
+ var st = $$i.next$0(); |
+ this._subtypes.add(st); |
+ this._subtypes.addAll(st.get$subtypes()); |
+ } |
+ } |
+ return this._subtypes; |
+} |
+DefinedType.prototype._cycleInClassExtends = function() { |
+ var seen = new HashSetImplementation(); |
+ seen.add(this); |
+ var ancestor = this.get$parent(); |
+ while (ancestor != null) { |
+ if (ancestor === this) { |
+ return true; |
+ } |
+ if (seen.contains(ancestor)) { |
+ return false; |
+ } |
+ seen.add(ancestor); |
+ ancestor = ancestor.get$parent(); |
+ } |
+ return false; |
+} |
+DefinedType.prototype._cycleInInterfaceExtends = function() { |
+ var $this = this; // closure support |
+ var seen = new HashSetImplementation(); |
+ seen.add(this); |
+ function _helper(ancestor) { |
+ if (ancestor == null) return false; |
+ if (ancestor === $this) return true; |
+ if (seen.contains(ancestor)) { |
+ return false; |
+ } |
+ seen.add(ancestor); |
+ if (ancestor.get$interfaces() != null) { |
+ var $$list = ancestor.get$interfaces(); |
+ for (var $$i = ancestor.get$interfaces().iterator$0(); $$i.hasNext$0(); ) { |
+ var parent = $$i.next$0(); |
+ if (_helper(parent)) return true; |
+ } |
+ } |
+ return false; |
+ } |
+ for (var i = 0; |
+ i < this.interfaces.length; i++) { |
+ if (_helper(this.interfaces.$index(i))) return i; |
+ } |
+ return -1; |
+} |
+DefinedType.prototype.resolve = function() { |
+ if ((this.definition instanceof TypeDefinition)) { |
+ var typeDef = this.definition; |
+ if (this.isClass) { |
+ if (typeDef.extendsTypes != null && typeDef.extendsTypes.length > 0) { |
+ if (typeDef.extendsTypes.length > 1) { |
+ $globals.world.error('more than one base class', typeDef.extendsTypes.$index(1).get$span()); |
+ } |
+ var extendsTypeRef = typeDef.extendsTypes.$index(0); |
+ if ((extendsTypeRef instanceof GenericTypeReference)) { |
+ var g = extendsTypeRef; |
+ this.set$parent(this.resolveType(g.baseType, true)); |
+ } |
+ this.set$parent(this.resolveType(extendsTypeRef, true)); |
+ if (!this.get$parent().get$isClass()) { |
+ $globals.world.error('class may not extend an interface - use implements', typeDef.extendsTypes.$index(0).get$span()); |
+ } |
+ this.get$parent().addDirectSubtype(this); |
+ if (this._cycleInClassExtends()) { |
+ $globals.world.error(('class "' + this.name + '" has a cycle in its inheritance chain'), extendsTypeRef.get$span()); |
+ } |
+ } |
+ else { |
+ if (!this.get$isObject()) { |
+ this.set$parent($globals.world.objectType); |
+ this.get$parent().addDirectSubtype(this); |
+ } |
+ } |
+ this.interfaces = this._resolveInterfaces(typeDef.implementsTypes); |
+ if (typeDef.factoryType != null) { |
+ $globals.world.error('factory not allowed on classes', typeDef.factoryType.span); |
+ } |
+ } |
+ else { |
+ if (typeDef.implementsTypes != null && typeDef.implementsTypes.length > 0) { |
+ $globals.world.error('implements not allowed on interfaces (use extends)', typeDef.implementsTypes.$index(0).get$span()); |
+ } |
+ this.interfaces = this._resolveInterfaces(typeDef.extendsTypes); |
+ var res = this._cycleInInterfaceExtends(); |
+ if (res >= 0) { |
+ $globals.world.error(('interface "' + this.name + '" has a cycle in its inheritance chain'), typeDef.extendsTypes.$index(res).get$span()); |
+ } |
+ if (typeDef.factoryType != null) { |
+ this.factory_ = this.resolveType(typeDef.factoryType, true); |
+ if (this.factory_ == null) { |
+ $globals.world.warning('unresolved factory', typeDef.factoryType.span); |
+ } |
+ } |
+ } |
+ } |
+ else if ((this.definition instanceof FunctionTypeDefinition)) { |
+ this.interfaces = [$globals.world.functionType]; |
+ } |
+ if (this.typeParameters != null) { |
+ var $$list = this.typeParameters; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var tp = $$list.$index($$i); |
+ tp.set$enclosingElement(this); |
+ tp.resolve$0(); |
+ } |
+ } |
+ if (this.get$isObject()) this._createNotEqualMember(); |
+ $globals.world._addType(this); |
+ var $$list = this.constructors.getValues(); |
+ for (var $$i = this.constructors.getValues().iterator$0(); $$i.hasNext$0(); ) { |
+ var c = $$i.next$0(); |
+ c.resolve$0(); |
+ } |
+ var $list0 = this.members.getValues(); |
+ for (var $$i = this.members.getValues().iterator$0(); $$i.hasNext$0(); ) { |
+ var m = $$i.next$0(); |
+ m.resolve$0(); |
+ } |
+ this.factories.forEach((function (f) { |
+ return f.resolve$0(); |
+ }) |
+ ); |
+ if (this.get$isJsGlobalObject()) { |
+ var $list1 = this.members.getValues(); |
+ for (var $$i = this.members.getValues().iterator$0(); $$i.hasNext$0(); ) { |
+ var m0 = $$i.next$0(); |
+ if (!m0.get$isStatic()) $globals.world._addTopName(m0); |
+ } |
+ } |
+} |
+DefinedType.prototype.addMethod = function(methodName, definition) { |
+ if (methodName == null) methodName = definition.name.name; |
+ var method = new MethodMember(methodName, this, definition); |
+ if (method.get$isConstructor()) { |
+ if (this.constructors.containsKey(method.get$constructorName())) { |
+ $globals.world.error(('duplicate constructor definition of ' + method.get$name()), definition.span); |
+ return; |
+ } |
+ this.constructors.$setindex(method.get$constructorName(), method); |
+ return; |
+ } |
+ if (definition.modifiers != null && definition.modifiers.length == 1 && $eq(definition.modifiers.$index(0).get$kind(), 75/*TokenKind.FACTORY*/)) { |
+ if (this.factories.getFactory(method.get$constructorName(), method.get$name()) != null) { |
+ $globals.world.error(('duplicate factory definition of "' + method.get$name() + '"'), definition.span); |
+ return; |
+ } |
+ this.factories.addFactory(method.get$constructorName(), method.get$name(), method); |
+ return; |
+ } |
+ if (methodName.startsWith('get:') || methodName.startsWith('set:')) { |
+ var propName = methodName.substring(4); |
+ var prop = this.members.$index(propName); |
+ if (prop == null) { |
+ prop = new PropertyMember(propName, this); |
+ this.members.$setindex(propName, prop); |
+ } |
+ if (!(prop instanceof PropertyMember)) { |
+ $globals.world.error(('property conflicts with field "' + propName + '"'), definition.span); |
+ return; |
+ } |
+ if (methodName[0] == 'g') { |
+ if (prop.get$getter() != null) { |
+ $globals.world.error(('duplicate getter definition for "' + propName + '"'), definition.span); |
+ } |
+ prop.set$getter(method); |
+ } |
+ else { |
+ if (prop.get$setter() != null) { |
+ $globals.world.error(('duplicate setter definition for "' + propName + '"'), definition.span); |
+ } |
+ prop.set$setter(method); |
+ } |
+ return; |
+ } |
+ if (this.members.containsKey(methodName)) { |
+ $globals.world.error(('duplicate method definition of "' + method.get$name() + '"'), definition.span); |
+ return; |
+ } |
+ this.members.$setindex(methodName, method); |
+} |
+DefinedType.prototype.addField = function(definition) { |
+ for (var i = 0; |
+ i < definition.names.length; i++) { |
+ var name = definition.names.$index(i).get$name(); |
+ if (this.members.containsKey(name)) { |
+ $globals.world.error(('duplicate field definition of "' + name + '"'), definition.span); |
+ return; |
+ } |
+ var value = null; |
+ if (definition.values != null) { |
+ value = definition.values.$index(i); |
+ } |
+ var field = new FieldMember(name, this, definition, value); |
+ this.members.$setindex(name, field); |
+ if (this.isNative) { |
+ field.set$isNative(true); |
+ } |
+ } |
+} |
+DefinedType.prototype.getFactory = function(type, constructorName) { |
+ var ret = this.factories.getFactory(type.name, constructorName); |
+ if (ret != null) return ret; |
+ ret = this.factories.getFactory(this.name, constructorName); |
+ if (ret != null) return ret; |
+ ret = this.constructors.$index(constructorName); |
+ if (ret != null) return ret; |
+ return this._tryCreateDefaultConstructor(constructorName); |
+} |
+DefinedType.prototype.getConstructor = function(constructorName) { |
+ var ret = this.constructors.$index(constructorName); |
+ if (ret != null) { |
+ if (this.factory_ != null) { |
+ return this.factory_.getFactory(this, constructorName); |
+ } |
+ return ret; |
+ } |
+ ret = this.factories.getFactory(this.name, constructorName); |
+ if (ret != null) return ret; |
+ return this._tryCreateDefaultConstructor(constructorName); |
+} |
+DefinedType.prototype._tryCreateDefaultConstructor = function(name) { |
+ if (name == '' && this.definition != null && this.isClass && this.constructors.get$length() == 0) { |
+ var span = this.definition.span; |
+ var inits = null, native_ = null, body = null; |
+ if (this.isNative) { |
+ native_ = ''; |
+ inits = null; |
+ } |
+ else { |
+ body = null; |
+ inits = [new CallExpression(new SuperExpression(span), [], span)]; |
+ } |
+ var typeDef = this.definition; |
+ var c = new FunctionDefinition(null, null, typeDef.name, [], null, inits, native_, body, span); |
+ this.addMethod(null, c); |
+ this.constructors.$index('').resolve$0(); |
+ return this.constructors.$index(''); |
+ } |
+ return null; |
+} |
+DefinedType.prototype.getMember = function(memberName) { |
+ var member = this.members.$index(memberName); |
+ if (member != null) { |
+ this._checkOverride(member); |
+ return member; |
+ } |
+ if (this.get$isTop()) { |
+ var libType = this.library.findTypeByName(memberName); |
+ if (libType != null) { |
+ return libType.get$typeMember(); |
+ } |
+ } |
+ return this._getMemberInParents(memberName); |
+} |
+DefinedType.prototype.resolveTypeParams = function(inType) { |
+ return this; |
+} |
+DefinedType.prototype.getOrMakeConcreteType = function(typeArgs) { |
+ var jsnames = []; |
+ var names = []; |
+ var typeMap = new HashMapImplementation(); |
+ for (var i = 0; |
+ i < typeArgs.length; i++) { |
+ var paramName = this.typeParameters.$index(i).get$name(); |
+ typeMap.$setindex(paramName, typeArgs.$index(i)); |
+ names.add$1(typeArgs.$index(i).get$name()); |
+ jsnames.add$1(typeArgs.$index(i).get$jsname()); |
+ } |
+ var jsname = ('' + this.get$jsname() + '_' + Strings.join(jsnames, '\$')); |
+ var simpleName = ('' + this.name + '<' + Strings.join(names, ', ') + '>'); |
+ var key = Strings.join(names, '\$'); |
+ var ret = this._concreteTypes.$index(key); |
+ if (ret == null) { |
+ ret = new ConcreteType(simpleName, this, typeMap, typeArgs); |
+ ret.set$_jsname(jsname); |
+ this._concreteTypes.$setindex(key, ret); |
+ } |
+ return ret; |
+} |
+DefinedType.prototype.getCallStub = function(args) { |
+ var name = _getCallStubName('call', args); |
+ var stub = this.varStubs.$index(name); |
+ if (stub == null) { |
+ stub = new VarFunctionStub(name, args); |
+ this.varStubs.$setindex(name, stub); |
+ } |
+ return stub; |
+} |
+DefinedType.prototype.addDirectSubtype$1 = DefinedType.prototype.addDirectSubtype; |
+DefinedType.prototype.addMethod$2 = DefinedType.prototype.addMethod; |
+DefinedType.prototype.getConstructor$1 = DefinedType.prototype.getConstructor; |
+DefinedType.prototype.getFactory$2 = DefinedType.prototype.getFactory; |
+DefinedType.prototype.getMember$1 = DefinedType.prototype.getMember; |
+DefinedType.prototype.getOrMakeConcreteType$1 = DefinedType.prototype.getOrMakeConcreteType; |
+DefinedType.prototype.markUsed$0 = DefinedType.prototype.markUsed; |
+DefinedType.prototype.resolve$0 = DefinedType.prototype.resolve; |
+DefinedType.prototype.resolveTypeParams$1 = DefinedType.prototype.resolveTypeParams; |
+DefinedType.prototype.setDefinition$1 = DefinedType.prototype.setDefinition; |
+// ********** Code for NativeType ************** |
+function NativeType(name) { |
+ this.isConstructorHidden = false |
+ this.isJsGlobalObject = false |
+ this.isSingleton = false |
+ this.name = name; |
+ // Initializers done |
+ while (true) { |
+ if (this.name.startsWith('@')) { |
+ this.name = this.name.substring(1); |
+ this.isJsGlobalObject = true; |
+ } |
+ else if (this.name.startsWith('*')) { |
+ this.name = this.name.substring(1); |
+ this.isConstructorHidden = true; |
+ } |
+ else { |
+ break; |
+ } |
+ } |
+ if (this.name.startsWith('=')) { |
+ this.name = this.name.substring(1); |
+ this.isSingleton = true; |
+ } |
+} |
+NativeType.prototype.get$name = function() { return this.name; }; |
+NativeType.prototype.set$name = function(value) { return this.name = value; }; |
+// ********** Code for FixedCollection ************** |
+function FixedCollection(value, length) { |
+ this.value = value; |
+ this.length = length; |
+ // Initializers done |
+} |
+FixedCollection.prototype.get$value = function() { return this.value; }; |
+FixedCollection.prototype.iterator = function() { |
+ return new FixedIterator_E(this.value, this.length); |
+} |
+FixedCollection.prototype.forEach = function(f) { |
+ Collections.forEach(this, f); |
+} |
+FixedCollection.prototype.filter = function(f) { |
+ return Collections.filter(this, new ListFactory(), f); |
+} |
+FixedCollection.prototype.every = function(f) { |
+ return Collections.every(this, f); |
+} |
+FixedCollection.prototype.some = function(f) { |
+ return Collections.some(this, f); |
+} |
+FixedCollection.prototype.isEmpty = function() { |
+ return this.length == 0; |
+} |
+FixedCollection.prototype.every$1 = function($0) { |
+ return this.every(to$call$1($0)); |
+}; |
+FixedCollection.prototype.filter$1 = function($0) { |
+ return this.filter(to$call$1($0)); |
+}; |
+FixedCollection.prototype.forEach$1 = function($0) { |
+ return this.forEach(to$call$1($0)); |
+}; |
+FixedCollection.prototype.isEmpty$0 = FixedCollection.prototype.isEmpty; |
+FixedCollection.prototype.iterator$0 = FixedCollection.prototype.iterator; |
+FixedCollection.prototype.some$1 = function($0) { |
+ return this.some(to$call$1($0)); |
+}; |
+// ********** Code for FixedCollection_Type ************** |
+$inherits(FixedCollection_Type, FixedCollection); |
+function FixedCollection_Type(value, length) { |
+ this.value = value; |
+ this.length = length; |
+ // Initializers done |
+} |
+// ********** Code for FixedIterator ************** |
+function FixedIterator(value, length) { |
+ this._index = 0 |
+ this.value = value; |
+ this.length = length; |
+ // Initializers done |
+} |
+FixedIterator.prototype.get$value = function() { return this.value; }; |
+FixedIterator.prototype.hasNext = function() { |
+ return this._index < this.length; |
+} |
+FixedIterator.prototype.next = function() { |
+ this._index++; |
+ return this.value; |
+} |
+FixedIterator.prototype.hasNext$0 = FixedIterator.prototype.hasNext; |
+FixedIterator.prototype.next$0 = FixedIterator.prototype.next; |
+// ********** Code for FixedIterator_E ************** |
+$inherits(FixedIterator_E, FixedIterator); |
+function FixedIterator_E(value, length) { |
+ this._index = 0 |
+ this.value = value; |
+ this.length = length; |
+ // Initializers done |
+} |
+// ********** Code for Value ************** |
+function Value(_type, code, span, needsTemp) { |
+ this.isSuper = false |
+ this.isType = false |
+ this.isFinal = false |
+ this.allowDynamic = true |
+ this._type = _type; |
+ this.code = code; |
+ this.span = span; |
+ this.needsTemp = needsTemp; |
+ // Initializers done |
+ if (this._type == null) $globals.world.internalError('type passed as null', this.span); |
+} |
+Value.type$ctor = function(_type, span) { |
+ this.isSuper = false |
+ this.isType = false |
+ this.isFinal = false |
+ this.allowDynamic = true |
+ this._type = _type; |
+ this.span = span; |
+ this.code = null; |
+ this.needsTemp = false; |
+ this.isType = true; |
+ // Initializers done |
+ if (this._type == null) $globals.world.internalError('type passed as null', this.span); |
+} |
+Value.type$ctor.prototype = Value.prototype; |
+Value.prototype.get$code = function() { return this.code; }; |
+Value.prototype.set$code = function(value) { return this.code = value; }; |
+Value.prototype.get$span = function() { return this.span; }; |
+Value.prototype.set$span = function(value) { return this.span = value; }; |
+Value.prototype.get$isSuper = function() { return this.isSuper; }; |
+Value.prototype.set$isSuper = function(value) { return this.isSuper = value; }; |
+Value.prototype.get$isType = function() { return this.isType; }; |
+Value.prototype.set$isType = function(value) { return this.isType = value; }; |
+Value.prototype.get$isFinal = function() { return this.isFinal; }; |
+Value.prototype.set$isFinal = function(value) { return this.isFinal = value; }; |
+Value.prototype.get$allowDynamic = function() { return this.allowDynamic; }; |
+Value.prototype.set$allowDynamic = function(value) { return this.allowDynamic = value; }; |
+Value.prototype.get$needsTemp = function() { return this.needsTemp; }; |
+Value.prototype.set$needsTemp = function(value) { return this.needsTemp = value; }; |
+Value.prototype.get$_typeIsVarOrParameterType = function() { |
+ return this.get$type().get$isVar() || (this.get$type() instanceof ParameterType); |
+} |
+Value.prototype.get$type = function() { |
+ if (!$globals.options.forceDynamic || !this.allowDynamic || this.isType || this.isSuper || this.get$isConst()) { |
+ return this._type; |
+ } |
+ else { |
+ return $globals.world.varType; |
+ } |
+} |
+Value.prototype.get$isConst = function() { |
+ return false; |
+} |
+Value.prototype.get$canonicalCode = function() { |
+ return null; |
+} |
+Value.prototype.get_ = function(context, name, node) { |
+ var member = this._resolveMember(context, name, node, false); |
+ if (member != null) { |
+ return member._get$3(context, node, this); |
+ } |
+ else { |
+ return this.invokeNoSuchMethod(context, ('get:' + name), node); |
+ } |
+} |
+Value.prototype.set_ = function(context, name, node, value, isDynamic) { |
+ var member = this._resolveMember(context, name, node, isDynamic); |
+ if (member != null) { |
+ return member._set$5(context, node, this, value, isDynamic); |
+ } |
+ else { |
+ return this.invokeNoSuchMethod(context, ('set:' + name), node, new Arguments(null, [value])); |
+ } |
+} |
+Value.prototype.invoke = function(context, name, node, args, isDynamic) { |
+ if (name == ':call') { |
+ if (this.isType) { |
+ $globals.world.error('must use "new" or "const" to construct a new instance', node.span); |
+ } |
+ if (this.get$type().needsVarCall(args)) { |
+ return this._varCall(context, args); |
+ } |
+ } |
+ var member = this._resolveMember(context, name, node, isDynamic); |
+ if (member == null) { |
+ return this.invokeNoSuchMethod(context, name, node, args); |
+ } |
+ else { |
+ return member.invoke$5(context, node, this, args, isDynamic); |
+ } |
+} |
+Value.prototype.canInvoke = function(context, name, args) { |
+ if (this.get$type().get$isVarOrFunction() && name == ':call') { |
+ return true; |
+ } |
+ var member = this._resolveMember(context, name, null, true); |
+ return member != null && member.canInvoke$2(context, args); |
+} |
+Value.prototype._hasOverriddenNoSuchMethod = function() { |
+ if (this.isSuper) { |
+ var m = this.get$type().getMember('noSuchMethod'); |
+ return m != null && !m.get$declaringType().get$isObject(); |
+ } |
+ else { |
+ var m = this.get$type().resolveMember('noSuchMethod'); |
+ return m != null && m.get$members().length > 1; |
+ } |
+} |
+Value.prototype._tryResolveMember = function(context, name) { |
+ if (this.isSuper) { |
+ return this.get$type().getMember(name); |
+ } |
+ else { |
+ return this.get$type().resolveMember(name); |
+ } |
+} |
+Value.prototype._resolveMember = function(context, name, node, isDynamic) { |
+ var member; |
+ if (!this.get$_typeIsVarOrParameterType()) { |
+ member = this._tryResolveMember(context, name); |
+ if (member != null && this.isType && !member.get$isStatic()) { |
+ if (!isDynamic) { |
+ $globals.world.error('can not refer to instance member as static', node.span); |
+ } |
+ return null; |
+ } |
+ if (member == null && !isDynamic && !this._hasOverriddenNoSuchMethod()) { |
+ var typeName = this.get$type().name == null ? this.get$type().get$library().name : this.get$type().name; |
+ var message = ('can not resolve "' + name + '" on "' + typeName + '"'); |
+ if (this.isType) { |
+ $globals.world.error(message, node.span); |
+ } |
+ else { |
+ $globals.world.warning(message, node.span); |
+ } |
+ } |
+ } |
+ if (member == null && !this.isSuper && !this.isType) { |
+ member = context.findMembers(name); |
+ if (member == null && !isDynamic) { |
+ var where = 'the world'; |
+ if (name.startsWith('_')) { |
+ where = ('library "' + context.get$library().name + '"'); |
+ } |
+ $globals.world.warning(('' + name + ' is not defined anywhere in ' + where + '.'), node.span); |
+ } |
+ } |
+ return member; |
+} |
+Value.prototype.checkFirstClass = function(span) { |
+ if (this.isType) { |
+ $globals.world.error('Types are not first class', span); |
+ } |
+} |
+Value.prototype._varCall = function(context, args) { |
+ var stub = $globals.world.functionType.getCallStub(args); |
+ return new Value($globals.world.varType, ('' + this.code + '.' + stub.get$name() + '(' + args.getCode() + ')'), this.span, true); |
+} |
+Value.prototype.needsConversion = function(toType) { |
+ var callMethod = toType.getCallMethod(); |
+ if (callMethod != null) { |
+ var arity = callMethod.get$parameters().length; |
+ var myCall = this.get$type().getCallMethod(); |
+ if (myCall == null || $ne(myCall.get$parameters().length, arity)) { |
+ return true; |
+ } |
+ } |
+ if ($globals.options.enableTypeChecks) { |
+ var fromType = this.get$type(); |
+ if (this.get$type().get$isVar() && (this.code != 'null' || !toType.get$isNullable())) { |
+ fromType = $globals.world.objectType; |
+ } |
+ var bothNum = this.get$type().get$isNum() && toType.get$isNum(); |
+ return !(fromType.isSubtypeOf(toType) || bothNum); |
+ } |
+ return false; |
+} |
+Value.prototype.convertTo = function(context, toType, node, isDynamic) { |
+ var checked = !isDynamic; |
+ var callMethod = toType.getCallMethod(); |
+ if (callMethod != null) { |
+ if (checked && !toType.isAssignable(this.get$type())) { |
+ this.convertWarning(toType, node); |
+ } |
+ var arity = callMethod.get$parameters().length; |
+ var myCall = this.get$type().getCallMethod(); |
+ if (myCall == null || $ne(myCall.get$parameters().length, arity)) { |
+ var stub = $globals.world.functionType.getCallStub(Arguments.Arguments$bare$factory(arity)); |
+ var val = new Value(toType, ('to\$' + stub.name + '(' + this.code + ')'), node.span, true); |
+ return this._isDomCallback(toType) && !this._isDomCallback(this.get$type()) ? val._wrapDomCallback$2(toType, arity) : val; |
+ } |
+ else if (this._isDomCallback(toType) && !this._isDomCallback(this.get$type())) { |
+ return this._wrapDomCallback(toType, arity); |
+ } |
+ } |
+ var fromType = this.get$type(); |
+ if (this.get$type().get$isVar() && (this.code != 'null' || !toType.get$isNullable())) { |
+ fromType = $globals.world.objectType; |
+ } |
+ var bothNum = this.get$type().get$isNum() && toType.get$isNum(); |
+ if (fromType.isSubtypeOf(toType) || bothNum) { |
+ return this; |
+ } |
+ if (checked && !toType.isSubtypeOf(this.get$type())) { |
+ this.convertWarning(toType, node); |
+ } |
+ if ($globals.options.enableTypeChecks) { |
+ return this._typeAssert(context, toType, node, isDynamic); |
+ } |
+ else { |
+ return this; |
+ } |
+} |
+Value.prototype._isDomCallback = function(toType) { |
+ return ((toType.get$definition() instanceof FunctionTypeDefinition) && $eq(toType.get$library(), $globals.world.get$dom())); |
+} |
+Value.prototype._wrapDomCallback = function(toType, arity) { |
+ if (arity == 0) { |
+ $globals.world.gen.corejs.useWrap0 = true; |
+ } |
+ else { |
+ $globals.world.gen.corejs.useWrap1 = true; |
+ } |
+ return new Value(toType, ('\$wrap_call\$' + arity + '(' + this.code + ')'), this.span, true); |
+} |
+Value.prototype._typeAssert = function(context, toType, node, isDynamic) { |
+ if ((toType instanceof ParameterType)) { |
+ var p = toType; |
+ toType = p.extendsType; |
+ } |
+ if (toType.get$isObject() || toType.get$isVar()) { |
+ $globals.world.internalError(('We thought ' + this.get$type().name + ' is not a subtype of ' + toType.name + '?')); |
+ } |
+ function throwTypeError(paramName) { |
+ return $globals.world.withoutForceDynamic((function () { |
+ var typeError = $globals.world.corelib.types.$index('TypeError'); |
+ var typeErrorCtor = typeError.getConstructor$1('_internal'); |
+ $globals.world.gen.corejs.ensureTypeNameOf(); |
+ var result = typeErrorCtor.invoke$5(context, node, new Value.type$ctor(typeError, null), new Arguments(null, [new Value($globals.world.objectType, paramName, null, true), new Value($globals.world.stringType, ('"' + toType.name + '"'), null, true)]), isDynamic); |
+ $globals.world.gen.corejs.useThrow = true; |
+ return ('\$throw(' + result.get$code() + ')'); |
+ }) |
+ ); |
+ } |
+ if (toType.get$isNum()) toType = $globals.world.numType; |
+ var check; |
+ if (toType.get$isVoid()) { |
+ check = ('\$assert_void(' + this.code + ')'); |
+ if (toType.typeCheckCode == null) { |
+ toType.typeCheckCode = ("function $assert_void(x) {\n if (x == null) return null;\n " + throwTypeError("x") + "\n}"); |
+ } |
+ } |
+ else if ($eq(toType, $globals.world.nonNullBool)) { |
+ $globals.world.gen.corejs.useNotNullBool = true; |
+ check = ('\$notnull_bool(' + this.code + ')'); |
+ } |
+ else if (toType.get$library().get$isCore() && toType.get$typeofName() != null) { |
+ check = ('\$assert_' + toType.name + '(' + this.code + ')'); |
+ if (toType.typeCheckCode == null) { |
+ toType.typeCheckCode = ("function $assert_" + toType.name + "(x) {\n if (x == null || typeof(x) == \"" + toType.get$typeofName() + "\") return x;\n " + throwTypeError("x") + "\n}"); |
+ } |
+ } |
+ else { |
+ toType.isChecked = true; |
+ var checkName = 'assert\$' + toType.get$jsname(); |
+ var temp = context.getTemp(this); |
+ check = ('(' + context.assignTemp(temp, this).code + ' == null ? null :'); |
+ check = check + (' ' + temp.get$code() + '.' + checkName + '())'); |
+ if ($ne(this, temp)) context.freeTemp(temp); |
+ if (!$globals.world.objectType.varStubs.containsKey(checkName)) { |
+ $globals.world.objectType.varStubs.$setindex(checkName, new VarMethodStub(checkName, null, Arguments.get$EMPTY(), throwTypeError('this'))); |
+ } |
+ } |
+ return new Value(toType, check, this.span, true); |
+} |
+Value.prototype.instanceOf = function(context, toType, span, isTrue, forceCheck) { |
+ if (toType.get$isVar()) { |
+ $globals.world.error('can not resolve type', span); |
+ } |
+ var testCode = null; |
+ if (toType.get$isVar() || toType.get$isObject() || (toType instanceof ParameterType)) { |
+ if (this.needsTemp) { |
+ return new Value($globals.world.nonNullBool, ('(' + this.code + ', true)'), span, true); |
+ } |
+ else { |
+ return EvaluatedValue.EvaluatedValue$factory($globals.world.nonNullBool, true, 'true', null); |
+ } |
+ } |
+ if (toType.get$library().get$isCore()) { |
+ var typeofName = toType.get$typeofName(); |
+ if (typeofName != null) { |
+ testCode = ("(typeof(" + this.code + ") " + (isTrue ? '==' : '!=') + " '" + typeofName + "')"); |
+ } |
+ } |
+ if (toType.get$isClass() && !(toType instanceof ConcreteType) && !toType.get$isHiddenNativeType()) { |
+ toType.markUsed(); |
+ testCode = ('(' + this.code + ' instanceof ' + toType.get$jsname() + ')'); |
+ if (!isTrue) { |
+ testCode = '!' + testCode; |
+ } |
+ } |
+ if (testCode == null) { |
+ toType.isTested = true; |
+ var temp = context.getTemp(this); |
+ var checkName = ('is\$' + toType.get$jsname()); |
+ testCode = ('(' + context.assignTemp(temp, this).code + ' &&'); |
+ testCode = testCode + (' ' + temp.get$code() + '.' + checkName + '())'); |
+ if (isTrue) { |
+ testCode = '!!' + testCode; |
+ } |
+ else { |
+ testCode = '!' + testCode; |
+ } |
+ if ($ne(this, temp)) context.freeTemp(temp); |
+ if (!$globals.world.objectType.varStubs.containsKey(checkName)) { |
+ $globals.world.objectType.varStubs.$setindex(checkName, new VarMethodStub(checkName, null, Arguments.get$EMPTY(), 'return false')); |
+ } |
+ } |
+ return new Value($globals.world.nonNullBool, testCode, span, true); |
+} |
+Value.prototype.convertWarning = function(toType, node) { |
+ $globals.world.warning(('type "' + this.get$type().name + '" is not assignable to "' + toType.name + '"'), node.span); |
+} |
+Value.prototype.invokeNoSuchMethod = function(context, name, node, args) { |
+ var pos = ''; |
+ if (args != null) { |
+ var argsCode = []; |
+ for (var i = 0; |
+ i < args.get$length(); i++) { |
+ argsCode.add$1(args.values.$index(i).get$code()); |
+ } |
+ pos = Strings.join(argsCode, ", "); |
+ } |
+ var noSuchArgs = [new Value($globals.world.stringType, ('"' + name + '"'), node.span, true), new Value($globals.world.listType, ('[' + pos + ']'), node.span, true)]; |
+ return this._resolveMember(context, 'noSuchMethod', node, false).invoke$4(context, node, this, new Arguments(null, noSuchArgs)); |
+} |
+Value.prototype._wrapDomCallback$2 = Value.prototype._wrapDomCallback; |
+Value.prototype.checkFirstClass$1 = Value.prototype.checkFirstClass; |
+Value.prototype.convertTo$3 = function($0, $1, $2) { |
+ return this.convertTo($0, $1, $2, false); |
+}; |
+Value.prototype.convertTo$4 = Value.prototype.convertTo; |
+Value.prototype.get_$3 = Value.prototype.get_; |
+Value.prototype.instanceOf$3$isTrue$forceCheck = Value.prototype.instanceOf; |
+Value.prototype.instanceOf$4 = function($0, $1, $2, $3) { |
+ return this.instanceOf($0, $1, $2, $3, false); |
+}; |
+Value.prototype.invoke$4 = function($0, $1, $2, $3) { |
+ return this.invoke($0, $1, $2, $3, false); |
+}; |
+Value.prototype.invoke$4$isDynamic = Value.prototype.invoke; |
+Value.prototype.invoke$5 = Value.prototype.invoke; |
+Value.prototype.needsConversion$1 = Value.prototype.needsConversion; |
+Value.prototype.set_$4 = function($0, $1, $2, $3) { |
+ return this.set_($0, $1, $2, $3, false); |
+}; |
+// ********** Code for EvaluatedValue ************** |
+$inherits(EvaluatedValue, Value); |
+function EvaluatedValue() {} |
+EvaluatedValue._internal$ctor = function(type, actualValue, canonicalCode, span, code) { |
+ this.actualValue = actualValue; |
+ this.canonicalCode = canonicalCode; |
+ // Initializers done |
+ Value.call(this, type, code, span, false); |
+} |
+EvaluatedValue._internal$ctor.prototype = EvaluatedValue.prototype; |
+EvaluatedValue.EvaluatedValue$factory = function(type, actualValue, canonicalCode, span) { |
+ return new EvaluatedValue._internal$ctor(type, actualValue, canonicalCode, span, EvaluatedValue.codeWithComments(canonicalCode, span)); |
+} |
+EvaluatedValue.prototype.get$actualValue = function() { return this.actualValue; }; |
+EvaluatedValue.prototype.set$actualValue = function(value) { return this.actualValue = value; }; |
+EvaluatedValue.prototype.get$isConst = function() { |
+ return true; |
+} |
+EvaluatedValue.prototype.get$canonicalCode = function() { return this.canonicalCode; }; |
+EvaluatedValue.prototype.set$canonicalCode = function(value) { return this.canonicalCode = value; }; |
+EvaluatedValue.codeWithComments = function(canonicalCode, span) { |
+ return (span != null && span.get$text() != canonicalCode) ? ('' + canonicalCode + '/*' + _escapeForComment(span.get$text()) + '*/') : canonicalCode; |
+} |
+// ********** Code for ConstListValue ************** |
+$inherits(ConstListValue, EvaluatedValue); |
+function ConstListValue() {} |
+ConstListValue._internal$ctor = function(type, values, actualValue, canonicalCode, span, code) { |
+ this.values = values; |
+ // Initializers done |
+ EvaluatedValue._internal$ctor.call(this, type, actualValue, canonicalCode, span, code); |
+} |
+ConstListValue._internal$ctor.prototype = ConstListValue.prototype; |
+ConstListValue.ConstListValue$factory = function(type, values, actualValue, canonicalCode, span) { |
+ return new ConstListValue._internal$ctor(type, values, actualValue, canonicalCode, span, EvaluatedValue.codeWithComments(canonicalCode, span)); |
+} |
+ConstListValue.prototype.get$values = function() { return this.values; }; |
+ConstListValue.prototype.set$values = function(value) { return this.values = value; }; |
+// ********** Code for ConstMapValue ************** |
+$inherits(ConstMapValue, EvaluatedValue); |
+function ConstMapValue() {} |
+ConstMapValue._internal$ctor = function(type, values, actualValue, canonicalCode, span, code) { |
+ this.values = values; |
+ // Initializers done |
+ EvaluatedValue._internal$ctor.call(this, type, actualValue, canonicalCode, span, code); |
+} |
+ConstMapValue._internal$ctor.prototype = ConstMapValue.prototype; |
+ConstMapValue.ConstMapValue$factory = function(type, keyValuePairs, actualValue, canonicalCode, span) { |
+ var values = new HashMapImplementation(); |
+ for (var i = 0; |
+ i < keyValuePairs.length; i += 2) { |
+ values.$setindex(keyValuePairs.$index(i).get$actualValue(), keyValuePairs.$index(i + 1)); |
+ } |
+ return new ConstMapValue._internal$ctor(type, values, actualValue, canonicalCode, span, EvaluatedValue.codeWithComments(canonicalCode, span)); |
+} |
+ConstMapValue.prototype.get$values = function() { return this.values; }; |
+ConstMapValue.prototype.set$values = function(value) { return this.values = value; }; |
+// ********** Code for ConstObjectValue ************** |
+$inherits(ConstObjectValue, EvaluatedValue); |
+function ConstObjectValue() {} |
+ConstObjectValue._internal$ctor = function(type, fields, actualValue, canonicalCode, span, code) { |
+ this.fields = fields; |
+ // Initializers done |
+ EvaluatedValue._internal$ctor.call(this, type, actualValue, canonicalCode, span, code); |
+} |
+ConstObjectValue._internal$ctor.prototype = ConstObjectValue.prototype; |
+ConstObjectValue.ConstObjectValue$factory = function(type, fields, canonicalCode, span) { |
+ var fieldValues = []; |
+ var $$list = fields.getKeys(); |
+ for (var $$i = fields.getKeys().iterator$0(); $$i.hasNext$0(); ) { |
+ var f = $$i.next$0(); |
+ fieldValues.add(('' + f + ' = ' + fields.$index(f).get$actualValue())); |
+ } |
+ fieldValues.sort((function (a, b) { |
+ return a.compareTo$1(b); |
+ }) |
+ ); |
+ var actualValue = ('const ' + type.get$jsname() + ' [') + Strings.join(fieldValues, ',') + ']'; |
+ return new ConstObjectValue._internal$ctor(type, fields, actualValue, canonicalCode, span, EvaluatedValue.codeWithComments(canonicalCode, span)); |
+} |
+ConstObjectValue.prototype.get$fields = function() { return this.fields; }; |
+ConstObjectValue.prototype.set$fields = function(value) { return this.fields = value; }; |
+// ********** Code for GlobalValue ************** |
+$inherits(GlobalValue, Value); |
+function GlobalValue(type, code, isConst, field, name, exp, canonicalCode, span, _dependencies) { |
+ this.field = field; |
+ this.name = name; |
+ this.exp = exp; |
+ this.canonicalCode = canonicalCode; |
+ this.dependencies = []; |
+ // Initializers done |
+ Value.call(this, type, code, span, !isConst); |
+ for (var $$i = 0;$$i < _dependencies.length; $$i++) { |
+ var dep = _dependencies.$index($$i); |
+ this.dependencies.add(dep); |
+ this.dependencies.addAll(dep.get$dependencies()); |
+ } |
+} |
+GlobalValue.GlobalValue$fromStatic$factory = function(field, exp, dependencies) { |
+ var code = (exp.get$isConst() ? exp.get$canonicalCode() : exp.code); |
+ var codeWithComment = ('' + code + '/*' + field.get$declaringType().get$name() + '.' + field.get$name() + '*/'); |
+ return new GlobalValue(exp.get$type(), codeWithComment, field.get$isFinal(), field, null, exp, code, exp.span, dependencies.filter$1((function (d) { |
+ return (d instanceof GlobalValue); |
+ }) |
+ )); |
+} |
+GlobalValue.GlobalValue$fromConst$factory = function(uniqueId, exp, dependencies) { |
+ var name = ("const\$" + uniqueId); |
+ var codeWithComment = ("" + name + "/*" + _escapeForComment(exp.span.get$text()) + "*/"); |
+ return new GlobalValue(exp.get$type(), codeWithComment, true, null, name, exp, name, exp.span, dependencies.filter$1((function (d) { |
+ return (d instanceof GlobalValue); |
+ }) |
+ )); |
+} |
+GlobalValue.prototype.get$field = function() { return this.field; }; |
+GlobalValue.prototype.set$field = function(value) { return this.field = value; }; |
+GlobalValue.prototype.get$name = function() { return this.name; }; |
+GlobalValue.prototype.set$name = function(value) { return this.name = value; }; |
+GlobalValue.prototype.get$exp = function() { return this.exp; }; |
+GlobalValue.prototype.set$exp = function(value) { return this.exp = value; }; |
+GlobalValue.prototype.get$canonicalCode = function() { return this.canonicalCode; }; |
+GlobalValue.prototype.set$canonicalCode = function(value) { return this.canonicalCode = value; }; |
+GlobalValue.prototype.get$isConst = function() { |
+ return this.exp.get$isConst() && (this.field == null || this.field.isFinal); |
+} |
+GlobalValue.prototype.get$actualValue = function() { |
+ return this.exp.get$dynamic().get$actualValue(); |
+} |
+GlobalValue.prototype.get$dependencies = function() { return this.dependencies; }; |
+GlobalValue.prototype.set$dependencies = function(value) { return this.dependencies = value; }; |
+GlobalValue.prototype.compareTo = function(other) { |
+ if ($eq(other, this)) { |
+ return 0; |
+ } |
+ else if (this.dependencies.indexOf(other) >= 0) { |
+ return 1; |
+ } |
+ else if (other.dependencies.indexOf(this) >= 0) { |
+ return -1; |
+ } |
+ else if (this.dependencies.length > other.dependencies.length) { |
+ return 1; |
+ } |
+ else if (this.dependencies.length < other.dependencies.length) { |
+ return -1; |
+ } |
+ else if (this.name == null && other.name != null) { |
+ return 1; |
+ } |
+ else if (this.name != null && other.name == null) { |
+ return -1; |
+ } |
+ else if (this.name != null) { |
+ return this.name.compareTo(other.name); |
+ } |
+ else { |
+ return this.field.name.compareTo(other.field.name); |
+ } |
+} |
+GlobalValue.prototype.compareTo$1 = GlobalValue.prototype.compareTo; |
+// ********** Code for BareValue ************** |
+$inherits(BareValue, Value); |
+function BareValue(home, outermost, span) { |
+ this.home = home; |
+ // Initializers done |
+ Value.call(this, outermost.method.declaringType, null, span, false); |
+ this.isType = outermost.get$isStatic(); |
+} |
+BareValue.prototype.get$type = function() { |
+ return this._type; |
+} |
+BareValue.prototype._ensureCode = function() { |
+ if (this.code != null) return; |
+ if (this.isType) { |
+ this.code = this.get$type().get$jsname(); |
+ } |
+ else { |
+ this.code = this.home._makeThisCode(); |
+ } |
+} |
+BareValue.prototype._tryResolveMember = function(context, name) { |
+ var member = this.get$type().resolveMember(name); |
+ if (member != null) { |
+ if ($globals.options.forceDynamic && !member.get$isStatic()) { |
+ member = context.findMembers(name); |
+ } |
+ this._ensureCode(); |
+ return member; |
+ } |
+ member = this.home.get$library().lookup(name, this.span); |
+ if (member != null) { |
+ return member; |
+ } |
+ this._ensureCode(); |
+ return null; |
+} |
+// ********** Code for CompilerException ************** |
+function CompilerException(_message, _location) { |
+ this._message = _message; |
+ this._location = _location; |
+ // Initializers done |
+} |
+CompilerException.prototype.toString = function() { |
+ if (this._location != null) { |
+ return ('CompilerException: ' + this._location.toMessageString(this._message)); |
+ } |
+ else { |
+ return ('CompilerException: ' + this._message); |
+ } |
+} |
+CompilerException.prototype.toString$0 = CompilerException.prototype.toString; |
+// ********** Code for World ************** |
+function World(files) { |
+ this.errors = 0 |
+ this.warnings = 0 |
+ this.dartBytesRead = 0 |
+ this.jsBytesWritten = 0 |
+ this.seenFatal = false |
+ this.files = files; |
+ this.libraries = new HashMapImplementation(); |
+ this._todo = []; |
+ this._members = new HashMapImplementation(); |
+ this._topNames = new HashMapImplementation(); |
+ this.reader = new LibraryReader(); |
+ // Initializers done |
+} |
+World.prototype.get$coreimpl = function() { |
+ return this.libraries.$index('dart:coreimpl'); |
+} |
+World.prototype.get$dom = function() { |
+ return this.libraries.$index('dart:dom'); |
+} |
+World.prototype.get$functionType = function() { return this.functionType; }; |
+World.prototype.set$functionType = function(value) { return this.functionType = value; }; |
+World.prototype.reset = function() { |
+ this.libraries = new HashMapImplementation(); |
+ this._todo = []; |
+ this._members = new HashMapImplementation(); |
+ this._topNames = new HashMapImplementation(); |
+ this.errors = this.warnings = 0; |
+ this.seenFatal = false; |
+ this.init(); |
+} |
+World.prototype.init = function() { |
+ this.corelib = new Library(this.readFile('dart:core')); |
+ this.libraries.$setindex('dart:core', this.corelib); |
+ this._todo.add(this.corelib); |
+ this.voidType = this._addToCoreLib('void', false); |
+ this.dynamicType = this._addToCoreLib('Dynamic', false); |
+ this.varType = this.dynamicType; |
+ this.objectType = this._addToCoreLib('Object', true); |
+ this.numType = this._addToCoreLib('num', false); |
+ this.intType = this._addToCoreLib('int', false); |
+ this.doubleType = this._addToCoreLib('double', false); |
+ this.boolType = this._addToCoreLib('bool', false); |
+ this.stringType = this._addToCoreLib('String', false); |
+ this.listType = this._addToCoreLib('List', false); |
+ this.mapType = this._addToCoreLib('Map', false); |
+ this.functionType = this._addToCoreLib('Function', false); |
+ this.nonNullBool = new NonNullableType(this.boolType); |
+} |
+World.prototype._addMember = function(member) { |
+ if (member.get$isStatic()) { |
+ if (member.declaringType.get$isTop()) { |
+ this._addTopName(member); |
+ } |
+ return; |
+ } |
+ var mset = this._members.$index(member.name); |
+ if (mset == null) { |
+ mset = new MemberSet(member, true); |
+ this._members.$setindex(mset.get$name(), mset); |
+ } |
+ else { |
+ mset.get$members().add$1(member); |
+ } |
+} |
+World.prototype._addTopName = function(named) { |
+ var existing = this._topNames.$index(named.get$jsname()); |
+ if (existing != null) { |
+ this.info(('mangling matching top level name "' + named.get$jsname() + '" in ') + ('both "' + named.get$library().get$jsname() + '" and "' + existing.get$library().get$jsname() + '"')); |
+ if (named.get$isNative()) { |
+ if (existing.get$isNative()) { |
+ $globals.world.internalError(('conflicting native names "' + named.get$jsname() + '" ') + ('(already defined in ' + existing.get$span().get$locationText() + ')'), named.get$span()); |
+ } |
+ else { |
+ this._topNames.$setindex(named.get$jsname(), named); |
+ this._addJavascriptTopName(existing); |
+ } |
+ } |
+ else if (named.get$library().get$isCore()) { |
+ if (existing.get$library().get$isCore()) { |
+ $globals.world.internalError(('conflicting top-level names in core "' + named.get$jsname() + '" ') + ('(previously defined in ' + existing.get$span().get$locationText() + ')'), named.get$span()); |
+ } |
+ else { |
+ this._topNames.$setindex(named.get$jsname(), named); |
+ this._addJavascriptTopName(existing); |
+ } |
+ } |
+ else { |
+ this._addJavascriptTopName(named); |
+ } |
+ } |
+ else { |
+ this._topNames.$setindex(named.get$jsname(), named); |
+ } |
+} |
+World.prototype._addJavascriptTopName = function(named) { |
+ named._jsname = ('' + named.get$library().get$jsname() + '_' + named.get$jsname()); |
+ var existing = this._topNames.$index(named.get$jsname()); |
+ if (existing != null && $ne(existing, named)) { |
+ $globals.world.internalError(('name mangling failed for "' + named.get$jsname() + '" ') + ('("' + named.get$jsname() + '" defined also in ' + existing.get$span().get$locationText() + ')'), named.get$span()); |
+ } |
+ this._topNames.$setindex(named.get$jsname(), named); |
+} |
+World.prototype._addType = function(type) { |
+ if (!type.get$isTop()) this._addTopName(type); |
+} |
+World.prototype._addToCoreLib = function(name, isClass) { |
+ var ret = new DefinedType(name, this.corelib, null, isClass); |
+ this.corelib.types.$setindex(name, ret); |
+ return ret; |
+} |
+World.prototype.toJsIdentifier = function(name) { |
+ if (name == null) return null; |
+ if (this._jsKeywords == null) { |
+ this._jsKeywords = HashSetImplementation.HashSetImplementation$from$factory(['break', 'case', 'catch', 'continue', 'debugger', 'default', 'delete', 'do', 'else', 'finally', 'for', 'function', 'if', 'in', 'instanceof', 'new', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void', 'while', 'with', 'class', 'enum', 'export', 'extends', 'import', 'super', 'implements', 'interface', 'let', 'package', 'private', 'protected', 'public', 'static', 'yield', 'native']); |
+ } |
+ if (this._jsKeywords.contains(name)) { |
+ return name + '_'; |
+ } |
+ else { |
+ return name.replaceAll("$", "$$").replaceAll(':', "$"); |
+ } |
+} |
+World.prototype.compile = function() { |
+ if ($globals.options.dartScript == null) { |
+ this.fatal('no script provided to compile'); |
+ return false; |
+ } |
+ try { |
+ this.info(('compiling ' + $globals.options.dartScript + ' with corelib ' + this.corelib)); |
+ if (!this.runLeg()) this.runCompilationPhases(); |
+ } catch (exc) { |
+ exc = _toDartException(exc); |
+ if (this.get$hasErrors() && !$globals.options.throwOnErrors) { |
+ } |
+ else { |
+ throw exc; |
+ } |
+ } |
+ this.printStatus(); |
+ return !this.get$hasErrors(); |
+} |
+World.prototype.runLeg = function() { |
+ var $this = this; // closure support |
+ if (!$globals.options.enableLeg) return false; |
+ if ($globals.legCompile == null) { |
+ this.fatal('requested leg enabled, but no leg compiler available'); |
+ } |
+ var res = this.withTiming('try leg compile', (function () { |
+ return $globals.legCompile($this); |
+ }) |
+ ); |
+ if (!res && $globals.options.legOnly) { |
+ this.fatal(("Leg could not compile " + $globals.options.dartScript)); |
+ return true; |
+ } |
+ return res; |
+} |
+World.prototype.runCompilationPhases = function() { |
+ var $this = this; // closure support |
+ var lib = this.withTiming('first pass', (function () { |
+ return $this.processDartScript(); |
+ }) |
+ ); |
+ this.withTiming('resolve top level', this.get$resolveAll()); |
+ if ($globals.experimentalAwaitPhase != null) { |
+ this.withTiming('await translation', to$call$0($globals.experimentalAwaitPhase)); |
+ } |
+ this.withTiming('generate code', (function () { |
+ $this.generateCode(lib); |
+ }) |
+ ); |
+} |
+World.prototype.getGeneratedCode = function() { |
+ if (this.legCode != null) { |
+ return this.legCode; |
+ } |
+ else { |
+ return this.gen.writer.get$text(); |
+ } |
+} |
+World.prototype.readFile = function(filename) { |
+ try { |
+ var sourceFile = this.reader.readFile(filename); |
+ this.dartBytesRead += sourceFile.get$text().length; |
+ return sourceFile; |
+ } catch (e) { |
+ e = _toDartException(e); |
+ this.warning(('Error reading file: ' + filename)); |
+ return new SourceFile(filename, ''); |
+ } |
+} |
+World.prototype.getOrAddLibrary = function(filename) { |
+ var library = this.libraries.$index(filename); |
+ if (library == null) { |
+ library = new Library(this.readFile(filename)); |
+ this.info(('read library ' + filename)); |
+ if (!library.get$isCore() && !library.imports.some((function (li) { |
+ return li.get$library().get$isCore(); |
+ }) |
+ )) { |
+ library.imports.add(new LibraryImport(this.corelib)); |
+ } |
+ this.libraries.$setindex(filename, library); |
+ this._todo.add(library); |
+ } |
+ return library; |
+} |
+World.prototype.process = function() { |
+ while (this._todo.length > 0) { |
+ var todo = this._todo; |
+ this._todo = []; |
+ for (var $$i = 0;$$i < todo.length; $$i++) { |
+ var lib = todo.$index($$i); |
+ lib.visitSources$0(); |
+ } |
+ } |
+} |
+World.prototype.processDartScript = function(script) { |
+ if (script == null) script = $globals.options.dartScript; |
+ var library = this.getOrAddLibrary(script); |
+ this.process(); |
+ return library; |
+} |
+World.prototype.resolveAll = function() { |
+ var $$list = this.libraries.getValues(); |
+ for (var $$i = this.libraries.getValues().iterator$0(); $$i.hasNext$0(); ) { |
+ var lib = $$i.next$0(); |
+ lib.resolve$0(); |
+ } |
+} |
+World.prototype.get$resolveAll = function() { |
+ return World.prototype.resolveAll.bind(this); |
+} |
+World.prototype.generateCode = function(lib) { |
+ var mainMembers = lib.topType.resolveMember('main'); |
+ var main = null; |
+ if (mainMembers == null || $eq(mainMembers.get$members().length, 0)) { |
+ this.fatal('no main method specified'); |
+ } |
+ else if (mainMembers.get$members().length > 1) { |
+ var $$list = mainMembers.get$members(); |
+ for (var $$i = mainMembers.get$members().iterator$0(); $$i.hasNext$0(); ) { |
+ var m = $$i.next$0(); |
+ main = m; |
+ this.error('more than one main member (using last?)', main.get$span()); |
+ } |
+ } |
+ else { |
+ main = mainMembers.get$members().$index(0); |
+ } |
+ var codeWriter = new CodeWriter(); |
+ this.gen = new WorldGenerator(main, codeWriter); |
+ this.gen.run(); |
+ this.jsBytesWritten = codeWriter.get$text().length; |
+} |
+World.prototype._message = function(color, prefix, message, span, span1, span2, throwing) { |
+ if (this.messageHandler != null) { |
+ this.messageHandler(prefix, message, span); |
+ if (span1 != null) { |
+ this.messageHandler(prefix, message, span1); |
+ } |
+ if (span2 != null) { |
+ this.messageHandler(prefix, message, span2); |
+ } |
+ } |
+ var messageWithPrefix = $globals.options.useColors ? (color + prefix + $globals._NO_COLOR + message) : (prefix + message); |
+ var text = messageWithPrefix; |
+ if (span != null) { |
+ text = span.toMessageString(messageWithPrefix); |
+ } |
+ print(text); |
+ if (span1 != null) { |
+ print(span1.toMessageString(messageWithPrefix)); |
+ } |
+ if (span2 != null) { |
+ print(span2.toMessageString(messageWithPrefix)); |
+ } |
+ if (throwing) { |
+ $throw(new CompilerException(messageWithPrefix, span)); |
+ } |
+} |
+World.prototype.error = function(message, span, span1, span2) { |
+ this.errors++; |
+ this._message($globals._RED_COLOR, 'error: ', message, span, span1, span2, $globals.options.throwOnErrors); |
+} |
+World.prototype.warning = function(message, span, span1, span2) { |
+ if ($globals.options.warningsAsErrors) { |
+ this.error(message, span, span1, span2); |
+ return; |
+ } |
+ this.warnings++; |
+ if ($globals.options.showWarnings) { |
+ this._message($globals._MAGENTA_COLOR, 'warning: ', message, span, span1, span2, $globals.options.throwOnWarnings); |
+ } |
+} |
+World.prototype.fatal = function(message, span, span1, span2) { |
+ this.errors++; |
+ this.seenFatal = true; |
+ this._message($globals._RED_COLOR, 'fatal: ', message, span, span1, span2, $globals.options.throwOnFatal || $globals.options.throwOnErrors); |
+} |
+World.prototype.internalError = function(message, span, span1, span2) { |
+ this._message($globals._NO_COLOR, 'We are sorry, but...', message, span, span1, span2, true); |
+} |
+World.prototype.info = function(message, span, span1, span2) { |
+ if ($globals.options.showInfo) { |
+ this._message($globals._GREEN_COLOR, 'info: ', message, span, span1, span2, false); |
+ } |
+} |
+World.prototype.withoutForceDynamic = function(fn) { |
+ var oldForceDynamic = $globals.options.forceDynamic; |
+ $globals.options.forceDynamic = false; |
+ try { |
+ return fn(); |
+ } finally { |
+ $globals.options.forceDynamic = oldForceDynamic; |
+ } |
+} |
+World.prototype.get$hasErrors = function() { |
+ return this.errors > 0; |
+} |
+World.prototype.printStatus = function() { |
+ this.info(('compiled ' + this.dartBytesRead + ' bytes Dart -> ' + this.jsBytesWritten + ' bytes JS')); |
+ if (this.get$hasErrors()) { |
+ print(('compilation failed with ' + this.errors + ' errors')); |
+ } |
+ else { |
+ if (this.warnings > 0) { |
+ this.info(('compilation completed successfully with ' + this.warnings + ' warnings')); |
+ } |
+ else { |
+ this.info('compilation completed sucessfully'); |
+ } |
+ } |
+} |
+World.prototype.withTiming = function(name, f) { |
+ var sw = new StopwatchImplementation(); |
+ sw.start(); |
+ var result = f(); |
+ sw.stop(); |
+ this.info(('' + name + ' in ' + sw.elapsedInMs() + 'msec')); |
+ return result; |
+} |
+// ********** Code for FrogOptions ************** |
+function FrogOptions(homedir, args, files) { |
+ this.config = 'dev' |
+ this.enableLeg = false |
+ this.legOnly = false |
+ this.enableAsserts = false |
+ this.enableTypeChecks = false |
+ this.warningsAsErrors = false |
+ this.verifyImplements = false |
+ this.compileAll = false |
+ this.forceDynamic = false |
+ this.dietParse = false |
+ this.compileOnly = false |
+ this.throwOnErrors = false |
+ this.throwOnWarnings = false |
+ this.throwOnFatal = false |
+ this.showInfo = false |
+ this.showWarnings = true |
+ this.useColors = true |
+ // Initializers done |
+ if ($eq(this.config, 'dev')) { |
+ this.libDir = joinPaths(homedir, '/lib'); |
+ } |
+ else if ($eq(this.config, 'sdk')) { |
+ this.libDir = joinPaths(homedir, '/../lib'); |
+ } |
+ else { |
+ $globals.world.error(('Invalid configuration ' + this.config)); |
+ $throw(('Invalid configuration')); |
+ } |
+ var ignoreUnrecognizedFlags = false; |
+ var passedLibDir = false; |
+ this.childArgs = []; |
+ loop: |
+ for (var i = 2; |
+ i < args.length; i++) { |
+ var arg = args.$index(i); |
+ switch (arg) { |
+ case '--enable_leg': |
+ |
+ this.enableLeg = true; |
+ break; |
+ |
+ case '--leg_only': |
+ |
+ this.enableLeg = true; |
+ this.legOnly = true; |
+ break; |
+ |
+ case '--enable_asserts': |
+ |
+ this.enableAsserts = true; |
+ break; |
+ |
+ case '--enable_type_checks': |
+ |
+ this.enableTypeChecks = true; |
+ this.enableAsserts = true; |
+ break; |
+ |
+ case '--verify_implements': |
+ |
+ this.verifyImplements = true; |
+ break; |
+ |
+ case '--compile_all': |
+ |
+ this.compileAll = true; |
+ break; |
+ |
+ case '--diet-parse': |
+ |
+ this.dietParse = true; |
+ break; |
+ |
+ case '--ignore-unrecognized-flags': |
+ |
+ ignoreUnrecognizedFlags = true; |
+ break; |
+ |
+ case '--verbose': |
+ |
+ this.showInfo = true; |
+ break; |
+ |
+ case '--suppress_warnings': |
+ |
+ this.showWarnings = false; |
+ break; |
+ |
+ case '--warnings_as_errors': |
+ |
+ this.warningsAsErrors = true; |
+ break; |
+ |
+ case '--throw_on_errors': |
+ |
+ this.throwOnErrors = true; |
+ break; |
+ |
+ case '--throw_on_warnings': |
+ |
+ this.throwOnWarnings = true; |
+ break; |
+ |
+ case '--compile-only': |
+ |
+ this.compileOnly = true; |
+ break; |
+ |
+ case '--force_dynamic': |
+ |
+ this.forceDynamic = true; |
+ break; |
+ |
+ case '--no_colors': |
+ |
+ this.useColors = false; |
+ break; |
+ |
+ default: |
+ |
+ if (arg.endsWith$1('.dart')) { |
+ this.dartScript = arg; |
+ this.childArgs = args.getRange(i + 1, args.length - i - 1); |
+ break loop; |
+ } |
+ else if (arg.startsWith$1('--out=')) { |
+ this.outfile = arg.substring$1('--out='.length); |
+ } |
+ else if (arg.startsWith$1('--libdir=')) { |
+ this.libDir = arg.substring$1('--libdir='.length); |
+ passedLibDir = true; |
+ } |
+ else { |
+ if (!ignoreUnrecognizedFlags) { |
+ print(('unrecognized flag: "' + arg + '"')); |
+ } |
+ } |
+ |
+ } |
+ } |
+ if (!passedLibDir && $eq(this.config, 'dev') && !files.fileExists(this.libDir)) { |
+ var temp = 'frog/lib'; |
+ if (files.fileExists(temp)) { |
+ this.libDir = temp; |
+ } |
+ else { |
+ this.libDir = 'lib'; |
+ } |
+ } |
+} |
+// ********** Code for LibraryReader ************** |
+function LibraryReader() { |
+ // Initializers done |
+ if ($eq($globals.options.config, 'dev')) { |
+ this._specialLibs = _map(['dart:core', joinPaths($globals.options.libDir, 'corelib.dart'), 'dart:coreimpl', joinPaths($globals.options.libDir, 'corelib_impl.dart'), 'dart:html', joinPaths($globals.options.libDir, '../../client/html/release/html.dart'), 'dart:htmlimpl', joinPaths($globals.options.libDir, '../../client/html/release/htmlimpl.dart'), 'dart:dom', joinPaths($globals.options.libDir, '../../client/dom/frog/frog_dom.dart'), 'dart:json', joinPaths($globals.options.libDir, 'json.dart')]); |
+ } |
+ else if ($eq($globals.options.config, 'sdk')) { |
+ this._specialLibs = _map(['dart:core', joinPaths($globals.options.libDir, 'core/core_frog.dart'), 'dart:coreimpl', joinPaths($globals.options.libDir, 'coreimpl/coreimpl_frog.dart'), 'dart:html', joinPaths($globals.options.libDir, 'html/html.dart'), 'dart:htmlimpl', joinPaths($globals.options.libDir, 'htmlimpl/htmlimpl.dart'), 'dart:dom', joinPaths($globals.options.libDir, 'dom/frog/frog_dom.dart'), 'dart:json', joinPaths($globals.options.libDir, 'json/json_frog.dart')]); |
+ } |
+ else { |
+ $globals.world.error(('Invalid configuration ' + $globals.options.config)); |
+ } |
+} |
+LibraryReader.prototype.readFile = function(fullname) { |
+ var filename = this._specialLibs.$index(fullname); |
+ if (filename == null) { |
+ filename = fullname; |
+ } |
+ if ($globals.world.files.fileExists(filename)) { |
+ return new SourceFile(filename, $globals.world.files.readAll(filename)); |
+ } |
+ else { |
+ $globals.world.error(('File not found: ' + filename)); |
+ return new SourceFile(filename, ''); |
+ } |
+} |
+// ********** Code for VarMember ************** |
+function VarMember(name) { |
+ this.isGenerated = false |
+ this.name = name; |
+ // Initializers done |
+} |
+VarMember.prototype.get$name = function() { return this.name; }; |
+VarMember.prototype.get$isGenerated = function() { return this.isGenerated; }; |
+VarMember.prototype.set$isGenerated = function(value) { return this.isGenerated = value; }; |
+VarMember.prototype.get$returnType = function() { |
+ return $globals.world.varType; |
+} |
+VarMember.prototype.invoke = function(context, node, target, args) { |
+ return new Value(this.get$returnType(), ('' + target.code + '.' + this.name + '(' + args.getCode() + ')'), node.span, true); |
+} |
+VarMember.prototype.generate$1 = VarMember.prototype.generate; |
+VarMember.prototype.invoke$4 = VarMember.prototype.invoke; |
+// ********** Code for VarFunctionStub ************** |
+$inherits(VarFunctionStub, VarMember); |
+function VarFunctionStub(name, callArgs) { |
+ this.args = callArgs.toCallStubArgs(); |
+ // Initializers done |
+ VarMember.call(this, name); |
+ $globals.world.gen.corejs.useGenStub = true; |
+} |
+VarFunctionStub.prototype.generate = function(code) { |
+ this.isGenerated = true; |
+ if (this.args.get$hasNames()) { |
+ this.generateNamed(code); |
+ } |
+ else { |
+ this.generatePositional(code); |
+ } |
+} |
+VarFunctionStub.prototype.generatePositional = function(w) { |
+ var arity = this.args.get$length(); |
+ w.enterBlock(('Function.prototype.to\$' + this.name + ' = function() {')); |
+ w.writeln(('this.' + this.name + ' = this.\$genStub(' + arity + ');')); |
+ w.writeln(('this.to\$' + this.name + ' = function() { return this.' + this.name + '; };')); |
+ w.writeln(('return this.' + this.name + ';')); |
+ w.exitBlock('};'); |
+ var argsCode = this.args.getCode(); |
+ w.enterBlock(('Function.prototype.' + this.name + ' = function(' + argsCode + ') {')); |
+ w.writeln(('return this.to\$' + this.name + '()(' + argsCode + ');')); |
+ w.exitBlock('};'); |
+ w.writeln(('function to\$' + this.name + '(f) { return f && f.to\$' + this.name + '(); }')); |
+} |
+VarFunctionStub.prototype.generateNamed = function(w) { |
+ var named = Strings.join(this.args.getNames(), '", "'); |
+ var argsCode = this.args.getCode(); |
+ w.enterBlock(('Function.prototype.' + this.name + ' = function(' + argsCode + ') {')); |
+ w.writeln(('this.' + this.name + ' = this.\$genStub(' + this.args.get$length() + ', ["' + named + '"]);')); |
+ w.writeln(('return this.' + this.name + '(' + argsCode + ');')); |
+ w.exitBlock('}'); |
+} |
+VarFunctionStub.prototype.generate$1 = VarFunctionStub.prototype.generate; |
+// ********** Code for VarMethodStub ************** |
+$inherits(VarMethodStub, VarMember); |
+function VarMethodStub(name, member, args, body) { |
+ this.member = member; |
+ this.args = args; |
+ this.body = body; |
+ // Initializers done |
+ VarMember.call(this, name); |
+} |
+VarMethodStub.prototype.get$body = function() { return this.body; }; |
+VarMethodStub.prototype.get$isHidden = function() { |
+ return this.member != null ? this.member.declaringType.get$isHiddenNativeType() : false; |
+} |
+VarMethodStub.prototype.get$returnType = function() { |
+ return this.member != null ? this.member.get$returnType() : $globals.world.varType; |
+} |
+VarMethodStub.prototype.get$declaringType = function() { |
+ return this.member != null ? this.member.declaringType : $globals.world.objectType; |
+} |
+VarMethodStub.prototype.generate = function(code) { |
+ this.isGenerated = true; |
+ code.write($globals.world.gen._prototypeOf(this.get$declaringType(), this.name) + ' = '); |
+ if (!this.get$isHidden() && this._useDirectCall(this.args)) { |
+ code.writeln($globals.world.gen._prototypeOf(this.get$declaringType(), this.member.get$jsname()) + ';'); |
+ } |
+ else if (this._needsExactTypeCheck()) { |
+ code.enterBlock(('function(' + this.args.getCode() + ') {')); |
+ code.enterBlock(('if (Object.getPrototypeOf(this).hasOwnProperty("' + this.name + '")) {')); |
+ code.writeln(('' + this.body + ';')); |
+ code.exitBlock('}'); |
+ var argsCode = this.args.getCode(); |
+ if (argsCode != '') argsCode = ', ' + argsCode; |
+ code.writeln(('return Object.prototype.' + this.name + '.call(this' + argsCode + ');')); |
+ code.exitBlock('};'); |
+ } |
+ else { |
+ code.enterBlock(('function(' + this.args.getCode() + ') {')); |
+ code.writeln(('' + this.body + ';')); |
+ code.exitBlock('};'); |
+ } |
+} |
+VarMethodStub.prototype._needsExactTypeCheck = function() { |
+ var $this = this; // closure support |
+ if (this.member == null || this.member.declaringType.get$isObject()) return false; |
+ var members = this.member.declaringType.resolveMember(this.member.name).members; |
+ return members.filter$1((function (m) { |
+ return $ne(m, $this.member) && m.get$declaringType().get$isHiddenNativeType(); |
+ }) |
+ ).length >= 1; |
+} |
+VarMethodStub.prototype._useDirectCall = function(args) { |
+ if ((this.member instanceof MethodMember) && !this.member.declaringType.get$hasNativeSubtypes()) { |
+ var method = this.member; |
+ if (method.needsArgumentConversion(args)) { |
+ return false; |
+ } |
+ for (var i = args.get$length(); |
+ i < method.parameters.length; i++) { |
+ if ($ne(method.parameters.$index(i).get$value().get$code(), 'null')) { |
+ return false; |
+ } |
+ } |
+ return method.namesInOrder(args); |
+ } |
+ else { |
+ return false; |
+ } |
+} |
+VarMethodStub.prototype.generate$1 = VarMethodStub.prototype.generate; |
+// ********** Code for VarMethodSet ************** |
+$inherits(VarMethodSet, VarMember); |
+function VarMethodSet(baseName, name, members, callArgs, returnType) { |
+ this.invoked = false |
+ this.baseName = baseName; |
+ this.members = members; |
+ this.returnType = returnType; |
+ this.args = callArgs.toCallStubArgs(); |
+ // Initializers done |
+ VarMember.call(this, name); |
+} |
+VarMethodSet.prototype.get$members = function() { return this.members; }; |
+VarMethodSet.prototype.get$returnType = function() { return this.returnType; }; |
+VarMethodSet.prototype.invoke = function(context, node, target, args) { |
+ this._invokeMembers(context, node); |
+ return VarMember.prototype.invoke.call(this, context, node, target, args); |
+} |
+VarMethodSet.prototype._invokeMembers = function(context, node) { |
+ if (this.invoked) return; |
+ this.invoked = true; |
+ var hasObjectType = false; |
+ var $$list = this.members; |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var member = $$list.$index($$i); |
+ var type = member.get$declaringType(); |
+ var target = new Value(type, 'this', node.span, true); |
+ var result = member.invoke$4$isDynamic(context, node, target, this.args, true); |
+ var stub = new VarMethodStub(this.name, member, this.args, 'return ' + result.get$code()); |
+ type.get$varStubs().$setindex(stub.get$name(), stub); |
+ if (type.get$isObject()) hasObjectType = true; |
+ } |
+ if (!hasObjectType) { |
+ var target = new Value($globals.world.objectType, 'this', node.span, true); |
+ var result = target.invokeNoSuchMethod(context, this.baseName, node, this.args); |
+ var stub = new VarMethodStub(this.name, null, this.args, 'return ' + result.get$code()); |
+ $globals.world.objectType.varStubs.$setindex(stub.get$name(), stub); |
+ } |
+} |
+VarMethodSet.prototype.generate = function(code) { |
+ |
+} |
+VarMethodSet.prototype.generate$1 = VarMethodSet.prototype.generate; |
+VarMethodSet.prototype.invoke$4 = VarMethodSet.prototype.invoke; |
+// ********** Code for top level ************** |
+function _otherOperator(jsname, op) { |
+ return ("function " + jsname + "(x, y) {\n return (typeof(x) == 'number' && typeof(y) == 'number')\n ? x " + op + " y : x." + jsname + "(y);\n}"); |
+} |
+function map(source, mapper) { |
+ var result = new ListFactory(); |
+ if (!!(source && source.is$List())) { |
+ var list = source; |
+ result.length = list.length; |
+ for (var i = 0; |
+ i < list.length; i++) { |
+ result.$setindex(i, mapper(list.$index(i))); |
+ } |
+ } |
+ else { |
+ for (var $$i = source.iterator(); $$i.hasNext$0(); ) { |
+ var item = $$i.next$0(); |
+ result.add(mapper(item)); |
+ } |
+ } |
+ return result; |
+} |
+function reduce(source, callback, initialValue) { |
+ var i = source.iterator(); |
+ var current = initialValue; |
+ if (current == null && i.hasNext$0()) { |
+ current = i.next$0(); |
+ } |
+ while (i.hasNext$0()) { |
+ current = callback.call$2(current, i.next$0()); |
+ } |
+ return current; |
+} |
+function orderValuesByKeys(map) { |
+ var keys = map.getKeys(); |
+ keys.sort((function (x, y) { |
+ return x.compareTo$1(y); |
+ }) |
+ ); |
+ var values = []; |
+ for (var $$i = 0;$$i < keys.length; $$i++) { |
+ var k = keys.$index($$i); |
+ values.add(map.$index(k)); |
+ } |
+ return values; |
+} |
+function isMultilineString(text) { |
+ return text.startsWith('"""') || text.startsWith("'''"); |
+} |
+function isRawMultilineString(text) { |
+ return text.startsWith('@"""') || text.startsWith("@'''"); |
+} |
+function toDoubleQuote(s) { |
+ return s.replaceAll('"', '\\"').replaceAll("\\'", "'"); |
+} |
+function parseStringLiteral(lit) { |
+ if (lit.startsWith('@')) { |
+ if (isRawMultilineString(lit)) { |
+ return stripLeadingNewline(lit.substring(4, lit.length - 3)); |
+ } |
+ else { |
+ return lit.substring(2, lit.length - 1); |
+ } |
+ } |
+ else if (isMultilineString(lit)) { |
+ lit = lit.substring(3, lit.length - 3).replaceAll('\\\$', '\$'); |
+ return stripLeadingNewline(lit); |
+ } |
+ else { |
+ return lit.substring(1, lit.length - 1).replaceAll('\\\$', '\$'); |
+ } |
+} |
+function stripLeadingNewline(text) { |
+ if (text.startsWith('\n')) { |
+ return text.substring(1); |
+ } |
+ else if (text.startsWith('\r')) { |
+ if (text.startsWith('\r\n')) { |
+ return text.substring(2); |
+ } |
+ else { |
+ return text.substring(1); |
+ } |
+ } |
+ else { |
+ return text; |
+ } |
+} |
+function _escapeForComment(text) { |
+ return text.replaceAll('/*', '/ *').replaceAll('*/', '* /'); |
+} |
+var world; |
+var experimentalAwaitPhase; |
+var legCompile; |
+function initializeWorld(files) { |
+ $globals.world = new World(files); |
+ $globals.world.init(); |
+} |
+var options; |
+function parseOptions(homedir, args, files) { |
+ $globals.options = new FrogOptions(homedir, args, files); |
+} |
+function _getCallStubName(name, args) { |
+ var nameBuilder = new StringBufferImpl(('' + name + '\$' + args.get$bareCount())); |
+ for (var i = args.get$bareCount(); |
+ i < args.get$length(); i++) { |
+ nameBuilder.add('\$').add(args.getName(i)); |
+ } |
+ return nameBuilder.toString(); |
+} |
+// ********** Library toss ************** |
+// ********** Code for top level ************** |
+function compileDart(basename, filename) { |
+ var basedir = path.dirname(basename); |
+ var fullname = ('' + basedir + '/' + filename); |
+ $globals.world.reset(); |
+ $globals.options.dartScript = fullname; |
+ if ($globals.world.compile()) { |
+ return $globals.world.getGeneratedCode(); |
+ } |
+ else { |
+ return ('alert("compilation of ' + filename + ' failed, see console for errors");'); |
+ } |
+} |
+function frogify(filename) { |
+ var s = "<script\\s+type=\"application/dart\"(?:\\s+src=\"([/\\w]+.dart)\")?>([\\s\\S]*)</script>"; |
+ var text = fs.readFileSync(filename, 'utf8'); |
+ var re = new JSSyntaxRegExp(s, true, false); |
+ var m = re.firstMatch(text); |
+ if (m == null) return text; |
+ var dname = m.group$1(1); |
+ var contents = m.group$1(2); |
+ print(('compiling ' + dname)); |
+ var compiled = compileDart(filename, dname); |
+ return text.substring(0, m.start$0()) + ('<script type="application/javascript">' + compiled + '</script>') + text.substring(m.start$0() + m.group$1(0).length); |
+} |
+function initializeCompiler(homedir) { |
+ var filesystem = new NodeFileSystem(); |
+ parseOptions(homedir, [null, null], filesystem); |
+ initializeWorld(filesystem); |
+} |
+function dirToHtml(url, dirname) { |
+ var names = new StringBufferImpl(""); |
+ var $$list = fs.readdirSync(dirname); |
+ for (var $$i = 0;$$i < $$list.length; $$i++) { |
+ var name = $$list.$index($$i); |
+ var link = ('' + url + '/' + name); |
+ names.add$1(('<li><a href=' + link + '>' + name + '</a></li>\n')); |
+ } |
+ return (" <html><head><title>" + dirname + "</title></head>\n <h3>" + dirname + "</h3>\n <ul>\n " + names + "\n </ul>\n </html>\n "); |
+} |
+function main() { |
+ var homedir = path.dirname(fs.realpathSync(process.argv.$index(1))); |
+ var dartdir = path.dirname(homedir); |
+ print(('running with dart root at ' + dartdir)); |
+ initializeCompiler(homedir); |
+ http.createServer((function (req, res) { |
+ var filename; |
+ if (req.url.endsWith('.html')) { |
+ res.setHeader('Content-Type', 'text/html'); |
+ } |
+ else if (req.url.endsWith('.css')) { |
+ res.setHeader('Content-Type', 'text/css'); |
+ } |
+ else { |
+ res.setHeader('Content-Type', 'text/plain'); |
+ } |
+ filename = ('' + dartdir + '/' + req.url); |
+ if (path.existsSync(filename)) { |
+ var stat = fs.statSync(filename); |
+ if (stat.isFile$0()) { |
+ res.statusCode = 200; |
+ var data; |
+ if (filename.endsWith$1('.html')) { |
+ res.end(frogify(filename), 'utf8'); |
+ } |
+ else { |
+ res.end(fs.readFileSync(filename, 'utf8'), 'utf8'); |
+ } |
+ return; |
+ } |
+ else { |
+ res.setHeader('Content-Type', 'text/html'); |
+ res.end(dirToHtml(req.url, filename), 'utf8'); |
+ } |
+ } |
+ res.statusCode = 404; |
+ res.end('', 'utf8'); |
+ }) |
+ ).listen(1337, "localhost"); |
+ print('Server running at http://localhost:1337/'); |
+} |
+// ********** Generic Type Inheritance ************** |
+/** Implements extends for generic types. */ |
+function $inheritsMembers(child, parent) { |
+ child = child.prototype; |
+ parent = parent.prototype; |
+ Object.getOwnPropertyNames(parent).forEach(function(name) { |
+ if (typeof(child[name]) == 'undefined') child[name] = parent[name]; |
+ }); |
+} |
+$inheritsMembers(_DoubleLinkedQueueEntrySentinel_E, DoubleLinkedQueueEntry_E); |
+$inheritsMembers(_DoubleLinkedQueueEntrySentinel_KeyValuePair_K$V, DoubleLinkedQueueEntry_KeyValuePair_K$V); |
+// ********** Globals ************** |
+function $static_init(){ |
+ $globals._GREEN_COLOR = '\u001b[32m'; |
+ $globals._MAGENTA_COLOR = '\u001b[35m'; |
+ $globals._NO_COLOR = '\u001b[0m'; |
+ $globals._RED_COLOR = '\u001b[31m'; |
+} |
+var const$1 = new EmptyQueueException()/*const EmptyQueueException()*/; |
+var const$2 = new _DeletedKeySentinel()/*const _DeletedKeySentinel()*/; |
+var const$7 = new NoMoreElementsException()/*const NoMoreElementsException()*/; |
+var $globals = {}; |
+$static_init(); |
+main(); |