Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Unified Diff: dart/frog/minfrog

Issue 10164004: Remove frogsh. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « dart/frog/lib/node/node.dart ('k') | dart/frog/minfrog.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dart/frog/minfrog
diff --git a/dart/frog/minfrog b/dart/frog/minfrog
deleted file mode 100755
index 5923a42a1c6440d1fd7e1a212f8b0a2d7045005a..0000000000000000000000000000000000000000
--- a/dart/frog/minfrog
+++ /dev/null
@@ -1,15186 +0,0 @@
-#!/usr/bin/env node
-// ********** Library dart:core **************
-// ********** Natives dart:core **************
-function $defProp(obj, prop, value) {
- Object.defineProperty(obj, prop,
- {value: value, enumerable: false, writable: true, configurable: true});
-}
-Function.prototype.bind = Function.prototype.bind ||
- function(thisObj) {
- var func = this;
- var funcLength = func.$length || func.length;
- var argsLength = arguments.length;
- if (argsLength > 1) {
- var boundArgs = Array.prototype.slice.call(arguments, 1);
- var bound = function() {
- // Prepend the bound arguments to the current arguments.
- var newArgs = Array.prototype.slice.call(arguments);
- Array.prototype.unshift.apply(newArgs, boundArgs);
- return func.apply(thisObj, newArgs);
- };
- bound.$length = Math.max(0, funcLength - (argsLength - 1));
- return bound;
- } else {
- var bound = function() {
- return func.apply(thisObj, arguments);
- };
- bound.$length = funcLength;
- return bound;
- }
- };
-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;
-}
-$defProp(Object.prototype, '$index', function(i) {
- $throw(new NoSuchMethodException(this, "operator []", [i]));
-});
-$defProp(Array.prototype, '$index', function(index) {
- var i = index | 0;
- if (i !== index) {
- throw new IllegalArgumentException('index is not int');
- } else if (i < 0 || i >= this.length) {
- throw new IndexOutOfRangeException(index);
- }
- return this[i];
-});
-$defProp(String.prototype, '$index', function(i) {
- return this[i];
-});
-$defProp(Object.prototype, '$setindex', function(i, value) {
- $throw(new NoSuchMethodException(this, "operator []=", [i, value]));
-});
-$defProp(Array.prototype, '$setindex', function(index, value) {
- var i = index | 0;
- if (i !== index) {
- throw new IllegalArgumentException('index is not int');
- } else if (i < 0 || i >= this.length) {
- throw new IndexOutOfRangeException(index);
- }
- return this[i] = value;
-});
-function $add$complex$(x, y) {
- if (typeof(x) == 'number') {
- $throw(new IllegalArgumentException(y));
- } else if (typeof(x) == 'string') {
- var str = (y == null) ? 'null' : y.toString();
- if (typeof(str) != 'string') {
- throw new Error("calling toString() on right hand operand of operator " +
- "+ did not return a String");
- }
- return x + str;
- } else if (typeof(x) == 'object') {
- return x.$add(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator +", [y]));
- }
-}
-
-function $add$(x, y) {
- if (typeof(x) == 'number' && typeof(y) == 'number') return x + y;
- return $add$complex$(x, y);
-}
-function $bit_xor$complex$(x, y) {
- if (typeof(x) == 'number') {
- $throw(new IllegalArgumentException(y));
- } else if (typeof(x) == 'object') {
- return x.$bit_xor(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator ^", [y]));
- }
-}
-function $bit_xor$(x, y) {
- if (typeof(x) == 'number' && typeof(y) == 'number') return x ^ y;
- return $bit_xor$complex$(x, y);
-}
-function $eq$(x, y) {
- if (x == null) return y == null;
- return (typeof(x) != 'object') ? x === y : x.$eq(y);
-}
-// TODO(jimhug): Should this or should it not match equals?
-$defProp(Object.prototype, '$eq', function(other) {
- return this === other;
-});
-function $gt$complex$(x, y) {
- if (typeof(x) == 'number') {
- $throw(new IllegalArgumentException(y));
- } else if (typeof(x) == 'object') {
- return x.$gt(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator >", [y]));
- }
-}
-function $gt$(x, y) {
- if (typeof(x) == 'number' && typeof(y) == 'number') return x > y;
- return $gt$complex$(x, y);
-}
-function $gte$complex$(x, y) {
- if (typeof(x) == 'number') {
- $throw(new IllegalArgumentException(y));
- } else if (typeof(x) == 'object') {
- return x.$gte(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator >=", [y]));
- }
-}
-function $gte$(x, y) {
- if (typeof(x) == 'number' && typeof(y) == 'number') return x >= y;
- return $gte$complex$(x, y);
-}
-function $lt$complex$(x, y) {
- if (typeof(x) == 'number') {
- $throw(new IllegalArgumentException(y));
- } else if (typeof(x) == 'object') {
- return x.$lt(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator <", [y]));
- }
-}
-function $lt$(x, y) {
- if (typeof(x) == 'number' && typeof(y) == 'number') return x < y;
- return $lt$complex$(x, y);
-}
-function $lte$complex$(x, y) {
- if (typeof(x) == 'number') {
- $throw(new IllegalArgumentException(y));
- } else if (typeof(x) == 'object') {
- return x.$lte(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator <=", [y]));
- }
-}
-function $lte$(x, y) {
- if (typeof(x) == 'number' && typeof(y) == 'number') return x <= y;
- return $lte$complex$(x, y);
-}
-function $mod$(x, y) {
- if (typeof(x) == 'number') {
- if (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 {
- $throw(new IllegalArgumentException(y));
- }
- } else if (typeof(x) == 'object') {
- return x.$mod(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator %", [y]));
- }
-}
-function $mul$complex$(x, y) {
- if (typeof(x) == 'number') {
- $throw(new IllegalArgumentException(y));
- } else if (typeof(x) == 'object') {
- return x.$mul(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator *", [y]));
- }
-}
-function $mul$(x, y) {
- if (typeof(x) == 'number' && typeof(y) == 'number') return x * y;
- return $mul$complex$(x, y);
-}
-function $ne$(x, y) {
- if (x == null) return y != null;
- return (typeof(x) != 'object') ? x !== y : !x.$eq(y);
-}
-function $shl$complex$(x, y) {
- if (typeof(x) == 'number') {
- $throw(new IllegalArgumentException(y));
- } else if (typeof(x) == 'object') {
- return x.$shl(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator <<", [y]));
- }
-}
-function $shl$(x, y) {
- if (typeof(x) == 'number' && typeof(y) == 'number') return x << y;
- return $shl$complex$(x, y);
-}
-function $sub$complex$(x, y) {
- if (typeof(x) == 'number') {
- $throw(new IllegalArgumentException(y));
- } else if (typeof(x) == 'object') {
- return x.$sub(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator -", [y]));
- }
-}
-function $sub$(x, y) {
- if (typeof(x) == 'number' && typeof(y) == 'number') return x - y;
- return $sub$complex$(x, y);
-}
-function $truncdiv$(x, y) {
- if (typeof(x) == 'number') {
- if (typeof(y) == 'number') {
- if (y == 0) $throw(new IntegerDivisionByZeroException());
- var tmp = x / y;
- return (tmp < 0) ? Math.ceil(tmp) : Math.floor(tmp);
- } else {
- $throw(new IllegalArgumentException(y));
- }
- } else if (typeof(x) == 'object') {
- return x.$truncdiv(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator ~/", [y]));
- }
-}
-/** 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;
- }
-}
-$defProp(Object.prototype, '$typeNameOf', (function() {
- function constructorNameWithFallback(obj) {
- var constructor = obj.constructor;
- if (typeof(constructor) == 'function') {
- // The constructor isn't null or undefined at this point. Try
- // to grab hold of its name.
- var name = constructor.name;
- // If the name is a non-empty string, we use that as the type
- // name of this object. On Firefox, we often get 'Object' as
- // the constructor name even for more specialized objects so
- // we have to fall through to the toString() based implementation
- // below in that case.
- if (typeof(name) == 'string' && name && name != 'Object') return name;
- }
- var string = Object.prototype.toString.call(obj);
- return string.substring(8, string.length - 1);
- }
-
- function chrome$typeNameOf() {
- var name = this.constructor.name;
- if (name == 'Window') return 'DOMWindow';
- return name;
- }
-
- function firefox$typeNameOf() {
- var name = constructorNameWithFallback(this);
- if (name == 'Window') return 'DOMWindow';
- if (name == 'Document') return 'HTMLDocument';
- if (name == 'XMLDocument') return 'Document';
- return name;
- }
-
- function ie$typeNameOf() {
- var name = constructorNameWithFallback(this);
- if (name == 'Window') return 'DOMWindow';
- // IE calls both HTML and XML documents 'Document', so we check for the
- // xmlVersion property, which is the empty string on HTML documents.
- if (name == 'Document' && this.xmlVersion) return 'Document';
- if (name == 'Document') return 'HTMLDocument';
- return name;
- }
-
- // If we're not in the browser, we're almost certainly running on v8.
- if (typeof(navigator) != 'object') return chrome$typeNameOf;
-
- var userAgent = navigator.userAgent;
- if (/Chrome|DumpRenderTree/.test(userAgent)) return chrome$typeNameOf;
- if (/Firefox/.test(userAgent)) return firefox$typeNameOf;
- if (/MSIE/.test(userAgent)) return ie$typeNameOf;
- return function() { return constructorNameWithFallback(this); };
-})());
-function $dynamic(name) {
- var f = Object.prototype[name];
- if (f && f.methods) return f.methods;
-
- var methods = {};
- if (f) methods.Object = f;
- function $dynamicBind() {
- // Find the target method
- var obj = this;
- var tag = obj.$typeNameOf();
- var method = methods[tag];
- if (!method) {
- var table = $dynamicMetadata;
- for (var i = 0; i < table.length; i++) {
- var entry = table[i];
- if (entry.map.hasOwnProperty(tag)) {
- method = methods[entry.tag];
- if (method) break;
- }
- }
- }
- method = method || methods.Object;
-
- var proto = Object.getPrototypeOf(obj);
-
- if (method == null) {
- // Trampoline to throw NoSuchMethodException (TODO: call noSuchMethod).
- method = function(){
- // Exact type check to prevent this code shadowing the dispatcher from a
- // subclass.
- if (Object.getPrototypeOf(this) === proto) {
- // TODO(sra): 'name' is the jsname, should be the Dart name.
- $throw(new NoSuchMethodException(
- obj, name, Array.prototype.slice.call(arguments)));
- }
- return Object.prototype[name].apply(this, arguments);
- };
- }
-
- if (!proto.hasOwnProperty(name)) {
- $defProp(proto, name, method);
- }
-
- return method.apply(this, Array.prototype.slice.call(arguments));
- };
- $dynamicBind.methods = methods;
- $defProp(Object.prototype, name, $dynamicBind);
- return methods;
-}
-if (typeof $dynamicMetadata == 'undefined') $dynamicMetadata = [];
-// ********** Code for Object **************
-$defProp(Object.prototype, "get$dynamic", function() {
- "use strict"; return this;
-});
-$defProp(Object.prototype, "noSuchMethod", function(name, args) {
- $throw(new NoSuchMethodException(this, name, args));
-});
-$defProp(Object.prototype, "_pushBlock$1", function($0) {
- return this.noSuchMethod("_pushBlock", [$0]);
-});
-$defProp(Object.prototype, "analyze$1", function($0) {
- return this.noSuchMethod("analyze", [$0]);
-});
-$defProp(Object.prototype, "contains$1", function($0) {
- return this.noSuchMethod("contains", [$0]);
-});
-$defProp(Object.prototype, "create$3$isFinal", function($0, $1, $2, isFinal) {
- return this.noSuchMethod("create", [$0, $1, $2, isFinal]);
-});
-$defProp(Object.prototype, "end$0", function() {
- return this.noSuchMethod("end", []);
-});
-$defProp(Object.prototype, "indexOf$1", function($0) {
- return this.noSuchMethod("indexOf", [$0]);
-});
-$defProp(Object.prototype, "instanceOf$3$isTrue$forceCheck", function($0, $1, $2, isTrue, forceCheck) {
- return this.noSuchMethod("instanceOf", [$0, $1, $2, isTrue, forceCheck]);
-});
-$defProp(Object.prototype, "instanceOf$4", function($0, $1, $2, $3) {
- return this.noSuchMethod("instanceOf", [$0, $1, $2, $3]);
-});
-$defProp(Object.prototype, "invokeNoSuchMethod$3", function($0, $1, $2) {
- return this.noSuchMethod("invokeNoSuchMethod", [$0, $1, $2]);
-});
-$defProp(Object.prototype, "is$Collection", function() {
- return false;
-});
-$defProp(Object.prototype, "is$List", function() {
- return false;
-});
-$defProp(Object.prototype, "is$Map", function() {
- return false;
-});
-$defProp(Object.prototype, "is$RegExp", function() {
- return false;
-});
-$defProp(Object.prototype, "remove$1", function($0) {
- return this.noSuchMethod("remove", [$0]);
-});
-$defProp(Object.prototype, "run$0", function() {
- return this.noSuchMethod("run", []);
-});
-$defProp(Object.prototype, "setIndex$4$kind", function($0, $1, $2, $3, kind) {
- return this.noSuchMethod("setIndex", [$0, $1, $2, $3, kind]);
-});
-$defProp(Object.prototype, "setIndex$4$kind$returnKind", function($0, $1, $2, $3, kind, returnKind) {
- return this.noSuchMethod("setIndex", [$0, $1, $2, $3, kind, returnKind]);
-});
-$defProp(Object.prototype, "set_$4$kind", function($0, $1, $2, $3, kind) {
- return this.noSuchMethod("set_", [$0, $1, $2, $3, kind]);
-});
-$defProp(Object.prototype, "set_$4$kind$returnKind", function($0, $1, $2, $3, kind, returnKind) {
- return this.noSuchMethod("set_", [$0, $1, $2, $3, kind, returnKind]);
-});
-$defProp(Object.prototype, "substring$1", function($0) {
- return this.noSuchMethod("substring", [$0]);
-});
-$defProp(Object.prototype, "toString$0", function() {
- return this.toString();
-});
-$defProp(Object.prototype, "visitBinaryExpression$1", function($0) {
- return this.noSuchMethod("visitBinaryExpression", [$0]);
-});
-$defProp(Object.prototype, "visitCallExpression$1", function($0) {
- return this.noSuchMethod("visitCallExpression", [$0]);
-});
-$defProp(Object.prototype, "visitPostfixExpression$1", function($0) {
- return this.noSuchMethod("visitPostfixExpression", [$0]);
-});
-$defProp(Object.prototype, "write$1", function($0) {
- return this.noSuchMethod("write", [$0]);
-});
-// ********** Code for Clock **************
-function Clock() {}
-Clock.now = function() {
- return new Date().getTime();
-}
-Clock.frequency = function() {
- return (1000);
-}
-// ********** Code for IndexOutOfRangeException **************
-function IndexOutOfRangeException(_index) {
- this._index = _index;
-}
-IndexOutOfRangeException.prototype.is$IndexOutOfRangeException = function(){return true};
-IndexOutOfRangeException.prototype.toString = function() {
- return ("IndexOutOfRangeException: " + this._index);
-}
-IndexOutOfRangeException.prototype.toString$0 = IndexOutOfRangeException.prototype.toString;
-// ********** Code for IllegalAccessException **************
-function IllegalAccessException() {
-
-}
-IllegalAccessException.prototype.toString = function() {
- return "Attempt to modify an immutable object";
-}
-IllegalAccessException.prototype.toString$0 = IllegalAccessException.prototype.toString;
-// ********** Code for NoSuchMethodException **************
-function NoSuchMethodException(_receiver, _functionName, _arguments, _existingArgumentNames) {
- this._receiver = _receiver;
- this._functionName = _functionName;
- this._arguments = _arguments;
- this._existingArgumentNames = _existingArgumentNames;
-}
-NoSuchMethodException.prototype.is$NoSuchMethodException = function(){return true};
-NoSuchMethodException.prototype.toString = function() {
- var sb = new StringBufferImpl("");
- for (var i = (0);
- i < this._arguments.get$length(); i++) {
- if (i > (0)) {
- sb.add(", ");
- }
- sb.add(this._arguments.$index(i));
- }
- if (null == this._existingArgumentNames) {
- return (("NoSuchMethodException : method not found: '" + this._functionName + "'\n") + ("Receiver: " + this._receiver + "\n") + ("Arguments: [" + sb + "]"));
- }
- else {
- var actualParameters = sb.toString();
- sb = new StringBufferImpl("");
- for (var i = (0);
- i < this._existingArgumentNames.get$length(); i++) {
- if (i > (0)) {
- sb.add(", ");
- }
- sb.add(this._existingArgumentNames.$index(i));
- }
- var formalParameters = sb.toString();
- return ("NoSuchMethodException: incorrect number of arguments passed to " + ("method named '" + this._functionName + "'\nReceiver: " + this._receiver + "\n") + ("Tried calling: " + this._functionName + "(" + actualParameters + ")\n") + ("Found: " + this._functionName + "(" + formalParameters + ")"));
- }
-}
-NoSuchMethodException.prototype.toString$0 = NoSuchMethodException.prototype.toString;
-// ********** Code for ClosureArgumentMismatchException **************
-function ClosureArgumentMismatchException() {
-
-}
-ClosureArgumentMismatchException.prototype.toString = function() {
- return "Closure argument mismatch";
-}
-ClosureArgumentMismatchException.prototype.toString$0 = ClosureArgumentMismatchException.prototype.toString;
-// ********** Code for ObjectNotClosureException **************
-function ObjectNotClosureException() {
-
-}
-ObjectNotClosureException.prototype.toString = function() {
- return "Object is not closure";
-}
-ObjectNotClosureException.prototype.toString$0 = ObjectNotClosureException.prototype.toString;
-// ********** Code for IllegalArgumentException **************
-function IllegalArgumentException(arg) {
- this._arg = arg;
-}
-IllegalArgumentException.prototype.is$IllegalArgumentException = function(){return true};
-IllegalArgumentException.prototype.toString = function() {
- return ("Illegal argument(s): " + this._arg);
-}
-IllegalArgumentException.prototype.toString$0 = IllegalArgumentException.prototype.toString;
-// ********** Code for StackOverflowException **************
-function StackOverflowException() {
-
-}
-StackOverflowException.prototype.toString = function() {
- return "Stack Overflow";
-}
-StackOverflowException.prototype.toString$0 = StackOverflowException.prototype.toString;
-// ********** Code for BadNumberFormatException **************
-function BadNumberFormatException(_s) {
- this._s = _s;
-}
-BadNumberFormatException.prototype.toString = function() {
- return ("BadNumberFormatException: '" + this._s + "'");
-}
-BadNumberFormatException.prototype.toString$0 = BadNumberFormatException.prototype.toString;
-// ********** Code for NullPointerException **************
-function NullPointerException(functionName, arguments) {
- this.functionName = functionName;
- this.arguments = arguments;
-}
-NullPointerException.prototype.toString = function() {
- if (this.functionName == null) {
- return this.get$exceptionName();
- }
- else {
- return (("" + this.get$exceptionName() + " : method: '" + this.functionName + "'\n") + "Receiver: null\n" + ("Arguments: " + this.arguments));
- }
-}
-NullPointerException.prototype.get$exceptionName = function() {
- return "NullPointerException";
-}
-NullPointerException.prototype.toString$0 = NullPointerException.prototype.toString;
-// ********** Code for NoMoreElementsException **************
-function NoMoreElementsException() {
-
-}
-NoMoreElementsException.prototype.toString = function() {
- return "NoMoreElementsException";
-}
-NoMoreElementsException.prototype.toString$0 = NoMoreElementsException.prototype.toString;
-// ********** Code for EmptyQueueException **************
-function EmptyQueueException() {
-
-}
-EmptyQueueException.prototype.toString = function() {
- return "EmptyQueueException";
-}
-EmptyQueueException.prototype.toString$0 = EmptyQueueException.prototype.toString;
-// ********** Code for IntegerDivisionByZeroException **************
-function IntegerDivisionByZeroException() {
-
-}
-IntegerDivisionByZeroException.prototype.is$IntegerDivisionByZeroException = function(){return true};
-IntegerDivisionByZeroException.prototype.toString = function() {
- return "IntegerDivisionByZeroException";
-}
-IntegerDivisionByZeroException.prototype.toString$0 = IntegerDivisionByZeroException.prototype.toString;
-// ********** Code for dart_core_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 match = /^\s*[+-]?(?:(0[xX][abcdefABCDEF0-9]+)|\d+)\s*$/.exec(str);
- if (!match) $throw(new BadNumberFormatException(str));
- var isHex = !!match[1];
- var ret = parseInt(str, isHex ? 16 : 10);
- 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.String$fromCharCodes$factory = function(charCodes) {
- return StringBase.createFromCharCodes(charCodes);
-}
-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 if (typeof write === 'function') {
- write(obj);
- write('\n');
- }
-}
-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(null, []));
- } else {
- return attachStack(new ObjectNotClosureException());
- }
- break;
- case 'non_object_property_call':
- case 'non_object_property_load':
- return attachStack(new NullPointerException(null, []));
- 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;
-$defProp(ListFactory.prototype, "is$List", function(){return true});
-$defProp(ListFactory.prototype, "is$Collection", function(){return true});
-ListFactory.ListFactory$from$factory = function(other) {
- var list = [];
- for (var $$i = other.iterator(); $$i.hasNext(); ) {
- var e = $$i.next();
- list.add(e);
- }
- return list;
-}
-$defProp(ListFactory.prototype, "get$length", function() { return this.length; });
-$defProp(ListFactory.prototype, "set$length", function(value) { return this.length = value; });
-$defProp(ListFactory.prototype, "add", function(value) {
- this.push(value);
-});
-$defProp(ListFactory.prototype, "addLast", function(value) {
- this.push(value);
-});
-$defProp(ListFactory.prototype, "addAll", function(collection) {
- for (var $$i = collection.iterator(); $$i.hasNext(); ) {
- var item = $$i.next();
- this.add(item);
- }
-});
-$defProp(ListFactory.prototype, "clear", function() {
- this.set$length((0));
-});
-$defProp(ListFactory.prototype, "removeLast", function() {
- return this.pop();
-});
-$defProp(ListFactory.prototype, "last", function() {
- return this.$index(this.get$length() - (1));
-});
-$defProp(ListFactory.prototype, "getRange", function(start, rangeLength) {
- if (rangeLength == 0) return [];
- if (rangeLength < 0) throw new IllegalArgumentException('length');
- if (start < 0 || start + rangeLength > this.length)
- throw new IndexOutOfRangeException(start);
- return this.slice(start, start + rangeLength);
-
-});
-$defProp(ListFactory.prototype, "insertRange", function(start, rangeLength, initialValue) {
- if (rangeLength == 0) return;
- if (rangeLength < 0) throw new IllegalArgumentException('length');
- if (start < 0 || start > this.length)
- throw new IndexOutOfRangeException(start);
-
- // Splice in the values with a minimum of array allocations.
- var args = new Array(rangeLength + 2);
- args[0] = start;
- args[1] = 0;
- for (var i = 0; i < rangeLength; i++) {
- args[i + 2] = initialValue;
- }
- this.splice.apply(this, args);
-
-});
-$defProp(ListFactory.prototype, "isEmpty", function() {
- return this.get$length() == (0);
-});
-$defProp(ListFactory.prototype, "iterator", function() {
- return new ListIterator(this);
-});
-$defProp(ListFactory.prototype, "toString", function() {
- return Collections.collectionToString(this);
-});
-$defProp(ListFactory.prototype, "indexOf$1", ListFactory.prototype.indexOf);
-$defProp(ListFactory.prototype, "toString$0", ListFactory.prototype.toString);
-// ********** Code for ListIterator **************
-function ListIterator(array) {
- this._array = array;
- this._pos = (0);
-}
-ListIterator.prototype.hasNext = function() {
- return this._array.get$length() > this._pos;
-}
-ListIterator.prototype.next = function() {
- if (!this.hasNext()) {
- $throw(const$0001);
- }
- return this._array.$index(this._pos++);
-}
-// ********** Code for ImmutableList **************
-$inherits(ImmutableList, ListFactory);
-function ImmutableList(length) {
- Array.call(this, length);
-}
-ImmutableList.ImmutableList$from$factory = function(other) {
- return _constList(other);
-}
-ImmutableList.prototype.get$length = function() {
- return this.length;
-}
-ImmutableList.prototype.set$length = function(length) {
- $throw(const$0006);
-}
-ImmutableList.prototype.$setindex = function(index, value) {
- $throw(const$0006);
-}
-ImmutableList.prototype.insertRange = function(start, length, initialValue) {
- $throw(const$0006);
-}
-ImmutableList.prototype.sort = function(compare) {
- $throw(const$0006);
-}
-ImmutableList.prototype.add = function(element) {
- $throw(const$0006);
-}
-ImmutableList.prototype.addLast = function(element) {
- $throw(const$0006);
-}
-ImmutableList.prototype.addAll = function(elements) {
- $throw(const$0006);
-}
-ImmutableList.prototype.clear = function() {
- $throw(const$0006);
-}
-ImmutableList.prototype.removeLast = function() {
- $throw(const$0006);
-}
-ImmutableList.prototype.toString = function() {
- return Collections.collectionToString(this);
-}
-ImmutableList.prototype.toString$0 = ImmutableList.prototype.toString;
-// ********** Code for JSSyntaxRegExp **************
-function JSSyntaxRegExp(pattern, multiLine, ignoreCase) {
- JSSyntaxRegExp._create$ctor.call(this, pattern, $add$(($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.hasMatch = function(str) {
- return this.re.test(str);
-}
-JSSyntaxRegExp.prototype.allMatches = function(str) {
- return new _AllMatchesIterable(this, str);
-}
-JSSyntaxRegExp.prototype.get$_global = function() {
- return new JSSyntaxRegExp._create$ctor(this.pattern, $add$($add$("g", (this.multiLine ? "m" : "")), (this.ignoreCase ? "i" : "")));
-}
-// ********** 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;
-}
-MatchImplementation.prototype.start = function() {
- return this._start;
-}
-MatchImplementation.prototype.get$start = function() {
- return this.start.bind(this);
-}
-MatchImplementation.prototype.end = function() {
- return this._end;
-}
-MatchImplementation.prototype.$index = function(groupIndex) {
- return this._groups.$index(groupIndex);
-}
-MatchImplementation.prototype.end$0 = MatchImplementation.prototype.end;
-// ********** Code for _AllMatchesIterable **************
-function _AllMatchesIterable(_re, _str) {
- this._re = _re;
- this._str = _str;
-}
-_AllMatchesIterable.prototype.iterator = function() {
- return new _AllMatchesIterator(this._re, this._str);
-}
-// ********** Code for _AllMatchesIterator **************
-function _AllMatchesIterator(re, _str) {
- this._str = _str;
- this._done = false;
- this._re = re.get$_global();
-}
-_AllMatchesIterator.prototype.next = function() {
- if (!this.hasNext()) {
- $throw(const$0001);
- }
- var result = this._next;
- this._next = null;
- return result;
-}
-_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;
- }
-}
-// ********** Code for NumImplementation **************
-NumImplementation = Number;
-NumImplementation.prototype.$negate = function() {
- 'use strict'; return -this;
-}
-NumImplementation.prototype.isNaN = function() {
- 'use strict'; return isNaN(this);
-}
-NumImplementation.prototype.isNegative = function() {
- 'use strict'; return this == 0 ? (1 / this) < 0 : this < 0;
-}
-NumImplementation.prototype.hashCode = function() {
- 'use strict'; return this & 0x1FFFFFFF;
-}
-NumImplementation.prototype.toDouble = function() {
- 'use strict'; return this + 0;
-}
-NumImplementation.prototype.toRadixString = function(radix) {
- 'use strict'; return this.toString(radix)
-}
-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);
- }
-}
-// ********** Code for Collections **************
-function Collections() {}
-Collections.collectionToString = function(c) {
- var result = new StringBufferImpl("");
- Collections._emitCollection(c, result, new Array());
- return result.toString$0();
-}
-Collections._emitCollection = function(c, result, visiting) {
- visiting.add(c);
- var isList = !!(c && c.is$List());
- result.add(isList ? "[" : "{");
- var first = true;
- for (var $$i = c.iterator(); $$i.hasNext(); ) {
- var e = $$i.next();
- if (!first) {
- result.add(", ");
- }
- first = false;
- Collections._emitObject(e, result, visiting);
- }
- result.add(isList ? "]" : "}");
- visiting.removeLast();
-}
-Collections._emitObject = function(o, result, visiting) {
- if (!!(o && o.is$Collection())) {
- if (Collections._containsRef(visiting, o)) {
- result.add(!!(o && o.is$List()) ? "[...]" : "{...}");
- }
- else {
- Collections._emitCollection(o, result, visiting);
- }
- }
- else if (!!(o && o.is$Map())) {
- if (Collections._containsRef(visiting, o)) {
- result.add("{...}");
- }
- else {
- Maps._emitMap(o, result, visiting);
- }
- }
- else {
- result.add($eq$(o) ? "null" : o);
- }
-}
-Collections._containsRef = function(c, ref) {
- for (var $$i = c.iterator(); $$i.hasNext(); ) {
- var e = $$i.next();
- if ((null == e ? null == (ref) : e === ref)) return true;
- }
- return false;
-}
-// ********** Code for HashMapImplementation **************
-function HashMapImplementation() {
- this._numberOfEntries = (0);
- this._numberOfDeleted = (0);
- this._loadLimit = HashMapImplementation._computeLoadLimit((8));
- this._keys = new Array((8));
- this._values = new Array((8));
-}
-HashMapImplementation.prototype.is$Map = function(){return true};
-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(), this._keys.get$length());
- var numberOfProbes = (1);
- var initialHash = hash;
- var insertionIndex = (-1);
- while (true) {
- var existingKey = this._keys.$index(hash);
- if (null == existingKey) {
- if (insertionIndex < (0)) return hash;
- return insertionIndex;
- }
- else if ($eq$(existingKey, key)) {
- return hash;
- }
- else if ((insertionIndex < (0)) && ((null == const$0000 ? null == (existingKey) : const$0000 === existingKey))) {
- insertionIndex = hash;
- }
- hash = HashMapImplementation._nextProbe(hash, numberOfProbes++, this._keys.get$length());
- }
-}
-HashMapImplementation.prototype._probeForLookup = function(key) {
- var hash = HashMapImplementation._firstProbe(key.hashCode(), this._keys.get$length());
- var numberOfProbes = (1);
- var initialHash = hash;
- while (true) {
- var existingKey = this._keys.$index(hash);
- if (null == existingKey) return (-1);
- if ($eq$(existingKey, key)) return hash;
- hash = HashMapImplementation._nextProbe(hash, numberOfProbes++, this._keys.get$length());
- }
-}
-HashMapImplementation.prototype._ensureCapacity = function() {
- var newNumberOfEntries = this._numberOfEntries + (1);
- if (newNumberOfEntries >= this._loadLimit) {
- this._grow(this._keys.get$length() * (2));
- return;
- }
- var capacity = this._keys.get$length();
- var numberOfFreeOrDeleted = capacity - newNumberOfEntries;
- var numberOfFree = numberOfFreeOrDeleted - this._numberOfDeleted;
- if (this._numberOfDeleted > numberOfFree) {
- this._grow(this._keys.get$length());
- }
-}
-HashMapImplementation._isPowerOfTwo = function(x) {
- return ((x & (x - (1))) == (0));
-}
-HashMapImplementation.prototype._grow = function(newCapacity) {
- var capacity = this._keys.get$length();
- this._loadLimit = HashMapImplementation._computeLoadLimit(newCapacity);
- var oldKeys = this._keys;
- var oldValues = this._values;
- this._keys = new Array(newCapacity);
- this._values = new Array(newCapacity);
- for (var i = (0);
- i < capacity; i++) {
- var key = oldKeys.$index(i);
- if (null == key || (null == key ? null == (const$0000) : key === const$0000)) {
- 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) {
- var $0;
- this._ensureCapacity();
- var index = this._probeForAdding(key);
- if ((null == this._keys.$index(index)) || ((($0 = this._keys.$index(index)) == null ? null == (const$0000) : $0 === const$0000))) {
- 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.putIfAbsent = function(key, ifAbsent) {
- var index = this._probeForLookup(key);
- if (index >= (0)) return this._values.$index(index);
- var value = ifAbsent();
- this.$setindex(key, value);
- return value;
-}
-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$0000);
- this._numberOfDeleted++;
- return value;
- }
- return null;
-}
-HashMapImplementation.prototype.isEmpty = function() {
- return this._numberOfEntries == (0);
-}
-HashMapImplementation.prototype.get$length = function() {
- return this._numberOfEntries;
-}
-HashMapImplementation.prototype.forEach = function(f) {
- var length = this._keys.get$length();
- for (var i = (0);
- i < length; i++) {
- var key = this._keys.$index(i);
- if ((null != key) && ((null == key ? null != (const$0000) : key !== const$0000))) {
- f(key, this._values.$index(i));
- }
- }
-}
-HashMapImplementation.prototype.getKeys = function() {
- var list = new Array(this.get$length());
- var i = (0);
- this.forEach(function _(key, value) {
- list.$setindex(i++, key);
- }
- );
- return list;
-}
-HashMapImplementation.prototype.getValues = function() {
- var list = new Array(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.toString = function() {
- return Maps.mapToString(this);
-}
-HashMapImplementation.prototype.remove$1 = HashMapImplementation.prototype.remove;
-HashMapImplementation.prototype.toString$0 = HashMapImplementation.prototype.toString;
-// ********** Code for HashMapImplementation_Dynamic$DoubleLinkedQueueEntry_KeyValuePair **************
-$inherits(HashMapImplementation_Dynamic$DoubleLinkedQueueEntry_KeyValuePair, HashMapImplementation);
-function HashMapImplementation_Dynamic$DoubleLinkedQueueEntry_KeyValuePair() {
- this._numberOfEntries = (0);
- this._numberOfDeleted = (0);
- this._loadLimit = HashMapImplementation._computeLoadLimit((8));
- this._keys = new Array((8));
- this._values = new Array((8));
-}
-HashMapImplementation_Dynamic$DoubleLinkedQueueEntry_KeyValuePair.prototype.remove$1 = HashMapImplementation_Dynamic$DoubleLinkedQueueEntry_KeyValuePair.prototype.remove;
-// ********** Code for HashMapImplementation_dart_core_String$dart_core_String **************
-$inherits(HashMapImplementation_dart_core_String$dart_core_String, HashMapImplementation);
-function HashMapImplementation_dart_core_String$dart_core_String() {
- this._numberOfEntries = (0);
- this._numberOfDeleted = (0);
- this._loadLimit = HashMapImplementation._computeLoadLimit((8));
- this._keys = new Array((8));
- this._values = new Array((8));
-}
-HashMapImplementation_dart_core_String$dart_core_String.prototype.remove$1 = HashMapImplementation_dart_core_String$dart_core_String.prototype.remove;
-// ********** Code for HashMapImplementation_dart_core_String$VariableValue **************
-$inherits(HashMapImplementation_dart_core_String$VariableValue, HashMapImplementation);
-function HashMapImplementation_dart_core_String$VariableValue() {
- this._numberOfEntries = (0);
- this._numberOfDeleted = (0);
- this._loadLimit = HashMapImplementation._computeLoadLimit((8));
- this._keys = new Array((8));
- this._values = new Array((8));
-}
-HashMapImplementation_dart_core_String$VariableValue.prototype.remove$1 = HashMapImplementation_dart_core_String$VariableValue.prototype.remove;
-// ********** Code for HashMapImplementation_FieldMember$Value **************
-$inherits(HashMapImplementation_FieldMember$Value, HashMapImplementation);
-function HashMapImplementation_FieldMember$Value() {
- this._numberOfEntries = (0);
- this._numberOfDeleted = (0);
- this._loadLimit = HashMapImplementation._computeLoadLimit((8));
- this._keys = new Array((8));
- this._values = new Array((8));
-}
-HashMapImplementation_FieldMember$Value.prototype.remove$1 = HashMapImplementation_FieldMember$Value.prototype.remove;
-// ********** Code for HashMapImplementation_Library$Library **************
-$inherits(HashMapImplementation_Library$Library, HashMapImplementation);
-function HashMapImplementation_Library$Library() {
- this._numberOfEntries = (0);
- this._numberOfDeleted = (0);
- this._loadLimit = HashMapImplementation._computeLoadLimit((8));
- this._keys = new Array((8));
- this._values = new Array((8));
-}
-// ********** Code for HashMapImplementation_Member$Member **************
-$inherits(HashMapImplementation_Member$Member, HashMapImplementation);
-function HashMapImplementation_Member$Member() {
- this._numberOfEntries = (0);
- this._numberOfDeleted = (0);
- this._loadLimit = HashMapImplementation._computeLoadLimit((8));
- this._keys = new Array((8));
- this._values = new Array((8));
-}
-// ********** Code for HashMapImplementation_Type$Map_dart_core_String$bool **************
-$inherits(HashMapImplementation_Type$Map_dart_core_String$bool, HashMapImplementation);
-function HashMapImplementation_Type$Map_dart_core_String$bool() {
- this._numberOfEntries = (0);
- this._numberOfDeleted = (0);
- this._loadLimit = HashMapImplementation._computeLoadLimit((8));
- this._keys = new Array((8));
- this._values = new Array((8));
-}
-HashMapImplementation_Type$Map_dart_core_String$bool.prototype.remove$1 = HashMapImplementation_Type$Map_dart_core_String$bool.prototype.remove;
-// ********** Code for HashMapImplementation_Type$Type **************
-$inherits(HashMapImplementation_Type$Type, HashMapImplementation);
-function HashMapImplementation_Type$Type() {
- this._numberOfEntries = (0);
- this._numberOfDeleted = (0);
- this._loadLimit = HashMapImplementation._computeLoadLimit((8));
- this._keys = new Array((8));
- this._values = new Array((8));
-}
-// ********** Code for HashSetImplementation **************
-function HashSetImplementation() {
- this._backingMap = new HashMapImplementation();
-}
-HashSetImplementation.prototype.is$Collection = function(){return true};
-HashSetImplementation.HashSetImplementation$from$factory = function(other) {
- var set = new HashSetImplementation();
- for (var $$i = other.iterator(); $$i.hasNext(); ) {
- var e = $$i.next();
- 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.map = function(f) {
- var result = new HashSetImplementation();
- this._backingMap.forEach(function _(key, value) {
- result.add(f(key));
- }
- );
- return result;
-}
-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();
-}
-HashSetImplementation.prototype.iterator = function() {
- return new HashSetIterator(this);
-}
-HashSetImplementation.prototype.toString = function() {
- return Collections.collectionToString(this);
-}
-HashSetImplementation.prototype.contains$1 = HashSetImplementation.prototype.contains;
-HashSetImplementation.prototype.remove$1 = HashSetImplementation.prototype.remove;
-HashSetImplementation.prototype.toString$0 = HashSetImplementation.prototype.toString;
-// ********** Code for HashSetImplementation_dart_core_String **************
-$inherits(HashSetImplementation_dart_core_String, HashSetImplementation);
-function HashSetImplementation_dart_core_String() {
- this._backingMap = new HashMapImplementation_dart_core_String$dart_core_String();
-}
-HashSetImplementation_dart_core_String.prototype.contains$1 = HashSetImplementation_dart_core_String.prototype.contains;
-// ********** Code for HashSetImplementation_Library **************
-$inherits(HashSetImplementation_Library, HashSetImplementation);
-function HashSetImplementation_Library() {
- this._backingMap = new HashMapImplementation_Library$Library();
-}
-// ********** Code for HashSetImplementation_Member **************
-$inherits(HashSetImplementation_Member, HashSetImplementation);
-function HashSetImplementation_Member() {
- this._backingMap = new HashMapImplementation_Member$Member();
-}
-// ********** Code for HashSetImplementation_Type **************
-$inherits(HashSetImplementation_Type, HashSetImplementation);
-function HashSetImplementation_Type() {
- this._backingMap = new HashMapImplementation_Type$Type();
-}
-HashSetImplementation_Type.prototype.contains$1 = HashSetImplementation_Type.prototype.contains;
-// ********** Code for HashSetIterator **************
-function HashSetIterator(set_) {
- this._nextValidIndex = (-1);
- this._entries = set_._backingMap._keys;
- this._advance();
-}
-HashSetIterator.prototype.hasNext = function() {
- var $0;
- if (this._nextValidIndex >= this._entries.get$length()) return false;
- if ((($0 = this._entries.$index(this._nextValidIndex)) == null ? null == (const$0000) : $0 === const$0000)) {
- this._advance();
- }
- return this._nextValidIndex < this._entries.get$length();
-}
-HashSetIterator.prototype.next = function() {
- if (!this.hasNext()) {
- $throw(const$0001);
- }
- var res = this._entries.$index(this._nextValidIndex);
- this._advance();
- return res;
-}
-HashSetIterator.prototype._advance = function() {
- var length = this._entries.get$length();
- var entry;
- var deletedKey = const$0000;
- do {
- if (++this._nextValidIndex >= length) break;
- entry = this._entries.$index(this._nextValidIndex);
- }
- while ((null == entry) || ((null == entry ? null == (deletedKey) : entry === deletedKey)))
-}
-// ********** Code for _DeletedKeySentinel **************
-function _DeletedKeySentinel() {
-
-}
-// ********** Code for KeyValuePair **************
-function KeyValuePair(key, value) {
- this.key = key;
- this.value = value;
-}
-KeyValuePair.prototype.get$value = function() { return this.value; };
-KeyValuePair.prototype.set$value = function(value) { return this.value = value; };
-// ********** Code for LinkedHashMapImplementation **************
-function LinkedHashMapImplementation() {
- this._map = new HashMapImplementation_Dynamic$DoubleLinkedQueueEntry_KeyValuePair();
- this._list = new DoubleLinkedQueue_KeyValuePair();
-}
-LinkedHashMapImplementation.prototype.is$Map = function(){return true};
-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(key, value));
- this._map.$setindex(key, this._list.lastEntry());
- }
-}
-LinkedHashMapImplementation.prototype.$index = function(key) {
- var entry = this._map.$index(key);
- if (null == entry) return null;
- return entry.get$element().get$value();
-}
-LinkedHashMapImplementation.prototype.remove = function(key) {
- var entry = this._map.remove(key);
- if (null == entry) return null;
- entry.remove();
- return entry.get$element().get$value();
-}
-LinkedHashMapImplementation.prototype.putIfAbsent = function(key, ifAbsent) {
- var value = this.$index(key);
- if ((null == this.$index(key)) && !(this.containsKey(key))) {
- value = ifAbsent();
- this.$setindex(key, value);
- }
- return value;
-}
-LinkedHashMapImplementation.prototype.getKeys = function() {
- var list = new Array(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 Array(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();
-}
-LinkedHashMapImplementation.prototype.isEmpty = function() {
- return this.get$length() == (0);
-}
-LinkedHashMapImplementation.prototype.toString = function() {
- return Maps.mapToString(this);
-}
-LinkedHashMapImplementation.prototype.remove$1 = LinkedHashMapImplementation.prototype.remove;
-LinkedHashMapImplementation.prototype.toString$0 = LinkedHashMapImplementation.prototype.toString;
-// ********** Code for Maps **************
-function Maps() {}
-Maps.mapToString = function(m) {
- var result = new StringBufferImpl("");
- Maps._emitMap(m, result, new Array());
- return result.toString$0();
-}
-Maps._emitMap = function(m, result, visiting) {
- visiting.add(m);
- result.add("{");
- var first = true;
- m.forEach((function (k, v) {
- if (!first) {
- result.add(", ");
- }
- first = false;
- Collections._emitObject(k, result, visiting);
- result.add(": ");
- Collections._emitObject(v, result, visiting);
- })
- );
- result.add("}");
- visiting.removeLast();
-}
-// ********** Code for DoubleLinkedQueueEntry **************
-function DoubleLinkedQueueEntry(e) {
- 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)._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_KeyValuePair **************
-$inherits(DoubleLinkedQueueEntry_KeyValuePair, DoubleLinkedQueueEntry);
-function DoubleLinkedQueueEntry_KeyValuePair(e) {
- this._element = e;
-}
-// ********** Code for _DoubleLinkedQueueEntrySentinel **************
-$inherits(_DoubleLinkedQueueEntrySentinel, DoubleLinkedQueueEntry);
-function _DoubleLinkedQueueEntrySentinel() {
- DoubleLinkedQueueEntry.call(this, null);
- this._link(this, this);
-}
-_DoubleLinkedQueueEntrySentinel.prototype.remove = function() {
- $throw(const$0002);
-}
-_DoubleLinkedQueueEntrySentinel.prototype._asNonSentinelEntry = function() {
- return null;
-}
-_DoubleLinkedQueueEntrySentinel.prototype.get$element = function() {
- $throw(const$0002);
-}
-// ********** Code for _DoubleLinkedQueueEntrySentinel_KeyValuePair **************
-$inherits(_DoubleLinkedQueueEntrySentinel_KeyValuePair, _DoubleLinkedQueueEntrySentinel);
-function _DoubleLinkedQueueEntrySentinel_KeyValuePair() {
- DoubleLinkedQueueEntry_KeyValuePair.call(this, null);
- this._link(this, this);
-}
-// ********** Code for DoubleLinkedQueue **************
-function DoubleLinkedQueue() {
- this._sentinel = new _DoubleLinkedQueueEntrySentinel();
-}
-DoubleLinkedQueue.prototype.is$Collection = function(){return true};
-DoubleLinkedQueue.DoubleLinkedQueue$from$factory = function(other) {
- var list = new DoubleLinkedQueue();
- for (var $$i = other.iterator(); $$i.hasNext(); ) {
- var e = $$i.next();
- 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(); ) {
- var e = $$i.next();
- 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;
-}
-DoubleLinkedQueue.prototype.isEmpty = function() {
- var $0;
- return ((($0 = this._sentinel._next) == null ? null == (this._sentinel) : $0 === this._sentinel));
-}
-DoubleLinkedQueue.prototype.forEach = function(f) {
- var entry = this._sentinel._next;
- while ((null == entry ? null != (this._sentinel) : entry !== this._sentinel)) {
- var nextEntry = entry._next;
- f(entry._element);
- entry = nextEntry;
- }
-}
-DoubleLinkedQueue.prototype.every = function(f) {
- var entry = this._sentinel._next;
- while ((null == entry ? null != (this._sentinel) : 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 ((null == entry ? null != (this._sentinel) : entry !== this._sentinel)) {
- var nextEntry = entry._next;
- if (f(entry._element)) return true;
- entry = nextEntry;
- }
- return false;
-}
-DoubleLinkedQueue.prototype.map = function(f) {
- var other = new DoubleLinkedQueue();
- var entry = this._sentinel._next;
- while ((null == entry ? null != (this._sentinel) : entry !== this._sentinel)) {
- var nextEntry = entry._next;
- other.addLast(f(entry._element));
- entry = nextEntry;
- }
- return other;
-}
-DoubleLinkedQueue.prototype.filter = function(f) {
- var other = new DoubleLinkedQueue();
- var entry = this._sentinel._next;
- while ((null == entry ? null != (this._sentinel) : 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(this._sentinel);
-}
-DoubleLinkedQueue.prototype.toString = function() {
- return Collections.collectionToString(this);
-}
-DoubleLinkedQueue.prototype.toString$0 = DoubleLinkedQueue.prototype.toString;
-// ********** Code for DoubleLinkedQueue_KeyValuePair **************
-$inherits(DoubleLinkedQueue_KeyValuePair, DoubleLinkedQueue);
-function DoubleLinkedQueue_KeyValuePair() {
- this._sentinel = new _DoubleLinkedQueueEntrySentinel_KeyValuePair();
-}
-// ********** Code for _DoubleLinkedQueueIterator **************
-function _DoubleLinkedQueueIterator(_sentinel) {
- this._sentinel = _sentinel;
- this._currentEntry = this._sentinel;
-}
-_DoubleLinkedQueueIterator.prototype.hasNext = function() {
- var $0;
- return (($0 = this._currentEntry._next) == null ? null != (this._sentinel) : $0 !== this._sentinel);
-}
-_DoubleLinkedQueueIterator.prototype.next = function() {
- if (!this.hasNext()) {
- $throw(const$0001);
- }
- this._currentEntry = this._currentEntry._next;
- return this._currentEntry.get$element();
-}
-// ********** Code for StopwatchImplementation **************
-function StopwatchImplementation() {
- this._start = null;
- this._stop = null;
-}
-StopwatchImplementation.prototype.start = function() {
- if (null == this._start) {
- this._start = Clock.now();
- }
- else {
- if (null == this._stop) {
- return;
- }
- this._start = Clock.now() - (this._stop - this._start);
- this._stop = null;
- }
-}
-StopwatchImplementation.prototype.get$start = function() {
- return this.start.bind(this);
-}
-StopwatchImplementation.prototype.stop = function() {
- if (null == this._start || null != this._stop) {
- return;
- }
- this._stop = Clock.now();
-}
-StopwatchImplementation.prototype.elapsed = function() {
- if (null == this._start) {
- return (0);
- }
- return (null == this._stop) ? (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();
-}
-// ********** Code for StringBufferImpl **************
-function StringBufferImpl(content) {
- this.clear();
- this.add(content);
-}
-StringBufferImpl.prototype.get$length = function() {
- return this._length;
-}
-StringBufferImpl.prototype.isEmpty = function() {
- return this._length == (0);
-}
-StringBufferImpl.prototype.add = function(obj) {
- var str = obj.toString$0();
- if (null == str || str.isEmpty()) return this;
- this._buffer.add(str);
- this._length = this._length + str.length;
- return this;
-}
-StringBufferImpl.prototype.addAll = function(objects) {
- for (var $$i = objects.iterator(); $$i.hasNext(); ) {
- var obj = $$i.next();
- this.add(obj);
- }
- return this;
-}
-StringBufferImpl.prototype.clear = function() {
- this._buffer = new Array();
- this._length = (0);
- return this;
-}
-StringBufferImpl.prototype.toString = function() {
- if (this._buffer.get$length() == (0)) return "";
- if (this._buffer.get$length() == (1)) return this._buffer.$index((0));
- var result = StringBase.concatAll(this._buffer);
- this._buffer.clear();
- this._buffer.add(result);
- return result;
-}
-StringBufferImpl.prototype.toString$0 = StringBufferImpl.prototype.toString;
-// ********** Code for StringBase **************
-function StringBase() {}
-StringBase.createFromCharCodes = function(charCodes) {
- if (Object.getPrototypeOf(charCodes) !== Array.prototype) {
- charCodes = new ListFactory.ListFactory$from$factory(charCodes);
- }
- return String.fromCharCode.apply(null, charCodes);
-}
-StringBase.join = function(strings, separator) {
- if (strings.get$length() == (0)) return "";
- var s = strings.$index((0));
- for (var i = (1);
- i < strings.get$length(); i++) {
- s = $add$($add$(s, separator), strings.$index(i));
- }
- return s;
-}
-StringBase.concatAll = function(strings) {
- return StringBase.join(strings, "");
-}
-// ********** Code for StringImplementation **************
-StringImplementation = String;
-StringImplementation.prototype.get$length = function() { return this.length; };
-StringImplementation.prototype.endsWith = function(other) {
- 'use strict';
- if (other.length > this.length) return false;
- return other == this.substring(this.length - other.length);
-}
-StringImplementation.prototype.startsWith = function(other) {
- 'use strict';
- 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) {
- 'use strict'; return this.indexOf(pattern, startIndex) >= 0;
-}
-StringImplementation.prototype._replaceRegExp = function(from, to) {
- 'use strict';return this.replace(from.re, to);
-}
-StringImplementation.prototype._replaceAll = function(from, to) {
- 'use strict';
- from = new RegExp(from.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'g');
- to = to.replace(/\$/g, '$$$$'); // Escape sequences are fun!
- return this.replace(from, to);
-}
-StringImplementation.prototype.replaceAll = function(from, to) {
- if ((typeof(from) == 'string')) return this._replaceAll(from, to);
- if (!!(from && from.is$RegExp())) return this._replaceRegExp(from.get$dynamic().get$_global(), to);
- var buffer = new StringBufferImpl("");
- var lastMatchEnd = (0);
- var $$list = from.allMatches(this);
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var match = $$i.next();
- buffer.add(this.substring(lastMatchEnd, match.start()));
- buffer.add(to);
- lastMatchEnd = match.end$0();
- }
- buffer.add(this.substring(lastMatchEnd));
-}
-StringImplementation.prototype.split$_ = function(pattern) {
- if ((typeof(pattern) == 'string')) return this._split(pattern);
- if (!!(pattern && pattern.is$RegExp())) return this._splitRegExp(pattern);
- $throw("String.split(Pattern) unimplemented.");
-}
-StringImplementation.prototype._split = function(pattern) {
- 'use strict'; return this.split(pattern);
-}
-StringImplementation.prototype._splitRegExp = function(pattern) {
- 'use strict'; return this.split(pattern.re);
-}
-StringImplementation.prototype.allMatches = function(str) {
- $throw("String.allMatches(String str) unimplemented.");
-}
-StringImplementation.prototype.hashCode = function() {
- 'use strict';
- var hash = 0;
- for (var i = 0; i < this.length; i++) {
- hash = 0x1fffffff & (hash + this.charCodeAt(i));
- hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
- hash ^= hash >> 6;
- }
-
- hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
- hash ^= hash >> 11;
- return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
-}
-StringImplementation.prototype.compareTo = function(other) {
- 'use strict'; return this == other ? 0 : this < other ? -1 : 1;
-}
-StringImplementation.prototype.contains$1 = StringImplementation.prototype.contains;
-StringImplementation.prototype.indexOf$1 = StringImplementation.prototype.indexOf;
-StringImplementation.prototype.substring$1 = StringImplementation.prototype.substring;
-// ********** Code for _ArgumentMismatchException **************
-$inherits(_ArgumentMismatchException, ClosureArgumentMismatchException);
-function _ArgumentMismatchException(_message) {
- this._dart_coreimpl_message = _message;
- ClosureArgumentMismatchException.call(this);
-}
-_ArgumentMismatchException.prototype.toString = function() {
- return ("Closure argument mismatch: " + this._dart_coreimpl_message);
-}
-_ArgumentMismatchException.prototype.toString$0 = _ArgumentMismatchException.prototype.toString;
-// ********** Code for _FunctionImplementation **************
-_FunctionImplementation = Function;
-_FunctionImplementation.prototype._genStub = function(argsLength, names) {
- // Fast path #1: if no named arguments and arg count matches.
- var thisLength = this.$length || this.length;
- if (thisLength == argsLength && !names) {
- return this;
- }
-
- var paramsNamed = this.$optional ? (this.$optional.length / 2) : 0;
- var paramsBare = thisLength - paramsNamed;
- var argsNamed = names ? names.length : 0;
- var argsBare = argsLength - argsNamed;
-
- // Check we got the right number of arguments
- if (argsBare < paramsBare || argsLength > thisLength ||
- argsNamed > paramsNamed) {
- return function() {
- $throw(new _ArgumentMismatchException(
- 'Wrong number of arguments to function. Expected ' + paramsBare +
- ' positional arguments and at most ' + paramsNamed +
- ' named arguments, but got ' + argsBare +
- ' positional arguments and ' + argsNamed + ' named arguments.'));
- };
- }
-
- // 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 function() {
- $throw(new _ArgumentMismatchException(
- 'Named argument "' + name + '" was not expected by function.' +
- ' Did you forget to mark the function parameter [optional]?'));
- };
- } else if (lastParameterIndex && lastParameterIndex > j) {
- namesInOrder = false;
- }
- p[j + paramsBare] = name;
- lastParameterIndex = j;
- }
-
- if (thisLength == argsLength && namesInOrder) {
- // Fast path #2: named arguments, but they're in order and all supplied.
- 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);
-
-}
-// ********** Code for top level **************
-function _constList(other) {
- other.__proto__ = ImmutableList.prototype;
- return other;
-}
-function _map(itemsAndKeys) {
- var ret = new LinkedHashMapImplementation();
- for (var i = (0);
- i < itemsAndKeys.get$length(); ) {
- ret.$setindex(itemsAndKeys.$index(i++), itemsAndKeys.$index(i++));
- }
- return ret;
-}
-// ********** Library node **************
-// ********** Code for Process **************
-function Process(_process) {
- this.SIGHUP = "SIGHUP";
- this.SIGINT = "SIGINT";
- this.SIGQUIT = "SIGQUIT";
- this.SIGILL = "SIGILL";
- this.SIGTRAP = "SIGTRAP";
- this.SIGABRT = "SIGABRT";
- this.SIGEMT = "SIGEMT";
- this.SIGFPE = "SIGFPE";
- this.SIGKILL = "SIGKILL";
- this.SIGBUS = "SIGBUS";
- this.SIGSEGV = "SIGSEGV";
- this.SIGSYS = "SIGSYS";
- this.SIGPIPE = "SIGPIPE";
- this.SIGALRM = "SIGALRM";
- this.SIGTERM = "SIGTERM";
- this.SIGURG = "SIGURG";
- this.SIGSTOP = "SIGSTOP";
- this.SIGTSTP = "SIGTSTP";
- this.SIGCONT = "SIGCONT";
- this.SIGCHLD = "SIGCHLD";
- this.SIGTTIN = "SIGTTIN";
- this.SIGTTOU = "SIGTTOU";
- this.SIGIO = "SIGIO";
- this.SIGXCPU = "SIGXCPU";
- this.SIGXFSZ = "SIGXFSZ";
- this.SIGVTALRM = "SIGVTALRM";
- this.SIGPROF = "SIGPROF";
- this.SIGWINCH = "SIGWINCH";
- this.SIGINFO = "SIGINFO";
- this.SIGUSR1 = "SIGUSR1";
- this.SIGUSR2 = "SIGUSR2";
- this._process = _process;
-}
-Process.prototype.get$argv = function() {
- return this._process.argv;
-}
-Process.prototype.set$argv = function(value) {
- this._process.argv = value;
-}
-Process.prototype.get$env = function() {
- return new EnvMap(this._process);
-}
-Process.prototype.exit = function(code) {
- this._process.exit(code);
-}
-// ********** Code for EnvMap **************
-function EnvMap(_process) {
- this._process = _process;
-}
-EnvMap.prototype.$index = function(key) {
- return this._process.env[key];
-}
-// ********** Code for ReadableStream **************
-// ********** Code for WritableStream **************
-$dynamic("end$0").WriteStream = function() {
- return this.end(null, "utf8");
-};
-$dynamic("write$1").WriteStream = function($0) {
- return this.write($0, "utf8");
-};
-// ********** Code for vm **************
-vm = require('vm');
-// ********** Code for fs **************
-fs = require('fs');
-// ********** Code for path **************
-path = require('path');
-// ********** Code for top level **************
-function createSandbox() {
- return {'require': require, 'process': process, 'console': console,
- 'Buffer' : Buffer,
- 'setTimeout$': this.setTimeout, 'clearTimeout': clearTimeout};
-}
-function get$$_process() {
- return process;
-}
-function get$$process() {
- return new Process(get$$_process());
-}
-// ********** Library file_system **************
-// ********** Code for top level **************
-function canonicalizePath(path) {
- return path.replaceAll("\\", "/");
-}
-function joinPaths(path1, path2) {
- path1 = canonicalizePath(path1);
- path2 = canonicalizePath(path2);
- var pieces = path1.split$_("/");
- var $$list = path2.split$_("/");
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var piece = $$i.next();
- if ($eq$(piece, "..") && pieces.get$length() > (0) && $ne$(pieces.last(), ".") && $ne$(pieces.last(), "..")) {
- pieces.removeLast();
- }
- else if ($ne$(piece, "")) {
- if (pieces.get$length() > (0) && $eq$(pieces.last(), ".")) {
- pieces.removeLast();
- }
- pieces.add(piece);
- }
- }
- return Strings.join(pieces, "/");
-}
-function dirname(path) {
- path = canonicalizePath(path);
- var lastSlash = path.lastIndexOf("/", path.length);
- if (lastSlash == (-1)) {
- return ".";
- }
- else {
- return path.substring((0), lastSlash);
- }
-}
-function basename(path) {
- path = canonicalizePath(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() {
-
-}
-NodeFileSystem.prototype.writeString = function(outfile, text) {
- fs.writeFileSync(outfile, text);
-}
-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 MethodAnalyzer **************
-function MethodAnalyzer(method, body) {
- this.hasTypeParams = false;
- this.method = method;
- this.body = body;
-}
-MethodAnalyzer.prototype.get$method = function() { return this.method; };
-MethodAnalyzer.prototype.get$body = function() { return this.body; };
-MethodAnalyzer.prototype.get$hasTypeParams = function() { return this.hasTypeParams; };
-MethodAnalyzer.prototype.analyze = function(context) {
- var thisValue;
- if (context != null) {
- thisValue = context.thisValue;
- }
- else {
- thisValue = new PureStaticValue(this.method.declaringType, null, false, false);
- }
- var values = [];
- var $$list = this.method.parameters;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var p = $$i.next();
- values.add(new PureStaticValue(p.get$type(), null, false, false));
- }
- var args = new Arguments(null, values);
- this._frame = new CallFrame(this, this.method, thisValue, args, context);
- this._bindArguments(this._frame.args);
- var declaredInitializers = this.method.definition.get$dynamic().get$initializers();
- if ($ne$(declaredInitializers)) {
- for (var $$i = declaredInitializers.iterator(); $$i.hasNext(); ) {
- var init = $$i.next();
- if ((init instanceof CallExpression)) {
- this.visitCallExpression(init, true);
- }
- }
- }
- if (this.body != null) this.body.visit(this);
-}
-MethodAnalyzer.prototype._hasTypeParams = function(node) {
- if ((node instanceof NameTypeReference)) {
- var name = node.get$name().get$name();
- return (this.method.declaringType.lookupTypeParam(name) != null);
- }
- else if ((node instanceof GenericTypeReference)) {
- var $$list = node.get$typeArguments();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var typeArg = $$i.next();
- if (this._hasTypeParams(typeArg)) return true;
- }
- return false;
- }
- else {
- return false;
- }
-}
-MethodAnalyzer.prototype.resolveType = function(node, typeErrors, allowTypeParams) {
- if (!this.hasTypeParams && this._hasTypeParams(node)) {
- this.hasTypeParams = true;
- }
- return this.method.resolveType(node, typeErrors, allowTypeParams);
-}
-MethodAnalyzer.prototype.makeNeutral = function(inValue, span) {
- return new PureStaticValue(inValue.get$type(), span, false, false);
-}
-MethodAnalyzer.prototype._bindArguments = function(args) {
- for (var i = (0);
- i < this.method.parameters.get$length(); i++) {
- var p = this.method.parameters.$index(i);
- var currentArg = null;
- if (i < args.get$bareCount()) {
- currentArg = args.values.$index(i);
- }
- else {
- currentArg = args.getValue(p.get$name());
- if (null == currentArg) {
- p.genValue(this.method, this._frame);
- if (null == p.get$value()) {
- $globals.world.warning("missing argument at call - does not match");
- }
- currentArg = p.get$value();
- }
- }
- currentArg = this.makeNeutral(currentArg, p.get$definition().get$span());
- this._frame.declareParameter(p, currentArg);
- }
-}
-MethodAnalyzer.prototype.visitBool = function(node) {
- return this.visitTypedValue(node, $globals.world.boolType);
-}
-MethodAnalyzer.prototype.visitValue = function(node) {
- if (node == null) return null;
- var value = node.visit(this);
- value.checkFirstClass(node.span);
- return value;
-}
-MethodAnalyzer.prototype.visitTypedValue = function(node, expectedType) {
- var val = this.visitValue(node);
- return null == val ? null : val.convertTo(this._frame, expectedType);
-}
-MethodAnalyzer.prototype.visitVoid = function(node) {
- return this.visitValue(node);
-}
-MethodAnalyzer.prototype._visitArgs = function(arguments) {
- var args = [];
- var seenLabel = false;
- for (var $$i = arguments.iterator(); $$i.hasNext(); ) {
- var arg = $$i.next();
- if (arg.get$label() != null) {
- seenLabel = true;
- }
- else if (seenLabel) {
- $globals.world.error("bare argument cannot follow named arguments", arg.get$span());
- }
- args.add(this.visitValue(arg.get$value()));
- }
- return new Arguments(arguments, args);
-}
-MethodAnalyzer.prototype._makeLambdaMethod = function(name, func) {
- var meth = new MethodMember.lambda$ctor(name, this.method.declaringType, func);
- meth.set$enclosingElement(this.method);
- meth.set$_methodData(new MethodData(meth, this._frame));
- meth.resolve();
- return meth;
-}
-MethodAnalyzer.prototype._pushBlock = function(node) {
- this._frame.pushBlock(node);
-}
-MethodAnalyzer.prototype._popBlock = function(node) {
- this._frame.popBlock(node);
-}
-MethodAnalyzer.prototype._resolveBare = function(name, node) {
- var type = this._frame.method.declaringType;
- var member = type.getMember(name);
- if ($eq$(member) || $ne$(member.get$declaringType(), type)) {
- var libMember = this._frame.get$library().lookup(name, node.span);
- if (null != libMember) return libMember;
- }
- if (null != member && !member.get$isStatic() && this._frame.get$isStatic()) {
- $globals.world.error("cannot refer to instance member from static method", node.span);
- }
- return member;
-}
-MethodAnalyzer.prototype.visitDietStatement = function(node) {
- var parser = new Parser(node.span.file, false, false, false, node.span.start);
- parser.block().visit(this);
-}
-MethodAnalyzer.prototype.visitVariableDefinition = function(node) {
- var isFinal = false;
- if (node.modifiers != null && node.modifiers.$index((0)).kind == (99)) {
- isFinal = true;
- }
- var type = this.resolveType(node.type, false, true);
- for (var i = (0);
- i < node.names.get$length(); i++) {
- var name = node.names.$index(i).name;
- var value = this.visitValue(node.values.$index(i));
- this._frame.create(name, type, node.names.$index(i), isFinal, value);
- }
-}
-MethodAnalyzer.prototype.visitFunctionDefinition = function(node) {
- var meth = this._makeLambdaMethod(node.name.name, node);
- var funcValue = this._frame.create(meth.get$name(), meth.get$functionType(), this.method.definition, true, null);
- meth.get$methodData().analyze();
-}
-MethodAnalyzer.prototype.visitReturnStatement = function(node) {
- if (node.value == null) {
- this._frame.returns(Value.fromNull(node.span));
- }
- else {
- this._frame.returns(this.visitValue(node.value));
- }
-}
-MethodAnalyzer.prototype.visitThrowStatement = function(node) {
- if (node.value != null) {
- var value = this.visitValue(node.value);
- }
- else {
- }
-}
-MethodAnalyzer.prototype.visitAssertStatement = function(node) {
- var test = this.visitValue(node.test);
-}
-MethodAnalyzer.prototype.visitBreakStatement = function(node) {
-
-}
-MethodAnalyzer.prototype.visitContinueStatement = function(node) {
-
-}
-MethodAnalyzer.prototype.visitIfStatement = function(node) {
- var test = this.visitBool(node.test);
- node.trueBranch.visit(this);
- if (node.falseBranch != null) {
- node.falseBranch.visit(this);
- }
-}
-MethodAnalyzer.prototype.visitWhileStatement = function(node) {
- var test = this.visitBool(node.test);
- node.body.visit(this);
-}
-MethodAnalyzer.prototype.visitDoStatement = function(node) {
- node.body.visit(this);
- var test = this.visitBool(node.test);
-}
-MethodAnalyzer.prototype.visitForStatement = function(node) {
- this._pushBlock(node);
- if (node.init != null) node.init.visit(this);
- if (node.test != null) {
- var test = this.visitBool(node.test);
- }
- var $$list = node.step;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var s = $$i.next();
- var sv = this.visitVoid(s);
- }
- this._pushBlock(node.body);
- node.body.visit(this);
- this._popBlock(node.body);
- this._popBlock(node);
-}
-MethodAnalyzer.prototype.visitForInStatement = function(node) {
- var itemType = this.resolveType(node.item.type, false, true);
- var list = node.list.visit(this);
- this._visitForInBody(node, itemType, list);
-}
-MethodAnalyzer.prototype._isFinal = function(typeRef) {
- if ((typeRef instanceof GenericTypeReference)) {
- typeRef = typeRef.get$baseType();
- }
- else if ((typeRef instanceof SimpleTypeReference)) {
- return false;
- }
- return $ne$(typeRef) && typeRef.get$isFinal();
-}
-MethodAnalyzer.prototype._visitForInBody = function(node, itemType, list) {
- this._pushBlock(node);
- var isFinal = this._isFinal(node.item.type);
- var itemName = node.item.name.name;
- var item = this._frame.create(itemName, itemType, node.item.name, isFinal, null);
- var iterator = list.invoke(this._frame, "iterator", node.list, Arguments.get$EMPTY());
- node.body.visit(this);
- this._popBlock(node);
-}
-MethodAnalyzer.prototype._createDI = function(di) {
- this._frame.create(di.name.name, this.resolveType(di.type, false, true), di.name, true, null);
-}
-MethodAnalyzer.prototype.visitTryStatement = function(node) {
- this._pushBlock(node.body);
- node.body.visit(this);
- this._popBlock(node.body);
- if (node.catches.get$length() > (0)) {
- for (var i = (0);
- i < node.catches.get$length(); i++) {
- var catch_ = node.catches.$index(i);
- this._pushBlock(catch_);
- this._createDI(catch_.get$exception());
- if (null != catch_.get$trace()) {
- this._createDI(catch_.get$trace());
- }
- catch_.get$body().visit(this);
- this._popBlock(catch_);
- }
- }
- if (node.finallyBlock != null) {
- node.finallyBlock.visit(this);
- }
-}
-MethodAnalyzer.prototype.visitSwitchStatement = function(node) {
- var test = this.visitValue(node.test);
- var $$list = node.cases;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var case_ = $$i.next();
- this._pushBlock(case_);
- for (var i = (0);
- i < case_.get$cases().get$length(); i++) {
- var expr = case_.get$cases().$index(i);
- if ($eq$(expr)) {
- }
- else {
- var value = this.visitValue(expr);
- }
- }
- this._visitAllStatements(case_.get$statements());
- this._popBlock(case_);
- }
-}
-MethodAnalyzer.prototype._visitAllStatements = function(statementList) {
- for (var i = (0);
- i < statementList.get$length(); i++) {
- var stmt = statementList.$index(i);
- stmt.visit(this);
- }
-}
-MethodAnalyzer.prototype.visitBlockStatement = function(node) {
- this._pushBlock(node);
- this._visitAllStatements(node.body);
- this._popBlock(node);
-}
-MethodAnalyzer.prototype.visitLabeledStatement = function(node) {
- node.body.visit(this);
-}
-MethodAnalyzer.prototype.visitExpressionStatement = function(node) {
- var value = this.visitVoid(node.body);
-}
-MethodAnalyzer.prototype.visitEmptyStatement = function(node) {
-
-}
-MethodAnalyzer.prototype.visitLambdaExpression = function(node) {
- var name = (node.func.name != null) ? node.func.name.name : "";
- var meth = this._makeLambdaMethod(name, node.func);
- meth.get$methodData().analyze();
- return this._frame._makeValue($globals.world.functionType, node);
-}
-MethodAnalyzer.prototype.analyzeInitializerConstructorCall = function(node, receiver, name) {
- var type = this._frame.method.declaringType;
- if ((receiver instanceof SuperExpression)) {
- type = type.get$parent();
- }
- var member = type.getConstructor(name == null ? "" : name);
- if (null != member) {
- return member.invoke(this._frame, node, this._frame.makeThisValue(node), this._visitArgs(node.arguments));
- }
- else {
- var constructorName = name == null ? "" : ("." + name);
- $globals.world.warning(("cannot find constructor \"" + type.get$name() + constructorName + "\""), node.span);
- return this._frame._makeValue($globals.world.varType, node);
- }
-}
-MethodAnalyzer.prototype.isThisOrSuper = function(node) {
- return (node instanceof ThisExpression) || (node instanceof SuperExpression);
-}
-MethodAnalyzer.prototype.visitCallExpression = function(node, visitingInitializers) {
- 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;
- if (this.isThisOrSuper(dot.self) && visitingInitializers) {
- return this.analyzeInitializerConstructorCall(node, dot.self, name);
- }
- else {
- position = dot.name;
- }
- }
- else if (this.isThisOrSuper(node.target) && visitingInitializers) {
- return this.analyzeInitializerConstructorCall(node, node.target, null);
- }
- else if ((node.target instanceof VarExpression)) {
- var varExpr = node.target;
- name = varExpr.name.name;
- target = this._frame.lookup(name);
- if ($ne$(target)) {
- return target.get(position).invoke(this._frame, ":call", node, this._visitArgs(node.arguments));
- }
- var member = this._resolveBare(name, varExpr.name);
- if (null != member) {
- return member.invoke(this._frame, node, this._frame.makeThisValue(node), this._visitArgs(node.arguments));
- }
- else {
- $globals.world.warning(("cannot find \"" + name + "\""), node.span);
- return this._frame._makeValue($globals.world.varType, node);
- }
- }
- else {
- target = node.target.visit(this);
- }
- return target.invoke(this._frame, name, position, this._visitArgs(node.arguments));
-}
-MethodAnalyzer.prototype.visitIndexExpression = function(node) {
- var target = this.visitValue(node.target);
- var index = this.visitValue(node.index);
- return target.invoke(this._frame, ":index", node, new Arguments(null, [index]));
-}
-MethodAnalyzer.prototype.visitBinaryExpression = function(node, isVoid) {
- var kind = node.op.kind;
- if ($eq$(kind, (35)) || $eq$(kind, (34))) {
- var xb = this.visitBool(node.x);
- var yb = this.visitBool(node.y);
- return xb.binop(kind, yb, this._frame, node);
- }
- var assignKind = TokenKind.kindFromAssign(node.op.kind);
- if ($eq$(assignKind, (-1))) {
- var x = this.visitValue(node.x);
- var y = this.visitValue(node.y);
- return x.binop(kind, y, this._frame, node);
- }
- else {
- return this._visitAssign(assignKind, node.x, node.y, node);
- }
-}
-MethodAnalyzer.prototype._visitAssign = function(kind, xn, yn, position) {
- if ((xn instanceof VarExpression)) {
- return this._visitVarAssign(kind, xn, yn, position);
- }
- else if ((xn instanceof IndexExpression)) {
- return this._visitIndexAssign(kind, xn, yn, position);
- }
- else if ((xn instanceof DotExpression)) {
- return this._visitDotAssign(kind, xn, yn, position);
- }
- else {
- $globals.world.error("illegal lhs", xn.span);
- }
-}
-MethodAnalyzer.prototype._visitVarAssign = function(kind, xn, yn, node) {
- var value = this.visitValue(yn);
- var name = xn.name.name;
- var slot = this._frame.lookup(name);
- if ($ne$(slot)) {
- slot.set(value);
- }
- else {
- var member = this._resolveBare(name, xn.name);
- if (null != member) {
- member._set(this._frame, node, this._frame.makeThisValue(node), value);
- }
- else {
- $globals.world.warning(("cannot find \"" + name + "\""), node.span);
- }
- }
- return this._frame._makeValue(value.get$type(), node);
-}
-MethodAnalyzer.prototype._visitIndexAssign = function(kind, xn, yn, position) {
- var target = this.visitValue(xn.target);
- var index = this.visitValue(xn.index);
- var y = this.visitValue(yn);
- return target.setIndex$4$kind(this._frame, index, position, y, kind);
-}
-MethodAnalyzer.prototype._visitDotAssign = function(kind, xn, yn, position) {
- var target = xn.self.visit(this);
- var y = this.visitValue(yn);
- return target.set_$4$kind(this._frame, xn.name.name, xn.name, y, kind);
-}
-MethodAnalyzer.prototype.visitUnaryExpression = function(node) {
- var value = this.visitValue(node.self);
- switch (node.op.kind) {
- case (16):
- case (17):
-
- return value.binop((42), this._frame._makeValue($globals.world.intType, node), this._frame, node);
-
- }
- return value.unop(node.op.kind, this._frame, node);
-}
-MethodAnalyzer.prototype.visitDeclaredIdentifier = function(node) {
- $globals.world.error("Expected expression", node.span);
-}
-MethodAnalyzer.prototype.visitAwaitExpression = function(node) {
- $globals.world.internalError("Await expressions should have been eliminated before code generation", node.span);
-}
-MethodAnalyzer.prototype.visitPostfixExpression = function(node, isVoid) {
- var value = this.visitValue(node.body);
- return this._frame._makeValue(value.get$type(), node);
-}
-MethodAnalyzer.prototype.visitNewExpression = function(node) {
- var typeRef = node.type;
- var constructorName = "";
- if (node.name != null) {
- constructorName = node.name.name;
- }
- if ($eq$(constructorName, "") && (typeRef instanceof NameTypeReference) && typeRef.get$names() != null) {
- var names = ListFactory.ListFactory$from$factory(typeRef.get$names());
- constructorName = names.removeLast().get$name();
- if (names.get$length() == (0)) names = null;
- typeRef = new NameTypeReference(typeRef.get$isFinal(), typeRef.get$name(), names, typeRef.get$span());
- }
- var type = this.resolveType(typeRef, true, true);
- if (type.get$isTop()) {
- type = type.get$library().findTypeByName(constructorName);
- if ($eq$(type)) {
- $globals.world.error(("cannot resolve type " + constructorName), node.span);
- }
- constructorName = "";
- }
- if ((type instanceof ParameterType)) {
- $globals.world.error("cannot instantiate a type parameter", node.span);
- return this._frame._makeValue($globals.world.varType, node);
- }
- var m = type.getConstructor(constructorName);
- if ($eq$(m)) {
- var name = type.get$jsname();
- if (type.get$isVar()) {
- name = typeRef.get$name().get$name();
- }
- $globals.world.warning(("no matching constructor for " + name), node.span);
- return this._frame._makeValue(type, node);
- }
- 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 = $$list.iterator(); $$i.hasNext(); ) {
- var arg = $$i.next();
- if (!this.visitValue(arg.get$value()).get$isConst()) {
- $globals.world.error("const constructor expects const arguments", arg.get$span());
- }
- }
- }
- var args = this._visitArgs(node.arguments);
- var target = new TypeValue(type, typeRef.get$span());
- return new PureStaticValue(type, node.span, node.isConst, false);
-}
-MethodAnalyzer.prototype.visitListExpression = function(node) {
- var argValues = [];
- var listType = $globals.world.listType;
- var type = $globals.world.varType;
- if (node.itemType != null) {
- type = this.resolveType(node.itemType, true, !node.isConst);
- if (node.isConst && ((type instanceof ParameterType) || type.get$hasTypeParams())) {
- $globals.world.error("type parameter cannot be used in const list literals");
- }
- listType = listType.getOrMakeConcreteType([type]);
- }
- var $$list = node.values;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var item = $$i.next();
- var arg = this.visitTypedValue(item, type);
- argValues.add(arg);
- }
- $globals.world.listFactoryType.markUsed();
- return new PureStaticValue(listType, node.span, node.isConst, false);
-}
-MethodAnalyzer.prototype.visitMapExpression = function(node) {
- var values = [];
- var valueType = $globals.world.varType, keyType = $globals.world.stringType;
- var mapType = $globals.world.mapType;
- if (null != node.valueType) {
- if (null != node.keyType) {
- keyType = this.method.resolveType(node.keyType, true, !node.isConst);
- if (!keyType.get$isString()) {
- $globals.world.error("the key type of a map literal must be \"String\"", keyType.get$span());
- }
- if (node.isConst && ((keyType instanceof ParameterType) || keyType.get$hasTypeParams())) {
- $globals.world.error("type parameter cannot be used in const map literals");
- }
- }
- valueType = this.resolveType(node.valueType, true, !node.isConst);
- if (node.isConst && ((valueType instanceof ParameterType) || valueType.get$hasTypeParams())) {
- $globals.world.error("type parameter cannot be used in const map literals");
- }
- mapType = mapType.getOrMakeConcreteType([keyType, valueType]);
- }
- for (var i = (0);
- i < node.items.get$length(); i += (2)) {
- var key = this.visitTypedValue(node.items.$index(i), keyType);
- values.add(key);
- var value = this.visitTypedValue(node.items.$index(i + (1)), valueType);
- if (node.isConst && !value.get$isConst()) {
- $globals.world.error("const map can only contain const values", value.get$span());
- }
- values.add(value);
- }
- return new PureStaticValue(mapType, node.span, node.isConst, false);
-}
-MethodAnalyzer.prototype.visitConditionalExpression = function(node) {
- var test = this.visitBool(node.test);
- var trueBranch = this.visitValue(node.trueBranch);
- var falseBranch = this.visitValue(node.falseBranch);
- return this._frame._makeValue(Type.union(trueBranch.get$type(), falseBranch.get$type()), node);
-}
-MethodAnalyzer.prototype.visitIsExpression = function(node) {
- var value = this.visitValue(node.x);
- var type = this.resolveType(node.type, false, true);
- return this._frame._makeValue($globals.world.boolType, node);
-}
-MethodAnalyzer.prototype.visitParenExpression = function(node) {
- return this.visitValue(node.body);
-}
-MethodAnalyzer.prototype.visitDotExpression = function(node) {
- var target = node.self.visit(this);
- return target.get_(this._frame, node.name.name, node);
-}
-MethodAnalyzer.prototype.visitVarExpression = function(node) {
- var name = node.name.name;
- var slot = this._frame.lookup(name);
- if ($ne$(slot)) {
- return slot.get(node);
- }
- var member = this._resolveBare(name, node.name);
- if (null != member) {
- if ((member instanceof TypeMember)) {
- return new PureStaticValue(member.get$dynamic().get$type(), node.span, true, true);
- }
- else {
- return member._get(this._frame, node, this._frame.makeThisValue(node));
- }
- }
- else {
- $globals.world.warning(("cannot find \"" + name + "\""), node.span);
- return this._frame._makeValue($globals.world.varType, node);
- }
-}
-MethodAnalyzer.prototype.visitThisExpression = function(node) {
- return this._frame.makeThisValue(node);
-}
-MethodAnalyzer.prototype.visitSuperExpression = function(node) {
- return this._frame.makeSuperValue(node);
-}
-MethodAnalyzer.prototype.visitLiteralExpression = function(node) {
- return new PureStaticValue(node.value.get$type(), node.span, true, false);
-}
-MethodAnalyzer.prototype.visitStringConcatExpression = function(node) {
- var $this = this; // closure support
- var isConst = true;
- node.strings.forEach((function (each) {
- if (!$this.visitValue(each).get$isConst()) isConst = false;
- })
- );
- return new PureStaticValue($globals.world.stringType, node.span, isConst, false);
-}
-MethodAnalyzer.prototype.visitStringInterpExpression = function(node) {
- var $this = this; // closure support
- var isConst = true;
- node.pieces.forEach((function (each) {
- if (!$this.visitValue(each).get$isConst()) isConst = false;
- })
- );
- return new PureStaticValue($globals.world.stringType, node.span, isConst, false);
-}
-MethodAnalyzer.prototype._pushBlock$1 = MethodAnalyzer.prototype._pushBlock;
-MethodAnalyzer.prototype.analyze$1 = MethodAnalyzer.prototype.analyze;
-MethodAnalyzer.prototype.visitBinaryExpression$1 = function($0) {
- return this.visitBinaryExpression($0, false);
-};
-MethodAnalyzer.prototype.visitCallExpression$1 = function($0) {
- return this.visitCallExpression($0, false);
-};
-MethodAnalyzer.prototype.visitPostfixExpression$1 = function($0) {
- return this.visitPostfixExpression($0, false);
-};
-// ********** Code for CallFrame **************
-function CallFrame(analyzer, method, thisValue, args, enclosingFrame) {
- this.analyzer = analyzer;
- this.method = method;
- this.thisValue = thisValue;
- this.args = args;
- this.enclosingFrame = enclosingFrame;
- this._slots = [];
- this._scope = new AnalyzeScope(null, this, this.analyzer.body);
- this._returnSlot = new VariableSlot(this._scope, "return", this.method.returnType, this.analyzer.body, false);
-}
-CallFrame.prototype.findMembers = function(name) {
- return this.get$library()._findMembers(name);
-}
-CallFrame.prototype.get$counters = function() {
- return $globals.world.counters;
-}
-CallFrame.prototype.get$library = function() {
- return this.method.get$library();
-}
-CallFrame.prototype.get$method = function() { return this.method; };
-CallFrame.prototype.get$needsCode = function() {
- return false;
-}
-CallFrame.prototype.get$showWarnings = function() {
- return true;
-}
-CallFrame.prototype._makeThisCode = function() {
- return null;
-}
-CallFrame.prototype.getTemp = function(value) {
- return null;
-}
-CallFrame.prototype.forceTemp = function(value) {
- return null;
-}
-CallFrame.prototype.assignTemp = function(tmp, v) {
- return null;
-}
-CallFrame.prototype.freeTemp = function(value) {
- return null;
-}
-CallFrame.prototype.get$isStatic = function() {
- return this.enclosingFrame != null ? this.enclosingFrame.get$isStatic() : this.method.isStatic;
-}
-CallFrame.prototype.get$_slots = function() { return this._slots; };
-CallFrame.prototype.get$_scope = function() { return this._scope; };
-CallFrame.prototype.pushBlock = function(node) {
- this._scope = new AnalyzeScope(this._scope, this, node);
-}
-CallFrame.prototype.popBlock = function(node) {
- if ($ne$(this._scope.node, node)) {
- $globals.world.internalError("incorrect pop", node.span, this._scope.node.span);
- }
- this._scope = this._scope.parent;
-}
-CallFrame.prototype.returns = function(value) {
- this._returnSlot.set(value);
-}
-CallFrame.prototype.lookup = function(name) {
- var slot = this._scope._lookup(name);
- if ($eq$(slot) && this.enclosingFrame != null) {
- return this.enclosingFrame.lookup(name);
- }
- return slot;
-}
-CallFrame.prototype.create = function(name, staticType, node, isFinal, value) {
- var slot = new VariableSlot(this._scope, name, staticType, node, isFinal, value);
- var existingSlot = this._scope._lookup(name);
- if (null != existingSlot) {
- if ($eq$(existingSlot.get$scope(), this)) {
- $globals.world.error(("duplicate name \"" + name + "\""), node.span);
- }
- else {
- }
- }
- this._slots.add(slot);
- this._scope._slots.add(slot);
-}
-CallFrame.prototype.declareParameter = function(p, value) {
- return this.create(p.name, p.type, p.definition, false, value);
-}
-CallFrame.prototype._makeValue = function(type, node) {
- return new PureStaticValue(type, node == null ? null : node.span, false, false);
-}
-CallFrame.prototype.makeSuperValue = function(node) {
- return this._makeValue(this.thisValue.get$type().get$parent(), node);
-}
-CallFrame.prototype.makeThisValue = function(node) {
- return this._makeValue(this.thisValue.get$type(), node);
-}
-// ********** Code for VariableSlot **************
-function VariableSlot(scope, name, staticType, node, isFinal, value) {
- this.scope = scope;
- this.name = name;
- this.staticType = staticType;
- this.node = node;
- this.isFinal = isFinal;
- this.value = value;
- if (null != this.value) {
- this.value = this.value.convertTo(this.scope.frame, this.staticType);
- }
-}
-VariableSlot.prototype.get$scope = function() { return this.scope; };
-VariableSlot.prototype.get$name = function() { return this.name; };
-VariableSlot.prototype.get$staticType = function() { return this.staticType; };
-VariableSlot.prototype.get$isFinal = function() { return this.isFinal; };
-VariableSlot.prototype.get$value = function() { return this.value; };
-VariableSlot.prototype.set$value = function(value) { return this.value = value; };
-VariableSlot.prototype.get = function(position) {
- return this.scope.frame._makeValue(this.staticType, position);
-}
-VariableSlot.prototype.set = function(newValue) {
- if (null != newValue) {
- newValue = newValue.convertTo(this.scope.frame, this.staticType);
- }
- this.value = Value.union(this.value, newValue);
-}
-VariableSlot.prototype.toString = function() {
- var valueString = null != this.value ? (" = " + this.value.get$type().name) : "";
- return ("" + this.staticType.name + " " + this.name + valueString);
-}
-VariableSlot.prototype.toString$0 = VariableSlot.prototype.toString;
-// ********** Code for AnalyzeScope **************
-function AnalyzeScope(parent, frame, node) {
- this.parent = parent;
- this.frame = frame;
- this.node = node;
- this._slots = [];
-}
-AnalyzeScope.prototype.get$parent = function() { return this.parent; };
-AnalyzeScope.prototype.get$_slots = function() { return this._slots; };
-AnalyzeScope.prototype._lookup = function(name) {
- for (var s = this;
- $ne$(s); s = s.get$parent()) {
- for (var i = (0);
- i < s.get$_slots().get$length(); i++) {
- var ret = s.get$_slots().$index(i);
- if ($eq$(ret.get$name(), name)) return ret;
- }
- }
- return null;
-}
-// ********** Code for BlockScope **************
-function BlockScope(enclosingMethod, parent, node, reentrant) {
- this.enclosingMethod = enclosingMethod;
- this.parent = parent;
- this.node = node;
- this.reentrant = reentrant;
- this._vars = new CopyOnWriteMap_dart_core_String$VariableValue();
- this._jsNames = new HashSetImplementation_dart_core_String();
- if (this.get$isMethodScope()) {
- this._closedOver = new HashSetImplementation_dart_core_String();
- }
- else {
- this.reentrant = reentrant || this.parent.reentrant;
- }
- this.inferTypes = $globals.options.inferTypes && (this.parent == null || this.parent.inferTypes);
-}
-BlockScope._snapshot$ctor = function(original) {
- this.enclosingMethod = original.enclosingMethod;
- this.parent = original.parent == null ? null : original.parent.snapshot();
- this._vars = original._vars.clone();
- this.node = original.node;
- this.inferTypes = original.inferTypes;
- this.rethrow = original.rethrow;
- this._jsNames = original._jsNames;
- this._closedOver = original._closedOver;
-}
-BlockScope._snapshot$ctor.prototype = BlockScope.prototype;
-BlockScope.prototype.get$enclosingMethod = function() { return this.enclosingMethod; };
-BlockScope.prototype.get$parent = function() { return this.parent; };
-BlockScope.prototype.get$_vars = function() { return this._vars; };
-BlockScope.prototype.get$_jsNames = function() { return this._jsNames; };
-BlockScope.prototype.get$_closedOver = function() { return this._closedOver; };
-BlockScope.prototype.get$rethrow = function() { return this.rethrow; };
-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) {
- for (var s = this;
- $ne$(s); s = s.get$parent()) {
- var ret = s.get$_vars().$index(name);
- if (ret != null) return this._capture(s, ret);
- }
- return null;
-}
-BlockScope.prototype.inferAssign = function(name, value) {
- if (this.inferTypes) this.assign(name, value);
-}
-BlockScope.prototype.assign = function(name, value) {
- for (var s = this;
- $ne$(s); s = s.get$parent()) {
- var existing = s.get$_vars().$index(name);
- if ($ne$(existing)) {
- s.get$_vars().$setindex(name, existing.replaceValue(value));
- return;
- }
- }
- $globals.world.internalError(("assigning variable '" + name + "' that doesn't exist."));
-}
-BlockScope.prototype._capture = function(other, value) {
- if ($ne$(other.enclosingMethod, this.enclosingMethod)) {
- other.get$methodScope()._closedOver.add(value.get$code());
- if (this.enclosingMethod.captures != null && other.reentrant) {
- this.enclosingMethod.captures.add(value.get$code());
- }
- }
- return value;
-}
-BlockScope.prototype._isDefinedInParent = function(name) {
- if (this.get$isMethodScope() && this._closedOver.contains(name)) return true;
- for (var s = this.parent;
- $ne$(s); s = s.get$parent()) {
- if (s.get$_vars().containsKey(name)) return true;
- if (s.get$_jsNames().contains(name)) return true;
- if (s.get$isMethodScope() && s.get$_closedOver().contains(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 VariableValue(type, jsName, span, 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, true);
- return this.create(id.name.name, type, id.span, false, false);
-}
-BlockScope.prototype.getRethrow = function() {
- var scope = this;
- while (scope.get$rethrow() == null && $ne$(scope.get$parent())) {
- scope = scope.get$parent();
- }
- return scope.get$rethrow();
-}
-BlockScope.prototype.snapshot = function() {
- return new BlockScope._snapshot$ctor(this);
-}
-BlockScope.prototype.unionWith = function(other) {
- var $this = this; // closure support
- var $0;
- var changed = false;
- if (this.parent != null) {
- changed = this.parent.unionWith(other.parent);
- }
- if ((($0 = this._vars._lang_map) == null ? null != (other._vars._lang_map) : $0 !== other._vars._lang_map)) {
- other._vars.forEach((function (key, otherVar) {
- var $0;
- var myVar = $this._vars.$index(key);
- var v = Value.union(myVar.value, otherVar.value);
- if ((($0 = myVar.value) == null ? null != (v) : $0 !== v)) {
- $this._vars.$setindex(key, myVar.replaceValue(v));
- changed = true;
- }
- })
- );
- }
- return changed;
-}
-BlockScope.prototype.create$3$isFinal = function($0, $1, $2, isFinal) {
- return this.create($0, $1, $2, isFinal, false);
-};
-// ********** Code for CodeWriter **************
-function CodeWriter() {
- this.writeComments = true;
- this._buf = [];
-}
-CodeWriter.prototype.get$text = function() {
- var $this = this; // closure support
- var sb = new StringBufferImpl("");
- var indentation = (0);
- var pendingIndent = false;
- function _walk(list) {
- for (var $$i = list.iterator(); $$i.hasNext(); ) {
- var thing = $$i.next();
- if ((typeof(thing) == 'string')) {
- if (pendingIndent) {
- for (var i = (0);
- i < indentation; i++) {
- sb.add(" ");
- }
- pendingIndent = false;
- }
- sb.add(thing);
- }
- else if (null == thing) {
- sb.add("\n");
- pendingIndent = true;
- }
- else if ((typeof(thing) == 'number')) {
- indentation = $add$(indentation, thing);
- }
- else if (!!(thing && thing.is$List())) {
- _walk(thing);
- }
- }
- }
- _walk(this._buf);
- return sb.toString();
-}
-CodeWriter.prototype.subWriter = function() {
- var sub = new CodeWriter();
- sub.writeComments = this.writeComments;
- this._buf.add(sub._buf);
- return sub;
-}
-CodeWriter.prototype.comment = function(text) {
- if (this.writeComments) {
- this.writeln(text);
- }
-}
-CodeWriter.prototype._writeFragment = function(text) {
- if (text.length == (0)) return;
- this._buf.add(text);
-}
-CodeWriter.prototype.write = function(text) {
- if (text.length == (0)) return;
- if (text.indexOf("\n") != (-1)) {
- var lines = text.split$_("\n");
- this._writeFragment(lines.$index((0)));
- for (var i = (1);
- i < lines.get$length(); i++) {
- this._buf.add();
- this._writeFragment(lines.$index(i));
- }
- }
- else {
- this._buf.add(text);
- }
-}
-CodeWriter.prototype.writeln = function(text) {
- if (text == null) {
- this._buf.add();
- }
- else {
- this.write(text);
- if (!text.endsWith("\n")) this._buf.add();
- }
-}
-CodeWriter.prototype.writeln.$optional = ['text', 'null']
-CodeWriter.prototype.get$writeln = function() {
- return this.writeln.bind(this);
-}
-CodeWriter.prototype.enterBlock = function(text) {
- this.writeln(text);
- this._buf.add((1));
-}
-CodeWriter.prototype.get$enterBlock = function() {
- return this.enterBlock.bind(this);
-}
-CodeWriter.prototype.exitBlock = function(text) {
- this._buf.add((-1));
- this.writeln(text);
-}
-CodeWriter.prototype.nextBlock = function(text) {
- this._buf.add((-1));
- this.writeln(text);
- this._buf.add((1));
-}
-CodeWriter.prototype.write$1 = CodeWriter.prototype.write;
-// ********** Code for CoreJs **************
-function CoreJs() {
- this.useThrow = false;
- this.useNotNullBool = false;
- this.useIndex = false;
- this.useSetIndex = false;
- this.useWrap0 = false;
- this.useWrap1 = false;
- this.useIsolates = false;
- this._generatedTypeNameOf = false;
- this._generatedDynamicProto = false;
- this._generatedDynamicSetMetadata = false;
- this._generatedInherits = false;
- this._generatedDefProp = false;
- this._generatedBind = false;
- this._usedOperators = new HashMapImplementation();
- this.writer = new CodeWriter();
-}
-CoreJs.prototype.get$writer = function() { return this.writer; };
-CoreJs.prototype.set$writer = function(value) { return this.writer = value; };
-CoreJs.prototype.markCorelibTypeUsed = function(typeName) {
- $globals.world.gen.markTypeUsed($globals.world.corelib.types.$index(typeName));
-}
-CoreJs.prototype.useOperator = function(name) {
- if ($ne$(this._usedOperators.$index(name))) return;
- if (name != ":ne" && name != ":eq") {
- this.markCorelibTypeUsed("NoSuchMethodException");
- }
- if (name != ":bit_not" && name != ":negate") {
- this.markCorelibTypeUsed("IllegalArgumentException");
- }
- var code;
- switch (name) {
- case ":ne":
-
- code = "function $ne$(x, y) {\n if (x == null) return y != null;\n return (typeof(x) != 'object') ? x !== y : !x.$eq(y);\n}";
- break;
-
- case ":eq":
-
- this.ensureDefProp();
- code = "function $eq$(x, y) {\n if (x == null) return y == null;\n return (typeof(x) != 'object') ? x === y : x.$eq(y);\n}\n// TODO(jimhug): Should this or should it not match equals?\n$defProp(Object.prototype, '$eq', function(other) {\n return this === other;\n});";
- break;
-
- case ":bit_not":
-
- code = "function $bit_not$(x) {\n if (typeof(x) == 'number') return ~x;\n if (typeof(x) == 'object') return x.$bit_not();\n $throw(new NoSuchMethodException(x, \"operator ~\", []));\n}";
- break;
-
- case ":negate":
-
- code = "function $negate$(x) {\n if (typeof(x) == 'number') return -x;\n if (typeof(x) == 'object') return x.$negate();\n $throw(new NoSuchMethodException(x, \"operator negate\", []));\n}";
- break;
-
- case ":add":
-
- code = "function $add$complex$(x, y) {\n if (typeof(x) == 'number') {\n $throw(new IllegalArgumentException(y));\n } else if (typeof(x) == 'string') {\n var str = (y == null) ? 'null' : y.toString();\n if (typeof(str) != 'string') {\n throw new Error(\"calling toString() on right hand operand of operator \" +\n \"+ did not return a String\");\n }\n return x + str;\n } else if (typeof(x) == 'object') {\n return x.$add(y);\n } else {\n $throw(new NoSuchMethodException(x, \"operator +\", [y]));\n }\n}\n\nfunction $add$(x, y) {\n if (typeof(x) == 'number' && typeof(y) == 'number') return x + y;\n return $add$complex$(x, y);\n}";
- break;
-
- case ":truncdiv":
-
- this.useThrow = true;
- this.markCorelibTypeUsed("IntegerDivisionByZeroException");
- code = "function $truncdiv$(x, y) {\n if (typeof(x) == 'number') {\n if (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 $throw(new IllegalArgumentException(y));\n }\n } else if (typeof(x) == 'object') {\n return x.$truncdiv(y);\n } else {\n $throw(new NoSuchMethodException(x, \"operator ~/\", [y]));\n }\n}";
- break;
-
- case ":mod":
-
- code = "function $mod$(x, y) {\n if (typeof(x) == 'number') {\n if (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 $throw(new IllegalArgumentException(y));\n }\n } else if (typeof(x) == 'object') {\n return x.$mod(y);\n } else {\n $throw(new NoSuchMethodException(x, \"operator %\", [y]));\n }\n}";
- 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.ensureDefProp();
- 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 obj = this;\n var tag = obj.$typeNameOf();\n var method = methods[tag];\n if (!method) {\n var table = $dynamicMetadata;\n for (var i = 0; i < table.length; i++) {\n var entry = table[i];\n if (entry.map.hasOwnProperty(tag)) {\n method = methods[entry.tag];\n if (method) break;\n }\n }\n }\n method = method || methods.Object;\n\n var proto = Object.getPrototypeOf(obj);\n\n if (method == null) {\n // Trampoline to throw NoSuchMethodException (TODO: call noSuchMethod).\n method = function(){\n // Exact type check to prevent this code shadowing the dispatcher from a\n // subclass.\n if (Object.getPrototypeOf(this) === proto) {\n // TODO(sra): 'name' is the jsname, should be the Dart name.\n $throw(new NoSuchMethodException(\n obj, name, Array.prototype.slice.call(arguments)));\n }\n return Object.prototype[name].apply(this, arguments);\n };\n }\n\n if (!proto.hasOwnProperty(name)) {\n $defProp(proto, name, method);\n }\n\n return method.apply(this, Array.prototype.slice.call(arguments));\n };\n $dynamicBind.methods = methods;\n $defProp(Object.prototype, name, $dynamicBind);\n return methods;\n}\nif (typeof $dynamicMetadata == 'undefined') $dynamicMetadata = [];\n");
-}
-CoreJs.prototype.ensureDynamicSetMetadata = function() {
- if (this._generatedDynamicSetMetadata) return;
- this._generatedDynamicSetMetadata = true;
- this.writer.writeln("function $dynamicSetMetadata(inputTable) {\n // TODO: Deal with light isolates.\n var table = [];\n for (var i = 0; i < inputTable.length; i++) {\n var tag = inputTable[i][0];\n var tags = inputTable[i][1];\n var map = {};\n var tagNames = tags.split('|');\n for (var j = 0; j < tagNames.length; j++) {\n map[tagNames[j]] = true;\n }\n table.push({tag: tag, tags: tags, map: map});\n }\n $dynamicMetadata = table;\n}\n");
-}
-CoreJs.prototype.ensureTypeNameOf = function() {
- if (this._generatedTypeNameOf) return;
- this._generatedTypeNameOf = true;
- this.ensureDefProp();
- this.writer.writeln("$defProp(Object.prototype, '$typeNameOf', (function() {\n function constructorNameWithFallback(obj) {\n var constructor = obj.constructor;\n if (typeof(constructor) == 'function') {\n // The constructor isn't null or undefined at this point. Try\n // to grab hold of its name.\n var name = constructor.name;\n // If the name is a non-empty string, we use that as the type\n // name of this object. On Firefox, we often get 'Object' as\n // the constructor name even for more specialized objects so\n // we have to fall through to the toString() based implementation\n // below in that case.\n if (typeof(name) == 'string' && name && name != 'Object') return name;\n }\n var string = Object.prototype.toString.call(obj);\n return string.substring(8, string.length - 1);\n }\n\n function chrome$typeNameOf() {\n var name = this.constructor.name;\n if (name == 'Window') return 'DOMWindow';\n return name;\n }\n\n function firefox$typeNameOf() {\n var name = constructorNameWithFallback(this);\n if (name == 'Window') return 'DOMWindow';\n if (name == 'Document') return 'HTMLDocument';\n if (name == 'XMLDocument') return 'Document';\n return name;\n }\n\n function ie$typeNameOf() {\n var name = constructorNameWithFallback(this);\n if (name == 'Window') return 'DOMWindow';\n // IE calls both HTML and XML documents 'Document', so we check for the\n // xmlVersion property, which is the empty string on HTML documents.\n if (name == 'Document' && this.xmlVersion) return 'Document';\n if (name == 'Document') return 'HTMLDocument';\n return name;\n }\n\n // If we're not in the browser, we're almost certainly running on v8.\n if (typeof(navigator) != 'object') return chrome$typeNameOf;\n\n var userAgent = navigator.userAgent;\n if (/Chrome|DumpRenderTree/.test(userAgent)) return chrome$typeNameOf;\n if (/Firefox/.test(userAgent)) return firefox$typeNameOf;\n if (/MSIE/.test(userAgent)) return ie$typeNameOf;\n return function() { return constructorNameWithFallback(this); };\n})());");
-}
-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}");
-}
-CoreJs.prototype.ensureDefProp = function() {
- if (this._generatedDefProp) return;
- this._generatedDefProp = true;
- this.writer.writeln("function $defProp(obj, prop, value) {\n Object.defineProperty(obj, prop,\n {value: value, enumerable: false, writable: true, configurable: true});\n}");
-}
-CoreJs.prototype.ensureBind = function() {
- if (this._generatedBind) return;
- this._generatedBind = true;
- this.writer.writeln("Function.prototype.bind = Function.prototype.bind ||\n function(thisObj) {\n var func = this;\n var funcLength = func.$length || func.length;\n var argsLength = arguments.length;\n if (argsLength > 1) {\n var boundArgs = Array.prototype.slice.call(arguments, 1);\n var bound = function() {\n // Prepend the bound arguments to the current arguments.\n var newArgs = Array.prototype.slice.call(arguments);\n Array.prototype.unshift.apply(newArgs, boundArgs);\n return func.apply(thisObj, newArgs);\n };\n bound.$length = Math.max(0, funcLength - (argsLength - 1));\n return bound;\n } else {\n var bound = function() {\n return func.apply(thisObj, arguments);\n };\n bound.$length = funcLength;\n return bound;\n }\n };");
-}
-CoreJs.prototype.generate = function(w) {
- w.write(this.writer.get$text());
- this.writer = w.subWriter();
- if (this.useNotNullBool) {
- this.useThrow = true;
- this.writer.writeln("function $notnull_bool(test) {\n if (test === true || test === false) return test;\n $throw(new TypeError(test, 'bool'));\n}");
- }
- if (this.useThrow) {
- this.writer.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}");
- }
- if (this.useIndex) {
- this.markCorelibTypeUsed("NoSuchMethodException");
- this.ensureDefProp();
- this.writer.writeln($globals.options.disableBoundsChecks ? "$defProp(Object.prototype, '$index', function(i) {\n $throw(new NoSuchMethodException(this, \"operator []\", [i]));\n});\n$defProp(Array.prototype, '$index', function(i) {\n return this[i];\n});\n$defProp(String.prototype, '$index', function(i) {\n return this[i];\n});" : "$defProp(Object.prototype, '$index', function(i) {\n $throw(new NoSuchMethodException(this, \"operator []\", [i]));\n});\n$defProp(Array.prototype, '$index', function(index) {\n var i = index | 0;\n if (i !== index) {\n throw new IllegalArgumentException('index is not int');\n } else if (i < 0 || i >= this.length) {\n throw new IndexOutOfRangeException(index);\n }\n return this[i];\n});\n$defProp(String.prototype, '$index', function(i) {\n return this[i];\n});");
- }
- if (this.useSetIndex) {
- this.markCorelibTypeUsed("NoSuchMethodException");
- this.ensureDefProp();
- this.writer.writeln($globals.options.disableBoundsChecks ? "$defProp(Object.prototype, '$setindex', function(i, value) {\n $throw(new NoSuchMethodException(this, \"operator []=\", [i, value]));\n});\n$defProp(Array.prototype, '$setindex',\n function(i, value) { return this[i] = value; });" : "$defProp(Object.prototype, '$setindex', function(i, value) {\n $throw(new NoSuchMethodException(this, \"operator []=\", [i, value]));\n});\n$defProp(Array.prototype, '$setindex', function(index, value) {\n var i = index | 0;\n if (i !== index) {\n throw new IllegalArgumentException('index is not int');\n } else if (i < 0 || i >= this.length) {\n throw new IndexOutOfRangeException(index);\n }\n return this[i] = value;\n});");
- }
- if (!this.useIsolates) {
- if (this.useWrap0) {
- this.writer.writeln("function $wrap_call$0(fn) { return fn; }");
- }
- if (this.useWrap1) {
- this.writer.writeln("function $wrap_call$1(fn) { return fn; }");
- }
- }
- var $$list = orderValuesByKeys(this._usedOperators);
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var opImpl = $$i.next();
- this.writer.writeln(opImpl);
- }
- if ($globals.world.dom != null) {
- this.ensureTypeNameOf();
- this.ensureDefProp();
- this.writer.writeln("$defProp(Object.prototype, \"get$typeName\", Object.prototype.$typeNameOf);");
- }
-}
-// ********** Code for Element **************
-function Element(name, _enclosingElement) {
- this.name = name;
- this._enclosingElement = _enclosingElement;
- if (null != this.name) {
- var mangled = this.mangleJsName();
- this._jsname = mangled;
- }
-}
-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.get$nativeName = function() {
- return this._jsname;
-}
-Element.prototype.get$avoidNativeName = function() {
- return false;
-}
-Element.prototype.get$jsnamePriority = function() {
- return this.get$isNative() ? (2) : (this.get$library().get$isCore() ? (1) : (0));
-}
-Element.prototype.resolve = function() {
-
-}
-Element.prototype.mangleJsName = function() {
- return $globals.world.toJsIdentifier(this.name);
-}
-Element.prototype.get$typeParameters = function() {
- return null;
-}
-Element.prototype.get$typeArgsInOrder = function() {
- return const$0007;
-}
-Element.prototype.get$enclosingElement = function() {
- return this._enclosingElement == null ? this.get$library() : this._enclosingElement;
-}
-Element.prototype.set$enclosingElement = function(e) {
- var $0;
- return (this._enclosingElement = ($0 = e), $0);
-}
-Element.prototype.lookupTypeParam = function(name) {
- if (this.get$typeParameters() == null) return null;
- for (var i = (0);
- i < this.get$typeParameters().get$length(); i++) {
- if (this.get$typeParameters().$index(i).name == name) {
- return this.get$typeArgsInOrder().$index(i);
- }
- }
- return null;
-}
-Element.prototype.resolveType = function(node, typeErrors, allowTypeParams) {
- if (node == null) return $globals.world.varType;
- if ((node instanceof SimpleTypeReference)) {
- var ret = node.get$dynamic().get$type();
- if ($eq$(ret, $globals.world.voidType)) {
- $globals.world.error("\"void\" only allowed as return type", node.span);
- return $globals.world.varType;
- }
- return ret;
- }
- else if ((node instanceof NameTypeReference)) {
- var typeRef = node;
- var name;
- if (typeRef.names != null) {
- name = typeRef.names.last().name;
- }
- else {
- name = typeRef.name.name;
- }
- var typeParamType = this.lookupTypeParam(name);
- if ($ne$(typeParamType)) {
- if (!allowTypeParams) {
- $globals.world.error("using type parameter in illegal context.", node.span);
- }
- return typeParamType;
- }
- return this.get$enclosingElement().resolveType(node, typeErrors, allowTypeParams);
- }
- else if ((node instanceof GenericTypeReference)) {
- var typeRef = node;
- var baseType = this.resolveType(typeRef.baseType, typeErrors, allowTypeParams);
- if (!baseType.get$isGeneric()) {
- $globals.world.error(("" + baseType.get$name() + " is not generic"), typeRef.span);
- return $globals.world.varType;
- }
- if (typeRef.typeArguments.get$length() != baseType.get$typeParameters().get$length()) {
- $globals.world.error("wrong number of type arguments", typeRef.span);
- return $globals.world.varType;
- }
- var typeArgs = [];
- for (var i = (0);
- i < typeRef.typeArguments.get$length(); i++) {
- typeArgs.add(this.resolveType(typeRef.typeArguments.$index(i), typeErrors, allowTypeParams));
- }
- return baseType.getOrMakeConcreteType(typeArgs);
- }
- else if ((node instanceof FunctionTypeReference)) {
- var typeRef = node;
- var name = "";
- if (typeRef.func.name != null) {
- name = typeRef.func.name.name;
- }
- return this.get$library().getOrAddFunctionType(this, name, typeRef.func, null);
- }
- $globals.world.internalError("unexpected TypeReference", node.span);
-}
-// ********** Code for ExistingJsGlobal **************
-$inherits(ExistingJsGlobal, Element);
-function ExistingJsGlobal(name, declaringElement) {
- this.declaringElement = declaringElement;
- Element.call(this, name, null);
-}
-ExistingJsGlobal.prototype.get$isNative = function() {
- return true;
-}
-ExistingJsGlobal.prototype.get$jsnamePriority = function() {
- return (10);
-}
-ExistingJsGlobal.prototype.get$span = function() {
- return this.declaringElement.get$span();
-}
-ExistingJsGlobal.prototype.get$library = function() {
- return this.declaringElement.get$library();
-}
-// ********** Code for WorldGenerator **************
-function WorldGenerator(main, writer) {
- this.hasStatics = false;
- this.writer = writer;
- this.main = main;
- this.mainContext = new MethodGenerator(main, null);
- this.globals = new HashMapImplementation();
- this.corejs = new CoreJs();
-}
-WorldGenerator.prototype.get$writer = function() { return this.writer; };
-WorldGenerator.prototype.set$writer = function(value) { return this.writer = value; };
-WorldGenerator.prototype.analyze = function() {
- var nlibs = (0), ntypes = (0), nmems = (0), nnews = (0);
- var $$list = $globals.world.libraries.getValues();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var lib = $$i.next();
- nlibs += (1);
- var $list0 = lib.get$types().getValues();
- for (var $i0 = $list0.iterator(); $i0.hasNext(); ) {
- var type = $i0.next();
- if (type.get$library().get$isDom() || type.get$isHiddenNativeType()) {
- if (type.get$isClass()) type.markUsed();
- }
- ntypes += (1);
- var allMembers = [];
- allMembers.addAll(type.get$constructors().getValues());
- allMembers.addAll(type.get$members().getValues());
- type.get$factories().forEach((function (allMembers, f) {
- return allMembers.add(f);
- }).bind(null, allMembers)
- );
- for (var $i1 = allMembers.iterator(); $i1.hasNext(); ) {
- var m = $i1.next();
- if (m.get$isAbstract() || !(m.get$isMethod() || m.get$isConstructor())) continue;
- m.get$methodData().analyze();
- }
- }
- }
-}
-WorldGenerator.prototype.run = function() {
- var mainTarget = new TypeValue(this.main.declaringType, this.main.get$span());
- var mainCall = this.main.invoke(this.mainContext, null, mainTarget, Arguments.get$EMPTY());
- this.main.declaringType.markUsed();
- if ($globals.options.compileAll) {
- this.markLibrariesUsed([$globals.world.coreimpl, $globals.world.corelib, this.main.declaringType.get$library()]);
- }
- $globals.world.numImplType.markUsed();
- $globals.world.stringImplType.markUsed();
- if (this.corejs.useIndex || this.corejs.useSetIndex) {
- if (!$globals.options.disableBoundsChecks) {
- this.markTypeUsed($globals.world.corelib.types.$index("IndexOutOfRangeException"));
- this.markTypeUsed($globals.world.corelib.types.$index("IllegalArgumentException"));
- }
- }
- if ($globals.world.isolatelib != null) {
- this.corejs.useIsolates = true;
- var isolateMain = $globals.world.isolatelib.lookup("startRootIsolate", this.main.get$span());
- mainCall = isolateMain.invoke(this.mainContext, null, new TypeValue($globals.world.isolatelib.topType, this.main.get$span()), new Arguments(null, [this.main._get(this.mainContext, this.main.definition, null)]));
- }
- this.typeEmittedTests = new HashMapImplementation_Type$Map_dart_core_String$bool();
- this.writeTypes($globals.world.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.writeDynamicDispatchMetadata();
- this.writeGlobals();
- this.writer.writeln("if (typeof window != 'undefined' && typeof document != 'undefined' &&");
- this.writer.writeln(" window.addEventListener && document.readyState == 'loading') {");
- this.writer.writeln(" window.addEventListener('DOMContentLoaded', function(e) {");
- this.writer.writeln((" " + mainCall.get$code() + ";"));
- this.writer.writeln(" });");
- this.writer.writeln("} else {");
- this.writer.writeln((" " + mainCall.get$code() + ";"));
- this.writer.writeln("}");
-}
-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((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 = members.iterator(); $$i.hasNext(); ) {
- var member = $$i.next();
- 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 this.markTypeUsed.bind(this);
-}
-WorldGenerator.prototype.getAllTypes = function(libs) {
- var types = [];
- var seen = new HashSetImplementation_Library();
- for (var $$i = libs.iterator(); $$i.hasNext(); ) {
- var mainLib = $$i.next();
- 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((function (lib, toCheck, i) {
- return toCheck.addLast(lib);
- }).bind(null, lib, toCheck)
- );
- lib.get$types().getValues().forEach((function (t) {
- return types.add(t);
- })
- );
- }
- }
- return types;
-}
-WorldGenerator.prototype.globalForStaticField = function(field, exp, dependencies) {
- this.hasStatics = true;
- var key = ("" + field.declaringType.get$jsname() + "." + field.get$jsname());
- var ret = this.globals.$index(key);
- if (null == ret) {
- ret = new GlobalValue(exp.get$type(), exp.get$code(), field.isFinal, field, null, exp, exp.span, dependencies);
- this.globals.$setindex(key, ret);
- }
- return ret;
-}
-WorldGenerator.prototype.globalForConst = function(exp, dependencies) {
- var key = ("" + exp.get$type().get$jsname() + ":" + exp.get$code());
- var ret = this.globals.$index(key);
- if (null == ret) {
- var ns = this.globals.get$length().toString$0();
- while (ns.get$length() < (4)) ns = ("0" + ns);
- var name = ("const$" + ns);
- ret = new GlobalValue(exp.get$type(), name, true, null, name, exp, exp.span, dependencies);
- this.globals.$setindex(key, ret);
- }
- return ret;
-}
-WorldGenerator.prototype.writeTypes = function(lib) {
- if (lib.isWritten) return;
- lib.isWritten = true;
- var $$list = lib.imports;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var import_ = $$i.next();
- this.writeTypes(import_.get$library());
- }
- for (var i = (0);
- i < lib.sources.get$length(); i++) {
- lib.sources.$index(i).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 = $$list.iterator(); $$i.hasNext(); ) {
- var file = $$i.next();
- var filename = basename(file.get$filename());
- this.writer.comment(("// ********** Natives " + filename + " **************"));
- this.writer.writeln(file.get$text());
- }
- lib.topType.markUsed();
- var orderedTypes = this._orderValues(lib.types);
- for (var $$i = orderedTypes.iterator(); $$i.hasNext(); ) {
- var type = $$i.next();
- if (type.get$isUsed() && type.get$isClass()) {
- this.writeType(type);
- if (type.get$isGeneric() && (null == type ? null != ($globals.world.listFactoryType) : type !== $globals.world.listFactoryType)) {
- var $$list = this._orderValues(type.get$_concreteTypes());
- for (var $i0 = $$list.iterator(); $i0.hasNext(); ) {
- var ct = $i0.next();
- if (ct.get$isUsed()) this.writeType(ct);
- }
- }
- }
- else if (type.get$isFunction() && type.get$varStubs().get$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) {
- meth.get$methodData().run(meth);
-}
-WorldGenerator.prototype._prototypeOf = function(type, name) {
- if (type.get$isSingletonNative()) {
- return ("" + type.get$jsname() + "." + name);
- }
- else if (type.get$isHiddenNativeType()) {
- this.corejs.ensureDynamicProto();
- this._usedDynamicDispatchOnType(type);
- return ("$dynamic(\"" + name + "\")." + type.get$definition().get$nativeType().name);
- }
- else {
- return ("" + type.get$jsname() + ".prototype." + name);
- }
-}
-WorldGenerator.prototype._writePrototypePatch = function(type, name, functionBody, writer, isOneLiner) {
- var $0;
- var writeFunction = writer.get$writeln();
- var ending = ";";
- if (!isOneLiner) {
- writeFunction = writer.get$enterBlock();
- ending = "";
- }
- if (type.get$isObject()) {
- ($0 = $globals.world.counters).objectProtoMembers = $0.objectProtoMembers + (1);
- }
- if (type.get$isObject() || $eq$(type.get$genericType(), $globals.world.listFactoryType)) {
- if (isOneLiner) {
- ending = (")" + ending);
- }
- this.corejs.ensureDefProp();
- writeFunction.call$1(("$defProp(" + type.get$jsname() + ".prototype, \"" + name + "\", " + functionBody + ending));
- if (isOneLiner) return "}";
- return "});";
- }
- else {
- writeFunction.call$1(("" + this._prototypeOf(type, name) + " = " + functionBody + ending));
- return isOneLiner ? "" : "}";
- }
-}
-WorldGenerator.prototype._maybeIsTest = function(onType, checkType) {
- var $this = this; // closure support
- var isSubtype = onType.isSubtypeOf(checkType);
- var onTypeMap = this.typeEmittedTests.$index(onType);
- if ($eq$(onTypeMap)) this.typeEmittedTests.$setindex(onType, onTypeMap = new HashMapImplementation());
- var protoParent = $eq$(onType.get$genericType(), onType) ? onType.get$parent() : onType.get$genericType();
- function needToOverride(checkName) {
- if (protoParent != null) {
- var map0 = $this.typeEmittedTests.$index(protoParent);
- if ($ne$(map0)) {
- var protoParentIsSubtype = map0.$index(checkName);
- if (protoParentIsSubtype != null && $eq$(protoParentIsSubtype, isSubtype)) {
- return false;
- }
- }
- }
- return true;
- }
- if (checkType.isTested) {
- var checkName = ("is$" + checkType.get$jsname());
- onTypeMap.$setindex(checkName, isSubtype);
- if (needToOverride(checkName)) {
- this._writePrototypePatch(onType, checkName, ("function(){return " + isSubtype + "}"), this.writer, true);
- }
- }
- if (checkType.isChecked) {
- var checkName = ("assert$" + checkType.get$jsname());
- onTypeMap.$setindex(checkName, isSubtype);
- if (needToOverride(checkName)) {
- var body = "return this";
- if (!isSubtype) {
- body = $globals.world.objectType.varStubs.$index(checkName).get$body();
- }
- else if ($eq$(onType, $globals.world.stringImplType) || $eq$(onType, $globals.world.numImplType)) {
- body = ("return " + onType.get$nativeType().name + "(this)");
- }
- this._writePrototypePatch(onType, checkName, ("function(){" + body + "}"), this.writer, true);
- }
- }
-}
-WorldGenerator.prototype.writeType = function(type) {
- var $0, $1;
- if (type.isWritten) return;
- type.isWritten = true;
- this.writeType(type.get$genericType());
- if (type.get$parent() != null) {
- this.writeType(type.get$parent());
- }
- var typeName = type.get$jsname() != null ? type.get$jsname() : "top level";
- this.writer.comment(("// ********** Code for " + typeName + " **************"));
- if (type.get$isNative() && !type.get$isTop() && !type.get$isConcreteGeneric()) {
- var nativeName = type.get$definition().get$nativeType().name;
- if ($eq$(nativeName, "")) {
- this.writer.writeln(("function " + type.get$jsname() + "() {}"));
- }
- else if (type.get$jsname() != nativeName) {
- if (type.get$isHiddenNativeType()) {
- if (this._hasStaticOrFactoryMethods(type)) {
- this.writer.writeln(("var " + type.get$jsname() + " = {};"));
- }
- }
- else {
- this.writer.writeln(("" + type.get$jsname() + " = " + nativeName + ";"));
- }
- }
- }
- if (!type.get$isTop()) {
- if ((($0 = type.get$genericType()) == null ? null != (type) : $0 !== type)) {
- this.corejs.ensureInheritsHelper();
- this.writer.writeln(("$inherits(" + type.get$jsname() + ", " + type.get$genericType().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() || type.get$isConcreteGeneric()) {
- this.writer.writeln(("function " + type.get$jsname() + "() {}"));
- }
- }
- else {
- var wroteStandard = false;
- var $$list = type.get$constructors().getValues();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var c = $$i.next();
- if (c.get$methodData().writeDefinition(c, this.writer)) {
- if (c.get$isConstructor() && c.get$constructorName() == "") wroteStandard = true;
- }
- }
- if (!wroteStandard && (!type.get$isNative() || (($1 = type.get$genericType()) == null ? null != (type) : $1 !== type))) {
- this.writer.writeln(("function " + type.get$jsname() + "() {}"));
- }
- }
- if (!type.get$isConcreteGeneric()) {
- this._maybeIsTest(type, type);
- }
- if (type.get$genericType()._concreteTypes != null) {
- var $$list = this._orderValues(type.get$genericType()._concreteTypes);
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var ct = $$i.next();
- 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()._concreteTypes != null) {
- var $$list = this._orderValues(interface_.get$genericType()._concreteTypes);
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var ct = $$i.next();
- this._maybeIsTest(type, ct);
- }
- }
- var $$list = interface_.get$interfaces();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var other = $$i.next();
- if (!seen.contains$1(other)) {
- worklist.addLast(other);
- seen.add(other);
- }
- }
- }
- }
- type.get$factories().forEach(this.get$_writeMethod());
- var $$list = this._orderValues(type.get$members());
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var member = $$i.next();
- 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._hasStaticOrFactoryMethods = function(type) {
- return type.get$members().getValues().some((function (m) {
- return m.get$isMethod() && m.get$isStatic();
- })
- ) || !type.get$factories().isEmpty();
-}
-WorldGenerator.prototype._writeDynamicStubs = function(type) {
- var $$list = orderValuesByKeys(type.varStubs);
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var stub = $$i.next();
- if (!stub.get$isGenerated()) stub.generate(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($add$(("$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._provideGetter && !field.declaringType.get$isConcreteGeneric()) {
- this._writePrototypePatch(field.declaringType, ("get$" + field.get$jsname()), ("function() { return this." + field.get$jsname() + "; }"), this.writer, true);
- }
- if (field._provideSetter && !field.declaringType.get$isConcreteGeneric()) {
- this._writePrototypePatch(field.declaringType, ("set$" + field.get$jsname()), ("function(value) { return this." + field.get$jsname() + " = value; }"), this.writer, true);
- }
-}
-WorldGenerator.prototype._writeProperty = function(property) {
- if (property.getter != null) this._writeMethod(property.getter);
- if (property.setter != null) this._writeMethod(property.setter);
- if (property.get$needsFieldSyntax()) {
- 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(m) {
- m.get$methodData().writeDefinition(m, this.writer);
- if (m.get$isNative() && m._provideGetter) {
- if (MethodGenerator._maybeGenerateBoundGetter(m, this.writer)) {
- $globals.world.gen.corejs.ensureBind();
- }
- }
-}
-WorldGenerator.prototype.get$_writeMethod = function() {
- return this._writeMethod.bind(this);
-}
-WorldGenerator.prototype.writeGlobals = function() {
- if (this.globals.get$length() > (0)) {
- this.writer.comment("// ********** Globals **************");
- var list = this.globals.getValues();
- list.sort((function (a, b) {
- return a.compareTo(b);
- })
- );
- this.writer.enterBlock("function $static_init(){");
- for (var $$i = list.iterator(); $$i.hasNext(); ) {
- var global = $$i.next();
- if (global.get$field() != null) {
- this._writeStaticField(global.get$field());
- }
- }
- this.writer.exitBlock("}");
- for (var $$i = list.iterator(); $$i.hasNext(); ) {
- var global = $$i.next();
- if (global.get$field() == null) {
- this.writer.writeln(("var " + global.get$name() + " = " + global.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._usedDynamicDispatchOnType = function(type) {
- if (this.typesWithDynamicDispatch == null) this.typesWithDynamicDispatch = new HashSetImplementation();
- this.typesWithDynamicDispatch.add(type);
-}
-WorldGenerator.prototype.writeDynamicDispatchMetadata = function() {
- var $this = this; // closure support
- if (this.typesWithDynamicDispatch == null) return;
- this.writer.comment(("// " + this.typesWithDynamicDispatch.get$length() + " dynamic types."));
- var seen = new HashSetImplementation();
- var types = [];
- function visit(type) {
- if (seen.contains$1(type)) return;
- seen.add(type);
- var $$list = $this._orderCollectionValues(type.get$directSubtypes());
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var subtype = $$i.next();
- visit(subtype);
- }
- types.add(type);
- }
- var $$list = this._orderCollectionValues(this.typesWithDynamicDispatch);
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var type = $$i.next();
- visit(type);
- }
- var dispatchTypes = types.filter((function (type) {
- return !type.get$directSubtypes().isEmpty() && $this.typesWithDynamicDispatch.contains(type);
- })
- );
- this.writer.comment(("// " + types.get$length() + " types"));
- this.writer.comment(("// " + types.filter((function (t) {
- return !t.get$directSubtypes().isEmpty();
- })
- ).get$length() + " !leaf"));
- var varNames = [];
- var varDefns = new HashMapImplementation();
- var tagDefns = new HashMapImplementation();
- function makeExpression(type) {
- var expressions = [];
- var subtags = [type.get$nativeName()];
- function walk(type) {
- var $$list = $this._orderCollectionValues(type.get$directSubtypes());
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var subtype = $$i.next();
- var tag = subtype.get$nativeName();
- var existing = tagDefns.$index(tag);
- if ($eq$(existing)) {
- subtags.add(tag);
- walk(subtype);
- }
- else {
- if (varDefns.containsKey(existing)) {
- expressions.add(existing);
- }
- else {
- var varName = ("v" + varNames.get$length() + "/*" + tag + "*/");
- varNames.add(varName);
- varDefns.$setindex(varName, existing);
- tagDefns.$setindex(tag, varName);
- expressions.add(varName);
- }
- }
- }
- }
- walk(type);
- var constantPart = ("'" + Strings.join(subtags, "|") + "'");
- if ($ne$(constantPart, "''")) expressions.add(constantPart);
- var expression;
- if (expressions.get$length() == (1)) {
- expression = expressions.$index((0));
- }
- else {
- expression = ("[" + Strings.join(expressions, ",") + "].join('|')");
- }
- return expression;
- }
- for (var $$i = dispatchTypes.iterator(); $$i.hasNext(); ) {
- var type = $$i.next();
- tagDefns.$setindex(type.get$nativeName(), makeExpression(type));
- }
- if (!tagDefns.isEmpty()) {
- this.corejs.ensureDynamicSetMetadata();
- this.writer.enterBlock("(function(){");
- for (var $$i = varNames.iterator(); $$i.hasNext(); ) {
- var varName = $$i.next();
- this.writer.writeln(("var " + varName + " = " + varDefns.$index(varName) + ";"));
- }
- this.writer.enterBlock("var table = [");
- this.writer.comment("// [dynamic-dispatch-tag, tags of classes implementing dynamic-dispatch-tag]");
- var needsComma = false;
- for (var $$i = dispatchTypes.iterator(); $$i.hasNext(); ) {
- var type = $$i.next();
- if (needsComma) {
- this.writer.write(", ");
- }
- this.writer.writeln(("['" + type.get$nativeName() + "', " + tagDefns.$index(type.get$nativeName()) + "]"));
- needsComma = true;
- }
- this.writer.exitBlock("];");
- this.writer.writeln("$dynamicSetMetadata(table);");
- this.writer.exitBlock("})();");
- }
-}
-WorldGenerator.prototype._orderValues = function(map) {
- var values = map.getValues();
- values.sort(this.get$_compareMembers());
- return values;
-}
-WorldGenerator.prototype._orderCollectionValues = function(collection) {
- var values = ListFactory.ListFactory$from$factory(collection);
- 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(y.get$span());
- if (spans != (0)) return spans;
- }
- else {
- if (x.get$span() != null) return (-1);
- if (y.get$span() != null) return (1);
- }
- if ($eq$(x.get$name(), y.get$name())) return (0);
- if ($eq$(x.get$name())) return (-1);
- if ($eq$(y.get$name())) return (1);
- return x.get$name().compareTo(y.get$name());
-}
-WorldGenerator.prototype.get$_compareMembers = function() {
- return this._compareMembers.bind(this);
-}
-WorldGenerator.prototype.run$0 = WorldGenerator.prototype.run;
-// ********** Code for MethodGenerator **************
-function MethodGenerator(method, enclosingMethod) {
- this.method = method;
- this.enclosingMethod = enclosingMethod;
- this.writer = new CodeWriter();
- this.needsThis = false;
- if (this.enclosingMethod != null) {
- this._scope = new BlockScope(this, this.enclosingMethod._scope, this.method.get$definition(), false);
- this.captures = new HashSetImplementation();
- }
- else {
- this._scope = new BlockScope(this, null, this.method.get$definition(), false);
- }
- this._usedTemps = new HashSetImplementation();
- this._freeTemps = [];
- this.counters = $globals.world.counters;
-}
-MethodGenerator.prototype.get$method = function() { return this.method; };
-MethodGenerator.prototype.get$writer = function() { return this.writer; };
-MethodGenerator.prototype.set$writer = function(value) { return this.writer = value; };
-MethodGenerator.prototype.get$_scope = function() { return this._scope; };
-MethodGenerator.prototype.get$enclosingMethod = function() { return this.enclosingMethod; };
-MethodGenerator.prototype.set$needsThis = function(value) { return this.needsThis = value; };
-MethodGenerator.prototype.set$_paramCode = function(value) { return this._paramCode = value; };
-MethodGenerator.prototype.get$counters = function() { return this.counters; };
-MethodGenerator.prototype.get$library = function() {
- return this.method.get$library();
-}
-MethodGenerator.prototype.findMembers = function(name) {
- return this.get$library()._findMembers(name);
-}
-MethodGenerator.prototype.get$needsCode = function() {
- return true;
-}
-MethodGenerator.prototype.get$showWarnings = function() {
- return false;
-}
-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.get$needsTemp() ? this.forceTemp(value) : value;
-}
-MethodGenerator.prototype.forceTemp = function(value) {
- var name;
- if (this._freeTemps.get$length() > (0)) {
- name = this._freeTemps.removeLast();
- }
- else {
- name = ("$" + this._usedTemps.get$length());
- }
- this._usedTemps.add(name);
- return new VariableValue(value.get$staticType(), name, value.span, false, value);
-}
-MethodGenerator.prototype.assignTemp = function(tmp, v) {
- if ($eq$(tmp, v)) {
- return v;
- }
- else {
- return new Value(v.get$type(), ("(" + tmp.get$code() + " = " + v.get$code() + ")"), v.span);
- }
-}
-MethodGenerator.prototype.freeTemp = function(value) {
-
-}
-MethodGenerator.prototype.run = function() {
- var thisObject;
- if (this.method.get$isConstructor()) {
- thisObject = new ObjectValue(false, this.method.declaringType, this.method.get$span());
- thisObject.initFields();
- }
- else {
- thisObject = new Value(this.method.declaringType, "this", null);
- }
- var values = [];
- var $$list = this.method.get$parameters();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var p = $$i.next();
- values.add(new Value(p.get$type(), p.get$name(), null));
- }
- var args = new Arguments(null, values);
- this.evalBody(thisObject, args);
-}
-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((function (x, y) {
- return x.compareTo(y);
- })
- );
- paramCode = ListFactory.ListFactory$from$factory(names);
- paramCode.addAll(this._paramCode);
- }
- var _params = ("(" + Strings.join(this._paramCode, ", ") + ")");
- var params = ("(" + Strings.join(paramCode, ", ") + ")");
- var suffix = "}";
- 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 ($ne$(names)) {
- 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 {
- suffix = $globals.world.gen._writePrototypePatch(this.method.declaringType, this.method.get$jsname(), ("function" + _params + " {"), defWriter, false);
- }
- if (this.needsThis) {
- defWriter.writeln("var $this = this; // closure support");
- }
- if (this._usedTemps.get$length() > (0) || this._freeTemps.get$length() > (0)) {
- this._freeTemps.addAll(this._usedTemps);
- this._freeTemps.sort((function (x, y) {
- return x.compareTo(y);
- })
- );
- defWriter.writeln(("var " + Strings.join(this._freeTemps, ", ") + ";"));
- }
- defWriter.writeln(this.writer.get$text());
- var usesBind = false;
- if ($ne$(names)) {
- usesBind = true;
- defWriter.exitBlock(("}).bind(null, " + Strings.join(names, ", ") + ")"));
- }
- else if (this.get$isClosure() && this.method.name == "") {
- defWriter.exitBlock("})");
- }
- else {
- defWriter.exitBlock(suffix);
- }
- 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)) {
- if (MethodGenerator._maybeGenerateBoundGetter(this.method, defWriter)) {
- usesBind = true;
- }
- }
- if (usesBind) $globals.world.gen.corejs.ensureBind();
-}
-MethodGenerator._maybeGenerateBoundGetter = function(m, defWriter) {
- if (m._provideGetter) {
- var suffix = $globals.world.gen._writePrototypePatch(m.declaringType, ("get$" + m.get$jsname()), "function() {", defWriter, false);
- defWriter.writeln(("return this." + m.get$jsname() + ".bind(this);"));
- defWriter.exitBlock(suffix);
- return true;
- }
- return false;
-}
-MethodGenerator.prototype._provideOptionalParamInfo = function(defWriter) {
- if ((this.method instanceof MethodMember)) {
- var meth = this.method;
- if (meth._provideOptionalParamInfo) {
- var optNames = [];
- var optValues = [];
- meth.genParameterValues(this);
- var $$list = meth.parameters;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var param = $$i.next();
- if (param.get$isOptional()) {
- optNames.add(param.get$name());
- optValues.add(MethodGenerator._escapeString(param.get$value().get$code()));
- }
- }
- if (optNames.get$length() > (0)) {
- var start = "";
- if (meth.isStatic) {
- if (!meth.declaringType.get$isTop()) {
- start = $add$(meth.declaringType.get$jsname(), ".");
- }
- }
- else {
- start = $add$(meth.declaringType.get$jsname(), ".prototype.");
- }
- optNames.addAll(optValues);
- var optional = ("['" + Strings.join(optNames, "', '") + "']");
- defWriter.writeln(("" + start + meth.get$jsname() + ".$optional = " + optional));
- }
- }
- }
-}
-MethodGenerator.prototype._initField = function(newObject, name, value, span) {
- var field = this.method.declaringType.getMember(name);
- if ($eq$(field)) {
- $globals.world.error("bad initializer - no matching field", span);
- }
- if (!field.get$isField()) {
- $globals.world.error(("\"this." + name + "\" does not refer to a field"), span);
- }
- return newObject.setField(field, value, true);
-}
-MethodGenerator.prototype.evalBody = function(newObject, args) {
- var fieldsSet = false;
- if (this.method.get$isNative() && this.method.get$isConstructor() && (newObject instanceof ObjectValue)) {
- newObject.get$dynamic().set$seenNativeInitializer(true);
- }
- this._paramCode = [];
- for (var i = (0);
- i < this.method.get$parameters().get$length(); i++) {
- var p = this.method.get$parameters().$index(i);
- var currentArg = null;
- if (i < args.get$bareCount()) {
- currentArg = args.values.$index(i);
- }
- else {
- currentArg = args.getValue(p.get$name());
- if (null == currentArg) {
- p.genValue(this.method, this);
- currentArg = p.get$value();
- if (currentArg == null) {
- return;
- }
- }
- }
- if (p.get$isInitializer()) {
- this._paramCode.add(p.get$name());
- fieldsSet = true;
- this._initField(newObject, p.get$name(), currentArg, p.get$definition().get$span());
- }
- else {
- var paramValue = this._scope.declareParameter(p);
- this._paramCode.add(paramValue.get$code());
- if (newObject != null && newObject.get$isConst()) {
- this._scope.assign(p.get$name(), currentArg.convertTo(this, p.get$type()));
- }
- }
- }
- var initializerCall = null;
- var declaredInitializers = this.method.get$definition().get$dynamic().get$initializers();
- if ($ne$(declaredInitializers)) {
- for (var $$i = declaredInitializers.iterator(); $$i.hasNext(); ) {
- var init = $$i.next();
- if ((init instanceof CallExpression)) {
- if ($ne$(initializerCall)) {
- $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().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 initValue = this.visitValue(init.get$y());
- fieldsSet = true;
- this._initField(newObject, left.get$name().get$name(), initValue, left.get$span());
- }
- else {
- $globals.world.error("invalid initializer", init.get$span());
- }
- }
- }
- if (this.method.get$isConstructor() && $eq$(initializerCall) && !this.method.get$isNative()) {
- var parentType = this.method.declaringType.get$parent();
- if ($ne$(parentType) && !parentType.get$isObject()) {
- initializerCall = new CallExpression(new SuperExpression(this.method.get$span()), [], this.method.get$span());
- }
- }
- if (this.method.get$isConstructor() && (newObject instanceof ObjectValue)) {
- var fields = newObject.get$dynamic().get$fields();
- var $$list = newObject.get$dynamic().get$fieldsInInitOrder();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var field = $$i.next();
- if (null != field) {
- var value = fields.$index(field);
- if (null != value) {
- this.writer.writeln(("this." + field.get$jsname() + " = " + value.get$code() + ";"));
- }
- }
- }
- }
- if ($ne$(initializerCall)) {
- this.evalInitializerCall(newObject, initializerCall, fieldsSet);
- }
- if (this.method.get$isConstructor() && null != newObject && newObject.get$isConst()) {
- newObject.validateInitialized(this.method.get$span());
- }
- else if (this.method.get$isConstructor()) {
- var fields = newObject.get$dynamic().get$fields();
- var $$list = fields.getKeys();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var field = $$i.next();
- var value = fields.$index(field);
- if (null == value && field.get$isFinal() && $eq$(field.get$declaringType(), this.method.declaringType) && !newObject.get$dynamic().get$seenNativeInitializer()) {
- $globals.world.error(("uninitialized final field \"" + field.get$name() + "\""), field.get$span(), this.method.get$span());
- }
- }
- }
- var body = this.method.get$definition().get$dynamic().get$body();
- if (null == body) {
- if (!this.method.get$isConstructor() && !this.method.get$isNative()) {
- $globals.world.error(("unexpected empty body for " + this.method.name), this.method.get$definition().get$span());
- }
- }
- else {
- this.visitStatementsInBlock(body);
- }
-}
-MethodGenerator.prototype.evalInitializerCall = function(newObject, node, fieldsSet) {
- var contructorName = "";
- var targetExp = node.target;
- if ((targetExp instanceof DotExpression)) {
- var dot = targetExp;
- targetExp = dot.self;
- contructorName = dot.name.name;
- }
- var targetType = null;
- var target = null;
- if ((targetExp instanceof SuperExpression)) {
- targetType = this.method.declaringType.get$parent();
- target = this._makeSuperValue(targetExp);
- }
- else if ((targetExp instanceof ThisExpression)) {
- targetType = this.method.declaringType;
- target = this._makeThisValue(targetExp);
- if (fieldsSet) {
- $globals.world.error("no initialization allowed with redirecting constructor", node.span);
- }
- }
- else {
- $globals.world.error("bad call in initializers", node.span);
- }
- var m = targetType.getConstructor(contructorName);
- if ($eq$(m)) {
- $globals.world.error(("no matching constructor for " + targetType.name), node.span);
- }
- this.method.set$initDelegate(m);
- var other = m;
- while ($ne$(other)) {
- if ($eq$(other, this.method)) {
- $globals.world.error("initialization cycle", node.span);
- break;
- }
- other = other.get$initDelegate();
- }
- var newArgs = this._makeArgs(node.arguments);
- $globals.world.gen.genMethod(m);
- m._evalConstConstructor(newObject, newArgs);
- if (!newObject.isConst) {
- var value = m.invoke(this, node, target, newArgs);
- if ($ne$(target.get$type(), $globals.world.objectType)) {
- this.writer.writeln(("" + value.get$code() + ";"));
- }
- }
-}
-MethodGenerator.prototype._makeArgs = function(arguments) {
- var args = [];
- var seenLabel = false;
- for (var $$i = arguments.iterator(); $$i.hasNext(); ) {
- var arg = $$i.next();
- if (arg.get$label() != null) {
- seenLabel = true;
- }
- else if (seenLabel) {
- $globals.world.error("bare argument cannot follow named arguments", arg.get$span());
- }
- args.add(this.visitValue(arg.get$value()));
- }
- return new Arguments(arguments, args);
-}
-MethodGenerator.prototype._invokeNative = function(name, arguments) {
- var args = Arguments.get$EMPTY();
- if (arguments.get$length() > (0)) {
- args = new Arguments(null, arguments);
- }
- var method = $globals.world.corelib.topType.members.$index(name);
- return method.invoke(this, method.get$definition(), new Value($globals.world.corelib.topType, null, null), 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 = $$list.iterator(); $$i.hasNext(); ) {
- var stmt = $$i.next();
- stmt.visit(this);
- }
- }
- else {
- if (body != null) body.visit(this);
- }
- return false;
-}
-MethodGenerator.prototype._pushBlock = function(node, reentrant) {
- this._scope = new BlockScope(this, this._scope, node, reentrant);
-}
-MethodGenerator.prototype._popBlock = function(node) {
- var $0;
- if ((($0 = this._scope.node) == null ? null != (node) : $0 !== node)) {
- function spanOf(n) {
- return $ne$(n) ? n.get$span() : null;
- }
- $globals.world.internalError($add$(("scope mismatch. Trying to pop \"" + node + "\" but found "), (" \"" + this._scope.node + "\"")), spanOf(node), spanOf(this._scope.node));
- }
- this._scope = this._scope.parent;
-}
-MethodGenerator.prototype._visitLoop = function(node, visitBody) {
- if (this._scope.inferTypes) {
- this._loopFixedPoint(node, visitBody);
- }
- else {
- this._pushBlock(node, true);
- visitBody();
- this._popBlock(node);
- }
-}
-MethodGenerator.prototype._loopFixedPoint = function(node, visitBody) {
- var savedCounters = this.counters;
- var savedWriter = this.writer;
- var tries = (0);
- var startScope = this._scope.snapshot();
- var s = startScope;
- while (true) {
- this.writer = new CodeWriter();
- this.counters = new CounterLog();
- this._pushBlock(node, true);
- if (tries++ >= $globals.options.maxInferenceIterations) {
- this._scope.inferTypes = false;
- }
- visitBody();
- this._popBlock(node);
- if (!this._scope.inferTypes || !this._scope.unionWith(s)) {
- break;
- }
- s = this._scope.snapshot();
- }
- savedWriter.write$1(this.writer.get$text());
- this.writer = savedWriter;
- savedCounters.add(this.counters);
- this.counters = savedCounters;
-}
-MethodGenerator.prototype._makeLambdaMethod = function(name, func) {
- var meth = new MethodMember.lambda$ctor(name, this.method.declaringType, func);
- meth.set$enclosingElement(this.method);
- meth.set$_methodData(new MethodData(meth, this));
- meth.resolve();
- return meth;
-}
-MethodGenerator.prototype.visitBool = function(node) {
- return this.visitValue(node).convertTo(this, $globals.world.nonNullBool);
-}
-MethodGenerator.prototype.visitValue = function(node) {
- if (node == null) return null;
- var value = node.visit(this);
- value.checkFirstClass(node.span);
- return value;
-}
-MethodGenerator.prototype.visitTypedValue = function(node, expectedType) {
- var val = this.visitValue(node);
- return expectedType == null ? val : val.convertTo(this, expectedType);
-}
-MethodGenerator.prototype.visitVoid = function(node) {
- if ((node instanceof PostfixExpression)) {
- var value = this.visitPostfixExpression(node, true);
- value.checkFirstClass(node.span);
- return value;
- }
- else if ((node instanceof BinaryExpression)) {
- var value = this.visitBinaryExpression(node, true);
- value.checkFirstClass(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());
- return false;
-}
-MethodGenerator.prototype.visitVariableDefinition = function(node) {
- var isFinal = false;
- if (node.modifiers != null && node.modifiers.$index((0)).kind == (99)) {
- isFinal = true;
- }
- this.writer.write("var ");
- var type = this.method.resolveType(node.type, false, true);
- for (var i = (0);
- i < node.names.get$length(); i++) {
- if (i > (0)) {
- this.writer.write(", ");
- }
- var name = node.names.$index(i).name;
- var value = this.visitValue(node.values.$index(i));
- if (isFinal && $eq$(value)) {
- $globals.world.error("no value specified for final variable", node.span);
- }
- var val = this._scope.create(name, type, node.names.$index(i).span, isFinal, false);
- if ($eq$(value)) {
- if (this._scope.reentrant) {
- this.writer.write(("" + val.get$code() + " = null"));
- }
- else {
- this.writer.write(("" + val.get$code()));
- }
- }
- else {
- value = value.convertTo(this, type);
- this._scope.inferAssign(name, value);
- 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);
- meth.get$methodData().createFunction(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(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 ($eq$(rethrow)) {
- $globals.world.error("rethrow outside of catch", node.span);
- }
- else {
- this.writer.writeln(("throw " + rethrow + ";"));
- }
- }
- 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(span.get$start()) + (1);
- var column = span.get$file().getColumn($sub$(line, (1)), span.get$start()) + (1);
- var args = [test, Value.fromString(span.get$text(), node.span), Value.fromString(span.get$file().filename, node.span), Value.fromInt(line, node.span), Value.fromInt(column, node.span)];
- var tp = $globals.world.corelib.topType;
- var f = tp.getMember("_assert");
- var value = f.invoke(this, node, new TypeValue(tp, null), new Arguments(null, args));
- 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 $this = this; // closure support
- var test = this.visitBool(node.test);
- this.writer.write(("while (" + test.get$code() + ") "));
- this._visitLoop(node, (function () {
- node.body.visit($this);
- })
- );
- return false;
-}
-MethodGenerator.prototype.visitDoStatement = function(node) {
- var $this = this; // closure support
- this.writer.write("do ");
- this._visitLoop(node, (function () {
- node.body.visit($this);
- })
- );
- var test = this.visitBool(node.test);
- this.writer.writeln(("while (" + test.get$code() + ")"));
- return false;
-}
-MethodGenerator.prototype.visitForStatement = function(node) {
- var $this = this; // closure support
- this._pushBlock(node, false);
- this.writer.write("for (");
- if (node.init != null) {
- node.init.visit(this);
- }
- else {
- this.writer.write(";");
- }
- this._visitLoop(node, (function () {
- 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 = $$list.iterator(); $$i.hasNext(); ) {
- var s = $$i.next();
- if (needsComma) $this.writer.write(", ");
- var sv = $this.visitVoid(s);
- $this.writer.write(sv.get$code());
- needsComma = true;
- }
- $this.writer.write(") ");
- $this._pushBlock(node.body, false);
- node.body.visit($this);
- $this._popBlock(node.body);
- })
- );
- this._popBlock(node);
- return false;
-}
-MethodGenerator.prototype.visitForInStatement = function(node) {
- var $this = this; // closure support
- var itemType = this.method.resolveType(node.item.type, false, true);
- var list = node.list.visit(this);
- this._visitLoop(node, (function () {
- $this._visitForInBody(node, itemType, list);
- })
- );
- return false;
-}
-MethodGenerator.prototype._visitForInBody = function(node, itemType, list) {
- var isFinal = node.item.isFinal;
- var itemName = node.item.name.name;
- var item = this._scope.create(itemName, itemType, node.item.name.span, isFinal, false);
- if (list.get$needsTemp()) {
- var listVar = this._scope.create("$list", list.get$type(), null, false, false);
- this.writer.writeln(("var " + listVar.get$code() + " = " + list.get$code() + ";"));
- list = listVar;
- }
- if ($eq$(list.get$type().get$genericType(), $globals.world.listFactoryType)) {
- var tmpi = this._scope.create("$i", $globals.world.numType, null, false, false);
- var listLength = list.get_(this, "length", node.list);
- this.writer.enterBlock((("for (var " + tmpi.get$code() + " = 0;") + ("" + tmpi.get$code() + " < " + listLength.get$code() + "; " + tmpi.get$code() + "++) {")));
- var value = list.invoke(this, ":index", node.list, new Arguments(null, [tmpi]));
- this.writer.writeln(("var " + item.get$code() + " = " + value.get$code() + ";"));
- }
- else {
- var iterator = list.invoke(this, "iterator", node.list, Arguments.get$EMPTY());
- var tmpi = this._scope.create("$i", iterator.get$type(), null, false, false);
- var hasNext = tmpi.invoke(this, "hasNext", node.list, Arguments.get$EMPTY());
- var next = tmpi.invoke(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("}");
-}
-MethodGenerator.prototype._genToDartException = function(ex) {
- var result = this._invokeNative("_toDartException", [ex]);
- this.writer.writeln(("" + ex.get$code() + " = " + result.get$code() + ";"));
-}
-MethodGenerator.prototype._genStackTraceOf = function(trace, ex) {
- var result = this._invokeNative("_stackTraceOf", [ex]);
- this.writer.writeln(("var " + trace.get$code() + " = " + result.get$code() + ";"));
-}
-MethodGenerator.prototype.visitTryStatement = function(node) {
- this.writer.enterBlock("try {");
- this._pushBlock(node.body, false);
- this.visitStatementsInBlock(node.body);
- this._popBlock(node.body);
- if (node.catches.get$length() == (1)) {
- var catch_ = node.catches.$index((0));
- this._pushBlock(catch_, false);
- var exType = this.method.resolveType(catch_.get$exception().get$type(), false, true);
- var ex = this._scope.declare(catch_.get$exception());
- this._scope.rethrow = ex.get$code();
- this.writer.nextBlock(("} catch (" + ex.get$code() + ") {"));
- if ($ne$(catch_.get$trace())) {
- var trace = this._scope.declare(catch_.get$trace());
- this._genStackTraceOf(trace, ex);
- }
- this._genToDartException(ex);
- 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)).body);
- this._popBlock(catch_);
- }
- else if (node.catches.get$length() > (0)) {
- this._pushBlock(node, false);
- var ex = this._scope.create("$ex", $globals.world.varType, null, false, false);
- this._scope.rethrow = ex.get$code();
- this.writer.nextBlock(("} catch (" + ex.get$code() + ") {"));
- var trace = null;
- if (node.catches.some((function (c) {
- return $ne$(c.get$trace());
- })
- )) {
- trace = this._scope.create("$trace", $globals.world.varType, null, false, false);
- this._genStackTraceOf(trace, ex);
- }
- this._genToDartException(ex);
- var needsRethrow = true;
- for (var i = (0);
- i < node.catches.get$length(); i++) {
- var catch_ = node.catches.$index(i);
- this._pushBlock(catch_, false);
- var tmpType = this.method.resolveType(catch_.get$exception().get$type(), false, true);
- 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 ($ne$(catch_.get$trace())) {
- 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(catch_);
- if (tmpType.get$isVarOrObject()) {
- if (i + (1) < node.catches.get$length()) {
- $globals.world.error("Unreachable catch clause", node.catches.$index(i + (1)).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(node);
- }
- if (node.finallyBlock != null) {
- this.writer.nextBlock("} finally {");
- this._pushBlock(node.finallyBlock, false);
- this.visitStatementsInBlock(node.finallyBlock);
- this._popBlock(node.finallyBlock);
- }
- 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 = $$list.iterator(); $$i.hasNext(); ) {
- var case_ = $$i.next();
- if (case_.get$label() != null) {
- $globals.world.error("unimplemented: labeled case statement", case_.get$span());
- }
- this._pushBlock(case_, false);
- for (var i = (0);
- i < case_.get$cases().get$length(); i++) {
- var expr = case_.get$cases().$index(i);
- if ($eq$(expr)) {
- if (i < case_.get$cases().get$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.get$length() - (1))) && !caseExits) {
- var span = case_.get$statements().$index(case_.get$statements().get$length() - (1)).get$span();
- this.writer.writeln("$throw(new FallThroughError());");
- $globals.world.gen.corejs.useThrow = true;
- }
- this.writer.exitBlock("");
- this._popBlock(case_);
- }
- this.writer.exitBlock("}");
- return false;
-}
-MethodGenerator.prototype._visitAllStatements = function(statementList, exits) {
- for (var i = (0);
- i < statementList.get$length(); i++) {
- var stmt = statementList.$index(i);
- exits = stmt.visit(this);
- if ($ne$(stmt, statementList.$index(statementList.get$length() - (1))) && exits) {
- $globals.world.warning("unreachable code", statementList.$index(i + (1)).get$span());
- }
- }
- return exits;
-}
-MethodGenerator.prototype.visitBlockStatement = function(node) {
- this._pushBlock(node, false);
- this.writer.enterBlock("{");
- var exits = this._visitAllStatements(node.body, false);
- this.writer.exitBlock("}");
- this._popBlock(node);
- 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 ($eq$(parentType)) {
- $globals.world.error("no super class", node.span);
- }
- return new SuperValue(parentType, node.span);
-}
-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(node);
- outermostMethod.set$needsThis(true);
- return new ThisValue(outermostMethod.get$method().get$declaringType(), "$this", node != null ? node.span : null);
- }
- else {
- this._checkNonStatic(node);
- return new ThisValue(this.method.declaringType, "this", node != null ? node.span : null);
- }
-}
-MethodGenerator.prototype.visitLambdaExpression = function(node) {
- var name = (node.func.name != null) ? node.func.name.name : "";
- var meth = this._makeLambdaMethod(name, node.func);
- return meth.get$methodData().createLambda(node, this);
-}
-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 ($ne$(target)) {
- return target.invoke(this, ":call", node, this._makeArgs(node.arguments));
- }
- target = this._makeThisOrType(varExpr.span);
- return target.invoke(this, name, node, this._makeArgs(node.arguments));
- }
- else {
- target = node.target.visit(this);
- }
- return target.invoke(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(this, ":index", node, new Arguments(null, [index]));
-}
-MethodGenerator.prototype._expressionNeedsParens = function(e) {
- return ((e instanceof BinaryExpression) || (e instanceof ConditionalExpression) || (e instanceof PostfixExpression) || this._isUnaryIncrement(e));
-}
-MethodGenerator.prototype.visitBinaryExpression = function(node, isVoid) {
- var kind = node.op.kind;
- if ($eq$(kind, (35)) || $eq$(kind, (34))) {
- var x = this.visitTypedValue(node.x, $globals.world.nonNullBool);
- var y = this.visitTypedValue(node.y, $globals.world.nonNullBool);
- return x.binop(kind, y, this, node);
- }
- else if ($eq$(kind, (50)) || $eq$(kind, (51))) {
- var x = this.visitValue(node.x);
- var y = this.visitValue(node.y);
- return x.binop(kind, y, this, node);
- }
- var assignKind = TokenKind.kindFromAssign(node.op.kind);
- if ($eq$(assignKind, (-1))) {
- var x = this.visitValue(node.x);
- var y = this.visitValue(node.y);
- return x.binop(kind, y, this, node);
- }
- else if (($ne$(assignKind, (0))) && this._expressionNeedsParens(node.y)) {
- return this._visitAssign(assignKind, node.x, new ParenExpression(node.y, node.y.span), node, isVoid ? (1) : (2));
- }
- else {
- return this._visitAssign(assignKind, node.x, node.y, node, isVoid ? (1) : (2));
- }
-}
-MethodGenerator.prototype._visitAssign = function(kind, xn, yn, position, returnKind) {
- if ((xn instanceof VarExpression)) {
- return this._visitVarAssign(kind, xn, yn, position, returnKind);
- }
- else if ((xn instanceof IndexExpression)) {
- return this._visitIndexAssign(kind, xn, yn, position, returnKind);
- }
- else if ((xn instanceof DotExpression)) {
- return this._visitDotAssign(kind, xn, yn, position, returnKind);
- }
- else {
- $globals.world.error("illegal lhs", xn.span);
- }
-}
-MethodGenerator.prototype._visitVarAssign = function(kind, xn, yn, position, returnKind) {
- var name = xn.name.name;
- var x = this._scope.lookup(name);
- var y = this.visitValue(yn);
- if ($ne$(x)) {
- y = y.convertTo(this, x.get$staticType());
- this._scope.inferAssign(name, Value.union(x, y));
- if (x.get$isFinal()) {
- $globals.world.error(("final variable \"" + x.get$code() + "\" is not assignable"), position.span);
- }
- if (kind == (0)) {
- return new Value(y.get$type(), ("" + x.get$code() + " = " + y.get$code()), position.span);
- }
- else if (x.get$type().get$isNum() && y.get$type().get$isNum() && (kind != (46))) {
- if (returnKind == (3)) {
- $globals.world.internalError("should not be here", position.span);
- }
- var op = TokenKind.kindToString(kind);
- return new Value(y.get$type(), ("" + x.get$code() + " " + op + "= " + y.get$code()), position.span);
- }
- else {
- var right = x;
- y = right.binop(kind, y, this, position);
- if (returnKind == (3)) {
- var tmp = this.forceTemp(x);
- var ret = new Value(x.get$type(), ("(" + tmp.get$code() + " = " + x.get$code() + ", " + x.get$code() + " = " + y.get$code() + ", " + tmp.get$code() + ")"), position.span);
- this.freeTemp(tmp);
- return ret;
- }
- else {
- return new Value(x.get$type(), ("" + x.get$code() + " = " + y.get$code()), position.span);
- }
- }
- }
- else {
- x = this._makeThisOrType(position.span);
- return x.set_$4$kind$returnKind(this, name, position, y, kind, returnKind);
- }
-}
-MethodGenerator.prototype._visitIndexAssign = function(kind, xn, yn, position, returnKind) {
- var target = this.visitValue(xn.target);
- var index = this.visitValue(xn.index);
- var y = this.visitValue(yn);
- return target.setIndex$4$kind$returnKind(this, index, position, y, kind, returnKind);
-}
-MethodGenerator.prototype._visitDotAssign = function(kind, xn, yn, position, returnKind) {
- var target = xn.self.visit(this);
- var y = this.visitValue(yn);
- return target.set_$4$kind$returnKind(this, xn.name.name, xn.name, y, kind, returnKind);
-}
-MethodGenerator.prototype.visitUnaryExpression = function(node) {
- var value = this.visitValue(node.self);
- switch (node.op.kind) {
- case (16):
- case (17):
-
- if (value.get$type().get$isNum() && !value.get$isFinal() && (node.self instanceof VarExpression)) {
- return new Value(value.get$type(), ("" + node.op + value.get$code()), node.span);
- }
- else {
- var kind = ((16) == node.op.kind ? (42) : (43));
- var operand = new LiteralExpression(Value.fromInt((1), node.span), node.span);
- var assignValue = this._visitAssign(kind, node.self, operand, node, (2));
- return new Value(assignValue.get$type(), ("(" + assignValue.get$code() + ")"), node.span);
- }
-
- }
- return value.unop(node.op.kind, this, node);
-}
-MethodGenerator.prototype.visitDeclaredIdentifier = function(node) {
- $globals.world.error("Expected expression", 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 value = this.visitValue(node.body);
- if (value.get$type().get$isNum() && !value.get$isFinal() && (node.body instanceof VarExpression)) {
- return new Value(value.get$type(), ("" + value.get$code() + node.op), node.span);
- }
- var kind = ((16) == node.op.kind) ? (42) : (43);
- var operand = new LiteralExpression(Value.fromInt((1), node.span), node.span);
- var ret = this._visitAssign(kind, node.body, operand, node, isVoid ? (1) : (3));
- 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 NameTypeReference) && typeRef.get$names() != null) {
- var names = ListFactory.ListFactory$from$factory(typeRef.get$names());
- constructorName = names.removeLast().get$name();
- if (names.get$length() == (0)) names = null;
- typeRef = new NameTypeReference(typeRef.get$isFinal(), typeRef.get$name(), names, typeRef.get$span());
- }
- var type = this.method.resolveType(typeRef, true, true);
- if (type.get$isTop()) {
- type = type.get$library().findTypeByName(constructorName);
- constructorName = "";
- }
- if ((type instanceof ParameterType)) {
- $globals.world.error("cannot instantiate a type parameter", node.span);
- return this._makeMissingValue(constructorName);
- }
- var m = type.getConstructor(constructorName);
- if ($eq$(m)) {
- 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 = $$list.iterator(); $$i.hasNext(); ) {
- var arg = $$i.next();
- if (!this.visitValue(arg.get$value()).get$isConst()) {
- $globals.world.error("const constructor expects const arguments", arg.get$span());
- }
- }
- }
- var target = new TypeValue(type, typeRef.get$span());
- return m.invoke(this, node, target, this._makeArgs(node.arguments));
-}
-MethodGenerator.prototype.visitListExpression = function(node) {
- var argValues = [];
- var listType = $globals.world.listType;
- var type = $globals.world.varType;
- if (node.itemType != null) {
- type = this.method.resolveType(node.itemType, true, !node.isConst);
- if (node.isConst && ((type instanceof ParameterType) || type.get$hasTypeParams())) {
- $globals.world.error("type parameter cannot be used in const list literals");
- }
- listType = listType.getOrMakeConcreteType([type]);
- }
- var $$list = node.values;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var item = $$i.next();
- var arg = this.visitTypedValue(item, type);
- argValues.add(arg);
- if (node.isConst && !arg.get$isConst()) {
- $globals.world.error("const list can only contain const values", arg.get$span());
- }
- }
- $globals.world.listFactoryType.markUsed();
- var ret = new ListValue(argValues, node.isConst, listType, node.span);
- if (ret.get$isConst()) return ret.getGlobalValue();
- return ret;
-}
-MethodGenerator.prototype.visitMapExpression = function(node) {
- if (node.items.get$length() == (0) && !node.isConst) {
- return $globals.world.mapType.getConstructor("").invoke(this, node, new TypeValue($globals.world.mapType, node.span), Arguments.get$EMPTY());
- }
- var values = [];
- var valueType = $globals.world.varType, keyType = $globals.world.stringType;
- var mapType = $globals.world.mapType;
- if (null != node.valueType) {
- if (null != node.keyType) {
- keyType = this.method.resolveType(node.keyType, true, !node.isConst);
- if (!keyType.get$isString()) {
- $globals.world.error("the key type of a map literal must be \"String\"", keyType.get$span());
- }
- if (node.isConst && ((keyType instanceof ParameterType) || keyType.get$hasTypeParams())) {
- $globals.world.error("type parameter cannot be used in const map literals");
- }
- }
- valueType = this.method.resolveType(node.valueType, true, !node.isConst);
- if (node.isConst && ((valueType instanceof ParameterType) || valueType.get$hasTypeParams())) {
- $globals.world.error("type parameter cannot be used in const map literals");
- }
- mapType = mapType.getOrMakeConcreteType([keyType, valueType]);
- }
- for (var i = (0);
- i < node.items.get$length(); i += (2)) {
- var key = this.visitTypedValue(node.items.$index(i), keyType);
- if (node.isConst && !key.get$isConst()) {
- $globals.world.error("const map can only contain const keys", key.get$span());
- }
- values.add(key);
- var value = this.visitTypedValue(node.items.$index(i + (1)), valueType);
- if (node.isConst && !value.get$isConst()) {
- $globals.world.error("const map can only contain const values", value.get$span());
- }
- values.add(value);
- }
- var ret = new MapValue(values, node.isConst, mapType, node.span);
- if (ret.get$isConst()) return ret.getGlobalValue();
- return ret;
-}
-MethodGenerator.prototype.visitConditionalExpression = function(node) {
- var test = this.visitBool(node.test);
- var trueBranch = this.visitValue(node.trueBranch);
- var falseBranch = this.visitValue(node.falseBranch);
- return new Value(Type.union(trueBranch.get$type(), falseBranch.get$type()), ("" + test.get$code() + " ? " + trueBranch.get$code() + " : " + falseBranch.get$code()), node.span);
-}
-MethodGenerator.prototype.visitIsExpression = function(node) {
- var value = this.visitValue(node.x);
- var type = this.method.resolveType(node.type, true, true);
- if (type.get$isVar()) {
- return Value.comma(value, Value.fromBool(true, node.span));
- }
- 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 body;
- return new Value(body.get$type(), ("(" + body.get$code() + ")"), node.span);
-}
-MethodGenerator.prototype.visitDotExpression = function(node) {
- var target = node.self.visit(this);
- return target.get_(this, node.name.name, node.name);
-}
-MethodGenerator.prototype.visitVarExpression = function(node) {
- var name = node.name.name;
- var ret = this._scope.lookup(name);
- if ($ne$(ret)) return ret;
- return this._makeThisOrType(node.span).get_(this, name, node);
-}
-MethodGenerator.prototype._makeMissingValue = function(name) {
- return new Value($globals.world.varType, ("" + name + "()/*NotFound*/"), null);
-}
-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.visitLiteralExpression = function(node) {
- return node.value;
-}
-MethodGenerator.prototype._isUnaryIncrement = function(item) {
- if ((item instanceof UnaryExpression)) {
- var u = item;
- return u.op.kind == (16) || u.op.kind == (17);
- }
- else {
- return false;
- }
-}
-MethodGenerator.prototype.foldStrings = function(strings) {
- var buffer = new StringBufferImpl("");
- for (var $$i = strings.iterator(); $$i.hasNext(); ) {
- var part = $$i.next();
- buffer.add(part.get$constValue().get$actualValue());
- }
- return buffer.toString();
-}
-MethodGenerator.prototype.visitStringConcatExpression = function(node) {
- var items = [];
- var itemsConst = [];
- var $$list = node.strings;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var item = $$i.next();
- var val = this.visitValue(item);
- if (val.get$isConst()) itemsConst.add(val);
- items.add(val.get$code());
- }
- if (items.get$length() == itemsConst.get$length()) {
- return new StringValue(this.foldStrings(itemsConst), true, node.span);
- }
- else {
- var code = ("(" + Strings.join(items, " + ") + ")");
- return new Value($globals.world.stringType, code, node.span);
- }
-}
-MethodGenerator.prototype.visitStringInterpExpression = function(node) {
- var items = [];
- var itemsConst = [];
- var $$list = node.pieces;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var item = $$i.next();
- var val = this.visitValue(item);
- var isConst = val.get$isConst() && val.get$type().get$isString();
- if (!isConst) {
- val.invoke(this, "toString", item, Arguments.get$EMPTY());
- }
- var code = val.get$code();
- if (this._expressionNeedsParens(item)) {
- code = ("(" + code + ")");
- }
- if (items.get$length() == (0) || ($ne$(code, "''") && $ne$(code, "\"\""))) {
- items.add(code);
- if (isConst) itemsConst.add(val);
- }
- }
- if (items.get$length() == itemsConst.get$length()) {
- return new StringValue(this.foldStrings(itemsConst), true, node.span);
- }
- else {
- var code = ("(" + Strings.join(items, " + ") + ")");
- return new Value($globals.world.stringType, code, node.span);
- }
-}
-MethodGenerator.prototype._pushBlock$1 = function($0) {
- return this._pushBlock($0, false);
-};
-MethodGenerator.prototype.run$0 = MethodGenerator.prototype.run;
-MethodGenerator.prototype.visitBinaryExpression$1 = function($0) {
- return this.visitBinaryExpression($0, false);
-};
-MethodGenerator.prototype.visitCallExpression$1 = MethodGenerator.prototype.visitCallExpression;
-MethodGenerator.prototype.visitPostfixExpression$1 = function($0) {
- return this.visitPostfixExpression($0, false);
-};
-// ********** Code for Arguments **************
-function Arguments(nodes, values) {
- this.nodes = nodes;
- this.values = values;
-}
-Arguments.Arguments$bare$factory = function(arity) {
- var values = [];
- for (var i = (0);
- i < arity; i++) {
- values.add(new VariableValue($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$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.get$length();
-}
-Arguments.prototype.getName = function(i) {
- return this.nodes.$index(i).label.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.get$length(); i++) {
- if (this.nodes.$index(i).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(this.values.$index(i).get$code());
- }
- Arguments.removeTrailingNulls(argsCode);
- return Strings.join(argsCode, ", ");
-}
-Arguments.removeTrailingNulls = function(argsCode) {
- while (argsCode.get$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(this.getName(i));
- }
- return names;
-}
-Arguments.prototype.toCallStubArgs = function() {
- var result = [];
- for (var i = (0);
- i < this.get$bareCount(); i++) {
- result.add(new VariableValue($globals.world.varType, ("$" + i), null, false));
- }
- for (var i = this.get$bareCount();
- i < this.get$length(); i++) {
- var name = this.getName(i);
- if ($eq$(name)) name = ("$" + i);
- result.add(new VariableValue($globals.world.varType, name, null, false));
- }
- return new Arguments(this.nodes, result);
-}
-Arguments.prototype.matches = function(other) {
- if (this.get$length() != other.get$length()) return false;
- if (this.get$bareCount() != other.get$bareCount()) return false;
- for (var i = (0);
- i < this.get$bareCount(); i++) {
- if ($ne$(this.values.$index(i).get$type(), other.values.$index(i).get$type())) return false;
- }
- return true;
-}
-// ********** Code for ReturnKind **************
-function ReturnKind() {}
-// ********** Code for LibraryImport **************
-function LibraryImport(library, prefix, span) {
- this.library = library;
- this.prefix = prefix;
- this.span = span;
-}
-LibraryImport.prototype.get$prefix = function() { return this.prefix; };
-LibraryImport.prototype.get$library = function() { return this.library; };
-LibraryImport.prototype.get$span = function() { return this.span; };
-// ********** Code for Member **************
-$inherits(Member, Element);
-function Member(name, declaringType) {
- this._provideGetter = false;
- this._provideSetter = false;
- this.declaringType = declaringType;
- Element.call(this, name, declaringType);
-}
-Member.prototype.get$declaringType = function() { return this.declaringType; };
-Member.prototype.get$genericMember = function() { return this.genericMember; };
-Member.prototype.set$genericMember = function(value) { return this.genericMember = value; };
-Member.prototype.mangleJsName = function() {
- var mangled = Element.prototype.mangleJsName.call(this);
- if (this.declaringType != null && this.declaringType.get$isTop()) {
- return JsNames.getValid(mangled);
- }
- else {
- return (this.get$isNative() && !this.name.contains(":")) ? this.name : mangled;
- }
-}
-Member.prototype.get$library = function() {
- return this.declaringType.get$library();
-}
-Member.prototype.get$isPrivate = function() {
- return null != this.name && 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$isNative = function() {
- return false;
-}
-Member.prototype.get$constructorName = function() {
- $globals.world.internalError("cannot be a constructor", this.get$span());
-}
-Member.prototype.provideGetter = function() {
-
-}
-Member.prototype.provideSetter = 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.get$preciseMemberSet = function() {
- if (null == this._preciseMemberSet) {
- this._preciseMemberSet = new MemberSet(this, false);
- }
- return this._preciseMemberSet;
-}
-Member.prototype.get$potentialMemberSet = function() {
- if (null == this._potentialMemberSet) {
- if (this.name == ":call") {
- this._potentialMemberSet = this.get$preciseMemberSet();
- return this._potentialMemberSet;
- }
- var mems = new HashSetImplementation_Member();
- if (this.declaringType.get$isClass()) mems.add(this);
- var $$list = this.declaringType.get$genericType().get$subtypes();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var subtype = $$i.next();
- if (!subtype.get$isClass()) continue;
- var mem = subtype.get$members().$index(this.name);
- if (null != mem) {
- if (mem.isDefinedOn(this.declaringType)) {
- mems.add(mem);
- }
- }
- else if (!this.declaringType.get$isClass()) {
- mem = subtype.getMember(this.name);
- if (null != mem && mem.isDefinedOn(this.declaringType)) {
- mems.add(mem);
- }
- }
- }
- if (mems.get$length() != (0)) {
- for (var $$i = mems.iterator(); $$i.hasNext(); ) {
- var mem = $$i.next();
- if ($ne$(this.declaringType.get$genericType(), this.declaringType) && mem.get$genericMember() != null && mems.contains$1(mem.get$genericMember())) {
- mems.remove$1(mem.get$genericMember());
- }
- }
- for (var $$i = mems.iterator(); $$i.hasNext(); ) {
- var mem = $$i.next();
- if (null == this._potentialMemberSet) {
- this._potentialMemberSet = new MemberSet(mem, false);
- }
- else {
- this._potentialMemberSet.add(mem);
- }
- }
- }
- }
- return this._potentialMemberSet;
-}
-Member.prototype.isDefinedOn = function(type) {
- if (type.get$isClass()) {
- if (this.declaringType.isSubtypeOf(type)) {
- return true;
- }
- else if (type.isSubtypeOf(this.declaringType)) {
- return $eq$(type.getMember(this.name), this);
- }
- else {
- return false;
- }
- }
- else {
- if (this.declaringType.isSubtypeOf(type)) {
- return true;
- }
- else {
- var $$list = this.declaringType.get$subtypes();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var t = $$i.next();
- if (t.isSubtypeOf(type) && $eq$(t.getMember(this.name), this)) {
- return true;
- }
- }
- return false;
- }
- }
-}
-Member.prototype.canInvoke = function(context, args) {
- if (this.get$canGet() && (this.get$isField() || this.get$isProperty())) {
- return this.get$returnType().get$isFunction() || this.get$returnType().get$isVar() || this.get$returnType().getCallMethod() != null;
- }
- return false;
-}
-Member.prototype.invoke = function(context, node, target, args) {
- var newTarget = this._get(context, node, target);
- return newTarget.invoke(context, ":call", node, args);
-}
-Member.prototype.override = function(other) {
- if (this.get$isStatic()) {
- $globals.world.error("static members cannot hide parent members", this.get$span(), other.get$span());
- return false;
- }
- else if (other.get$isStatic()) {
- $globals.world.error("cannot override static member", this.get$span(), other.get$span());
- return false;
- }
- return true;
-}
-Member.prototype.get$generatedFactoryName = function() {
- var prefix = ("" + this.declaringType.get$genericType().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 $bit_xor$(($shl$(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.resolveType = function(node, typeErrors, allowTypeParams) {
- allowTypeParams = allowTypeParams && !(this.get$isStatic() && !this.get$isFactory());
- return Element.prototype.resolveType.call(this, node, typeErrors, allowTypeParams);
-}
-Member.prototype.makeConcrete = function(concreteType) {
- $globals.world.internalError("cannot make this concrete", this.get$span());
-}
-// ********** Code for AmbiguousMember **************
-$inherits(AmbiguousMember, Member);
-function AmbiguousMember(name, members) {
- this.members = members;
- Member.call(this, name, null);
-}
-AmbiguousMember.prototype.get$members = function() { return this.members; };
-// ********** Code for Library **************
-$inherits(Library, Element);
-function Library(baseSource) {
- this.isWritten = false;
- this.baseSource = baseSource;
- 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.get$imports = function() { return this.imports; };
-Library.prototype.get$_privateMembers = function() { return this._privateMembers; };
-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.coreimpl);
-}
-Library.prototype.get$isDom = function() {
- return $eq$(this, $globals.world.dom);
-}
-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("package:")) return filename;
- if (filename.startsWith("/")) return filename;
- if (filename.startsWith("file:///")) return filename;
- if (filename.startsWith("http://")) return filename;
- if (const$0009.hasMatch(filename)) return filename;
- return joinPaths(this.sourceDir, filename);
-}
-Library.prototype.addImport = function(fullname, prefix, span) {
- var newLib = $globals.world.getOrAddLibrary(fullname);
- if (newLib.get$isCore()) return;
- this.imports.add(new LibraryImport(newLib, prefix, span));
- 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);
- }
- }
- else {
- var members = this._privateMembers.$index(member.name);
- if ($eq$(members)) {
- members = new MemberSet(member, true);
- this._privateMembers.$setindex(member.name, members);
- }
- else {
- members.add(member);
- }
- }
- }
- else {
- $globals.world._addMember(member);
- }
-}
-Library.prototype.getOrAddFunctionType = function(enclosingElement, name, func, data) {
- var def = new FunctionTypeDefinition(func, null, func.span);
- var type = new DefinedType(name, this, def, false);
- type.addMethod(":call", func);
- var m = type.get$members().$index(":call");
- m.set$enclosingElement(enclosingElement);
- m.resolve();
- m.set$_methodData(data);
- type.set$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() || this.get$isCoreImpl()) && $eq$(existingType.get$definition())) {
- existingType.setDefinition(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.get$length() > (1)) {
- return null;
- }
- if (!result.get$isTop()) {
- return null;
- }
- return result.get$library().findTypeByName(type.names.$index((0)).name);
- }
- return result;
-}
-Library.prototype.findTypeByName = function(name) {
- var ret = this.types.$index(name);
- var $$list = this.imports;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var imported = $$i.next();
- var newRet = null;
- if (imported.get$prefix() == null) {
- newRet = imported.get$library().types.$index(name);
- }
- else if (imported.get$prefix() == name) {
- newRet = imported.get$library().topType;
- }
- if ($ne$(newRet)) {
- if ($ne$(ret) && $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, allowTypeParams) {
- if (node == null) return $globals.world.varType;
- var ret = this.findType(node);
- if ($eq$(ret)) {
- var message = ("cannot find type " + Library._getDottedName(node));
- if (typeErrors) {
- $globals.world.error(message, node.span);
- return $globals.world.objectType;
- }
- else {
- $globals.world.warning(message, node.span);
- return $globals.world.varType;
- }
- }
- return ret;
-}
-Library._getDottedName = function(type) {
- if (type.names != null) {
- var names = map(type.names, (function (n) {
- return n.get$name();
- })
- );
- return $add$($add$(type.name.name, "."), Strings.join(names, "."));
- }
- else {
- return type.name.name;
- }
-}
-Library.prototype.lookup = function(name, span) {
- return this._topNames.$index(name);
-}
-Library.prototype.resolve = function() {
- if (this.name == null) {
- this.name = this.baseSource.filename;
- var index = this.name.lastIndexOf("/", this.name.length);
- if ($gte$(index, (0))) {
- this.name = this.name.substring($add$(index, (1)));
- }
- index = this.name.indexOf(".");
- if ($gt$(index, (0))) {
- this.name = this.name.substring((0), index);
- }
- }
- this._jsname = this.name.replaceAll(".", "_").replaceAll(":", "_").replaceAll(" ", "_");
- var $$list = this.types.getValues();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var type = $$i.next();
- type.resolve();
- }
-}
-Library.prototype._addTopName = function(name, member, localSpan) {
- var existing = this._topNames.$index(name);
- if (null == existing) {
- this._topNames.$setindex(name, member);
- }
- else {
- if ((existing instanceof AmbiguousMember)) {
- existing.get$members().add(member);
- }
- else {
- var newMember = new AmbiguousMember(name, [existing, member]);
- $globals.world.error(("conflicting members for \"" + name + "\""), existing.get$span(), member.get$span(), localSpan);
- this._topNames.$setindex(name, newMember);
- }
- }
-}
-Library.prototype._addTopNames = function(lib) {
- var $$list = lib.topType.members.getValues();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var member = $$i.next();
- if (member.get$isPrivate() && $ne$(lib, this)) continue;
- this._addTopName(member.get$name(), member);
- }
- var $$list = lib.types.getValues();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var type = $$i.next();
- if (!type.get$isTop()) {
- if ($ne$(lib, this) && type.get$typeMember().get$isPrivate()) continue;
- this._addTopName(type.get$name(), type.get$typeMember());
- }
- }
-}
-Library.prototype.postResolveChecks = function() {
- this._topNames = new HashMapImplementation();
- this._addTopNames(this);
- var $$list = this.imports;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var imported = $$i.next();
- if (imported.get$prefix() == null) {
- this._addTopNames(imported.get$library());
- }
- else {
- this._addTopName(imported.get$prefix(), imported.get$library().topType.get$typeMember(), imported.get$span());
- }
- }
-}
-Library.prototype.visitSources = function() {
- var visitor = new _LibraryVisitor(this);
- visitor.addSource(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) && other.get$baseSource().filename == this.baseSource.filename;
-}
-Library.prototype.toString$0 = Library.prototype.toString;
-// ********** Code for _LibraryVisitor **************
-function _LibraryVisitor(library) {
- this.seenImport = false;
- this.seenSource = false;
- this.seenResource = false;
- this.isTop = true;
- this.library = library;
- 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.addSourceFromName = function(name, span) {
- var filename = this.library.makeFullPath(name);
- if ($eq$(filename, this.library.baseSource.filename)) {
- $globals.world.error("library cannot source itself", span);
- return;
- }
- else if (this.sources.some((function (s) {
- return 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 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($this);
- })
- );
- this.isTop = false;
- var newSources = this.sources;
- this.sources = [];
- for (var $$i = newSources.iterator(); $$i.hasNext(); ) {
- var newSource = $$i.next();
- this.addSource(newSource);
- }
-}
-_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.get$length() > (2) || node.arguments.get$length() == (2) && $eq$(prefix)) {
- $globals.world.error($add$("expected at most one \"name\" argument and one optional \"prefix\"", (" but found " + node.arguments.get$length())), node.span);
- }
- else if ($ne$(prefix) && $gte$(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().baseSource, filename);
- })
- )) {
- $globals.world.error(("duplicate import of \"" + name + "\""), node.span);
- return;
- }
- var newLib = this.library.addImport(filename, prefix, node.span);
- 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.get$length() != (1)) {
- $globals.world.error(("expected exactly one argument but found " + node.arguments.get$length()), node.span);
- }
- return this.getFirstStringArg(node);
-}
-_LibraryVisitor.prototype.getFirstStringArg = function(node) {
- if (node.arguments.get$length() < (1)) {
- $globals.world.error(("expected at least one argument but found " + node.arguments.get$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 && a.get$label().name == argName;
- })
- );
- if (args.get$length() == (0)) {
- return null;
- }
- if (args.get$length() > (1)) {
- $globals.world.error(("expected at most one \"" + argName + "\" argument but found ") + node.arguments.get$length(), node.span);
- }
- for (var $$i = args.iterator(); $$i.hasNext(); ) {
- var arg = $$i.next();
- return this._parseStringArgument(arg);
- }
-}
-_LibraryVisitor.prototype._parseStringArgument = function(arg) {
- var expr = arg.value;
- if (!(expr instanceof LiteralExpression) || !expr.get$value().get$type().get$isString()) {
- $globals.world.error("expected string literal", expr.get$span());
- }
- return expr.get$value().get$actualValue();
-}
-_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 = $$list.iterator(); $$i.hasNext(); ) {
- var member = $$i.next();
- member.visit(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(":call", node.func);
-}
-// ********** Code for Parameter **************
-function Parameter(definition, method) {
- this.isInitializer = false;
- this.definition = definition;
- this.method = method;
-}
-Parameter.prototype.get$definition = function() { return this.definition; };
-Parameter.prototype.get$method = function() { return this.method; };
-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.get$isInitializer = function() { return this.isInitializer; };
-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, true);
- if (this.definition.value != null) {
- if (!this.get$hasDefaultValue()) return;
- if (this.method.name == ":call") {
- var methodDef = this.method.get$definition();
- if ($eq$(methodDef.get$body()) && !this.method.get$isNative()) {
- $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 instanceof MethodGenerator)) {
- var gen = context;
- this.value = this.definition.value.visit(gen);
- 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);
- }
-}
-Parameter.prototype.get$isOptional = function() {
- return this.definition != null && this.definition.value != null;
-}
-Parameter.prototype.get$hasDefaultValue = function() {
- return this.definition.value.span.start != this.definition.span.start;
-}
-// ********** Code for TypeMember **************
-$inherits(TypeMember, Member);
-function TypeMember(type) {
- this.type = type;
- Member.call(this, type.name, type.library.topType);
-}
-TypeMember.prototype.get$type = function() { return this.type; };
-TypeMember.prototype.get$span = function() {
- return null == this.type.definition ? null : 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 = function(context, node, target) {
- return new TypeValue(this.type, node.span);
-}
-TypeMember.prototype._set = function(context, node, target, value) {
- $globals.world.error("cannot set type", node.span);
-}
-TypeMember.prototype.invoke = function(context, node, target, args) {
- $globals.world.error("cannot invoke type", node.span);
-}
-// ********** Code for FieldMember **************
-$inherits(FieldMember, Member);
-function FieldMember(name, declaringType, definition, value, isNative) {
- this._computing = false;
- this.definition = definition;
- this.value = value;
- this.isNative = isNative;
- 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.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.get$isNative = function() { return this.isNative; };
-FieldMember.prototype.override = function(other) {
- if (!Member.prototype.override.call(this, other)) return false;
- if (other.get$isProperty() || other.get$isField()) {
- return true;
- }
- else {
- $globals.world.error("field can only override field or property", this.get$span(), other.get$span());
- return false;
- }
-}
-FieldMember.prototype.provideGetter = function() {
- this._provideGetter = true;
- if (null != this.genericMember) {
- this.genericMember.provideGetter();
- }
-}
-FieldMember.prototype.provideSetter = function() {
- this._provideSetter = true;
- if (null != this.genericMember) {
- this.genericMember.provideSetter();
- }
-}
-FieldMember.prototype.makeConcrete = function(concreteType) {
- var ret = new FieldMember(this.name, concreteType, this.definition, this.value, false);
- ret.set$genericMember(this);
- ret.set$_jsname(this._jsname);
- return ret;
-}
-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 = $$list.iterator(); $$i.hasNext(); ) {
- var mod = $$i.next();
- if (mod.get$kind() == (85)) {
- if (this.isStatic) {
- $globals.world.error("duplicate static modifier", mod.get$span());
- }
- this.isStatic = true;
- }
- else if (mod.get$kind() == (99)) {
- 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, true);
- if (this.isStatic && this.isFinal && this.value == null) {
- $globals.world.error("static final field is missing initializer", this.get$span());
- }
- if (this.declaringType.get$isClass()) 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) {
- if (this.isFinal && this._computedValue.get$isConst()) {
- ;
- }
- else {
- this._computedValue = $globals.world.gen.globalForStaticField(this, this._computedValue, [this._computedValue]);
- }
- }
- this._computing = false;
- }
- return this._computedValue;
-}
-FieldMember.prototype._get = function(context, node, target) {
- if (!context.get$needsCode()) {
- return new PureStaticValue(this.type, node.span, this.isStatic && this.isFinal, false);
- }
- if (this.isNative && this.get$returnType() != null) {
- this.get$returnType().markUsed();
- if ((this.get$returnType() instanceof DefinedType)) {
- var defaultType = this.get$returnType().get$genericType().defaultType;
- if ($ne$(defaultType) && defaultType.get$isNative()) {
- defaultType.markUsed();
- }
- }
- }
- 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 (this.declaringType.get$library().get$isDom()) {
- return new Value(this.type, ("" + this.get$jsname()), node.span);
- }
- else {
- return new Value(this.type, ("$globals." + this.get$jsname()), node.span);
- }
- }
- 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);
- }
- else {
- return new Value(this.type, ("$globals." + this.declaringType.get$jsname() + "_" + this.get$jsname()), node.span);
- }
- }
- return new Value(this.type, ("" + target.get$code() + "." + this.get$jsname()), node.span);
-}
-FieldMember.prototype._set = function(context, node, target, value) {
- if (!context.get$needsCode()) {
- return new PureStaticValue(this.type, node.span, false, false);
- }
- var lhs = this._get(context, node, target);
- value = value.convertTo(context, this.type);
- return new Value(this.type, ("" + lhs.get$code() + " = " + value.get$code()), node.span);
-}
-// ********** Code for PropertyMember **************
-$inherits(PropertyMember, Member);
-function PropertyMember(name, declaringType) {
- 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$needsFieldSyntax = function() {
- return this._overriddenField != null && this._overriddenField.get$isNative() && !this._overriddenField.declaringType.get$isHiddenNativeType();
-}
-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.makeConcrete = function(concreteType) {
- var ret = new PropertyMember(this.name, concreteType);
- if (null != this.getter) ret.set$getter(this.getter.makeConcrete(concreteType));
- if (null != this.setter) ret.set$setter(this.setter.makeConcrete(concreteType));
- ret.set$_jsname(this._jsname);
- return ret;
-}
-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) {
- if (this.getter == null) {
- if (this._overriddenField != null) {
- return this._overriddenField._get(context, node, target);
- }
- return target.invokeNoSuchMethod$3(context, ("get:" + this.name), node);
- }
- return this.getter.invoke(context, node, target, Arguments.get$EMPTY());
-}
-PropertyMember.prototype._set = function(context, node, target, value) {
- if (this.setter == null) {
- if (this._overriddenField != null) {
- return this._overriddenField._set(context, node, target, value);
- }
- return target.invokeNoSuchMethod(context, ("set:" + this.name), node, new Arguments(null, [value]));
- }
- return this.setter.invoke(context, node, target, new Arguments(null, [value]));
-}
-PropertyMember.prototype.addFromParent = function(parentMember) {
- var parent = parentMember;
- if (this.getter == null) this.getter = parent.get$getter();
- if (this.setter == null) this.setter = parent.get$setter();
-}
-PropertyMember.prototype.resolve = function() {
- if (this.getter != null) {
- this.getter.resolve();
- if (this.getter.parameters.get$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.get$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);
- }
- }
- if (this.declaringType.get$isClass()) this.get$library()._addMember(this);
-}
-// ********** Code for MethodMember **************
-$inherits(MethodMember, Member);
-function MethodMember(name, declaringType, definition) {
- this.isStatic = false;
- this.isAbstract = false;
- this.isConst = false;
- this.isFactory = false;
- this._provideOptionalParamInfo = false;
- this._hasNativeBody = false;
- this.definition = definition;
- this.isLambda = false;
- Member.call(this, name, declaringType);
- if (this.get$isNative()) {
- if (const$0013.hasMatch(this.definition.nativeBody)) {
- this._jsname = this.definition.nativeBody;
- $globals.world._addHazardousMemberName(this._jsname);
- }
- this._hasNativeBody = this.definition.nativeBody != "" && this.definition.nativeBody != this._jsname;
- }
-}
-MethodMember.lambda$ctor = function(name, declaringType, definition) {
- this.isStatic = false;
- this.isAbstract = false;
- this.isConst = false;
- this.isFactory = false;
- this._provideOptionalParamInfo = false;
- this._hasNativeBody = false;
- this.definition = definition;
- this.isLambda = true;
- Member.call(this, name, declaringType);
-}
-MethodMember.lambda$ctor.prototype = MethodMember.prototype;
-MethodMember.prototype.get$definition = function() { return this.definition; };
-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.set$_methodData = function(value) { return this._methodData = 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.get$isFactory = function() { return this.isFactory; };
-MethodMember.prototype.get$initDelegate = function() { return this.initDelegate; };
-MethodMember.prototype.set$initDelegate = function(value) { return this.initDelegate = value; };
-MethodMember.prototype.makeConcrete = function(concreteType) {
- var _name = this.get$isConstructor() ? concreteType.name : this.name;
- var ret = new MethodMember(_name, concreteType, this.definition);
- ret.set$genericMember(this);
- ret.set$_jsname(this._jsname);
- return ret;
-}
-MethodMember.prototype.get$methodData = function() {
- if (null != this.genericMember) return this.genericMember.get$dynamic().get$methodData();
- if (null == this._methodData) {
- this._methodData = new MethodData(this);
- }
- return this._methodData;
-}
-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() {
- if (this.definition == null) return false;
- return this.definition.nativeBody != null;
-}
-MethodMember.prototype.get$hasNativeBody = function() {
- return this._hasNativeBody;
-}
-MethodMember.prototype.get$canGet = function() {
- return true;
-}
-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 ($eq$(returnType)) return "";
- if ((returnType instanceof GenericTypeReference)) {
- return "";
- }
- if (returnType.get$names() != null) {
- return returnType.get$names().$index((0)).name;
- }
- else if ($ne$(returnType.get$name())) {
- 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, this.get$methodData());
- 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.get$length()) return false;
- if (bareCount == this.parameters.get$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.get$length(); i++) {
- var p = this.parameters.$index(i);
- if (p.get$isOptional() && $eq$(p.get$name(), name)) {
- return i;
- }
- }
- return (-1);
-}
-MethodMember.prototype.provideGetter = function() {
- this._provideGetter = true;
-}
-MethodMember.prototype.provideSetter = function() {
- this._provideSetter = true;
-}
-MethodMember.prototype._set = function(context, node, target, value) {
- $globals.world.error("cannot set method", node.span);
-}
-MethodMember.prototype._get = function(context, node, target) {
- if (!context.get$needsCode()) {
- return new PureStaticValue(this.get$functionType(), node.span, false, false);
- }
- 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);
- }
- this._provideGetter = true;
- return new Value(this.get$functionType(), ("" + target.get$code() + ".get$" + this.get$jsname() + "()"), node.span);
-}
-MethodMember.prototype.namesInHomePositions = function(args) {
- if (!args.get$hasNames()) return true;
- for (var i = args.get$bareCount();
- i < args.values.get$length(); i++) {
- if (i >= this.parameters.get$length()) {
- return false;
- }
- if (args.getName(i) != this.parameters.$index(i).name) {
- return false;
- }
- }
- return true;
-}
-MethodMember.prototype.namesInOrder = function(args) {
- if (!args.get$hasNames()) return true;
- var lastParameter = null;
- for (var i = args.get$bareCount();
- i < this.parameters.get$length(); i++) {
- var p = args.getIndexOfName(this.parameters.$index(i).name);
- if ($gte$(p, (0)) && args.values.$index(p).get$needsTemp()) {
- if (lastParameter != null && $gt$(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(this.parameters.$index(i).type)) {
- return true;
- }
- }
- if (bareCount < this.parameters.get$length()) {
- for (var i = bareCount;
- i < this.parameters.get$length(); i++) {
- var arg = args.getValue(this.parameters.$index(i).name);
- if ($ne$(arg) && arg.needsConversion(this.parameters.$index(i).type)) {
- return true;
- }
- }
- }
- return false;
-}
-MethodMember.prototype.hasOptionalParameters = function() {
- return this.parameters.some((function (p) {
- return p.get$isOptional();
- })
- );
-}
-MethodMember.prototype._tooManyArgumentsMsg = function(actual, expected) {
- return this.hasOptionalParameters() ? ("too many arguments, expected at most " + expected + " but found " + actual) : this._wrongArgumentCountMsg(actual, expected);
-}
-MethodMember.prototype._tooFewArgumentsMsg = function(actual, expected) {
- return this.hasOptionalParameters() ? ("too few arguments, expected at least " + expected + " but found " + actual) : this._wrongArgumentCountMsg(actual, expected);
-}
-MethodMember.prototype._wrongArgumentCountMsg = function(actual, expected) {
- return ("wrong number of arguments, expected " + expected + " but found " + actual);
-}
-MethodMember.prototype._argError = function(context, node, target, args, msg, argIndex) {
- if (context.get$showWarnings()) {
- var span;
- if ((args.nodes == null) || (argIndex >= args.nodes.get$length())) {
- span = node.span;
- }
- else {
- span = args.nodes.$index(argIndex).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(context) {
- if (context.get$needsCode()) {
- var $$list = this.parameters;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var p = $$i.next();
- p.genValue(this, context);
- }
- }
-}
-MethodMember.prototype.invoke = function(context, node, target, args) {
- var argValues = [];
- var bareCount = args.get$bareCount();
- for (var i = (0);
- i < bareCount; i++) {
- var arg = args.values.$index(i);
- if (i >= this.parameters.get$length()) {
- var msg = this._tooManyArgumentsMsg(args.get$length(), this.parameters.get$length());
- return this._argError(context, node, target, args, msg, i);
- }
- argValues.add(arg.convertTo(context, this.parameters.$index(i).type));
- }
- var namedArgsUsed = (0);
- if (bareCount < this.parameters.get$length()) {
- this.genParameterValues(context);
- for (var i = bareCount;
- i < this.parameters.get$length(); i++) {
- var param = this.parameters.$index(i);
- var arg = args.getValue(param.get$name());
- if ($eq$(arg)) {
- arg = param.get$value();
- if ($eq$(arg)) {
- arg = new PureStaticValue(param.get$type(), param.get$definition().get$span(), true, false);
- }
- }
- else {
- arg = arg.convertTo(context, this.parameters.$index(i).type);
- namedArgsUsed++;
- }
- if ($eq$(arg) || !this.parameters.$index(i).get$isOptional()) {
- var msg = this._tooFewArgumentsMsg(Math.min(i, args.get$length()), i + (1));
- return this._argError(context, node, target, args, msg, i);
- }
- else {
- argValues.add(arg);
- }
- }
- }
- if (namedArgsUsed < args.get$nameCount()) {
- var seen = new HashSetImplementation_dart_core_String();
- 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 + "\""), i);
- }
- seen.add(name);
- var p = this.indexOfParameter(name);
- if (p < (0)) {
- return this._argError(context, node, target, args, ("method does not have optional parameter \"" + name + "\""), i);
- }
- else if (p < bareCount) {
- return this._argError(context, node, target, args, ("argument \"" + name + "\" passed as positional and named"), p);
- }
- }
- $globals.world.internalError(("wrong named arguments calling " + this.name), node.span);
- }
- if (!context.get$needsCode()) {
- return new PureStaticValue(this.returnType, node.span, false, false);
- }
- 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 = argValues.map((function (v) {
- return v.get$code();
- })
- );
- if (!target.get$isType() && (this.get$isConstructor() || target.get$isSuper())) {
- argsCode.insertRange((0), (1), "this");
- }
- if (bareCount < this.parameters.get$length()) {
- Arguments.removeTrailingNulls(argsCode);
- }
- var argsString = Strings.join(argsCode, ", ");
- if (this.get$isConstructor()) {
- return this._invokeConstructor(context, node, target, args, argsString);
- }
- if (target.get$isSuper()) {
- return new Value(this.get$inferredResult(), ("" + this.declaringType.get$jsname() + ".prototype." + this.get$jsname() + ".call(" + argsString + ")"), node.span);
- }
- if (this.get$isOperator()) {
- return this._invokeBuiltin(context, node, target, args, argsCode);
- }
- if (this.isFactory) {
- return new Value(target.get$type(), ("" + this.get$generatedFactoryName() + "(" + argsString + ")"), null != node ? node.span : null);
- }
- if (this.isStatic) {
- if (this.declaringType.get$isTop()) {
- return new Value(this.get$inferredResult(), ("" + this.get$jsname() + "(" + argsString + ")"), null != node ? node.span : null);
- }
- return new Value(this.get$inferredResult(), ("" + this.declaringType.get$jsname() + "." + this.get$jsname() + "(" + argsString + ")"), node.span);
- }
- if (this.name == "get:typeName" && this.declaringType.get$library().get$isDom()) {
- $globals.world.gen.corejs.ensureTypeNameOf();
- }
- var code = ("" + target.get$code() + "." + this.get$jsname() + "(" + argsString + ")");
- return new Value(this.get$inferredResult(), code, node.span);
-}
-MethodMember.prototype._invokeConstructor = function(context, node, target, args, argsString) {
- this.declaringType.markUsed();
- var ctor = this.get$constructorName();
- if (ctor != "") ctor = ("." + ctor + "$ctor");
- var span = node != null ? node.span : target.span;
- if (!target.get$isType()) {
- var code = ("" + this.declaringType.get$nativeName() + ctor + ".call(" + argsString + ")");
- return new Value(target.get$type(), code, span);
- }
- else {
- if (this.isConst && (node instanceof NewExpression) && node.get$dynamic().get$isConst()) {
- if (this.get$isNative() || this.declaringType.name == "JSSyntaxRegExp") {
- var code = ("new " + this.declaringType.get$nativeName() + ctor + "(" + argsString + ")");
- return $globals.world.gen.globalForConst(new Value(target.get$type(), code, span), [args.values]);
- }
- var newType = this.declaringType;
- var newObject = new ObjectValue(true, newType, span);
- newObject.initFields();
- this._evalConstConstructor(newObject, args);
- return $globals.world.gen.globalForConst(newObject, [args.values]);
- }
- else {
- var code = ("new " + this.declaringType.get$nativeName() + ctor + "(" + argsString + ")");
- return new Value(target.get$type(), code, span);
- }
- }
-}
-MethodMember.prototype._evalConstConstructor = function(newObject, args) {
- this.declaringType.markUsed();
- this.get$methodData().eval(this, newObject, args);
-}
-MethodMember.prototype._invokeBuiltin = function(context, node, target, args, argsCode) {
- if (target.get$type().get$isNum()) {
- var code = null;
- if (args.get$length() == (0)) {
- if (this.name == ":negate") {
- code = ("-" + target.get$code());
- }
- else if (this.name == ":bit_not") {
- code = ("~" + target.get$code());
- }
- }
- else if (args.get$length() == (1) && args.values.$index((0)).get$type().get$isNum()) {
- if (this.name == ":truncdiv" || this.name == ":mod") {
- $globals.world.gen.corejs.useOperator(this.name);
- code = ("" + this.get$jsname() + "$(" + target.get$code() + ", " + argsCode.$index((0)) + ")");
- }
- else {
- var op = TokenKind.rawOperatorFromMethod(this.name);
- code = ("" + target.get$code() + " " + op + " " + argsCode.$index((0)));
- }
- }
- if (null != code) {
- return new Value(this.get$inferredResult(), code, node.span);
- }
- }
- else if (target.get$type().get$isString()) {
- if (this.name == ":index" && args.values.$index((0)).get$type().get$isNum()) {
- return new Value(this.declaringType, ("" + target.get$code() + "[" + argsCode.$index((0)) + "]"), node.span);
- }
- else if (this.name == ":add" && args.values.$index((0)).get$type().get$isNum()) {
- return new Value(this.declaringType, ("" + target.get$code() + " + " + argsCode.$index((0))), node.span);
- }
- }
- else if (this.declaringType.get$isNative() && $globals.options.disableBoundsChecks) {
- if (args.get$length() > (0) && args.values.$index((0)).get$type().get$isNum()) {
- if (this.name == ":index") {
- return new Value(this.returnType, ("" + target.get$code() + "[" + argsCode.$index((0)) + "]"), node.span);
- }
- else if (this.name == ":setindex") {
- return new Value(this.returnType, ("" + target.get$code() + "[" + argsCode.$index((0)) + "] = " + argsCode.$index((1))), node.span);
- }
- }
- }
- if (this.name == ":eq" || this.name == ":ne") {
- var op = this.name == ":eq" ? "==" : "!=";
- if (this.name == ":ne") {
- target.invoke(context, ":eq", node, args);
- }
- if ($eq$(argsCode.$index((0)), "null")) {
- return new Value(this.get$inferredResult(), ("" + target.get$code() + " " + op + " null"), node.span);
- }
- else if (target.get$type().get$isNum() || target.get$type().get$isString()) {
- return new Value(this.get$inferredResult(), ("" + target.get$code() + " " + op + " " + argsCode.$index((0))), node.span);
- }
- $globals.world.gen.corejs.useOperator(this.name);
- return new Value(this.get$inferredResult(), ("" + this.get$jsname() + "$(" + target.get$code() + ", " + argsCode.$index((0)) + ")"), node.span);
- }
- if (this.get$isCallMethod()) {
- this.declaringType.markUsed();
- return new Value(this.get$inferredResult(), ("" + target.get$code() + "(" + Strings.join(argsCode, ", ") + ")"), node.span);
- }
- if (this.name == ":index") {
- $globals.world.gen.corejs.useIndex = true;
- }
- else if (this.name == ":setindex") {
- $globals.world.gen.corejs.useSetIndex = true;
- }
- else {
- $globals.world.gen.corejs.useOperator(this.name);
- var argsString = argsCode.get$length() == (0) ? "" : (", " + argsCode.$index((0)));
- return new Value(this.returnType, ("" + this.get$jsname() + "$(" + target.get$code() + argsString + ")"), node.span);
- }
- var argsString = Strings.join(argsCode, ", ");
- return new Value(this.get$inferredResult(), ("" + target.get$code() + "." + this.get$jsname() + "(" + argsString + ")"), node.span);
-}
-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 = $$list.iterator(); $$i.hasNext(); ) {
- var mod = $$i.next();
- if (mod.get$kind() == (85)) {
- if (this.isStatic) {
- $globals.world.error("duplicate static modifier", mod.get$span());
- }
- this.isStatic = true;
- }
- else if (this.get$isConstructor() && mod.get$kind() == (92)) {
- if (this.isConst) {
- $globals.world.error("duplicate const modifier", mod.get$span());
- }
- if (this.isFactory) {
- $globals.world.error("const factory not allowed", mod.get$span());
- }
- this.isConst = true;
- }
- else if (mod.get$kind() == (74)) {
- if (this.isFactory) {
- $globals.world.error("duplicate factory modifier", mod.get$span());
- }
- if (this.isConst) {
- $globals.world.error("const factory not allowed", mod.get$span());
- }
- if (this.isStatic) {
- $globals.world.error("static factory not allowed", mod.get$span());
- }
- this.isFactory = true;
- }
- else if (mod.get$kind() == (71)) {
- if (this.isAbstract) {
- if (this.declaringType.get$isClass()) {
- $globals.world.error("duplicate abstract modifier", mod.get$span());
- }
- else if (!this.get$isCallMethod()) {
- $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.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 cannot have a body", this.get$span());
- }
- if (this.isStatic && !(this.declaringType.get$definition() instanceof FunctionTypeDefinition)) {
- $globals.world.error("static method cannot 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 {
- if ((this.definition.returnType instanceof SimpleTypeReference) && $eq$(this.definition.returnType.get$dynamic().get$type(), $globals.world.voidType)) {
- this.returnType = $globals.world.voidType;
- }
- else {
- this.returnType = this.resolveType(this.definition.returnType, false, !this.isStatic);
- }
- }
- this.parameters = [];
- var $$list = this.definition.formals;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var formal = $$i.next();
- var param = new Parameter(formal, this);
- param.resolve();
- this.parameters.add(param);
- }
- if (!this.isLambda && this.declaringType.get$isClass()) {
- this.get$library()._addMember(this);
- }
-}
-// ********** Code for FactoryMap **************
-function FactoryMap() {
- this.factories = new HashMapImplementation();
-}
-FactoryMap.prototype.get$factories = function() { return this.factories; };
-FactoryMap.prototype.getFactoriesFor = function(typeName) {
- var ret = this.factories.$index(typeName);
- if ($eq$(ret)) {
- 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.isEmpty = function() {
- return this.factories.getValues().every((function (constructors) {
- return constructors.isEmpty();
- })
- );
-}
-// ********** Code for MemberSet **************
-function MemberSet(member, isVar) {
- this._preparedForSet = false;
- this.name = member.name;
- this.members = [member];
- this.jsname = member.get$jsname();
- this.isVar = isVar;
-}
-MemberSet.prototype.get$name = function() { return this.name; };
-MemberSet.prototype.get$members = function() { return this.members; };
-MemberSet.prototype.get$isVar = function() { return this.isVar; };
-MemberSet.prototype.get$jsname = function() { return this.jsname; };
-MemberSet.prototype.set$jsname = function(value) { return this.jsname = value; };
-MemberSet.prototype.toString = function() {
- return ("" + this.name + ":" + this.members.get$length());
-}
-MemberSet.prototype.add = function(member) {
- this.members.add(member);
-}
-MemberSet.prototype.get$isOperator = function() {
- return this.members.$index((0)).get$isOperator();
-}
-MemberSet.prototype.get$treatAsField = function() {
- if (this._treatAsField == null) {
- this._treatAsField = !this.isVar && this.members.every((function (m) {
- return m.get$isField();
- })
- );
- }
- return this._treatAsField;
-}
-MemberSet.unionTypes = function(t1, t2) {
- if (t1 == null) return t2;
- if (t2 == null) return t1;
- return Type.union(t1, t2);
-}
-MemberSet.prototype._get = function(context, node, target) {
- if (this.members.get$length() == (1) && !this.isVar) {
- return this.members.$index((0))._get(context, node, target);
- }
- if (this._returnTypeForGet == null) {
- var $$list = this.members;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var member = $$i.next();
- if (!member.get$canGet()) continue;
- if (!this.get$treatAsField()) member.provideGetter();
- var r = member._get(context, node, target);
- this._returnTypeForGet = MemberSet.unionTypes(this._returnTypeForGet, r.get$type());
- }
- if (this._returnTypeForGet == null) {
- $globals.world.error(("no valid getters for \"" + this.name + "\""), node.span);
- }
- }
- if (this._treatAsField) {
- return new Value(this._returnTypeForGet, ("" + target.get$code() + "." + this.jsname), node.span);
- }
- else {
- return new Value(this._returnTypeForGet, ("" + target.get$code() + ".get$" + this.jsname + "()"), node.span);
- }
-}
-MemberSet.prototype._set = function(context, node, target, value) {
- if (this.members.get$length() == (1) && !this.isVar) {
- return this.members.$index((0))._set(context, node, target, value);
- }
- if (!this._preparedForSet) {
- this._preparedForSet = true;
- var $$list = this.members;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var member = $$i.next();
- if (!member.get$canSet()) continue;
- if (!this.get$treatAsField()) member.provideSetter();
- var r = member._set(context, node, target, value);
- }
- }
- if (this.get$treatAsField()) {
- return new Value(value.get$type(), ("" + target.get$code() + "." + this.jsname + " = " + value.get$code()), node.span);
- }
- else {
- return new Value(value.get$type(), ("" + target.get$code() + ".set$" + this.jsname + "(" + value.get$code() + ")"), node.span);
- }
-}
-MemberSet.prototype.invoke = function(context, node, target, args) {
- if (this.members.get$length() == (1) && !this.isVar) {
- return this.members.$index((0)).invoke(context, node, target, args);
- }
- var invokeKey = null;
- if (this._invokes == null) {
- this._invokes = [];
- invokeKey = null;
- }
- else {
- var $$list = this._invokes;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var ik = $$i.next();
- if (ik.matches(args)) {
- invokeKey = ik;
- break;
- }
- }
- }
- if ($eq$(invokeKey)) {
- invokeKey = new InvokeKey(args);
- this._invokes.add(invokeKey);
- invokeKey.addMembers(this.members, context, target, args);
- }
- if (invokeKey.get$needsVarCall() || this.get$isOperator()) {
- if (this.name == ":call") {
- return target._varCall(context, node, args);
- }
- else if (this.get$isOperator()) {
- return this.invokeSpecial(target, args, invokeKey.get$returnType());
- }
- else {
- return this.invokeOnVar(context, node, target, args);
- }
- }
- else {
- var code = ("" + target.get$code() + "." + this.jsname + "(" + args.getCode() + ")");
- return new Value(invokeKey.get$returnType(), code, node.span);
- }
-}
-MemberSet.prototype.invokeSpecial = function(target, args, returnType) {
- var argsString = args.getCode();
- if (this.name == ":index" || this.name == ":setindex") {
- if (this.name == ":index") {
- $globals.world.gen.corejs.useIndex = true;
- }
- else if (this.name == ":setindex") {
- $globals.world.gen.corejs.useSetIndex = true;
- }
- return new Value(returnType, ("" + target.get$code() + "." + this.jsname + "(" + argsString + ")"), target.span);
- }
- else {
- if (argsString.get$length() > (0)) argsString = (", " + argsString);
- $globals.world.gen.corejs.useOperator(this.name);
- return new Value(returnType, ("" + this.jsname + "$(" + target.get$code() + argsString + ")"), target.span);
- }
-}
-MemberSet.prototype.invokeOnVar = function(context, node, target, args) {
- var $0;
- ($0 = context.get$counters()).dynamicMethodCalls = $0.dynamicMethodCalls + (1);
- var member = this.getVarMember(context, node, args);
- return member.invoke(context, node, target, args);
-}
-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 ($eq$(stub)) {
- var mset = context.findMembers(this.name).members;
- var targets = mset.filter((function (m) {
- return m.canInvoke(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.toString$0 = MemberSet.prototype.toString;
-// ********** Code for InvokeKey **************
-function InvokeKey(args) {
- this.needsVarCall = false;
- this.bareArgs = args.get$bareCount();
- if (this.bareArgs != args.get$length()) {
- this.namedArgs = args.getNames();
- }
-}
-InvokeKey.prototype.get$returnType = function() { return this.returnType; };
-InvokeKey.prototype.set$returnType = function(value) { return this.returnType = value; };
-InvokeKey.prototype.get$needsVarCall = function() { return this.needsVarCall; };
-InvokeKey.prototype.matches = function(args) {
- if (this.namedArgs == null) {
- if (this.bareArgs != args.get$length()) return false;
- }
- else {
- if (this.bareArgs + this.namedArgs.get$length() != args.get$length()) return false;
- }
- if (this.bareArgs != args.get$bareCount()) return false;
- if (this.namedArgs == null) return true;
- for (var i = (0);
- i < this.namedArgs.get$length(); i++) {
- if (this.namedArgs.$index(i) != args.getName(this.bareArgs + i)) return false;
- }
- return true;
-}
-InvokeKey.prototype.addMembers = function(members, context, target, args) {
- for (var $$i = members.iterator(); $$i.hasNext(); ) {
- var member = $$i.next();
- if (!(member.get$parameters().get$length() == this.bareArgs && this.namedArgs == null)) {
- this.needsVarCall = true;
- }
- else if ($globals.options.enableTypeChecks && member.get$isMethod() && member.needsArgumentConversion(args)) {
- this.needsVarCall = true;
- }
- else if (member.get$jsname() != members.$index((0)).get$jsname()) {
- this.needsVarCall = true;
- }
- else if ($eq$(member.get$library(), $globals.world.dom)) {
- var $$list = member.get$parameters();
- for (var $i0 = $$list.iterator(); $i0.hasNext(); ) {
- var p = $i0.next();
- if (p.get$type().getCallMethod() != null) {
- this.needsVarCall = true;
- }
- }
- }
- if (member.canInvoke(context, args)) {
- if (member.get$isMethod()) {
- this.returnType = MemberSet.unionTypes(this.returnType, member.get$returnType());
- member.get$declaringType().genMethod(member);
- }
- else {
- this.needsVarCall = true;
- this.returnType = $globals.world.varType;
- }
- }
- }
- if (this.returnType == null) {
- this.returnType = $globals.world.varType;
- }
-}
-// ********** Code for MethodCallData **************
-function MethodCallData(data, method) {
- this.data = data;
- this.method = method;
-}
-MethodCallData.prototype.get$method = function() { return this.method; };
-MethodCallData.prototype.get$_methodGenerator = function() { return this._methodGenerator; };
-MethodCallData.prototype.matches = function(other) {
- return $eq$(this.method, other.method);
-}
-MethodCallData.prototype.run = function() {
- if (null != this._methodGenerator) return;
- this._methodGenerator = new MethodGenerator(this.method, this.data.context);
- this._methodGenerator.run();
-}
-MethodCallData.prototype.run$0 = MethodCallData.prototype.run;
-// ********** Code for MethodData **************
-function MethodData(baseMethod, context) {
- this.needsTypeParams = false;
- this.baseMethod = baseMethod;
- this.context = context;
- this._calls = [];
- this.body = this.baseMethod.definition.body;
- if (this.baseMethod.get$isConstructor()) {
- this.needsTypeParams = true;
- }
-}
-MethodData.prototype.get$body = function() { return this.body; };
-MethodData.prototype.analyze = function() {
- var ma = new MethodAnalyzer(this.baseMethod, this.body);
- ma.analyze$1(this.context);
-}
-MethodData.prototype.eval = function(method, newObject, args) {
- if ((null == method ? null != (this.baseMethod) : method !== this.baseMethod)) {
- if (!this.needsTypeParams) method = this.baseMethod;
- }
- var gen = new MethodGenerator(method, this.context);
- return gen.evalBody(newObject, args);
-}
-MethodData.prototype.invokeCall = function(callData) {
- var $$list = this._calls;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var cd = $$i.next();
- if (cd.matches(callData)) {
- return cd.run$0();
- }
- }
- this._calls.add(callData);
- callData.run();
-}
-MethodData.prototype.run = function(method) {
- if (null == this.body && !method.get$isConstructor() && !method.get$isNative()) return;
- if ((null == method ? null != (this.baseMethod) : method !== this.baseMethod)) {
- if (!this.needsTypeParams) method = this.baseMethod;
- }
- var callData = new MethodCallData(this, method);
- method.declaringType.get$genericType().markUsed();
- this.invokeCall(callData);
-}
-MethodData.prototype.writeDefinition = function(method, writer) {
- var gen = null;
- var $$list = this._calls;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var cd = $$i.next();
- if ($eq$(cd.get$method(), method)) {
- gen = cd.get$_methodGenerator();
- }
- }
- if ($ne$(gen)) {
- if (method.get$isNative() && $eq$(method, this.baseMethod)) {
- if (!method.get$hasNativeBody()) return true;
- gen.set$writer(new CodeWriter());
- gen.get$writer().write(method.definition.nativeBody);
- gen.set$_paramCode(map(method.parameters, (function (p) {
- return p.get$name();
- })
- ));
- }
- gen.writeDefinition(writer);
- return true;
- }
- else {
- return false;
- }
-}
-MethodData.prototype.createFunction = function(writer) {
- this.run(this.baseMethod);
- this.writeDefinition(this.baseMethod, writer);
-}
-MethodData.prototype.createLambda = function(node, context) {
- var lambdaGen = new MethodGenerator(this.baseMethod, context);
- if (this.baseMethod.name != "") {
- lambdaGen.get$_scope().create$3$isFinal(this.baseMethod.name, this.baseMethod.get$functionType(), this.baseMethod.definition.span, true);
- lambdaGen._pushBlock$1(this.baseMethod.definition);
- }
- this._calls.add(new MethodCallData(this, this.baseMethod));
- lambdaGen.run$0();
- if (this.baseMethod.name != "") {
- lambdaGen._popBlock(this.baseMethod.definition);
- }
- var writer = new CodeWriter();
- lambdaGen.writeDefinition(writer, node);
- return new Value(this.baseMethod.get$functionType(), writer.get$text(), this.baseMethod.definition.span);
-}
-// ********** Code for Token **************
-function Token(kind, source, start, end) {
- this.kind = kind;
- this.source = source;
- this.start = start;
- this.end = end;
-}
-Token.prototype.get$kind = function() { return this.kind; };
-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.get$length() > (10)) {
- actualText = $add$(actualText.substring((0), (8)), "...");
- }
- return ("" + kindText + "(" + actualText + ")");
- }
- else {
- return kindText;
- }
-}
-Token.prototype.get$span = function() {
- return new SourceSpan(this.source, this.start, this.end);
-}
-Token.prototype.toString$0 = Token.prototype.toString;
-// ********** Code for LiteralToken **************
-$inherits(LiteralToken, Token);
-function LiteralToken(kind, source, start, end, value) {
- this.value = value;
- Token.call(this, kind, source, start, end);
-}
-LiteralToken.prototype.get$value = function() { return this.value; };
-LiteralToken.prototype.set$value = function(value) { return this.value = value; };
-// ********** Code for ErrorToken **************
-$inherits(ErrorToken, Token);
-function ErrorToken(kind, source, start, end, message) {
- this.message = message;
- Token.call(this, kind, source, start, end);
-}
-ErrorToken.prototype.get$message = function() { return this.message; };
-// ********** Code for SourceFile **************
-function SourceFile(filename, _text) {
- this.filename = filename;
- this._text = _text;
-}
-SourceFile.prototype.get$filename = function() { return this.filename; };
-SourceFile.prototype.get$text = function() {
- return this._text;
-}
-SourceFile.prototype.get$lineStarts = function() {
- if (this._lineStarts == null) {
- var starts = [(0)];
- var index = (0);
- while ($lt$(index, this.get$text().length)) {
- index = this.get$text().indexOf("\n", index) + (1);
- if ($lte$(index, (0))) break;
- starts.add(index);
- }
- starts.add(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.get$length(); i++) {
- if ($gt$(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 + ":" + ($add$(line, (1))) + ":" + ($add$(column, (1))) + ": " + message));
- if (includeText) {
- buf.add("\n");
- var textLine;
- if ($lt$(($add$(line, (2))), this._lineStarts.get$length())) {
- textLine = this.get$text().substring(this._lineStarts.$index(line), this._lineStarts.$index($add$(line, (1))));
- }
- else {
- textLine = $add$(this.get$text().substring(this._lineStarts.$index(line)), "\n");
- }
- var toColumn = Math.min($add$(column, (end - start)), textLine.get$length());
- if ($globals.options.useColors) {
- buf.add(textLine.substring((0), column));
- buf.add($globals._RED_COLOR);
- buf.add(textLine.substring(column, toColumn));
- buf.add($globals._NO_COLOR);
- buf.add(textLine.substring$1(toColumn));
- }
- else {
- buf.add(textLine);
- }
- var i = (0);
- for (; $lt$(i, column); i++) {
- buf.add(" ");
- }
- if ($globals.options.useColors) buf.add($globals._RED_COLOR);
- for (; i < toColumn; i++) {
- buf.add("^");
- }
- if ($globals.options.useColors) buf.add($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);
- }
-}
-// ********** Code for SourceSpan **************
-function SourceSpan(file, start, end) {
- this.file = file;
- this.start = start;
- this.end = end;
-}
-SourceSpan.prototype.get$file = function() { return this.file; };
-SourceSpan.prototype.get$start = function() { return this.start; };
-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 + ":" + ($add$(line, (1))) + ":" + ($add$(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);
-}
-// ********** Code for InterpStack **************
-function InterpStack(previous, quote, isMultiline) {
- this.previous = previous;
- this.quote = quote;
- this.isMultiline = isMultiline;
- this.depth = (-1);
-}
-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.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;
-}
-// ********** Code for TokenizerHelpers **************
-function TokenizerHelpers() {
-
-}
-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.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._lang_index = index;
- TokenizerHelpers.call(this);
- this._text = this._source.get$text();
-}
-TokenizerBase.prototype._nextChar = function() {
- if (this._lang_index < this._text.length) {
- return this._text.charCodeAt(this._lang_index++);
- }
- else {
- return (0);
- }
-}
-TokenizerBase.prototype._peekChar = function() {
- if (this._lang_index < this._text.length) {
- return this._text.charCodeAt(this._lang_index);
- }
- else {
- return (0);
- }
-}
-TokenizerBase.prototype._maybeEatChar = function(ch) {
- if (this._lang_index < this._text.length) {
- if (this._text.charCodeAt(this._lang_index) == ch) {
- this._lang_index++;
- return true;
- }
- else {
- return false;
- }
- }
- else {
- return false;
- }
-}
-TokenizerBase.prototype._finishToken = function(kind) {
- return new Token(kind, this._source, this._startIndex, this._lang_index);
-}
-TokenizerBase.prototype._errorToken = function(message) {
- return new ErrorToken((65), this._source, this._startIndex, this._lang_index, message);
-}
-TokenizerBase.prototype.finishWhitespace = function() {
- this._lang_index--;
- while (this._lang_index < this._text.length) {
- var ch = this._text.charCodeAt(this._lang_index++);
- if ($eq$(ch, (32)) || $eq$(ch, (9)) || $eq$(ch, (13))) {
- }
- else if ($eq$(ch, (10))) {
- if (!this._skipWhitespace) {
- return this._finishToken((63));
- }
- }
- else {
- this._lang_index--;
- if (this._skipWhitespace) {
- return this.next();
- }
- else {
- return this._finishToken((63));
- }
- }
- }
- return this._finishToken((1));
-}
-TokenizerBase.prototype.finishHashBang = function() {
- while (true) {
- var ch = this._nextChar();
- if (ch == (0) || ch == (10) || ch == (13)) {
- return this._finishToken((13));
- }
- }
-}
-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));
- }
- }
- }
-}
-TokenizerBase.prototype.finishMultiLineComment = function() {
- var nesting = (1);
- do {
- var ch = this._nextChar();
- if (ch == (0)) {
- return this._errorToken();
- }
- else if (ch == (42)) {
- if (this._maybeEatChar((47))) {
- nesting--;
- }
- }
- else if (ch == (47)) {
- if (this._maybeEatChar((42))) {
- nesting++;
- }
- }
- }
- while (nesting > (0))
- if (this._skipWhitespace) {
- return this.next();
- }
- else {
- return this._finishToken((64));
- }
-}
-TokenizerBase.prototype.eatDigits = function() {
- while (this._lang_index < this._text.length) {
- if (TokenizerHelpers.isDigit(this._text.charCodeAt(this._lang_index))) {
- this._lang_index++;
- }
- else {
- return;
- }
- }
-}
-TokenizerBase._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);
- }
-}
-TokenizerBase.prototype.readHex = function(hexLength) {
- var maxIndex;
- if (null == hexLength) {
- maxIndex = this._text.length - (1);
- }
- else {
- maxIndex = this._lang_index + hexLength;
- if (maxIndex >= this._text.length) return (-1);
- }
- var result = (0);
- while (this._lang_index < maxIndex) {
- var digit = TokenizerBase._hexDigit(this._text.charCodeAt(this._lang_index));
- if ($eq$(digit, (-1))) {
- if (null == hexLength) {
- return result;
- }
- else {
- return (-1);
- }
- }
- TokenizerBase._hexDigit(this._text.charCodeAt(this._lang_index));
- result = $add$(($mul$(result, (16))), digit);
- this._lang_index++;
- }
- return result;
-}
-TokenizerBase.prototype.finishHex = function() {
- var value = this.readHex();
- return new LiteralToken((61), this._source, this._startIndex, this._lang_index, value);
-}
-TokenizerBase.prototype.finishNumber = function() {
- this.eatDigits();
- if (this._peekChar() == (46)) {
- this._nextChar();
- if (TokenizerHelpers.isDigit(this._peekChar())) {
- this.eatDigits();
- return this.finishNumberExtra((62));
- }
- else {
- this._lang_index--;
- }
- }
- return this.finishNumberExtra((60));
-}
-TokenizerBase.prototype.finishNumberExtra = function(kind) {
- if (this._maybeEatChar((101)) || this._maybeEatChar((69))) {
- kind = (62);
- 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._makeStringToken = function(buf, isPart) {
- var s = Strings.String$fromCharCodes$factory(buf);
- var kind = isPart ? (59) : (58);
- return new LiteralToken(kind, this._source, this._startIndex, this._lang_index, s);
-}
-TokenizerBase.prototype._makeRawStringToken = function(isMultiline) {
- var s;
- if (isMultiline) {
- var start = this._startIndex + (4);
- if (this._source.get$text()[start] == "\n") start++;
- s = this._source.get$text().substring(start, this._lang_index - (3));
- }
- else {
- s = this._source.get$text().substring(this._startIndex + (2), this._lang_index - (1));
- }
- return new LiteralToken((58), this._source, this._startIndex, this._lang_index, s);
-}
-TokenizerBase.prototype.finishMultilineString = function(quote) {
- var buf = [];
- while (true) {
- var ch = this._nextChar();
- if (ch == (0)) {
- return this._errorToken();
- }
- else if (ch == quote) {
- if (this._maybeEatChar(quote)) {
- if (this._maybeEatChar(quote)) {
- return this._makeStringToken(buf, false);
- }
- buf.add(quote);
- }
- buf.add(quote);
- }
- else if (ch == (36)) {
- this._interpStack = InterpStack.push(this._interpStack, quote, true);
- return this._makeStringToken(buf, true);
- }
- else if (ch == (92)) {
- var escapeVal = this.readEscapeSequence();
- if ($eq$(escapeVal, (-1))) {
- return this._errorToken("invalid hex escape sequence");
- }
- else {
- buf.add(escapeVal);
- }
- }
- else {
- buf.add(ch);
- }
- }
-}
-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));
-}
-TokenizerBase.prototype._finishCloseBrace = function() {
- var $0;
- if (this._interpStack != null) {
- ($0 = this._interpStack).depth = $0.depth - (1);
- }
- return this._finishToken((7));
-}
-TokenizerBase.prototype.finishString = function(quote) {
- if (this._maybeEatChar(quote)) {
- if (this._maybeEatChar(quote)) {
- this._maybeEatChar((10));
- return this.finishMultilineString(quote);
- }
- else {
- return this._makeStringToken(new Array(), false);
- }
- }
- return this.finishStringBody(quote);
-}
-TokenizerBase.prototype.finishRawString = function(quote) {
- if (this._maybeEatChar(quote)) {
- if (this._maybeEatChar(quote)) {
- return this.finishMultilineRawString(quote);
- }
- else {
- return this._makeStringToken([], false);
- }
- }
- while (true) {
- var ch = this._nextChar();
- if (ch == quote) {
- return this._makeRawStringToken(false);
- }
- else if (ch == (0)) {
- return this._errorToken();
- }
- }
-}
-TokenizerBase.prototype.finishMultilineRawString = function(quote) {
- while (true) {
- var ch = this._nextChar();
- if (ch == (0)) {
- return this._errorToken();
- }
- else if (ch == quote && this._maybeEatChar(quote) && this._maybeEatChar(quote)) {
- return this._makeRawStringToken(true);
- }
- }
-}
-TokenizerBase.prototype.finishStringBody = function(quote) {
- var buf = new Array();
- while (true) {
- var ch = this._nextChar();
- if (ch == quote) {
- return this._makeStringToken(buf, false);
- }
- else if (ch == (36)) {
- this._interpStack = InterpStack.push(this._interpStack, quote, false);
- return this._makeStringToken(buf, true);
- }
- else if (ch == (0)) {
- return this._errorToken();
- }
- else if (ch == (92)) {
- var escapeVal = this.readEscapeSequence();
- if ($eq$(escapeVal, (-1))) {
- return this._errorToken("invalid hex escape sequence");
- }
- else {
- buf.add(escapeVal);
- }
- }
- else {
- buf.add(ch);
- }
- }
-}
-TokenizerBase.prototype.readEscapeSequence = function() {
- var ch = this._nextChar();
- var hexValue;
- switch (ch) {
- case (110):
-
- return (10);
-
- case (114):
-
- return (13);
-
- case (102):
-
- return (12);
-
- case (98):
-
- return (8);
-
- case (116):
-
- return (9);
-
- case (118):
-
- return (11);
-
- case (120):
-
- hexValue = this.readHex((2));
- break;
-
- case (117):
-
- if (this._maybeEatChar((123))) {
- hexValue = this.readHex();
- if (!this._maybeEatChar((125))) {
- return (-1);
- }
- else {
- break;
- }
- }
- else {
- hexValue = this.readHex((4));
- break;
- }
-
- default:
-
- return ch;
-
- }
- if (hexValue == (-1)) return (-1);
- if (hexValue < (55296) || hexValue > (57343) && hexValue <= (65535)) {
- return hexValue;
- }
- else if (hexValue <= (1114111)) {
- $globals.world.fatal("unicode values greater than 2 bytes not implemented yet");
- return (-1);
- }
- else {
- return (-1);
- }
-}
-TokenizerBase.prototype.finishDot = function() {
- if (TokenizerHelpers.isDigit(this._peekChar())) {
- this.eatDigits();
- return this.finishNumberExtra((62));
- }
- else {
- return this._finishToken((14));
- }
-}
-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._lang_index < this._text.length) {
- if (!TokenizerHelpers.isInterpIdentifierPart(this._text.charCodeAt(this._lang_index++))) {
- this._lang_index--;
- break;
- }
- }
- }
- else {
- while (this._lang_index < this._text.length) {
- if (!TokenizerHelpers.isIdentifierPart(this._text.charCodeAt(this._lang_index++))) {
- this._lang_index--;
- break;
- }
- }
- }
- var kind = this.getIdentifierKind();
- if (kind == (70)) {
- return this._finishToken((70));
- }
- else {
- return this._finishToken(kind);
- }
-}
-// ********** Code for Tokenizer **************
-$inherits(Tokenizer, TokenizerBase);
-function Tokenizer(source, skipWhitespace, index) {
- TokenizerBase.call(this, source, skipWhitespace, index);
-}
-Tokenizer.prototype.next = function() {
- this._startIndex = this._lang_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));
-
- 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));
- }
- else {
- return this._finishToken((49));
- }
- }
- else {
- return this._finishToken((19));
- }
-
- case (34):
-
- return this.finishString((34));
-
- case (35):
-
- if (this._maybeEatChar((33))) {
- return this.finishHashBang();
- }
- else {
- return this._finishToken((12));
- }
-
- 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));
- }
- else {
- return this._finishToken((47));
- }
-
- case (38):
-
- if (this._maybeEatChar((38))) {
- return this._finishToken((35));
- }
- else if (this._maybeEatChar((61))) {
- return this._finishToken((23));
- }
- else {
- return this._finishToken((38));
- }
-
- case (39):
-
- return this.finishString((39));
-
- case (40):
-
- return this._finishToken((2));
-
- case (41):
-
- return this._finishToken((3));
-
- case (42):
-
- if (this._maybeEatChar((61))) {
- return this._finishToken((29));
- }
- else {
- return this._finishToken((44));
- }
-
- case (43):
-
- if (this._maybeEatChar((43))) {
- return this._finishToken((16));
- }
- else if (this._maybeEatChar((61))) {
- return this._finishToken((27));
- }
- else {
- return this._finishToken((42));
- }
-
- case (44):
-
- return this._finishToken((11));
-
- case (45):
-
- if (this._maybeEatChar((45))) {
- return this._finishToken((17));
- }
- else if (this._maybeEatChar((61))) {
- return this._finishToken((28));
- }
- else {
- return this._finishToken((43));
- }
-
- case (46):
-
- if (this._maybeEatChar((46))) {
- if (this._maybeEatChar((46))) {
- return this._finishToken((15));
- }
- 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));
- }
- else {
- return this._finishToken((45));
- }
-
- 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));
-
- case (59):
-
- return this._finishToken((10));
-
- case (60):
-
- if (this._maybeEatChar((60))) {
- if (this._maybeEatChar((61))) {
- return this._finishToken((24));
- }
- else {
- return this._finishToken((39));
- }
- }
- else if (this._maybeEatChar((61))) {
- return this._finishToken((54));
- }
- else {
- return this._finishToken((52));
- }
-
- case (61):
-
- if (this._maybeEatChar((61))) {
- if (this._maybeEatChar((61))) {
- return this._finishToken((50));
- }
- else {
- return this._finishToken((48));
- }
- }
- else if (this._maybeEatChar((62))) {
- return this._finishToken((9));
- }
- else {
- return this._finishToken((20));
- }
-
- case (62):
-
- if (this._maybeEatChar((61))) {
- return this._finishToken((55));
- }
- else if (this._maybeEatChar((62))) {
- if (this._maybeEatChar((61))) {
- return this._finishToken((25));
- }
- else if (this._maybeEatChar((62))) {
- if (this._maybeEatChar((61))) {
- return this._finishToken((26));
- }
- else {
- return this._finishToken((41));
- }
- }
- else {
- return this._finishToken((40));
- }
- }
- else {
- return this._finishToken((53));
- }
-
- case (63):
-
- return this._finishToken((33));
-
- 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));
- }
- else {
- return this._finishToken((56));
- }
- }
- else {
- return this._finishToken((4));
- }
-
- case (93):
-
- return this._finishToken((5));
-
- case (94):
-
- if (this._maybeEatChar((61))) {
- return this._finishToken((22));
- }
- else {
- return this._finishToken((37));
- }
-
- case (123):
-
- return this._finishOpenBrace();
-
- case (124):
-
- if (this._maybeEatChar((61))) {
- return this._finishToken((21));
- }
- else if (this._maybeEatChar((124))) {
- return this._finishToken((34));
- }
- else {
- return this._finishToken((36));
- }
-
- case (125):
-
- return this._finishCloseBrace();
-
- case (126):
-
- if (this._maybeEatChar((47))) {
- if (this._maybeEatChar((61))) {
- return this._finishToken((31));
- }
- else {
- return this._finishToken((46));
- }
- }
- else {
- return this._finishToken((18));
- }
-
- 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;
- var ch;
- switch ($sub$(this._lang_index, i0)) {
- case (2):
-
- ch = this._text.charCodeAt(i0);
- if (ch == (100)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (111)) return (95);
- }
- else if (ch == (105)) {
- ch = this._text.charCodeAt($add$(i0, (1)));
- if (ch == (102)) {
- return (102);
- }
- else if (ch == (110)) {
- return (103);
- }
- else if (ch == (115)) {
- return (104);
- }
- }
- return (70);
-
- case (3):
-
- ch = this._text.charCodeAt(i0);
- if (ch == (102)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (111) && this._text.charCodeAt($add$(i0, (2))) == (114)) return (101);
- }
- else if (ch == (103)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (101) && this._text.charCodeAt($add$(i0, (2))) == (116)) return (75);
- }
- else if (ch == (110)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (101) && this._text.charCodeAt($add$(i0, (2))) == (119)) return (105);
- }
- else if (ch == (115)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (101) && this._text.charCodeAt($add$(i0, (2))) == (116)) return (83);
- }
- else if (ch == (116)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (114) && this._text.charCodeAt($add$(i0, (2))) == (121)) return (113);
- }
- else if (ch == (118)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (97) && this._text.charCodeAt($add$(i0, (2))) == (114)) return (114);
- }
- return (70);
-
- case (4):
-
- ch = this._text.charCodeAt(i0);
- if (ch == (99)) {
- ch = this._text.charCodeAt($add$(i0, (1)));
- if (ch == (97)) {
- ch = this._text.charCodeAt($add$(i0, (2)));
- if (ch == (108)) {
- if (this._text.charCodeAt($add$(i0, (3))) == (108)) return (73);
- }
- else if (ch == (115)) {
- if (this._text.charCodeAt($add$(i0, (3))) == (101)) return (89);
- }
- }
- }
- else if (ch == (101)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (108) && this._text.charCodeAt($add$(i0, (2))) == (115) && this._text.charCodeAt($add$(i0, (3))) == (101)) return (96);
- }
- else if (ch == (110)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (117) && this._text.charCodeAt($add$(i0, (2))) == (108) && this._text.charCodeAt($add$(i0, (3))) == (108)) return (106);
- }
- else if (ch == (116)) {
- ch = this._text.charCodeAt($add$(i0, (1)));
- if (ch == (104)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (105) && this._text.charCodeAt($add$(i0, (3))) == (115)) return (110);
- }
- else if (ch == (114)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (117) && this._text.charCodeAt($add$(i0, (3))) == (101)) return (112);
- }
- }
- else if (ch == (118)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (111) && this._text.charCodeAt($add$(i0, (2))) == (105) && this._text.charCodeAt($add$(i0, (3))) == (100)) return (115);
- }
- return (70);
-
- case (5):
-
- ch = this._text.charCodeAt(i0);
- if (ch == (97)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (119) && this._text.charCodeAt($add$(i0, (2))) == (97) && this._text.charCodeAt($add$(i0, (3))) == (105) && this._text.charCodeAt($add$(i0, (4))) == (116)) return (87);
- }
- else if (ch == (98)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (114) && this._text.charCodeAt($add$(i0, (2))) == (101) && this._text.charCodeAt($add$(i0, (3))) == (97) && this._text.charCodeAt($add$(i0, (4))) == (107)) return (88);
- }
- else if (ch == (99)) {
- ch = this._text.charCodeAt($add$(i0, (1)));
- if (ch == (97)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (116) && this._text.charCodeAt($add$(i0, (3))) == (99) && this._text.charCodeAt($add$(i0, (4))) == (104)) return (90);
- }
- else if (ch == (108)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (97) && this._text.charCodeAt($add$(i0, (3))) == (115) && this._text.charCodeAt($add$(i0, (4))) == (115)) return (91);
- }
- else if (ch == (111)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (110) && this._text.charCodeAt($add$(i0, (3))) == (115) && this._text.charCodeAt($add$(i0, (4))) == (116)) return (92);
- }
- }
- else if (ch == (102)) {
- ch = this._text.charCodeAt($add$(i0, (1)));
- if (ch == (97)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (108) && this._text.charCodeAt($add$(i0, (3))) == (115) && this._text.charCodeAt($add$(i0, (4))) == (101)) return (98);
- }
- else if (ch == (105)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (110) && this._text.charCodeAt($add$(i0, (3))) == (97) && this._text.charCodeAt($add$(i0, (4))) == (108)) return (99);
- }
- }
- else if (ch == (115)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (117) && this._text.charCodeAt($add$(i0, (2))) == (112) && this._text.charCodeAt($add$(i0, (3))) == (101) && this._text.charCodeAt($add$(i0, (4))) == (114)) return (108);
- }
- else if (ch == (116)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (104) && this._text.charCodeAt($add$(i0, (2))) == (114) && this._text.charCodeAt($add$(i0, (3))) == (111) && this._text.charCodeAt($add$(i0, (4))) == (119)) return (111);
- }
- else if (ch == (119)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (104) && this._text.charCodeAt($add$(i0, (2))) == (105) && this._text.charCodeAt($add$(i0, (3))) == (108) && this._text.charCodeAt($add$(i0, (4))) == (101)) return (116);
- }
- return (70);
-
- case (6):
-
- ch = this._text.charCodeAt(i0);
- if (ch == (97)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (115) && this._text.charCodeAt($add$(i0, (2))) == (115) && this._text.charCodeAt($add$(i0, (3))) == (101) && this._text.charCodeAt($add$(i0, (4))) == (114) && this._text.charCodeAt($add$(i0, (5))) == (116)) return (72);
- }
- else if (ch == (105)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (109) && this._text.charCodeAt($add$(i0, (2))) == (112) && this._text.charCodeAt($add$(i0, (3))) == (111) && this._text.charCodeAt($add$(i0, (4))) == (114) && this._text.charCodeAt($add$(i0, (5))) == (116)) return (77);
- }
- else if (ch == (110)) {
- ch = this._text.charCodeAt($add$(i0, (1)));
- if (ch == (97)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (116) && this._text.charCodeAt($add$(i0, (3))) == (105) && this._text.charCodeAt($add$(i0, (4))) == (118) && this._text.charCodeAt($add$(i0, (5))) == (101)) return (80);
- }
- else if (ch == (101)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (103) && this._text.charCodeAt($add$(i0, (3))) == (97) && this._text.charCodeAt($add$(i0, (4))) == (116) && this._text.charCodeAt($add$(i0, (5))) == (101)) return (81);
- }
- }
- else if (ch == (114)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (101) && this._text.charCodeAt($add$(i0, (2))) == (116) && this._text.charCodeAt($add$(i0, (3))) == (117) && this._text.charCodeAt($add$(i0, (4))) == (114) && this._text.charCodeAt($add$(i0, (5))) == (110)) return (107);
- }
- else if (ch == (115)) {
- ch = this._text.charCodeAt($add$(i0, (1)));
- if (ch == (111)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (117) && this._text.charCodeAt($add$(i0, (3))) == (114) && this._text.charCodeAt($add$(i0, (4))) == (99) && this._text.charCodeAt($add$(i0, (5))) == (101)) return (84);
- }
- else if (ch == (116)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (97) && this._text.charCodeAt($add$(i0, (3))) == (116) && this._text.charCodeAt($add$(i0, (4))) == (105) && this._text.charCodeAt($add$(i0, (5))) == (99)) return (85);
- }
- else if (ch == (119)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (105) && this._text.charCodeAt($add$(i0, (3))) == (116) && this._text.charCodeAt($add$(i0, (4))) == (99) && this._text.charCodeAt($add$(i0, (5))) == (104)) return (109);
- }
- }
- return (70);
-
- case (7):
-
- ch = this._text.charCodeAt(i0);
- if (ch == (100)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (101) && this._text.charCodeAt($add$(i0, (2))) == (102) && this._text.charCodeAt($add$(i0, (3))) == (97) && this._text.charCodeAt($add$(i0, (4))) == (117) && this._text.charCodeAt($add$(i0, (5))) == (108) && this._text.charCodeAt($add$(i0, (6))) == (116)) return (94);
- }
- else if (ch == (101)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (120) && this._text.charCodeAt($add$(i0, (2))) == (116) && this._text.charCodeAt($add$(i0, (3))) == (101) && this._text.charCodeAt($add$(i0, (4))) == (110) && this._text.charCodeAt($add$(i0, (5))) == (100) && this._text.charCodeAt($add$(i0, (6))) == (115)) return (97);
- }
- else if (ch == (102)) {
- ch = this._text.charCodeAt($add$(i0, (1)));
- if (ch == (97)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (99) && this._text.charCodeAt($add$(i0, (3))) == (116) && this._text.charCodeAt($add$(i0, (4))) == (111) && this._text.charCodeAt($add$(i0, (5))) == (114) && this._text.charCodeAt($add$(i0, (6))) == (121)) return (74);
- }
- else if (ch == (105)) {
- if (this._text.charCodeAt($add$(i0, (2))) == (110) && this._text.charCodeAt($add$(i0, (3))) == (97) && this._text.charCodeAt($add$(i0, (4))) == (108) && this._text.charCodeAt($add$(i0, (5))) == (108) && this._text.charCodeAt($add$(i0, (6))) == (121)) return (100);
- }
- }
- else if (ch == (108)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (105) && this._text.charCodeAt($add$(i0, (2))) == (98) && this._text.charCodeAt($add$(i0, (3))) == (114) && this._text.charCodeAt($add$(i0, (4))) == (97) && this._text.charCodeAt($add$(i0, (5))) == (114) && this._text.charCodeAt($add$(i0, (6))) == (121)) return (79);
- }
- else if (ch == (116)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (121) && this._text.charCodeAt($add$(i0, (2))) == (112) && this._text.charCodeAt($add$(i0, (3))) == (101) && this._text.charCodeAt($add$(i0, (4))) == (100) && this._text.charCodeAt($add$(i0, (5))) == (101) && this._text.charCodeAt($add$(i0, (6))) == (102)) return (86);
- }
- return (70);
-
- case (8):
-
- ch = this._text.charCodeAt(i0);
- if (ch == (97)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (98) && this._text.charCodeAt($add$(i0, (2))) == (115) && this._text.charCodeAt($add$(i0, (3))) == (116) && this._text.charCodeAt($add$(i0, (4))) == (114) && this._text.charCodeAt($add$(i0, (5))) == (97) && this._text.charCodeAt($add$(i0, (6))) == (99) && this._text.charCodeAt($add$(i0, (7))) == (116)) return (71);
- }
- else if (ch == (99)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (111) && this._text.charCodeAt($add$(i0, (2))) == (110) && this._text.charCodeAt($add$(i0, (3))) == (116) && this._text.charCodeAt($add$(i0, (4))) == (105) && this._text.charCodeAt($add$(i0, (5))) == (110) && this._text.charCodeAt($add$(i0, (6))) == (117) && this._text.charCodeAt($add$(i0, (7))) == (101)) return (93);
- }
- else if (ch == (111)) {
- if (this._text.charCodeAt($add$(i0, (1))) == (112) && this._text.charCodeAt($add$(i0, (2))) == (101) && this._text.charCodeAt($add$(i0, (3))) == (114) && this._text.charCodeAt($add$(i0, (4))) == (97) && this._text.charCodeAt($add$(i0, (5))) == (116) && this._text.charCodeAt($add$(i0, (6))) == (111) && this._text.charCodeAt($add$(i0, (7))) == (114)) return (82);
- }
- return (70);
-
- case (9):
-
- if (this._text.charCodeAt(i0) == (105) && this._text.charCodeAt($add$(i0, (1))) == (110) && this._text.charCodeAt($add$(i0, (2))) == (116) && this._text.charCodeAt($add$(i0, (3))) == (101) && this._text.charCodeAt($add$(i0, (4))) == (114) && this._text.charCodeAt($add$(i0, (5))) == (102) && this._text.charCodeAt($add$(i0, (6))) == (97) && this._text.charCodeAt($add$(i0, (7))) == (99) && this._text.charCodeAt($add$(i0, (8))) == (101)) return (78);
- return (70);
-
- case (10):
-
- if (this._text.charCodeAt(i0) == (105) && this._text.charCodeAt($add$(i0, (1))) == (109) && this._text.charCodeAt($add$(i0, (2))) == (112) && this._text.charCodeAt($add$(i0, (3))) == (108) && this._text.charCodeAt($add$(i0, (4))) == (101) && this._text.charCodeAt($add$(i0, (5))) == (109) && this._text.charCodeAt($add$(i0, (6))) == (101) && this._text.charCodeAt($add$(i0, (7))) == (110) && this._text.charCodeAt($add$(i0, (8))) == (116) && this._text.charCodeAt($add$(i0, (9))) == (115)) return (76);
- return (70);
-
- default:
-
- return (70);
-
- }
-}
-// ********** Code for TokenKind **************
-function TokenKind() {}
-TokenKind.kindToString = function(kind) {
- switch (kind) {
- case (1):
-
- return "end of file";
-
- case (2):
-
- return "(";
-
- case (3):
-
- return ")";
-
- case (4):
-
- return "[";
-
- case (5):
-
- return "]";
-
- case (6):
-
- return "{";
-
- case (7):
-
- return "}";
-
- case (8):
-
- return ":";
-
- case (9):
-
- return "=>";
-
- case (10):
-
- return ";";
-
- case (11):
-
- return ",";
-
- case (12):
-
- return "#";
-
- case (13):
-
- return "#!";
-
- case (14):
-
- return ".";
-
- case (15):
-
- return "...";
-
- case (16):
-
- return "++";
-
- case (17):
-
- return "--";
-
- case (18):
-
- return "~";
-
- case (19):
-
- return "!";
-
- case (20):
-
- return "=";
-
- case (21):
-
- return "|=";
-
- case (22):
-
- return "^=";
-
- case (23):
-
- return "&=";
-
- case (24):
-
- return "<<=";
-
- case (25):
-
- return ">>=";
-
- case (26):
-
- return ">>>=";
-
- case (27):
-
- return "+=";
-
- case (28):
-
- return "-=";
-
- case (29):
-
- return "*=";
-
- case (30):
-
- return "/=";
-
- case (31):
-
- return "~/=";
-
- case (32):
-
- return "%=";
-
- case (33):
-
- return "?";
-
- case (34):
-
- return "||";
-
- case (35):
-
- return "&&";
-
- case (36):
-
- return "|";
-
- case (37):
-
- return "^";
-
- case (38):
-
- return "&";
-
- case (39):
-
- return "<<";
-
- case (40):
-
- return ">>";
-
- case (41):
-
- return ">>>";
-
- case (42):
-
- return "+";
-
- case (43):
-
- return "-";
-
- case (44):
-
- return "*";
-
- case (45):
-
- return "/";
-
- case (46):
-
- return "~/";
-
- case (47):
-
- return "%";
-
- case (48):
-
- return "==";
-
- case (49):
-
- return "!=";
-
- case (50):
-
- return "===";
-
- case (51):
-
- return "!==";
-
- case (52):
-
- return "<";
-
- case (53):
-
- return ">";
-
- case (54):
-
- return "<=";
-
- case (55):
-
- return ">=";
-
- case (56):
-
- return "[]";
-
- case (57):
-
- return "[]=";
-
- case (58):
-
- return "string";
-
- case (59):
-
- return "string part";
-
- case (60):
-
- return "integer";
-
- case (61):
-
- return "hex integer";
-
- case (62):
-
- return "double";
-
- case (63):
-
- return "whitespace";
-
- case (64):
-
- return "comment";
-
- case (65):
-
- return "error";
-
- case (66):
-
- return "incomplete string";
-
- case (67):
-
- return "incomplete comment";
-
- case (68):
-
- return "incomplete multiline string dq";
-
- case (69):
-
- return "incomplete multiline string sq";
-
- case (70):
-
- return "identifier";
-
- case (71):
-
- return "pseudo-keyword 'abstract'";
-
- case (72):
-
- return "pseudo-keyword 'assert'";
-
- case (73):
-
- return "pseudo-keyword 'call'";
-
- case (74):
-
- return "pseudo-keyword 'factory'";
-
- case (75):
-
- return "pseudo-keyword 'get'";
-
- case (76):
-
- return "pseudo-keyword 'implements'";
-
- case (77):
-
- return "pseudo-keyword 'import'";
-
- case (78):
-
- return "pseudo-keyword 'interface'";
-
- case (79):
-
- return "pseudo-keyword 'library'";
-
- case (80):
-
- return "pseudo-keyword 'native'";
-
- case (81):
-
- return "pseudo-keyword 'negate'";
-
- case (82):
-
- return "pseudo-keyword 'operator'";
-
- case (83):
-
- return "pseudo-keyword 'set'";
-
- case (84):
-
- return "pseudo-keyword 'source'";
-
- case (85):
-
- return "pseudo-keyword 'static'";
-
- case (86):
-
- return "pseudo-keyword 'typedef'";
-
- case (87):
-
- return "keyword 'await'";
-
- case (88):
-
- return "keyword 'break'";
-
- case (89):
-
- return "keyword 'case'";
-
- case (90):
-
- return "keyword 'catch'";
-
- case (91):
-
- return "keyword 'class'";
-
- case (92):
-
- return "keyword 'const'";
-
- case (93):
-
- return "keyword 'continue'";
-
- case (94):
-
- return "keyword 'default'";
-
- case (95):
-
- return "keyword 'do'";
-
- case (96):
-
- return "keyword 'else'";
-
- case (97):
-
- return "keyword 'extends'";
-
- case (98):
-
- return "keyword 'false'";
-
- case (99):
-
- return "keyword 'final'";
-
- case (100):
-
- return "keyword 'finally'";
-
- case (101):
-
- return "keyword 'for'";
-
- case (102):
-
- return "keyword 'if'";
-
- case (103):
-
- return "keyword 'in'";
-
- case (104):
-
- return "keyword 'is'";
-
- case (105):
-
- return "keyword 'new'";
-
- case (106):
-
- return "keyword 'null'";
-
- case (107):
-
- return "keyword 'return'";
-
- case (108):
-
- return "keyword 'super'";
-
- case (109):
-
- return "keyword 'switch'";
-
- case (110):
-
- return "keyword 'this'";
-
- case (111):
-
- return "keyword 'throw'";
-
- case (112):
-
- return "keyword 'true'";
-
- case (113):
-
- return "keyword 'try'";
-
- case (114):
-
- return "keyword 'var'";
-
- case (115):
-
- return "keyword 'void'";
-
- case (116):
-
- return "keyword 'while'";
-
- default:
-
- return $add$($add$("TokenKind(", kind.toString$0()), ")");
-
- }
-}
-TokenKind.isIdentifier = function(kind) {
- return kind >= (70) && kind < (87);
-}
-TokenKind.infixPrecedence = function(kind) {
- switch (kind) {
- case (20):
-
- return (2);
-
- case (21):
-
- return (2);
-
- case (22):
-
- return (2);
-
- case (23):
-
- return (2);
-
- case (24):
-
- return (2);
-
- case (25):
-
- return (2);
-
- case (26):
-
- return (2);
-
- case (27):
-
- return (2);
-
- case (28):
-
- return (2);
-
- case (29):
-
- return (2);
-
- case (30):
-
- return (2);
-
- case (31):
-
- return (2);
-
- case (32):
-
- return (2);
-
- case (33):
-
- return (3);
-
- case (34):
-
- return (4);
-
- case (35):
-
- return (5);
-
- case (36):
-
- return (6);
-
- case (37):
-
- return (7);
-
- case (38):
-
- return (8);
-
- case (39):
-
- return (11);
-
- case (40):
-
- return (11);
-
- case (41):
-
- return (11);
-
- case (42):
-
- return (12);
-
- case (43):
-
- return (12);
-
- case (44):
-
- return (13);
-
- case (45):
-
- return (13);
-
- case (46):
-
- return (13);
-
- case (47):
-
- return (13);
-
- case (48):
-
- return (9);
-
- case (49):
-
- return (9);
-
- case (50):
-
- return (9);
-
- case (51):
-
- return (9);
-
- case (52):
-
- return (10);
-
- case (53):
-
- return (10);
-
- case (54):
-
- return (10);
-
- case (55):
-
- return (10);
-
- case (104):
-
- 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):
-
- return ":bit_not";
-
- case (36):
-
- return ":bit_or";
-
- case (37):
-
- return ":bit_xor";
-
- case (38):
-
- return ":bit_and";
-
- case (39):
-
- return ":shl";
-
- case (40):
-
- return ":sar";
-
- case (41):
-
- return ":shr";
-
- case (42):
-
- return ":add";
-
- case (43):
-
- return ":sub";
-
- case (44):
-
- return ":mul";
-
- case (45):
-
- return ":div";
-
- case (46):
-
- return ":truncdiv";
-
- case (47):
-
- return ":mod";
-
- case (48):
-
- return ":eq";
-
- case (52):
-
- return ":lt";
-
- case (53):
-
- return ":gt";
-
- case (54):
-
- return ":lte";
-
- case (55):
-
- return ":gte";
-
- case (56):
-
- return ":index";
-
- case (57):
-
- return ":setindex";
-
- }
-}
-TokenKind.kindFromAssign = function(kind) {
- if (kind == (20)) return (0);
- if (kind > (20) && kind <= (32)) {
- return kind + (15);
- }
- 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;
- 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))) {
- $throw(new IncompleteSourceException(this._previousToken));
- }
- else if (this._maybeEat((1))) {
- this._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, (87)));
-}
-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))) return;
- this._eat((10));
-}
-Parser.prototype._errorExpected = function(expected) {
- if (this.throwOnIncomplete) this.isPrematureEndOfFile();
- var tok = this._lang_next();
- if ((tok instanceof ErrorToken) && tok.get$message() != null) {
- this._error(tok.get$message(), tok.get$span());
- }
- else {
- this._error(("expected " + expected + ", but found " + tok), tok.get$span());
- }
-}
-Parser.prototype._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));
- while (true) {
- var tok = this._lang_next();
- if (tok.get$kind() == (6)) {
- depth += (1);
- }
- else if (tok.get$kind() == (7)) {
- depth -= (1);
- if (depth == (0)) return;
- }
- else if (tok.get$kind() == (1)) {
- this._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));
- while (this._peekKind((12))) {
- ret.add(this.directive());
- }
- this._recover = false;
- while (!this._maybeEat((1))) {
- ret.add(this.topLevelDefinition());
- }
- this._recover = false;
- return ret;
-}
-Parser.prototype.directive = function() {
- var start = this._peekToken.start;
- this._eat((12));
- 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 (91):
-
- return this.classDefinition((91));
-
- case (78):
-
- return this.classDefinition((78));
-
- case (86):
-
- return this.functionTypeAlias();
-
- default:
-
- return this.declaration(true);
-
- }
-}
-Parser.prototype.classDefinition = function(kind) {
- var start = this._peekToken.start;
- this._eat(kind);
- var name = this.identifierForType();
- var typeParams = null;
- if (this._peekKind((52))) {
- typeParams = this.typeParameters();
- }
- var _extends = null;
- if (this._maybeEat((97))) {
- _extends = this.typeList();
- }
- var _implements = null;
- if (this._maybeEat((76))) {
- _implements = this.typeList();
- }
- var _native = null;
- if (this._maybeEat((80))) {
- _native = this.maybeStringLiteral();
- if ($ne$(_native)) _native = new NativeType(_native);
- }
- var oldFactory = this._maybeEat((74));
- var defaultType = null;
- if (oldFactory || this._maybeEat((94))) {
- if (oldFactory) {
- $globals.world.warning("factory no longer supported, use \"default\" instead", this._previousToken.get$span());
- }
- var baseType = this.nameTypeReference();
- var factTypeParams = null;
- if (this._peekKind((52))) {
- factTypeParams = this.typeParameters();
- }
- defaultType = new DefaultTypeReference(oldFactory, baseType, factTypeParams, this._makeSpan(baseType.get$span().start));
- }
- var body = [];
- if (this._maybeEat((6))) {
- while (!this._maybeEat((7))) {
- body.add(this.declaration(true));
- if (this._recover) {
- if (!this._recoverTo((7), (10))) break;
- this._maybeEat((10));
- }
- }
- }
- else {
- this._errorExpected("block starting with \"{\" or \";\"");
- }
- return new TypeDefinition(kind == (91), name, typeParams, _extends, _implements, _native, defaultType, body, this._makeSpan(start));
-}
-Parser.prototype.functionTypeAlias = function() {
- var start = this._peekToken.start;
- this._eat((86));
- var di = this.declaredIdentifier(false);
- var typeParams = null;
- if (this._peekKind((52))) {
- typeParams = this.typeParameters();
- }
- var formals = this.formalParameterList();
- this._eatSemicolon();
- var func = new FunctionDefinition(null, di.get$type(), di.get$name(), formals, 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(this.expression());
- }
- while (this._maybeEat((11)))
- this._inhibitLambda = false;
- return ret;
-}
-Parser.prototype.get$initializers = function() {
- return this.initializers.bind(this);
-}
-Parser.prototype.functionBody = function(inExpression) {
- var start = this._peekToken.start;
- if (this._maybeEat((9))) {
- var expr = this.expression();
- if (!inExpression) {
- this._eatSemicolon();
- }
- return new ReturnStatement(expr, this._makeSpan(start));
- }
- else if (this._peekKind((6))) {
- if (this.diet) {
- this._skipBlock();
- return new DietStatement(this._makeSpan(start));
- }
- else {
- return this.block();
- }
- }
- else if (!inExpression) {
- if (this._maybeEat((10))) {
- return null;
- }
- }
- this._error("Expected function body (neither { nor => found)");
-}
-Parser.prototype.finishField = function(start, modifiers, type, name, value) {
- var names = [name];
- var values = [value];
- while (this._maybeEat((11))) {
- names.add(this.identifier());
- if (this._maybeEat((20))) {
- values.add(this.expression());
- }
- else {
- values.add();
- }
- }
- this._eatSemicolon();
- return new VariableDefinition(modifiers, type, names, values, this._makeSpan(start));
-}
-Parser.prototype.finishDefinition = function(start, modifiers, di) {
- switch (this._peek()) {
- case (2):
-
- var formals = this.formalParameterList();
- var inits = null, native_ = null;
- if (this._maybeEat((8))) {
- inits = this.initializers();
- }
- if (this._maybeEat((80))) {
- native_ = this.maybeStringLiteral();
- if ($eq$(native_)) native_ = "";
- }
- var body = this.functionBody(false);
- if ($eq$(di.get$name())) {
- di.set$name(di.get$type().get$name());
- }
- return new FunctionDefinition(modifiers, di.get$type(), di.get$name(), formals, inits, native_, body, this._makeSpan(start));
-
- case (20):
-
- this._eat((20));
- var value = this.expression();
- return this.finishField(start, modifiers, di.get$type(), di.get$name(), value);
-
- case (11):
- case (10):
-
- return this.finishField(start, modifiers, 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((74))) {
- return this.factoryConstructorDeclaration();
- }
- var modifiers = this._readModifiers();
- return this.finishDefinition(start, modifiers, this.declaredIdentifier(includeOperators));
-}
-Parser.prototype.factoryConstructorDeclaration = function() {
- var start = this._peekToken.start;
- var factoryToken = this._lang_next();
- var names = [this.identifier()];
- while (this._maybeEat((14))) {
- names.add(this.identifier());
- }
- if (this._peekKind((52))) {
- var tp = this.typeParameters();
- $globals.world.warning("type parameters on factories are no longer supported, place them on the class instead", this._makeSpan(tp.$index((0)).get$span().start));
- }
- var name = null;
- var type = null;
- if (this._maybeEat((14))) {
- name = this.identifier();
- }
- else {
- if (names.get$length() > (1)) {
- name = names.removeLast();
- }
- else {
- name = new Identifier("", names.$index((0)).get$span());
- }
- }
- if (names.get$length() > (1)) {
- this._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, false, this._makeSpan(start));
- return this.finishDefinition(start, [factoryToken], di);
-}
-Parser.prototype.statement = function() {
- switch (this._peek()) {
- case (88):
-
- return this.breakStatement();
-
- case (93):
-
- return this.continueStatement();
-
- case (107):
-
- return this.returnStatement();
-
- case (111):
-
- return this.throwStatement();
-
- case (72):
-
- return this.assertStatement();
-
- case (116):
-
- return this.whileStatement();
-
- case (95):
-
- return this.doStatement();
-
- case (101):
-
- return this.forStatement();
-
- case (102):
-
- return this.ifStatement();
-
- case (109):
-
- return this.switchStatement();
-
- case (113):
-
- return this.tryStatement();
-
- case (6):
-
- return this.block();
-
- case (10):
-
- return this.emptyStatement();
-
- case (99):
-
- return this.declaration(false);
-
- case (114):
-
- return this.declaration(false);
-
- default:
-
- return this.finishExpressionAsStatement(this.expression());
-
- }
-}
-Parser.prototype.finishExpressionAsStatement = function(expr) {
- var start = expr.get$span().start;
- if (this._maybeEat((8))) {
- var label = this._makeLabel(expr);
- return new LabeledStatement(label, this.statement(), this._makeSpan(start));
- }
- if ((expr instanceof LambdaExpression)) {
- if (!(expr.get$func().body instanceof BlockStatement)) {
- this._eatSemicolon();
- expr.get$func().span = this._makeSpan(start);
- }
- return expr.get$func();
- }
- else if ((expr instanceof DeclaredIdentifier)) {
- var value = null;
- if (this._maybeEat((20))) {
- value = this.expression();
- }
- return this.finishField(start, null, expr.get$type(), expr.get$name(), value);
- }
- else if (this._isBin(expr, (20)) && ((expr.get$x() instanceof DeclaredIdentifier))) {
- var di = expr.get$x();
- return this.finishField(start, null, di.type, di.name, expr.get$y());
- }
- else if (this._isBin(expr, (52)) && this._maybeEat((11))) {
- 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))) {
- value = this.expression();
- }
- return this.finishField(expr.get$span().start, null, gt, name, value);
- }
- else {
- this._eatSemicolon();
- return new ExpressionStatement(expr, this._makeSpan(expr.get$span().start));
- }
-}
-Parser.prototype.testCondition = function() {
- this._eatLeftParen();
- var ret = this.expression();
- this._eat((3));
- return ret;
-}
-Parser.prototype.block = function() {
- var start = this._peekToken.start;
- this._eat((6));
- var stmts = [];
- while (!this._maybeEat((7))) {
- stmts.add(this.statement());
- if (this._recover && !this._recoverTo((7), (10))) break;
- }
- this._recover = false;
- return new BlockStatement(stmts, this._makeSpan(start));
-}
-Parser.prototype.emptyStatement = function() {
- var start = this._peekToken.start;
- this._eat((10));
- return new EmptyStatement(this._makeSpan(start));
-}
-Parser.prototype.ifStatement = function() {
- var start = this._peekToken.start;
- this._eat((102));
- var test = this.testCondition();
- var trueBranch = this.statement();
- var falseBranch = null;
- if (this._maybeEat((96))) {
- falseBranch = this.statement();
- }
- return new IfStatement(test, trueBranch, falseBranch, this._makeSpan(start));
-}
-Parser.prototype.whileStatement = function() {
- var start = this._peekToken.start;
- this._eat((116));
- 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));
- var body = this.statement();
- this._eat((116));
- 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((101));
- this._eatLeftParen();
- var init = this.forInitializerStatement(start);
- if ((init instanceof ForInStatement)) {
- return init;
- }
- var test = null;
- if (!this._maybeEat((10))) {
- test = this.expression();
- this._eatSemicolon();
- }
- var step = [];
- if (!this._maybeEat((3))) {
- step.add(this.expression());
- while (this._maybeEat((11))) {
- step.add(this.expression());
- }
- this._eat((3));
- }
- var body = this.statement();
- return new ForStatement(init, test, step, body, this._makeSpan(start));
-}
-Parser.prototype.forInitializerStatement = function(start) {
- if (this._maybeEat((10))) {
- return null;
- }
- else {
- var init = this.expression();
- if (this._peekKind((11)) && this._isBin(init, (52))) {
- this._eat((11));
- 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, false, this._makeSpan(init.get$span().start));
- }
- if (this._maybeEat((103))) {
- 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));
- var body = this.statement();
- return new ForInStatement(di, expr, body, this._makeSpan(start));
-}
-Parser.prototype.tryStatement = function() {
- var start = this._peekToken.start;
- this._eat((113));
- var body = this.block();
- var catches = [];
- while (this._peekKind((90))) {
- catches.add(this.catchNode());
- }
- var finallyBlock = null;
- if (this._maybeEat((100))) {
- finallyBlock = this.block();
- }
- return new TryStatement(body, catches, finallyBlock, this._makeSpan(start));
-}
-Parser.prototype.catchNode = function() {
- var start = this._peekToken.start;
- this._eat((90));
- this._eatLeftParen();
- var exc = this.declaredIdentifier(false);
- var trace = null;
- if (this._maybeEat((11))) {
- trace = this.declaredIdentifier(false);
- }
- this._eat((3));
- var body = this.block();
- return new CatchNode(exc, trace, body, this._makeSpan(start));
-}
-Parser.prototype.switchStatement = function() {
- var start = this._peekToken.start;
- this._eat((109));
- var test = this.testCondition();
- var cases = [];
- this._eat((6));
- while (!this._maybeEat((7))) {
- cases.add(this.caseNode());
- }
- return new SwitchStatement(test, cases, this._makeSpan(start));
-}
-Parser.prototype._peekCaseEnd = function() {
- var kind = this._peek();
- return $eq$(kind, (7)) || $eq$(kind, (89)) || $eq$(kind, (94));
-}
-Parser.prototype.caseNode = function() {
- var start = this._peekToken.start;
- var label = null;
- if (this._peekIdentifier()) {
- label = this.identifier();
- this._eat((8));
- }
- var cases = [];
- while (true) {
- if (this._maybeEat((89))) {
- cases.add(this.expression());
- this._eat((8));
- }
- else if (this._maybeEat((94))) {
- cases.add();
- this._eat((8));
- }
- else {
- break;
- }
- }
- if (cases.get$length() == (0)) {
- this._error("case or default");
- }
- var stmts = [];
- while (!this._peekCaseEnd()) {
- stmts.add(this.statement());
- if (this._recover && !this._recoverTo((7), (89), (94))) {
- break;
- }
- }
- return new CaseNode(label, cases, stmts, this._makeSpan(start));
-}
-Parser.prototype.returnStatement = function() {
- var start = this._peekToken.start;
- this._eat((107));
- var expr;
- if (this._maybeEat((10))) {
- 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((111));
- var expr;
- if (this._maybeEat((10))) {
- 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));
- this._eatLeftParen();
- var expr = this.expression();
- this._eat((3));
- this._eatSemicolon();
- return new AssertStatement(expr, this._makeSpan(start));
-}
-Parser.prototype.breakStatement = function() {
- var start = this._peekToken.start;
- this._eat((88));
- 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));
- 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(expr.get$name());
- }
- type.set$span(expr.get$span());
- return type;
- }
- else {
- this._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, false, this._makeSpan(type.get$span().start)));
-}
-Parser.prototype._fixAsType = function(x) {
- if (this._maybeEat((53))) {
- 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))) {
- type = this._finishTypeArguments(base, (0), [firstParam]);
- }
- else {
- this._eat((53));
- 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 ($gte$(prec, precedence)) {
- if (kind == (52) || kind == (53)) {
- if (this._isBin(x, (52))) {
- return this._fixAsType(x);
- }
- }
- var op = this._lang_next();
- if (op.get$kind() == (104)) {
- var isTrue = !this._maybeEat((19));
- 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 : $add$(prec, (1)));
- if (op.get$kind() == (33)) {
- this._eat((8));
- 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):
- case (43):
- case (19):
- case (18):
- case (16):
- case (17):
-
- 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((87))) {
- 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))) {
- label = new Identifier("...", this._makeSpan(start));
- }
- expr = this.expression();
- if ($eq$(label) && this._maybeEat((8))) {
- 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))) {
- do {
- args.add(this.argument());
- }
- while (this._maybeEat((11)))
- this._eat((3));
- }
- this._inhibitLambda = saved;
- return args;
-}
-Parser.prototype.finishPostfixExpression = function(expr) {
- switch (this._peek()) {
- case (2):
-
- return this.finishCallOrLambdaExpression(expr);
-
- case (4):
-
- this._eat((4));
- var index = this.expression();
- this._eat((5));
- return this.finishPostfixExpression(new IndexExpression(expr, index, this._makeSpan(expr.get$span().start)));
-
- case (14):
-
- this._eat((14));
- var name = this.identifier();
- var ret = new DotExpression(expr, name, this._makeSpan(expr.get$span().start));
- return this.finishPostfixExpression(ret);
-
- case (16):
- case (17):
-
- var tok = this._lang_next();
- return new PostfixExpression(expr, tok, this._makeSpan(expr.get$span().start));
-
- case (9):
- case (6):
-
- return expr;
-
- default:
-
- if (this._peekIdentifier()) {
- return this.finishPostfixExpression(new DeclaredIdentifier(this._makeType(expr), this.identifier(), false, this._makeSpan(expr.get$span().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._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().start)));
- }
-}
-Parser.prototype._isBin = function(expr, kind) {
- return (expr instanceof BinaryExpression) && expr.get$op().kind == kind;
-}
-Parser.prototype._makeLiteral = function(value) {
- return new LiteralExpression(value, value.span);
-}
-Parser.prototype.primary = function() {
- var start = this._peekToken.start;
- switch (this._peek()) {
- case (110):
-
- this._eat((110));
- return new ThisExpression(this._makeSpan(start));
-
- case (108):
-
- this._eat((108));
- return new SuperExpression(this._makeSpan(start));
-
- case (92):
-
- this._eat((92));
- if (this._peekKind((4)) || this._peekKind((56))) {
- return this.finishListLiteral(start, true, null);
- }
- else if (this._peekKind((6))) {
- return this.finishMapLiteral(start, true, null, null);
- }
- else if (this._peekKind((52))) {
- return this.finishTypedLiteral(start, true);
- }
- else {
- return this.finishNewExpression(start, true);
- }
-
- case (105):
-
- this._eat((105));
- return this.finishNewExpression(start, false);
-
- case (2):
-
- return this._parenOrLambda();
-
- case (4):
- case (56):
-
- return this.finishListLiteral(start, false, null);
-
- case (6):
-
- return this.finishMapLiteral(start, false, null, null);
-
- case (106):
-
- this._eat((106));
- return this._makeLiteral(Value.fromNull(this._makeSpan(start)));
-
- case (112):
-
- this._eat((112));
- return this._makeLiteral(Value.fromBool(true, this._makeSpan(start)));
-
- case (98):
-
- this._eat((98));
- return this._makeLiteral(Value.fromBool(false, this._makeSpan(start)));
-
- case (61):
-
- var t = this._lang_next();
- return this._makeLiteral(Value.fromInt(t.get$value(), t.get$span()));
-
- case (60):
-
- var t = this._lang_next();
- return this._makeLiteral(Value.fromInt(Math.parseInt(t.get$text()), t.get$span()));
-
- case (62):
-
- var t = this._lang_next();
- return this._makeLiteral(Value.fromDouble(Math.parseDouble(t.get$text()), t.get$span()));
-
- case (58):
- case (59):
-
- return this.adjacentStrings();
-
- case (52):
-
- return this.finishTypedLiteral(start, false);
-
- case (115):
- case (114):
- case (99):
-
- return this.declaredIdentifier(false);
-
- default:
-
- if (!this._peekIdentifier()) {
- this._errorExpected("expression");
- }
- return new VarExpression(this.identifier(), this._makeSpan(start));
-
- }
-}
-Parser.prototype.adjacentStrings = function() {
- var start = this._peekToken.start;
- var strings = [];
- while (this._peek() == (58) || this._peek() == (59)) {
- var part = null;
- if (this._peek() == (58)) {
- var t = this._lang_next();
- part = this._makeLiteral(Value.fromString(t.get$value(), t.get$span()));
- }
- else {
- part = this.stringInterpolation();
- }
- strings.add(part);
- }
- if (strings.get$length() == (1)) {
- return strings.$index((0));
- }
- else {
- return new StringConcatExpression(strings, this._makeSpan(start));
- }
-}
-Parser.prototype.stringInterpolation = function() {
- var start = this._peekToken.start;
- var pieces = new Array();
- var startQuote = null, endQuote = null;
- while (this._peekKind((59))) {
- var token = this._lang_next();
- pieces.add(this._makeLiteral(Value.fromString(token.get$value(), token.get$span())));
- if (this._maybeEat((6))) {
- pieces.add(this.expression());
- this._eat((7));
- }
- else if (this._maybeEat((110))) {
- pieces.add(new ThisExpression(this._previousToken.get$span()));
- }
- else {
- var id = this.identifier();
- pieces.add(new VarExpression(id, id.get$span()));
- }
- }
- var tok = this._lang_next();
- if (tok.get$kind() != (58)) {
- this._errorExpected("interpolated string");
- }
- pieces.add(this._makeLiteral(Value.fromString(tok.get$value(), tok.get$span())));
- var span = this._makeSpan(start);
- return new StringInterpExpression(pieces, span);
-}
-Parser.prototype.maybeStringLiteral = function() {
- var kind = this._peek();
- if ($eq$(kind, (58))) {
- var t = this._lang_next();
- return t.get$value();
- }
- else if ($eq$(kind, (59))) {
- this._lang_next();
- this._errorExpected("string literal, but found interpolated string start");
- }
- 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, 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));
- 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) || after.kind == (6);
-}
-Parser.prototype._eatLeftParen = function() {
- this._eat((2));
- this._afterParensIndex++;
-}
-Parser.prototype._peekAfterCloseParen = function() {
- if (this._afterParensIndex < this._afterParens.get$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(after);
- this.tokenizer = new DivertedTokenSource(tokens, this, this.tokenizer);
- this._lang_next();
- return after;
-}
-Parser.prototype._lookaheadAfterParens = function(tokens) {
- var saved = this._afterParens.get$length();
- this._afterParens.add();
- while (true) {
- var token = this._lang_next();
- tokens.add(token);
- var kind = token.kind;
- if (kind == (3) || kind == (1)) {
- this._afterParens.$setindex(saved, this._peekToken);
- return;
- }
- else if (kind == (2)) {
- this._lookaheadAfterParens(tokens);
- }
- }
-}
-Parser.prototype._typeAsIdentifier = function(type) {
- if ($eq$(type.get$name().get$name(), "void")) {
- this._errorExpected(("identifer, but found \"" + type.get$name().get$name() + "\""));
- }
- return type.get$name();
-}
-Parser.prototype._specialIdentifier = function(includeOperators) {
- var start = this._peekToken.start;
- var name;
- switch (this._peek()) {
- case (15):
-
- this._eat((15));
- this._error("rest no longer supported", this._previousToken.get$span());
- name = this.identifier().get$name();
- break;
-
- case (110):
-
- this._eat((110));
- this._eat((14));
- name = ("this." + this.identifier().get$name());
- break;
-
- case (75):
-
- if (!includeOperators) return null;
- this._eat((75));
- if (this._peekIdentifier()) {
- name = ("get:" + this.identifier().get$name());
- }
- else {
- name = "get";
- }
- break;
-
- case (83):
-
- if (!includeOperators) return null;
- this._eat((83));
- if (this._peekIdentifier()) {
- name = ("set:" + this.identifier().get$name());
- }
- else {
- name = "set";
- }
- break;
-
- case (82):
-
- if (!includeOperators) return null;
- this._eat((82));
- var kind = this._peek();
- if ($eq$(kind, (81))) {
- 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);
- var isFinal = false;
- if ($eq$(name)) {
- myType = this.type((0));
- name = this._specialIdentifier(includeOperators);
- if ($eq$(name)) {
- if (this._peekIdentifier()) {
- name = this.identifier();
- }
- else if ((myType instanceof NameTypeReference) && myType.get$names() == null) {
- name = this._typeAsIdentifier(myType);
- isFinal = myType.get$isFinal();
- myType = null;
- }
- else {
- }
- }
- }
- return new DeclaredIdentifier(myType, name, isFinal, this._makeSpan(start));
-}
-Parser.prototype.finishNewExpression = function(start, isConst) {
- var type = this.type((0));
- var name = null;
- if (this._maybeEat((14))) {
- name = this.identifier();
- }
- var args = this.arguments();
- return new NewExpression(isConst, type, name, args, this._makeSpan(start));
-}
-Parser.prototype.finishListLiteral = function(start, isConst, itemType) {
- if (this._maybeEat((56))) {
- return new ListExpression(isConst, itemType, [], this._makeSpan(start));
- }
- var values = [];
- this._eat((4));
- while (!this._maybeEat((5))) {
- values.add(this.expression());
- if (this._recover && !this._recoverTo((5), (11))) break;
- if (!this._maybeEat((11))) {
- this._eat((5));
- break;
- }
- }
- return new ListExpression(isConst, itemType, values, this._makeSpan(start));
-}
-Parser.prototype.finishMapLiteral = function(start, isConst, keyType, valueType) {
- var items = [];
- this._eat((6));
- while (!this._maybeEat((7))) {
- items.add(this.expression());
- this._eat((8));
- items.add(this.expression());
- if (this._recover && !this._recoverTo((7), (11))) break;
- if (!this._maybeEat((11))) {
- this._eat((7));
- break;
- }
- }
- return new MapExpression(isConst, keyType, valueType, 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));
- var typeArgs = genericType.get$typeArguments();
- if (this._peekKind((4)) || this._peekKind((56))) {
- if (typeArgs.get$length() != (1)) {
- $globals.world.error("exactly one type argument expected for list", genericType.get$span());
- }
- return this.finishListLiteral(start, isConst, typeArgs.$index((0)));
- }
- else if (this._peekKind((6))) {
- var keyType, valueType;
- if (typeArgs.get$length() == (1)) {
- keyType = null;
- valueType = typeArgs.$index((0));
- }
- else if (typeArgs.get$length() == (2)) {
- keyType = typeArgs.$index((0));
- $globals.world.warning("a map literal takes one type argument specifying the value type", keyType.get$span());
- valueType = typeArgs.$index((1));
- }
- return this.finishMapLiteral(start, isConst, keyType, valueType);
- }
- else {
- this._errorExpected("array or map literal");
- }
-}
-Parser.prototype._readModifiers = function() {
- var modifiers = null;
- while (true) {
- switch (this._peek()) {
- case (85):
- case (99):
- case (92):
- case (71):
- case (74):
-
- if ($eq$(modifiers)) modifiers = [];
- modifiers.add(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((97))) {
- 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 this.typeParameter.bind(this);
-}
-Parser.prototype.typeParameters = function() {
- this._eat((52));
- var closed = false;
- var ret = [];
- do {
- var tp = this.typeParameter();
- ret.add(tp);
- if ((tp.get$typeParameter().get$extendsType() instanceof GenericTypeReference) && tp.get$typeParameter().get$extendsType().get$dynamic().get$depth() == (0)) {
- closed = true;
- break;
- }
- }
- while (this._maybeEat((11)))
- if (!closed) {
- this._eat((53));
- }
- return ret;
-}
-Parser.prototype.get$typeParameters = function() {
- return this.typeParameters.bind(this);
-}
-Parser.prototype._eatClosingAngle = function(depth) {
- if (this._maybeEat((53))) {
- return depth;
- }
- else if (depth > (0) && this._maybeEat((40))) {
- return depth - (1);
- }
- else if (depth > (1) && this._maybeEat((41))) {
- return depth - (2);
- }
- else {
- this._errorExpected(">");
- return depth;
- }
-}
-Parser.prototype.addTypeArguments = function(baseType, depth) {
- this._eat((52));
- return this._finishTypeArguments(baseType, depth, []);
-}
-Parser.prototype._finishTypeArguments = function(baseType, depth, types) {
- var delta = (-1);
- do {
- var myType = this.type(depth + (1));
- types.add(myType);
- if ((myType instanceof GenericTypeReference) && myType.get$depth() <= depth) {
- delta = depth - myType.get$depth();
- break;
- }
- }
- while (this._maybeEat((11)))
- if ($gte$(delta, (0))) {
- depth = $sub$(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(this.type((0)));
- }
- while (this._maybeEat((11)))
- 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 (115):
-
- return new SimpleTypeReference($globals.world.voidType, this._lang_next().get$span());
-
- case (114):
-
- return new SimpleTypeReference($globals.world.varType, this._lang_next().get$span());
-
- case (99):
-
- this._eat((99));
- isFinal = true;
- name = this.identifier();
- break;
-
- default:
-
- name = this.identifier();
- break;
-
- }
- while (this._maybeEat((14))) {
- if ($eq$(names)) names = [];
- names.add(this.identifier());
- }
- return new NameTypeReference(isFinal, name, names, this._makeSpan(start));
-}
-Parser.prototype.type = function(depth) {
- var typeRef = this.nameTypeReference();
- if (this._peekKind((52))) {
- return this.addTypeArguments(typeRef, depth);
- }
- else {
- return typeRef;
- }
-}
-Parser.prototype.type.$optional = ['depth', '(0)']
-Parser.prototype.get$type = function() {
- return this.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();
- if ($eq$(name)) {
- this._error("Formal parameter invalid", this._makeSpan(start));
- }
- var value = null;
- if (this._maybeEat((20))) {
- if (!inOptionalBlock) {
- this._error("default values only allowed inside [optional] section");
- }
- value = this.expression();
- }
- else if (this._peekKind((2))) {
- var formals = this.formalParameterList();
- var func = new FunctionDefinition(null, type, name, formals, null, null, null, this._makeSpan(start));
- type = new FunctionTypeReference(false, func, func.get$span());
- }
- if (inOptionalBlock && $eq$(value)) {
- value = this._makeLiteral(Value.fromNull(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))) {
- if (this._maybeEat((4))) {
- inOptionalBlock = true;
- }
- formals.add(this.formalParameter(inOptionalBlock));
- while (this._maybeEat((11))) {
- if (this._maybeEat((4))) {
- if (inOptionalBlock) {
- this._error("already inside an optional block", this._previousToken.get$span());
- }
- inOptionalBlock = true;
- }
- formals.add(this.formalParameter(inOptionalBlock));
- }
- if (inOptionalBlock) {
- this._eat((5));
- }
- this._eat((3));
- }
- return formals;
-}
-Parser.prototype.identifierForType = function() {
- var $0;
- var tok = this._lang_next();
- if (!this._isIdentifier(tok.get$kind())) {
- this._error(("expected identifier, but found " + tok), tok.get$span());
- }
- if ((($0 = tok.get$kind()) == null ? null != ((70)) : $0 !== (70)) && tok.get$kind() != (80)) {
- this._error(("" + tok + " may not be used as a type name"), tok.get$span());
- }
- return new Identifier(tok.get$text(), this._makeSpan(tok.get$start()));
-}
-Parser.prototype.identifier = function() {
- var tok = this._lang_next();
- if (!this._isIdentifier(tok.get$kind())) {
- this._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();
- if ($eq$(name)) {
- this._error("expected name and type", expr.get$span());
- }
- }
- else {
- this._error("bad function body", expr.get$span());
- }
- var span = new SourceSpan(expr.get$span().file, expr.get$span().start, body.get$span().end);
- var func = new FunctionDefinition(null, type, name, formals, 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(), false, e.get$span());
- }
- else if ((e instanceof DeclaredIdentifier)) {
- return e;
- }
- else {
- this._error("expected declared identifier");
- return new DeclaredIdentifier(null, null, false, e.get$span());
- }
-}
-Parser.prototype._makeLabel = function(expr) {
- if ((expr instanceof VarExpression)) {
- return expr.get$name();
- }
- else {
- this._errorExpected("label");
- return null;
- }
-}
-// ********** Code for IncompleteSourceException **************
-function IncompleteSourceException(token) {
- this.token = token;
-}
-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;
-}
-DivertedTokenSource.prototype.next = function() {
- var token = this.tokens.$index(this._lang_pos);
- ++this._lang_pos;
- if (this._lang_pos == this.tokens.get$length()) {
- this.parser.tokenizer = this.previousTokenizer;
- }
- return token;
-}
-// ********** Code for Node **************
-function Node(span) {
- this.span = span;
-}
-Node.prototype.get$span = function() { return this.span; };
-Node.prototype.set$span = function(value) { return this.span = value; };
-// ********** Code for Statement **************
-$inherits(Statement, Node);
-function Statement(span) {
- Node.call(this, span);
-}
-// ********** Code for Definition **************
-$inherits(Definition, Statement);
-function Definition(span) {
- 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) {
- Node.call(this, span);
-}
-// ********** Code for TypeReference **************
-$inherits(TypeReference, Node);
-function TypeReference(span) {
- Node.call(this, span);
-}
-// ********** Code for DirectiveDefinition **************
-$inherits(DirectiveDefinition, Definition);
-function DirectiveDefinition(name, arguments, span) {
- this.name = name;
- this.arguments = arguments;
- Definition.call(this, span);
-}
-DirectiveDefinition.prototype.get$name = function() { return this.name; };
-DirectiveDefinition.prototype.set$name = function(value) { return this.name = value; };
-DirectiveDefinition.prototype.visit = function(visitor) {
- return visitor.visitDirectiveDefinition(this);
-}
-// ********** Code for TypeDefinition **************
-$inherits(TypeDefinition, Definition);
-function TypeDefinition(isClass, name, typeParameters, extendsTypes, implementsTypes, nativeType, defaultType, body, span) {
- this.isClass = isClass;
- this.name = name;
- this.typeParameters = typeParameters;
- this.extendsTypes = extendsTypes;
- this.implementsTypes = implementsTypes;
- this.nativeType = nativeType;
- this.defaultType = defaultType;
- this.body = body;
- Definition.call(this, span);
-}
-TypeDefinition.prototype.get$isClass = function() { return this.isClass; };
-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.get$nativeType = function() { return this.nativeType; };
-TypeDefinition.prototype.get$body = function() { return this.body; };
-TypeDefinition.prototype.visit = function(visitor) {
- return visitor.visitTypeDefinition(this);
-}
-// ********** Code for FunctionTypeDefinition **************
-$inherits(FunctionTypeDefinition, Definition);
-function FunctionTypeDefinition(func, typeParameters, span) {
- this.func = func;
- this.typeParameters = typeParameters;
- Definition.call(this, span);
-}
-FunctionTypeDefinition.prototype.get$func = function() { return this.func; };
-FunctionTypeDefinition.prototype.get$typeParameters = function() { return this.typeParameters; };
-FunctionTypeDefinition.prototype.visit = function(visitor) {
- return visitor.visitFunctionTypeDefinition(this);
-}
-// ********** 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;
- Definition.call(this, span);
-}
-VariableDefinition.prototype.get$type = function() { return this.type; };
-VariableDefinition.prototype.get$names = function() { return this.names; };
-VariableDefinition.prototype.set$names = function(value) { return this.names = value; };
-VariableDefinition.prototype.visit = function(visitor) {
- return visitor.visitVariableDefinition(this);
-}
-// ********** Code for FunctionDefinition **************
-$inherits(FunctionDefinition, Definition);
-function FunctionDefinition(modifiers, returnType, name, formals, initializers, nativeBody, body, span) {
- this.modifiers = modifiers;
- this.returnType = returnType;
- this.name = name;
- this.formals = formals;
- this.initializers = initializers;
- this.nativeBody = nativeBody;
- this.body = body;
- 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$initializers = function() { return this.initializers; };
-FunctionDefinition.prototype.get$body = function() { return this.body; };
-FunctionDefinition.prototype.visit = function(visitor) {
- return visitor.visitFunctionDefinition(this);
-}
-// ********** Code for ReturnStatement **************
-$inherits(ReturnStatement, Statement);
-function ReturnStatement(value, span) {
- this.value = value;
- 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);
-}
-// ********** Code for ThrowStatement **************
-$inherits(ThrowStatement, Statement);
-function ThrowStatement(value, span) {
- this.value = value;
- 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);
-}
-// ********** Code for AssertStatement **************
-$inherits(AssertStatement, Statement);
-function AssertStatement(test, span) {
- this.test = test;
- Statement.call(this, span);
-}
-AssertStatement.prototype.visit = function(visitor) {
- return visitor.visitAssertStatement(this);
-}
-// ********** Code for BreakStatement **************
-$inherits(BreakStatement, Statement);
-function BreakStatement(label, span) {
- this.label = label;
- Statement.call(this, span);
-}
-BreakStatement.prototype.get$label = function() { return this.label; };
-BreakStatement.prototype.visit = function(visitor) {
- return visitor.visitBreakStatement(this);
-}
-// ********** Code for ContinueStatement **************
-$inherits(ContinueStatement, Statement);
-function ContinueStatement(label, span) {
- this.label = label;
- Statement.call(this, span);
-}
-ContinueStatement.prototype.get$label = function() { return this.label; };
-ContinueStatement.prototype.visit = function(visitor) {
- return visitor.visitContinueStatement(this);
-}
-// ********** Code for IfStatement **************
-$inherits(IfStatement, Statement);
-function IfStatement(test, trueBranch, falseBranch, span) {
- this.test = test;
- this.trueBranch = trueBranch;
- this.falseBranch = falseBranch;
- Statement.call(this, span);
-}
-IfStatement.prototype.visit = function(visitor) {
- return visitor.visitIfStatement(this);
-}
-// ********** Code for WhileStatement **************
-$inherits(WhileStatement, Statement);
-function WhileStatement(test, body, span) {
- this.test = test;
- this.body = body;
- Statement.call(this, span);
-}
-WhileStatement.prototype.get$body = function() { return this.body; };
-WhileStatement.prototype.visit = function(visitor) {
- return visitor.visitWhileStatement(this);
-}
-// ********** Code for DoStatement **************
-$inherits(DoStatement, Statement);
-function DoStatement(body, test, span) {
- this.body = body;
- this.test = test;
- Statement.call(this, span);
-}
-DoStatement.prototype.get$body = function() { return this.body; };
-DoStatement.prototype.visit = function(visitor) {
- return visitor.visitDoStatement(this);
-}
-// ********** 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;
- Statement.call(this, span);
-}
-ForStatement.prototype.get$body = function() { return this.body; };
-ForStatement.prototype.visit = function(visitor) {
- return visitor.visitForStatement(this);
-}
-// ********** Code for ForInStatement **************
-$inherits(ForInStatement, Statement);
-function ForInStatement(item, list, body, span) {
- this.item = item;
- this.list = list;
- this.body = body;
- Statement.call(this, span);
-}
-ForInStatement.prototype.get$body = function() { return this.body; };
-ForInStatement.prototype.visit = function(visitor) {
- return visitor.visitForInStatement(this);
-}
-// ********** Code for TryStatement **************
-$inherits(TryStatement, Statement);
-function TryStatement(body, catches, finallyBlock, span) {
- this.body = body;
- this.catches = catches;
- this.finallyBlock = finallyBlock;
- Statement.call(this, span);
-}
-TryStatement.prototype.get$body = function() { return this.body; };
-TryStatement.prototype.visit = function(visitor) {
- return visitor.visitTryStatement(this);
-}
-// ********** Code for SwitchStatement **************
-$inherits(SwitchStatement, Statement);
-function SwitchStatement(test, cases, span) {
- this.test = test;
- this.cases = cases;
- Statement.call(this, span);
-}
-SwitchStatement.prototype.get$cases = function() { return this.cases; };
-SwitchStatement.prototype.visit = function(visitor) {
- return visitor.visitSwitchStatement(this);
-}
-// ********** Code for BlockStatement **************
-$inherits(BlockStatement, Statement);
-function BlockStatement(body, span) {
- this.body = body;
- Statement.call(this, span);
-}
-BlockStatement.prototype.get$body = function() { return this.body; };
-BlockStatement.prototype.visit = function(visitor) {
- return visitor.visitBlockStatement(this);
-}
-// ********** Code for LabeledStatement **************
-$inherits(LabeledStatement, Statement);
-function LabeledStatement(name, body, span) {
- this.name = name;
- this.body = body;
- 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.visit = function(visitor) {
- return visitor.visitLabeledStatement(this);
-}
-// ********** Code for ExpressionStatement **************
-$inherits(ExpressionStatement, Statement);
-function ExpressionStatement(body, span) {
- this.body = body;
- Statement.call(this, span);
-}
-ExpressionStatement.prototype.get$body = function() { return this.body; };
-ExpressionStatement.prototype.visit = function(visitor) {
- return visitor.visitExpressionStatement(this);
-}
-// ********** Code for EmptyStatement **************
-$inherits(EmptyStatement, Statement);
-function EmptyStatement(span) {
- Statement.call(this, span);
-}
-EmptyStatement.prototype.visit = function(visitor) {
- return visitor.visitEmptyStatement(this);
-}
-// ********** Code for DietStatement **************
-$inherits(DietStatement, Statement);
-function DietStatement(span) {
- Statement.call(this, span);
-}
-DietStatement.prototype.visit = function(visitor) {
- return visitor.visitDietStatement(this);
-}
-// ********** Code for LambdaExpression **************
-$inherits(LambdaExpression, Expression);
-function LambdaExpression(func, span) {
- this.func = func;
- Expression.call(this, span);
-}
-LambdaExpression.prototype.get$func = function() { return this.func; };
-LambdaExpression.prototype.visit = function(visitor) {
- return visitor.visitLambdaExpression(this);
-}
-// ********** Code for CallExpression **************
-$inherits(CallExpression, Expression);
-function CallExpression(target, arguments, span) {
- this.target = target;
- this.arguments = arguments;
- Expression.call(this, span);
-}
-CallExpression.prototype.visit = function(visitor) {
- return visitor.visitCallExpression$1(this);
-}
-// ********** Code for IndexExpression **************
-$inherits(IndexExpression, Expression);
-function IndexExpression(target, index, span) {
- this.target = target;
- this.index = index;
- Expression.call(this, span);
-}
-IndexExpression.prototype.visit = function(visitor) {
- return visitor.visitIndexExpression(this);
-}
-// ********** Code for BinaryExpression **************
-$inherits(BinaryExpression, Expression);
-function BinaryExpression(op, x, y, span) {
- this.op = op;
- this.x = x;
- this.y = y;
- Expression.call(this, span);
-}
-BinaryExpression.prototype.get$op = function() { return this.op; };
-BinaryExpression.prototype.get$x = function() { return this.x; };
-BinaryExpression.prototype.get$y = function() { return this.y; };
-BinaryExpression.prototype.visit = function(visitor) {
- return visitor.visitBinaryExpression$1(this);
-}
-// ********** Code for UnaryExpression **************
-$inherits(UnaryExpression, Expression);
-function UnaryExpression(op, self, span) {
- this.op = op;
- this.self = self;
- Expression.call(this, span);
-}
-UnaryExpression.prototype.get$op = function() { return this.op; };
-UnaryExpression.prototype.get$self = function() { return this.self; };
-UnaryExpression.prototype.visit = function(visitor) {
- return visitor.visitUnaryExpression(this);
-}
-// ********** Code for PostfixExpression **************
-$inherits(PostfixExpression, Expression);
-function PostfixExpression(body, op, span) {
- this.body = body;
- this.op = op;
- Expression.call(this, span);
-}
-PostfixExpression.prototype.get$body = function() { return this.body; };
-PostfixExpression.prototype.get$op = function() { return this.op; };
-PostfixExpression.prototype.visit = function(visitor) {
- return visitor.visitPostfixExpression$1(this);
-}
-// ********** 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;
- Expression.call(this, span);
-}
-NewExpression.prototype.get$isConst = function() { return this.isConst; };
-NewExpression.prototype.get$type = function() { return this.type; };
-NewExpression.prototype.get$name = function() { return this.name; };
-NewExpression.prototype.set$name = function(value) { return this.name = value; };
-NewExpression.prototype.visit = function(visitor) {
- return visitor.visitNewExpression(this);
-}
-// ********** Code for ListExpression **************
-$inherits(ListExpression, Expression);
-function ListExpression(isConst, itemType, values, span) {
- this.isConst = isConst;
- this.itemType = itemType;
- this.values = values;
- Expression.call(this, span);
-}
-ListExpression.prototype.get$isConst = function() { return this.isConst; };
-ListExpression.prototype.visit = function(visitor) {
- return visitor.visitListExpression(this);
-}
-// ********** Code for MapExpression **************
-$inherits(MapExpression, Expression);
-function MapExpression(isConst, keyType, valueType, items, span) {
- this.isConst = isConst;
- this.keyType = keyType;
- this.valueType = valueType;
- this.items = items;
- Expression.call(this, span);
-}
-MapExpression.prototype.get$isConst = function() { return this.isConst; };
-MapExpression.prototype.visit = function(visitor) {
- return visitor.visitMapExpression(this);
-}
-// ********** Code for ConditionalExpression **************
-$inherits(ConditionalExpression, Expression);
-function ConditionalExpression(test, trueBranch, falseBranch, span) {
- this.test = test;
- this.trueBranch = trueBranch;
- this.falseBranch = falseBranch;
- Expression.call(this, span);
-}
-ConditionalExpression.prototype.visit = function(visitor) {
- return visitor.visitConditionalExpression(this);
-}
-// ********** Code for IsExpression **************
-$inherits(IsExpression, Expression);
-function IsExpression(isTrue, x, type, span) {
- this.isTrue = isTrue;
- this.x = x;
- this.type = type;
- Expression.call(this, span);
-}
-IsExpression.prototype.get$x = function() { return this.x; };
-IsExpression.prototype.get$type = function() { return this.type; };
-IsExpression.prototype.visit = function(visitor) {
- return visitor.visitIsExpression(this);
-}
-// ********** Code for ParenExpression **************
-$inherits(ParenExpression, Expression);
-function ParenExpression(body, span) {
- this.body = body;
- Expression.call(this, span);
-}
-ParenExpression.prototype.get$body = function() { return this.body; };
-ParenExpression.prototype.visit = function(visitor) {
- return visitor.visitParenExpression(this);
-}
-// ********** Code for AwaitExpression **************
-$inherits(AwaitExpression, Expression);
-function AwaitExpression(body, span) {
- this.body = body;
- Expression.call(this, span);
-}
-AwaitExpression.prototype.get$body = function() { return this.body; };
-AwaitExpression.prototype.visit = function(visitor) {
- return visitor.visitAwaitExpression(this);
-}
-// ********** Code for DotExpression **************
-$inherits(DotExpression, Expression);
-function DotExpression(self, name, span) {
- this.self = self;
- this.name = name;
- Expression.call(this, span);
-}
-DotExpression.prototype.get$self = function() { return this.self; };
-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);
-}
-// ********** Code for VarExpression **************
-$inherits(VarExpression, Expression);
-function VarExpression(name, span) {
- this.name = name;
- 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);
-}
-// ********** Code for ThisExpression **************
-$inherits(ThisExpression, Expression);
-function ThisExpression(span) {
- Expression.call(this, span);
-}
-ThisExpression.prototype.visit = function(visitor) {
- return visitor.visitThisExpression(this);
-}
-// ********** Code for SuperExpression **************
-$inherits(SuperExpression, Expression);
-function SuperExpression(span) {
- Expression.call(this, span);
-}
-SuperExpression.prototype.visit = function(visitor) {
- return visitor.visitSuperExpression(this);
-}
-// ********** Code for LiteralExpression **************
-$inherits(LiteralExpression, Expression);
-function LiteralExpression(value, span) {
- this.value = value;
- Expression.call(this, span);
-}
-LiteralExpression.prototype.get$value = function() { return this.value; };
-LiteralExpression.prototype.set$value = function(value) { return this.value = value; };
-LiteralExpression.prototype.visit = function(visitor) {
- return visitor.visitLiteralExpression(this);
-}
-// ********** Code for StringConcatExpression **************
-$inherits(StringConcatExpression, Expression);
-function StringConcatExpression(strings, span) {
- this.strings = strings;
- Expression.call(this, span);
-}
-StringConcatExpression.prototype.visit = function(visitor) {
- return visitor.visitStringConcatExpression(this);
-}
-// ********** Code for StringInterpExpression **************
-$inherits(StringInterpExpression, Expression);
-function StringInterpExpression(pieces, span) {
- this.pieces = pieces;
- Expression.call(this, span);
-}
-StringInterpExpression.prototype.visit = function(visitor) {
- return visitor.visitStringInterpExpression(this);
-}
-// ********** Code for SimpleTypeReference **************
-$inherits(SimpleTypeReference, TypeReference);
-function SimpleTypeReference(type, span) {
- this.type = type;
- TypeReference.call(this, span);
-}
-SimpleTypeReference.prototype.get$type = function() { return this.type; };
-SimpleTypeReference.prototype.visit = function(visitor) {
- return visitor.visitSimpleTypeReference(this);
-}
-// ********** Code for NameTypeReference **************
-$inherits(NameTypeReference, TypeReference);
-function NameTypeReference(isFinal, name, names, span) {
- this.isFinal = isFinal;
- this.name = name;
- this.names = names;
- TypeReference.call(this, span);
-}
-NameTypeReference.prototype.get$isFinal = function() { return this.isFinal; };
-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);
-}
-// ********** Code for GenericTypeReference **************
-$inherits(GenericTypeReference, TypeReference);
-function GenericTypeReference(baseType, typeArguments, depth, span) {
- this.baseType = baseType;
- this.typeArguments = typeArguments;
- this.depth = depth;
- TypeReference.call(this, span);
-}
-GenericTypeReference.prototype.get$baseType = function() { return this.baseType; };
-GenericTypeReference.prototype.get$typeArguments = function() { return this.typeArguments; };
-GenericTypeReference.prototype.get$depth = function() { return this.depth; };
-GenericTypeReference.prototype.visit = function(visitor) {
- return visitor.visitGenericTypeReference(this);
-}
-// ********** Code for FunctionTypeReference **************
-$inherits(FunctionTypeReference, TypeReference);
-function FunctionTypeReference(isFinal, func, span) {
- this.isFinal = isFinal;
- this.func = func;
- TypeReference.call(this, span);
-}
-FunctionTypeReference.prototype.get$isFinal = function() { return this.isFinal; };
-FunctionTypeReference.prototype.get$func = function() { return this.func; };
-FunctionTypeReference.prototype.visit = function(visitor) {
- return visitor.visitFunctionTypeReference(this);
-}
-// ********** Code for DefaultTypeReference **************
-$inherits(DefaultTypeReference, TypeReference);
-function DefaultTypeReference(oldFactory, baseType, typeParameters, span) {
- this.oldFactory = oldFactory;
- this.baseType = baseType;
- this.typeParameters = typeParameters;
- TypeReference.call(this, span);
-}
-DefaultTypeReference.prototype.get$baseType = function() { return this.baseType; };
-DefaultTypeReference.prototype.get$typeParameters = function() { return this.typeParameters; };
-DefaultTypeReference.prototype.visit = function(visitor) {
- return visitor.visitDefaultTypeReference(this);
-}
-// ********** Code for ArgumentNode **************
-$inherits(ArgumentNode, Node);
-function ArgumentNode(label, value, span) {
- this.label = label;
- this.value = value;
- Node.call(this, span);
-}
-ArgumentNode.prototype.get$label = function() { return this.label; };
-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);
-}
-// ********** 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;
- Node.call(this, span);
-}
-FormalNode.prototype.get$type = function() { return this.type; };
-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);
-}
-// ********** Code for CatchNode **************
-$inherits(CatchNode, Node);
-function CatchNode(exception, trace, body, span) {
- this.exception = exception;
- this.trace = trace;
- this.body = body;
- Node.call(this, span);
-}
-CatchNode.prototype.get$exception = function() { return this.exception; };
-CatchNode.prototype.get$trace = function() { return this.trace; };
-CatchNode.prototype.get$body = function() { return this.body; };
-CatchNode.prototype.visit = function(visitor) {
- return visitor.visitCatchNode(this);
-}
-// ********** Code for CaseNode **************
-$inherits(CaseNode, Node);
-function CaseNode(label, cases, statements, span) {
- this.label = label;
- this.cases = cases;
- this.statements = statements;
- Node.call(this, span);
-}
-CaseNode.prototype.get$label = function() { return this.label; };
-CaseNode.prototype.get$cases = function() { return this.cases; };
-CaseNode.prototype.get$statements = function() { return this.statements; };
-CaseNode.prototype.visit = function(visitor) {
- return visitor.visitCaseNode(this);
-}
-// ********** Code for TypeParameter **************
-$inherits(TypeParameter, Node);
-function TypeParameter(name, extendsType, span) {
- this.name = name;
- this.extendsType = extendsType;
- 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.visit = function(visitor) {
- return visitor.visitTypeParameter(this);
-}
-// ********** Code for Identifier **************
-$inherits(Identifier, Node);
-function Identifier(name, span) {
- this.name = name;
- 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);
-}
-// ********** Code for DeclaredIdentifier **************
-$inherits(DeclaredIdentifier, Expression);
-function DeclaredIdentifier(type, name, isFinal, span) {
- this.type = type;
- this.name = name;
- this.isFinal = isFinal;
- Expression.call(this, span);
-}
-DeclaredIdentifier.prototype.get$type = function() { return this.type; };
-DeclaredIdentifier.prototype.get$name = function() { return this.name; };
-DeclaredIdentifier.prototype.set$name = function(value) { return this.name = value; };
-DeclaredIdentifier.prototype.get$isFinal = function() { return this.isFinal; };
-DeclaredIdentifier.prototype.visit = function(visitor) {
- return visitor.visitDeclaredIdentifier(this);
-}
-// ********** Code for Type **************
-$inherits(Type, Element);
-function Type(name) {
- this.isTested = false;
- this.isChecked = false;
- this.isWritten = false;
- this._foundMembers = new HashMapImplementation();
- this.varStubs = new HashMapImplementation();
- Element.call(this, name, null);
-}
-Type.prototype.get$typeCheckCode = function() { return this.typeCheckCode; };
-Type.prototype.get$varStubs = function() { return this.varStubs; };
-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$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$fullname = function() {
- return null != this.get$library().name ? ("" + this.get$library().name + "." + this.name) : this.name;
-}
-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 const$0007;
-}
-Type.prototype.get$genericType = function() {
- return this;
-}
-Type.prototype.get$isConcreteGeneric = function() {
- return $ne$(this.get$genericType(), this);
-}
-Type.prototype.get$interfaces = function() {
- return null;
-}
-Type.prototype.get$parent = function() {
- return null;
-}
-Type.prototype.get$nativeName = function() {
- return this.get$isNative() ? this.get$definition().get$nativeType().name : this.get$jsname();
-}
-Type.prototype.get$avoidNativeName = function() {
- return this.get$isHiddenNativeType();
-}
-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 ($ne$(typeParams)) {
- for (var i = (0);
- i < typeParams.get$length(); i++) {
- if ($ne$(typeParams.$index(i).get$extendsType())) {
- this.get$typeArgsInOrder().$index(i).get$dynamic().ensureSubtypeOf(typeParams.$index(i).get$extendsType(), typeParams.$index(i).get$span(), false);
- }
- }
- }
- if (this.get$interfaces() != null) {
- var $$list = this.get$interfaces();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var i = $$i.next();
- i._checkExtends();
- }
- }
-}
-Type.prototype._checkOverride = function(member) {
- var parentMember = this._getMemberInParents(member.name);
- if ($ne$(parentMember)) {
- 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.set$returnType(eq.returnType);
- ne.set$parameters(eq.parameters);
- ne.set$isStatic(eq.isStatic);
- ne.set$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().get$length() > (0)) {
- var $$list = this.get$interfaces();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var i = $$i.next();
- var ret = i.getMember(memberName);
- if ($ne$(ret)) {
- return ret;
- }
- }
- }
- return $globals.world.objectType.getMember(memberName);
- }
-}
-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 ($ne$(call)) {
- if (args.get$length() != call.get$parameters().get$length() || !call.namesInOrder(args)) {
- return true;
- }
- }
- return false;
-}
-Type.prototype.get$needsVarCall = function() {
- return this.needsVarCall.bind(this);
-}
-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) {
- var $0;
- if ($eq$(this, other)) return true;
- if (this.get$isVar() || other.get$isVar()) return true;
- if (other._isDirectSupertypeOf(this)) return true;
- var call = this.getCallMethod();
- var otherCall = other.getCallMethod();
- if ($ne$(call) && $ne$(otherCall)) {
- return Type._isFunctionSubtypeOf(call, otherCall);
- }
- if ((($0 = this.get$genericType()) == null ? null == (other.get$genericType()) : $0 === other.get$genericType())) {
- for (var i = (0);
- i < this.get$typeArgsInOrder().get$length(); i++) {
- if (!this.get$typeArgsInOrder().$index(i).get$dynamic().isSubtypeOf(other.get$typeArgsInOrder().$index(i))) {
- 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(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 $bit_xor$(($shl$(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.get$length() < sp.get$length()) return false;
- for (var i = (0);
- i < sp.get$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(sp.$index(i).get$type())) return false;
- }
- if (tp.get$length() > sp.get$length() && !tp.$index(sp.get$length()).get$isOptional()) return false;
- return true;
-}
-// ********** Code for ParameterType **************
-$inherits(ParameterType, Type);
-function ParameterType(name, typeParameter) {
- this.typeParameter = typeParameter;
- Type.call(this, name);
-}
-ParameterType.prototype.get$typeParameter = function() { return this.typeParameter; };
-ParameterType.prototype.get$extendsType = function() { return this.extendsType; };
-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.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.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, true);
- }
- else {
- this.extendsType = $globals.world.objectType;
- }
-}
-// ********** Code for NonNullableType **************
-$inherits(NonNullableType, Type);
-function NonNullableType(type) {
- this.type = type;
- 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, allowTypeParams) {
- return this.type.resolveType(node, isRequired, allowTypeParams);
-}
-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.getMember = function(name) {
- return this.type.getMember(name);
-}
-NonNullableType.prototype.getConstructor = function(name) {
- return this.type.getConstructor(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.get$isNative = function() {
- return this.type.get$isNative();
-}
-// ********** 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_Type();
- this.constructors = new HashMapImplementation();
- this.members = new HashMapImplementation();
- this.factories = new FactoryMap();
- Type.call(this, name);
- this.setDefinition(definition);
-}
-DefinedType.prototype.get$definition = function() { return this.definition; };
-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(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$directSubtypes = function() { return this.directSubtypes; };
-DefinedType.prototype.get$typeParameters = function() { return this.typeParameters; };
-DefinedType.prototype.get$typeArgsInOrder = function() { return this.typeArgsInOrder; };
-DefinedType.prototype.set$typeArgsInOrder = function(value) { return this.typeArgsInOrder = value; };
-DefinedType.prototype.get$constructors = function() { return this.constructors; };
-DefinedType.prototype.get$members = function() { return this.members; };
-DefinedType.prototype.get$factories = function() { return this.factories; };
-DefinedType.prototype.get$_concreteTypes = function() { return this._concreteTypes; };
-DefinedType.prototype.get$isUsed = function() { return this.isUsed; };
-DefinedType.prototype.get$isNative = function() { return this.isNative; };
-DefinedType.prototype.set$baseGenericType = function(value) { return this.baseGenericType = value; };
-DefinedType.prototype.get$genericType = function() {
- return null == this.baseGenericType ? this : this.baseGenericType;
-}
-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 && $ne$(this.definition.get$typeParameters())) {
- this._concreteTypes = new HashMapImplementation();
- this.typeParameters = this.definition.get$typeParameters();
- this.typeArgsInOrder = new Array(this.typeParameters.get$length());
- for (var i = (0);
- i < this.typeArgsInOrder.get$length(); i++) {
- this.typeArgsInOrder.$setindex(i, $globals.world.varType);
- }
- }
- else {
- this.typeArgsInOrder = const$0007;
- }
-}
-DefinedType.prototype.get$nativeType = function() {
- return (this.definition != null ? this.definition.get$nativeType() : null);
-}
-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 $eq$(this, $globals.world.objectType);
-}
-DefinedType.prototype.get$isString = function() {
- return $eq$(this, $globals.world.stringType) || $eq$(this, $globals.world.stringImplType);
-}
-DefinedType.prototype.get$isBool = function() {
- return $eq$(this, $globals.world.boolType);
-}
-DefinedType.prototype.get$isFunction = function() {
- return $eq$(this, $globals.world.functionType) || $eq$(this, $globals.world.functionImplType);
-}
-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 $eq$(this, $globals.world.numType) || $eq$(this, $globals.world.intType) || $eq$(this, $globals.world.doubleType) || $eq$(this, $globals.world.numImplType);
-}
-DefinedType.prototype.getCallMethod = function() {
- return this.get$genericType().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 = $$list.iterator(); $$i.hasNext(); ) {
- var method = $$i.next();
- $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 || this.baseGenericType != null) {
- $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 = types.iterator(); $$i.hasNext(); ) {
- var type = $$i.next();
- var resolvedInterface = this.resolveType(type, true, true);
- if (resolvedInterface.get$isClosed() && !(this.library.get$isCore() || this.library.get$isCoreImpl())) {
- $globals.world.error((("cannot implement \"" + resolvedInterface.get$name() + "\": ") + "only native implementation allowed"), type.get$span());
- }
- resolvedInterface.addDirectSubtype(this);
- interfaces.add(resolvedInterface);
- }
- return interfaces;
-}
-DefinedType.prototype.addDirectSubtype = function(type) {
- this.directSubtypes.add(type);
- if (this.baseGenericType != null) {
- this.baseGenericType.addDirectSubtype(type);
- }
-}
-DefinedType.prototype.get$subtypes = function() {
- if (this._subtypes == null) {
- this._subtypes = new HashSetImplementation_Type();
- var $$list = this.directSubtypes;
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var st = $$i.next();
- 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 ($ne$(ancestor)) {
- if ((null == ancestor ? null == (this) : ancestor === this)) {
- return true;
- }
- if (seen.contains$1(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 ($eq$(ancestor)) return false;
- if ((null == ancestor ? null == ($this) : ancestor === $this)) return true;
- if (seen.contains$1(ancestor)) {
- return false;
- }
- seen.add(ancestor);
- if (ancestor.get$interfaces() != null) {
- var $$list = ancestor.get$interfaces();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var parent = $$i.next();
- if (_helper(parent)) return true;
- }
- }
- return false;
- }
- for (var i = (0);
- i < this.interfaces.get$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.get$length() > (0)) {
- if (typeDef.extendsTypes.get$length() > (1)) {
- $globals.world.error("more than one base class", typeDef.extendsTypes.$index((1)).span);
- }
- var extendsTypeRef = typeDef.extendsTypes.$index((0));
- if ((extendsTypeRef instanceof GenericTypeReference)) {
- var g = extendsTypeRef;
- this.set$parent(this.resolveType(g.baseType, true, true));
- }
- this.set$parent(this.resolveType(extendsTypeRef, true, true));
- if (!this.get$parent().get$isClass()) {
- $globals.world.error("class may not extend an interface - use implements", typeDef.extendsTypes.$index((0)).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.defaultType != null) {
- $globals.world.error("default not allowed on classes", typeDef.defaultType.span);
- }
- }
- else {
- if (typeDef.implementsTypes != null && typeDef.implementsTypes.get$length() > (0)) {
- $globals.world.error("implements not allowed on interfaces (use extends)", typeDef.implementsTypes.$index((0)).span);
- }
- this.interfaces = this._resolveInterfaces(typeDef.extendsTypes);
- var res = this._cycleInInterfaceExtends();
- if ($gte$(res, (0))) {
- $globals.world.error(("interface \"" + this.name + "\" has a cycle in its inheritance chain"), typeDef.extendsTypes.$index(res).span);
- }
- if (typeDef.defaultType != null) {
- this.defaultType = this.resolveType(typeDef.defaultType.baseType, true, true);
- if (this.defaultType == null) {
- $globals.world.warning("unresolved default class", typeDef.defaultType.span);
- }
- else {
- if (this.baseGenericType != null) {
- if (!this.defaultType.get$isGeneric()) {
- $globals.world.error("default type of generic interface must be generic", typeDef.defaultType.span);
- }
- this.defaultType = this.defaultType.getOrMakeConcreteType(this.typeArgsInOrder);
- }
- }
- }
- }
- }
- else if ((this.definition instanceof FunctionTypeDefinition)) {
- this.interfaces = [$globals.world.functionType];
- }
- this._resolveTypeParams(this.typeParameters);
- if (this.get$isObject()) this._createNotEqualMember();
- if ($ne$(this.baseGenericType, $globals.world.listFactoryType)) $globals.world._addType(this);
- var $$list = this.constructors.getValues();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var c = $$i.next();
- c.resolve();
- }
- var $$list = this.members.getValues();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var m = $$i.next();
- m.resolve();
- }
- this.factories.forEach((function (f) {
- return f.resolve();
- })
- );
- if (this.get$isJsGlobalObject()) {
- var $$list = this.members.getValues();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var m = $$i.next();
- if (!m.get$isStatic()) $globals.world._addTopName(new ExistingJsGlobal(m.get$name(), m));
- }
- }
-}
-DefinedType.prototype._resolveTypeParams = function(params) {
- if (params == null) return;
- for (var $$i = params.iterator(); $$i.hasNext(); ) {
- var tp = $$i.next();
- tp.set$enclosingElement(this);
- tp.resolve();
- }
-}
-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.get$length() == (1) && definition.modifiers.$index((0)).kind == (74)) {
- 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 ($eq$(prop)) {
- 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.get$length(); i++) {
- var name = definition.names.$index(i).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.isNative);
- this.members.$setindex(name, field);
- }
-}
-DefinedType.prototype.getFactory = function(type, constructorName) {
- if (this.baseGenericType != null) {
- var rr = this.baseGenericType.get$factories().getFactory(type.get$genericType().name, constructorName);
- if ($ne$(rr)) {
- $globals.world.info(("need to remap factory on " + this.name + " from " + rr.get$declaringType().name));
- return rr;
- }
- else {
- var ret = this.getConstructor(constructorName);
- return ret;
- }
- }
- var ret = this.factories.getFactory(type.get$genericType().name, constructorName);
- if ($ne$(ret)) return ret;
- ret = this.factories.getFactory(this.name, constructorName);
- if ($ne$(ret)) return ret;
- ret = this.constructors.$index(constructorName);
- if ($ne$(ret)) return ret;
- return this._tryCreateDefaultConstructor(constructorName);
-}
-DefinedType.prototype.getConstructor = function(constructorName) {
- if (this.baseGenericType != null) {
- var rr = this.constructors.$index(constructorName);
- if ($ne$(rr)) return rr;
- rr = this.baseGenericType.get$constructors().$index(constructorName);
- if ($ne$(rr)) {
- if (this.defaultType != null) {
- var ret = this.defaultType.getFactory(this, constructorName);
- return ret;
- }
- }
- else {
- rr = this.baseGenericType.get$factories().getFactory(this.baseGenericType.name, constructorName);
- }
- if ($eq$(rr)) {
- rr = this.baseGenericType.get$dynamic()._tryCreateDefaultConstructor(constructorName);
- }
- if ($eq$(rr)) return null;
- var rr1 = rr.makeConcrete(this);
- rr1.resolve();
- this.constructors.$setindex(constructorName, rr1);
- return rr1;
- }
- var ret = this.constructors.$index(constructorName);
- if ($ne$(ret)) {
- if (this.defaultType != null) {
- return this.defaultType.getFactory(this, constructorName);
- }
- return ret;
- }
- ret = this.factories.getFactory(this.name, constructorName);
- if ($ne$(ret)) 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, [], inits, native_, body, span);
- this.addMethod(null, c);
- this.constructors.$index("").resolve();
- return this.constructors.$index("");
- }
- return null;
-}
-DefinedType.prototype.getMember = function(memberName) {
- var member = this._foundMembers.$index(memberName);
- if (member != null) return member;
- if (this.baseGenericType != null) {
- member = this.baseGenericType.getMember(memberName);
- if (member == null) return null;
- if (member.get$isStatic() || $ne$(member.declaringType, this.baseGenericType)) {
- this._foundMembers.$setindex(memberName, member);
- return member;
- }
- var rr = member.makeConcrete(this);
- if (null != member.get$definition() || (member instanceof PropertyMember)) {
- rr.resolve();
- }
- else {
- $globals.world.info(("no definition for " + member.name + " on " + this.name));
- }
- this.members.$setindex(memberName, rr);
- this._foundMembers.$setindex(memberName, rr);
- return rr;
- }
- member = this.members.$index(memberName);
- if (member != null) {
- this._checkOverride(member);
- this._foundMembers.$setindex(memberName, member);
- return member;
- }
- if (this.get$isTop()) {
- var libType = this.library.findTypeByName(memberName);
- if ($ne$(libType)) {
- member = libType.get$typeMember();
- this._foundMembers.$setindex(memberName, member);
- return member;
- }
- }
- member = this._getMemberInParents(memberName);
- this._foundMembers.$setindex(memberName, member);
- return member;
-}
-DefinedType.prototype.getOrMakeConcreteType = function(typeArgs) {
- var jsnames = [];
- var names = [];
- var typeMap = new HashMapImplementation();
- var allVar = true;
- for (var i = (0);
- i < typeArgs.get$length(); i++) {
- var typeArg = typeArgs.$index(i);
- if ((typeArg instanceof ParameterType)) {
- typeArg = $globals.world.varType;
- typeArgs.$setindex(i, typeArg);
- }
- if (!typeArg.get$isVar()) allVar = false;
- var paramName = this.typeParameters.$index(i).name;
- typeMap.$setindex(paramName, typeArg);
- names.add(typeArg.get$fullname());
- jsnames.add(typeArg.get$jsname());
- }
- if (allVar) return this;
- var jsname = ("" + this.get$jsname() + "_" + Strings.join(jsnames, "$"));
- var simpleName = ("" + this.name + "<" + Strings.join(names, ", ") + ">");
- var ret = this._concreteTypes.$index(simpleName);
- if ($eq$(ret)) {
- ret = new DefinedType(simpleName, this.library, this.definition, this.isClass);
- ret.set$baseGenericType(this);
- ret.set$typeArgsInOrder(typeArgs);
- ret.set$_jsname(jsname);
- this._concreteTypes.$setindex(simpleName, ret);
- ret.resolve();
- }
- return ret;
-}
-DefinedType.prototype.getCallStub = function(args) {
- var name = _getCallStubName("call", args);
- var stub = this.varStubs.$index(name);
- if ($eq$(stub)) {
- stub = new VarFunctionStub(name, args);
- this.varStubs.$setindex(name, stub);
- }
- return stub;
-}
-// ********** Code for NativeType **************
-function NativeType(name) {
- this.isConstructorHidden = false;
- this.isJsGlobalObject = false;
- this.isSingleton = false;
- this.name = name;
- 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 _SharedBackingMap **************
-$inherits(_SharedBackingMap, HashMapImplementation);
-function _SharedBackingMap() {
- this.shared = (0);
- HashMapImplementation.call(this);
-}
-_SharedBackingMap._SharedBackingMap$from$factory = function(other) {
- var result = new _SharedBackingMap();
- other.forEach((function (k, v) {
- result.$setindex(k, v);
- })
- );
- return result;
-}
-// ********** Code for _SharedBackingMap_dart_core_String$VariableValue **************
-$inherits(_SharedBackingMap_dart_core_String$VariableValue, _SharedBackingMap);
-function _SharedBackingMap_dart_core_String$VariableValue() {
- this.shared = (0);
- HashMapImplementation_dart_core_String$VariableValue.call(this);
-}
-// ********** Code for CopyOnWriteMap **************
-CopyOnWriteMap._wrap$ctor = function(_map) {
- this._lang_map = _map;
-}
-CopyOnWriteMap._wrap$ctor.prototype = CopyOnWriteMap.prototype;
-function CopyOnWriteMap() {}
-CopyOnWriteMap.prototype.is$Map = function(){return true};
-CopyOnWriteMap.prototype.clone = function() {
- var $0;
- ($0 = this._lang_map).shared = $0.shared + (1);
- return new CopyOnWriteMap._wrap$ctor(this._lang_map);
-}
-CopyOnWriteMap.prototype._ensureWritable = function() {
- var $0;
- if (this._lang_map.shared > (0)) {
- ($0 = this._lang_map).shared = $0.shared - (1);
- this._lang_map = _SharedBackingMap._SharedBackingMap$from$factory(this._lang_map);
- }
-}
-CopyOnWriteMap.prototype.$setindex = function(key, value) {
- this._ensureWritable();
- this._lang_map.$setindex(key, value);
-}
-CopyOnWriteMap.prototype.putIfAbsent = function(key, ifAbsent) {
- this._ensureWritable();
- return this._lang_map.putIfAbsent(key, ifAbsent);
-}
-CopyOnWriteMap.prototype.remove = function(key) {
- this._ensureWritable();
- return this._lang_map.remove(key);
-}
-CopyOnWriteMap.prototype.$index = function(key) {
- return this._lang_map.$index(key);
-}
-CopyOnWriteMap.prototype.isEmpty = function() {
- return this._lang_map.isEmpty();
-}
-CopyOnWriteMap.prototype.get$length = function() {
- return this._lang_map.get$length();
-}
-CopyOnWriteMap.prototype.forEach = function(f) {
- return this._lang_map.forEach(f);
-}
-CopyOnWriteMap.prototype.getKeys = function() {
- return this._lang_map.getKeys();
-}
-CopyOnWriteMap.prototype.getValues = function() {
- return this._lang_map.getValues();
-}
-CopyOnWriteMap.prototype.containsKey = function(key) {
- return this._lang_map.containsKey(key);
-}
-CopyOnWriteMap.prototype.remove$1 = CopyOnWriteMap.prototype.remove;
-// ********** Code for CopyOnWriteMap_dart_core_String$VariableValue **************
-$inherits(CopyOnWriteMap_dart_core_String$VariableValue, CopyOnWriteMap);
-function CopyOnWriteMap_dart_core_String$VariableValue() {
- this._lang_map = new _SharedBackingMap_dart_core_String$VariableValue();
-}
-CopyOnWriteMap_dart_core_String$VariableValue.prototype.remove$1 = CopyOnWriteMap_dart_core_String$VariableValue.prototype.remove;
-// ********** Code for Value **************
-function Value(type, code, span) {
- this.type = type;
- this.code = code;
- this.span = span;
- if (this.get$type() == null) $globals.world.internalError("type passed as null", this.span);
-}
-Value.prototype.get$type = function() { return this.type; };
-Value.prototype.get$code = function() { return this.code; };
-Value.prototype.get$span = function() { return this.span; };
-Value.prototype.get$isType = function() {
- return false;
-}
-Value.prototype.get$isSuper = function() {
- return false;
-}
-Value.prototype.get$isConst = function() {
- return false;
-}
-Value.prototype.get$isFinal = function() {
- return false;
-}
-Value.prototype.get$needsTemp = function() {
- return true;
-}
-Value.prototype.get$staticType = function() {
- return this.get$type();
-}
-Value.prototype.get$constValue = function() {
- return null;
-}
-Value.comma = function(x, y) {
- return new Value(y.get$type(), ("(" + x.get$code() + ", " + y.get$code() + ")"), null);
-}
-Value.union = function(x, y) {
- if (null == y || $eq$(x, y)) return x;
- if (null == x) return y;
- var ret = x._tryUnion(y);
- if ($ne$(ret)) return ret;
- ret = y._tryUnion(x);
- if ($ne$(ret)) return ret;
- return new Value(Type.union(x.get$type(), y.get$type()), null, null);
-}
-Value.prototype._tryUnion = function(right) {
- return null;
-}
-Value.prototype.validateInitialized = function(span) {
-
-}
-Value.prototype.get_ = function(context, name, node) {
- var member = this._resolveMember(context, name, node);
- if ($ne$(member)) {
- return member._get(context, node, this);
- }
- else {
- return this.invokeNoSuchMethod$3(context, ("get:" + name), node);
- }
-}
-Value.prototype.set_ = function(context, name, node, value, kind, returnKind) {
- var member = this._resolveMember(context, name, node);
- if ($ne$(member)) {
- var thisValue = this;
- var thisTmp = null;
- var retTmp = null;
- if (kind != (0)) {
- thisTmp = context.getTemp(thisValue);
- thisValue = context.assignTemp(thisTmp, thisValue);
- var lhs = member._get(context, node, thisTmp);
- if (returnKind == (3)) {
- retTmp = context.forceTemp(lhs);
- lhs = context.assignTemp(retTmp, lhs);
- }
- value = lhs.binop(kind, value, context, node);
- }
- if (returnKind == (2)) {
- retTmp = context.forceTemp(value);
- value = context.assignTemp(retTmp, value);
- }
- var ret = member._set(context, node, thisValue, value);
- if ($ne$(thisTmp) && $ne$(thisTmp, this)) context.freeTemp(thisTmp);
- if ($ne$(retTmp)) {
- context.freeTemp(retTmp);
- return Value.comma(ret, retTmp);
- }
- else {
- return ret;
- }
- }
- else {
- return this.invokeNoSuchMethod(context, ("set:" + name), node, new Arguments(null, [value]));
- }
-}
-Value.prototype.setIndex = function(context, index, node, value, kind, returnKind) {
- var member = this._resolveMember(context, ":setindex", node);
- if ($ne$(member)) {
- var thisValue = this;
- var indexValue = index;
- var thisTmp = null;
- var indexTmp = null;
- var retTmp = null;
- if (returnKind == (2)) {
- retTmp = context.forceTemp(value);
- }
- if (kind != (0)) {
- thisTmp = context.getTemp(this);
- indexTmp = context.getTemp(index);
- thisValue = context.assignTemp(thisTmp, thisValue);
- indexValue = context.assignTemp(indexTmp, indexValue);
- if (returnKind == (3)) {
- retTmp = context.forceTemp(value);
- }
- var lhs = thisTmp.invoke(context, ":index", node, new Arguments(null, [indexTmp]));
- if (returnKind == (3)) {
- lhs = context.assignTemp(retTmp, lhs);
- }
- value = lhs.binop(kind, value, context, node);
- }
- if (returnKind == (2)) {
- value = context.assignTemp(retTmp, value);
- }
- var ret = member.invoke(context, node, thisValue, new Arguments(null, [indexValue, value]));
- if ($ne$(thisTmp) && $ne$(thisTmp, this)) context.freeTemp(thisTmp);
- if ($ne$(indexTmp) && $ne$(indexTmp, index)) context.freeTemp(indexTmp);
- if ($ne$(retTmp)) {
- context.freeTemp(retTmp);
- return Value.comma(ret, retTmp);
- }
- else {
- return ret;
- }
- }
- else {
- return this.invokeNoSuchMethod(context, ":index", node, new Arguments(null, [index, value]));
- }
-}
-Value.prototype.unop = function(kind, context, node) {
- switch (kind) {
- case (19):
-
- var newVal = this.convertTo(context, $globals.world.nonNullBool);
- return new Value(newVal.get$type(), ("!" + newVal.get$code()), node.get$span());
-
- case (42):
-
- $globals.world.error("no unary add operator in dart", node.get$span());
- break;
-
- case (43):
-
- return this.invoke(context, ":negate", node, Arguments.get$EMPTY());
-
- case (18):
-
- return this.invoke(context, ":bit_not", node, Arguments.get$EMPTY());
-
- }
- $globals.world.internalError(("unimplemented: " + node.get$op()), node.get$span());
-}
-Value.prototype._mayOverrideEqual = function() {
- return this.get$type().get$isVar() || this.get$type().get$isObject() || !this.get$type().getMember(":eq").declaringType.get$isObject();
-}
-Value.prototype.binop = function(kind, other, context, node) {
- switch (kind) {
- case (35):
- case (34):
-
- var code = ("" + this.get$code() + " " + node.get$op() + " " + other.get$code());
- return new Value($globals.world.nonNullBool, code, node.get$span());
-
- case (50):
- case (51):
-
- var op = kind == (50) ? "==" : "!=";
- if (this.get$code() == "null") {
- return new Value($globals.world.nonNullBool, ("null " + op + " " + other.get$code()), node.get$span());
- }
- else if (other.get$code() == "null") {
- return new Value($globals.world.nonNullBool, ("null " + op + " " + this.get$code()), node.get$span());
- }
- else {
- var ret;
- var check;
- if (this.get$needsTemp()) {
- var tmp = context.forceTemp(this);
- ret = tmp.get$code();
- check = ("(" + ret + " = " + this.get$code() + ") == null");
- }
- else {
- ret = this.get$code();
- check = ("null == " + this.get$code());
- }
- return new Value($globals.world.nonNullBool, ("(" + check + " ? null " + op + " (" + other.get$code() + ") : " + ret + " " + op + "= " + other.get$code() + ")"), node.get$span());
- }
-
- case (48):
-
- if (other.get$code() == "null") {
- if (!this._mayOverrideEqual()) {
- return new Value($globals.world.nonNullBool, ("" + this.get$code() + " == " + other.get$code()), node.get$span());
- }
- }
- else if (this.get$code() == "null") {
- return new Value($globals.world.nonNullBool, ("" + this.get$code() + " == " + other.get$code()), node.get$span());
- }
- break;
-
- case (49):
-
- if (other.get$code() == "null") {
- if (!this._mayOverrideEqual()) {
- return new Value($globals.world.nonNullBool, ("" + this.get$code() + " != " + other.get$code()), node.get$span());
- }
- }
- else if (this.get$code() == "null") {
- return new Value($globals.world.nonNullBool, ("" + this.get$code() + " != " + other.get$code()), node.get$span());
- }
- break;
-
- }
- var name = kind == (49) ? ":ne" : TokenKind.binaryMethodName(kind);
- return this.invoke(context, name, node, new Arguments(null, [other]));
-}
-Value.prototype.invoke = function(context, name, node, args) {
- if (name == ":call") {
- if (this.get$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, node, args);
- }
- }
- var member = this._resolveMember(context, name, node);
- if ($eq$(member)) {
- return this.invokeNoSuchMethod(context, name, node, args);
- }
- else {
- return member.invoke(context, node, this, args);
- }
-}
-Value.prototype._hasOverriddenNoSuchMethod = function() {
- var m = this.get$type().getMember("noSuchMethod");
- return $ne$(m) && !m.get$declaringType().get$isObject();
-}
-Value.prototype.get$isPreciseType = function() {
- return this.get$isSuper() || this.get$isType();
-}
-Value.prototype._missingMemberError = function(context, name, node) {
- var onStaticType = false;
- if ($ne$(this.get$type(), this.get$staticType())) {
- onStaticType = null != this.get$staticType().getMember(name);
- }
- if (!onStaticType && context.get$showWarnings() && !this._isVarOrParameterType(this.get$staticType()) && !this._hasOverriddenNoSuchMethod()) {
- var typeName = this.get$staticType().name;
- if ($eq$(typeName)) typeName = this.get$staticType().get$library().name;
- var message = ("cannot resolve \"" + name + "\" on \"" + typeName + "\"");
- if (this.get$isType()) {
- $globals.world.error(message, node.span);
- }
- else {
- $globals.world.warning(message, node.span);
- }
- }
-}
-Value.prototype._tryResolveMember = function(context, name, node) {
- var member = this.get$type().getMember(name);
- if ($eq$(member)) {
- this._missingMemberError(context, name, node);
- return null;
- }
- else {
- if (this.get$isType() && !member.get$isStatic() && context.get$showWarnings()) {
- $globals.world.error("cannot refer to instance member as static", node.span);
- return null;
- }
- }
- if (this.get$isPreciseType() || member.get$isStatic()) {
- return member.get$preciseMemberSet();
- }
- else {
- return member.get$potentialMemberSet();
- }
-}
-Value.prototype._isVarOrParameterType = function(t) {
- return t.get$isVar() || (t instanceof ParameterType);
-}
-Value.prototype._shouldBindDynamically = function() {
- return this._isVarOrParameterType(this.get$type()) || $globals.options.forceDynamic && !this.get$isConst();
-}
-Value.prototype._resolveMember = function(context, name, node) {
- var member = null;
- if (!this._shouldBindDynamically()) {
- member = this._tryResolveMember(context, name, node);
- }
- if ($eq$(member) && !this.get$isSuper() && !this.get$isType()) {
- member = context.findMembers(name);
- if ($eq$(member) && context.get$showWarnings()) {
- 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.get$isType()) {
- $globals.world.error("Types are not first class", span);
- }
-}
-Value.prototype._varCall = function(context, node, args) {
- var stub = $globals.world.functionType.getCallStub(args);
- return stub.invoke(context, node, this, args);
-}
-Value.prototype.needsConversion = function(toType) {
- var c = this.convertTo(null, toType);
- return $eq$(c) || this.get$code() != c.get$code();
-}
-Value.prototype.convertTo = function(context, toType) {
- var checked = context != null && context.get$showWarnings();
- var callMethod = toType.getCallMethod();
- if ($ne$(callMethod)) {
- if (checked && !toType.isAssignable(this.get$type())) {
- this.convertWarning(toType);
- }
- return this._maybeWrapFunction(toType, callMethod);
- }
- var fromType = this.get$type();
- if (this.get$type().get$isVar() && (this.get$code() != "null" || !toType.get$isNullable())) {
- fromType = $globals.world.objectType;
- }
- var bothNum = this.get$type().get$isNum() && toType.get$isNum();
- if (!fromType.isSubtypeOf(toType) && !bothNum) {
- if (checked && !toType.isSubtypeOf(this.get$type())) {
- this.convertWarning(toType);
- }
- if ($globals.options.enableTypeChecks) {
- if (context == null) {
- return null;
- }
- return this._typeAssert(context, toType);
- }
- }
- return this._changeStaticType(toType);
-}
-Value.prototype._changeStaticType = function(toType) {
- return this;
-}
-Value.prototype._maybeWrapFunction = function(toType, callMethod) {
- var arity = callMethod.parameters.get$length();
- var myCall = this.get$type().getCallMethod();
- var result = this;
- if ($eq$(myCall) || myCall.get$parameters().get$length() != arity) {
- var stub = $globals.world.functionType.getCallStub(Arguments.Arguments$bare$factory(arity));
- result = new Value(toType, ("to$" + stub.get$name() + "(" + this.get$code() + ")"), this.span);
- }
- if ($eq$(toType.get$library(), $globals.world.dom) && $ne$(this.get$type().get$library(), $globals.world.dom)) {
- if (arity == (0)) {
- $globals.world.gen.corejs.useWrap0 = true;
- }
- else {
- $globals.world.gen.corejs.useWrap1 = true;
- }
- result = new Value(toType, ("$wrap_call$" + arity + "(" + result.get$code() + ")"), this.span);
- }
- return result._changeStaticType(toType);
-}
-Value.prototype._typeAssert = function(context, toType) {
- var $0;
- 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 typeErrorCtor = $globals.world.typeErrorType.getConstructor("_internal");
- $globals.world.gen.corejs.ensureTypeNameOf();
- var result = typeErrorCtor.invoke(context, null, new TypeValue($globals.world.typeErrorType, null), new Arguments(null, [new Value($globals.world.objectType, paramName, null), new Value($globals.world.stringType, ("\"" + toType.name + "\""), null)]));
- $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.get$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.get$code() + ")");
- }
- else if (toType.get$library().get$isCore() && toType.get$typeofName() != null) {
- check = ("$assert_" + toType.name + "(" + this.get$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).get$code() + " == null ? null :");
- check = $add$(check, (" " + temp.get$code() + "." + checkName + "())"));
- if ($ne$(this, temp)) context.freeTemp(temp);
- $globals.world.objectType.varStubs.putIfAbsent(checkName, (function () {
- return new VarMethodStub(checkName, null, Arguments.get$EMPTY(), throwTypeError("this"));
- })
- );
- }
- ($0 = context.get$counters()).typeAsserts = $0.typeAsserts + (1);
- return new Value(toType, check, this.span);
-}
-Value.prototype.instanceOf = function(context, toType, span, isTrue, forceCheck) {
- if (toType.get$isVar()) {
- $globals.world.error("cannot resolve type", span);
- }
- var testCode = null;
- if (toType.get$isVar() || toType.get$isObject() || (toType instanceof ParameterType)) {
- if (this.get$needsTemp()) {
- return new Value($globals.world.nonNullBool, ("(" + this.get$code() + ", true)"), span);
- }
- else {
- return Value.fromBool(true, span);
- }
- }
- if (toType.get$library().get$isCore()) {
- var typeofName = toType.get$typeofName();
- if ($ne$(typeofName)) {
- testCode = ("(typeof(" + this.get$code() + ") " + (isTrue ? "==" : "!=") + " '" + typeofName + "')");
- }
- }
- if (toType.get$isClass() && !toType.get$isHiddenNativeType() && !toType.get$isConcreteGeneric()) {
- toType.markUsed();
- testCode = ("(" + this.get$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).get$code() + " &&") + (" " + 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);
-}
-Value.prototype.convertWarning = function(toType) {
- $globals.world.warning(("type \"" + this.get$type().get$fullname() + "\" is not assignable to \"" + toType.get$fullname() + "\""), this.span);
-}
-Value.prototype.invokeNoSuchMethod = function(context, name, node, args) {
- if (this.get$isType()) {
- $globals.world.error(("member lookup failed for \"" + name + "\""), node.span);
- }
- var pos = "";
- if (args != null) {
- var argsCode = [];
- for (var i = (0);
- i < args.get$length(); i++) {
- argsCode.add(args.values.$index(i).get$code());
- }
- pos = Strings.join(argsCode, ", ");
- }
- var noSuchArgs = [new Value($globals.world.stringType, ("\"" + name + "\""), node.span), new Value($globals.world.listType, ("[" + pos + "]"), node.span)];
- return this._resolveMember(context, "noSuchMethod", node).invoke(context, node, this, new Arguments(null, noSuchArgs));
-}
-Value.fromBool = function(value, span) {
- return new BoolValue(value, true, span);
-}
-Value.fromInt = function(value, span) {
- return new IntValue(value, true, span);
-}
-Value.fromDouble = function(value, span) {
- return new DoubleValue(value, true, span);
-}
-Value.fromString = function(value, span) {
- return new StringValue(value, true, span);
-}
-Value.fromNull = function(span) {
- return new NullValue(true, span);
-}
-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.invokeNoSuchMethod$3 = Value.prototype.invokeNoSuchMethod;
-Value.prototype.setIndex$4$kind = function($0, $1, $2, $3, kind) {
- return this.setIndex($0, $1, $2, $3, kind, (1));
-};
-Value.prototype.setIndex$4$kind$returnKind = Value.prototype.setIndex;
-Value.prototype.set_$4$kind = function($0, $1, $2, $3, kind) {
- return this.set_($0, $1, $2, $3, kind, (1));
-};
-Value.prototype.set_$4$kind$returnKind = Value.prototype.set_;
-// ********** Code for PureStaticValue **************
-$inherits(PureStaticValue, Value);
-function PureStaticValue(type, span, isConst, isType) {
- this.isConst = isConst;
- this.isType = isType;
- Value.call(this, type, null, span);
-}
-PureStaticValue.prototype.get$isConst = function() { return this.isConst; };
-PureStaticValue.prototype.get$isType = function() { return this.isType; };
-PureStaticValue.prototype.getMem = function(context, name, node) {
- var member = this.get$type().getMember(name);
- if ($eq$(member)) {
- $globals.world.warning(("cannot find \"" + name + "\" on \"" + this.get$type().name + "\""), node.span);
- return null;
- }
- if (this.isType && !member.get$isStatic()) {
- $globals.world.error("cannot refer to instance member as static", node.span);
- }
- return member;
-}
-PureStaticValue.prototype.get_ = function(context, name, node) {
- if (this.get$type().get$isVar()) return new PureStaticValue($globals.world.varType, node.span, false, false);
- var member = this.getMem(context, name, node);
- if ($eq$(member)) return new PureStaticValue($globals.world.varType, node.span, false, false);
- return member._get(context, node, this);
-}
-PureStaticValue.prototype.set_ = function(context, name, node, value, kind, returnKind) {
- if (this.get$type().get$isVar()) return new PureStaticValue($globals.world.varType, node.span, false, false);
- var member = this.getMem(context, name, node);
- if ($ne$(member)) {
- member._set(context, node, this, value);
- }
- return new PureStaticValue(value.get$type(), node.span, false, false);
-}
-PureStaticValue.prototype.setIndex = function(context, index, node, value, kind, returnKind) {
- var tmp = this.invoke(context, ":setindex", node, new Arguments(null, [index, value]));
- return new PureStaticValue(value.get$type(), node.span, false, false);
-}
-PureStaticValue.prototype.unop = function(kind, context, node) {
- switch (kind) {
- case (19):
-
- return new PureStaticValue($globals.world.boolType, node.get$span(), false, false);
-
- case (42):
-
- if (!this.isConst && !this.get$type().get$isNum()) {
- $globals.world.error("no unary add operator in dart", node.get$span());
- }
- return new PureStaticValue($globals.world.numType, node.get$span(), false, false);
-
- case (43):
-
- return this.invoke(context, ":negate", node, Arguments.get$EMPTY());
-
- case (18):
-
- return this.invoke(context, ":bit_not", node, Arguments.get$EMPTY());
-
- }
- $globals.world.internalError(("unimplemented: " + node.get$op()), node.get$span());
-}
-PureStaticValue.prototype.binop = function(kind, other, context, node) {
- var isConst = this.isConst && other.get$isConst();
- switch (kind) {
- case (35):
- case (34):
-
- return new PureStaticValue($globals.world.boolType, node.get$span(), isConst, false);
-
- case (50):
-
- return new PureStaticValue($globals.world.boolType, node.get$span(), isConst, false);
-
- case (51):
-
- return new PureStaticValue($globals.world.boolType, node.get$span(), isConst, false);
-
- }
- var name = kind == (49) ? ":ne" : TokenKind.binaryMethodName(kind);
- var ret = this.invoke(context, name, node, new Arguments(null, [other]));
- if (isConst) {
- ret = new PureStaticValue(ret.get$type(), node.get$span(), isConst, false);
- }
- return ret;
-}
-PureStaticValue.prototype.invoke = function(context, name, node, args) {
- if (this.get$type().get$isVar()) return new PureStaticValue($globals.world.varType, node.span, false, false);
- if (this.get$type().get$isFunction() && name == ":call") {
- return new PureStaticValue($globals.world.varType, node.span, false, false);
- }
- var member = this.getMem(context, name, node);
- if ($eq$(member)) return new PureStaticValue($globals.world.varType, node.span, false, false);
- return member.invoke(context, node, this, args);
-}
-PureStaticValue.prototype.invokeNoSuchMethod = function(context, name, node, args) {
- if (this.isType) {
- $globals.world.error(("member lookup failed for \"" + name + "\""), node.span);
- }
- var member = this.getMem(context, "noSuchMethod", node);
- if ($eq$(member)) return new PureStaticValue($globals.world.varType, node.span, false, false);
- var noSuchArgs = new Arguments(null, [new PureStaticValue($globals.world.stringType, node.span, false, false), new PureStaticValue($globals.world.listType, node.span, false, false)]);
- return member.invoke(context, node, this, noSuchArgs);
-}
-PureStaticValue.prototype._typeAssert = function(context, toType) {
- return this._changeStaticType(toType);
-}
-PureStaticValue.prototype._changeStaticType = function(toType) {
- if ((null == toType ? null == (this.get$type()) : toType === this.get$type())) return this;
- return new PureStaticValue(toType, this.span, this.isConst, this.isType);
-}
-PureStaticValue.prototype.invokeNoSuchMethod$3 = PureStaticValue.prototype.invokeNoSuchMethod;
-PureStaticValue.prototype.setIndex$4$kind = function($0, $1, $2, $3, kind) {
- return this.setIndex($0, $1, $2, $3, kind, (1));
-};
-PureStaticValue.prototype.setIndex$4$kind$returnKind = PureStaticValue.prototype.setIndex;
-PureStaticValue.prototype.set_$4$kind = function($0, $1, $2, $3, kind) {
- return this.set_($0, $1, $2, $3, kind, (1));
-};
-PureStaticValue.prototype.set_$4$kind$returnKind = PureStaticValue.prototype.set_;
-// ********** Code for EvaluatedValue **************
-$inherits(EvaluatedValue, Value);
-function EvaluatedValue(isConst, type, span) {
- this.isConst = isConst;
- Value.call(this, type, "@@@", span);
-}
-EvaluatedValue.prototype.get$isConst = function() { return this.isConst; };
-EvaluatedValue.prototype.get$code = function() {
- $globals.world.internalError("Should not be getting code from raw EvaluatedValue", this.span);
-}
-EvaluatedValue.prototype.get$actualValue = function() {
- $globals.world.internalError("Should not be getting actual value from raw EvaluatedValue", this.span);
-}
-EvaluatedValue.prototype.get$needsTemp = function() {
- return false;
-}
-EvaluatedValue.prototype.get$constValue = function() {
- return this;
-}
-EvaluatedValue.prototype.hashCode = function() {
- return this.get$code().hashCode();
-}
-EvaluatedValue.prototype.$eq = function(other) {
- return (other instanceof EvaluatedValue) && $eq$(other.get$type(), this.get$type()) && $eq$(other.get$code(), this.get$code());
-}
-// ********** Code for NullValue **************
-$inherits(NullValue, EvaluatedValue);
-function NullValue(isConst, span) {
- EvaluatedValue.call(this, isConst, $globals.world.varType, span);
-}
-NullValue.prototype.get$actualValue = function() {
- return null;
-}
-NullValue.prototype.get$code = function() {
- return "null";
-}
-NullValue.prototype.binop = function(kind, other, context, node) {
- if (!(other instanceof NullValue)) return Value.prototype.binop.call(this, kind, other, context, node);
- var c = this.isConst && other.get$isConst();
- var s = node.get$span();
- switch (kind) {
- case (50):
- case (48):
-
- return new BoolValue(true, c, s);
-
- case (51):
- case (49):
-
- return new BoolValue(false, c, s);
-
- }
- return Value.prototype.binop.call(this, kind, other, context, node);
-}
-// ********** Code for BoolValue **************
-$inherits(BoolValue, EvaluatedValue);
-function BoolValue(actualValue, isConst, span) {
- this.actualValue = actualValue;
- EvaluatedValue.call(this, isConst, $globals.world.nonNullBool, span);
-}
-BoolValue.prototype.get$actualValue = function() { return this.actualValue; };
-BoolValue.prototype.get$code = function() {
- return this.actualValue ? "true" : "false";
-}
-BoolValue.prototype.unop = function(kind, context, node) {
- switch (kind) {
- case (19):
-
- return new BoolValue(!this.actualValue, this.isConst, node.get$span());
-
- }
- return Value.prototype.unop.call(this, kind, context, node);
-}
-BoolValue.prototype.binop = function(kind, other, context, node) {
- if (!(other instanceof BoolValue)) return Value.prototype.binop.call(this, kind, other, context, node);
- var c = this.isConst && other.get$isConst();
- var s = node.get$span();
- var x = this.actualValue, y = other.get$actualValue();
- switch (kind) {
- case (50):
- case (48):
-
- return new BoolValue($eq$(x, y), c, s);
-
- case (51):
- case (49):
-
- return new BoolValue($ne$(x, y), c, s);
-
- case (35):
-
- return new BoolValue(x && y, c, s);
-
- case (34):
-
- return new BoolValue(x || y, c, s);
-
- }
- return Value.prototype.binop.call(this, kind, other, context, node);
-}
-// ********** Code for IntValue **************
-$inherits(IntValue, EvaluatedValue);
-function IntValue(actualValue, isConst, span) {
- this.actualValue = actualValue;
- EvaluatedValue.call(this, isConst, $globals.world.intType, span);
-}
-IntValue.prototype.get$actualValue = function() { return this.actualValue; };
-IntValue.prototype.get$code = function() {
- return ("(" + this.actualValue + ")");
-}
-IntValue.prototype.unop = function(kind, context, node) {
- switch (kind) {
- case (42):
-
- return new IntValue(this.actualValue, this.isConst, this.span);
-
- case (43):
-
- return new IntValue(-this.actualValue, this.isConst, this.span);
-
- case (18):
-
- return new IntValue(~this.actualValue, this.isConst, this.span);
-
- }
- return Value.prototype.unop.call(this, kind, context, node);
-}
-IntValue.prototype.binop = function(kind, other, context, node) {
- var c = this.isConst && other.get$isConst();
- var s = node.get$span();
- if ((other instanceof IntValue)) {
- var x = this.actualValue;
- var y = other.get$actualValue();
- switch (kind) {
- case (50):
- case (48):
-
- return new BoolValue(x == y, c, s);
-
- case (51):
- case (49):
-
- return new BoolValue(x != y, c, s);
-
- case (36):
-
- return new IntValue(x | y, c, s);
-
- case (37):
-
- return new IntValue(x ^ y, c, s);
-
- case (38):
-
- return new IntValue(x & y, c, s);
-
- case (39):
-
- return new IntValue(x << y, c, s);
-
- case (40):
-
- return new IntValue(x >> y, c, s);
-
- case (42):
-
- return new IntValue(x + y, c, s);
-
- case (43):
-
- return new IntValue(x - y, c, s);
-
- case (44):
-
- return new IntValue(x * y, c, s);
-
- case (45):
-
- return new DoubleValue(x / y, c, s);
-
- case (46):
-
- return new IntValue($truncdiv$(x, y), c, s);
-
- case (47):
-
- return new IntValue($mod$(x, y), c, s);
-
- case (52):
-
- return new BoolValue(x < y, c, s);
-
- case (53):
-
- return new BoolValue(x > y, c, s);
-
- case (54):
-
- return new BoolValue(x <= y, c, s);
-
- case (55):
-
- return new BoolValue(x >= y, c, s);
-
- }
- }
- else if ((other instanceof DoubleValue)) {
- var x = this.actualValue;
- var y = other.get$actualValue();
- switch (kind) {
- case (50):
- case (48):
-
- return new BoolValue(x == y, c, s);
-
- case (51):
- case (49):
-
- return new BoolValue(x != y, c, s);
-
- case (42):
-
- return new DoubleValue(x + y, c, s);
-
- case (43):
-
- return new DoubleValue(x - y, c, s);
-
- case (44):
-
- return new DoubleValue(x * y, c, s);
-
- case (45):
-
- return new DoubleValue(x / y, c, s);
-
- case (46):
-
- return new DoubleValue($truncdiv$(x, y), c, s);
-
- case (47):
-
- return new DoubleValue($mod$(x, y), c, s);
-
- case (52):
-
- return new BoolValue(x < y, c, s);
-
- case (53):
-
- return new BoolValue(x > y, c, s);
-
- case (54):
-
- return new BoolValue(x <= y, c, s);
-
- case (55):
-
- return new BoolValue(x >= y, c, s);
-
- }
- }
- return Value.prototype.binop.call(this, kind, other, context, node);
-}
-// ********** Code for DoubleValue **************
-$inherits(DoubleValue, EvaluatedValue);
-function DoubleValue(actualValue, isConst, span) {
- this.actualValue = actualValue;
- EvaluatedValue.call(this, isConst, $globals.world.doubleType, span);
-}
-DoubleValue.prototype.get$actualValue = function() { return this.actualValue; };
-DoubleValue.prototype.get$code = function() {
- return ("(" + this.actualValue + ")");
-}
-DoubleValue.prototype.unop = function(kind, context, node) {
- switch (kind) {
- case (42):
-
- return new DoubleValue(this.actualValue, this.isConst, this.span);
-
- case (43):
-
- return new DoubleValue(-this.actualValue, this.isConst, this.span);
-
- }
- return Value.prototype.unop.call(this, kind, context, node);
-}
-DoubleValue.prototype.binop = function(kind, other, context, node) {
- var c = this.isConst && other.get$isConst();
- var s = node.get$span();
- if ((other instanceof DoubleValue)) {
- var x = this.actualValue;
- var y = other.get$actualValue();
- switch (kind) {
- case (50):
- case (48):
-
- return new BoolValue(x == y, c, s);
-
- case (51):
- case (49):
-
- return new BoolValue(x != y, c, s);
-
- case (42):
-
- return new DoubleValue(x + y, c, s);
-
- case (43):
-
- return new DoubleValue(x - y, c, s);
-
- case (44):
-
- return new DoubleValue(x * y, c, s);
-
- case (45):
-
- return new DoubleValue(x / y, c, s);
-
- case (46):
-
- return new DoubleValue($truncdiv$(x, y), c, s);
-
- case (47):
-
- return new DoubleValue($mod$(x, y), c, s);
-
- case (52):
-
- return new BoolValue(x < y, c, s);
-
- case (53):
-
- return new BoolValue(x > y, c, s);
-
- case (54):
-
- return new BoolValue(x <= y, c, s);
-
- case (55):
-
- return new BoolValue(x >= y, c, s);
-
- }
- }
- else if ((other instanceof IntValue)) {
- var x = this.actualValue;
- var y = other.get$actualValue();
- switch (kind) {
- case (50):
- case (48):
-
- return new BoolValue(x == y, c, s);
-
- case (51):
- case (49):
-
- return new BoolValue(x != y, c, s);
-
- case (42):
-
- return new DoubleValue(x + y, c, s);
-
- case (43):
-
- return new DoubleValue(x - y, c, s);
-
- case (44):
-
- return new DoubleValue(x * y, c, s);
-
- case (45):
-
- return new DoubleValue(x / y, c, s);
-
- case (46):
-
- return new DoubleValue($truncdiv$(x, y), c, s);
-
- case (47):
-
- return new DoubleValue($mod$(x, y), c, s);
-
- case (52):
-
- return new BoolValue(x < y, c, s);
-
- case (53):
-
- return new BoolValue(x > y, c, s);
-
- case (54):
-
- return new BoolValue(x <= y, c, s);
-
- case (55):
-
- return new BoolValue(x >= y, c, s);
-
- }
- }
- return Value.prototype.binop.call(this, kind, other, context, node);
-}
-// ********** Code for StringValue **************
-$inherits(StringValue, EvaluatedValue);
-function StringValue(actualValue, isConst, span) {
- this.actualValue = actualValue;
- EvaluatedValue.call(this, isConst, $globals.world.stringType, span);
-}
-StringValue.prototype.get$actualValue = function() { return this.actualValue; };
-StringValue.prototype.binop = function(kind, other, context, node) {
- if (!(other instanceof StringValue)) return Value.prototype.binop.call(this, kind, other, context, node);
- var c = this.isConst && other.get$isConst();
- var s = node.get$span();
- var x = this.actualValue, y = other.get$actualValue();
- switch (kind) {
- case (50):
- case (48):
-
- return new BoolValue(x == y, c, s);
-
- case (51):
- case (49):
-
- return new BoolValue(x != y, c, s);
-
- case (42):
-
- return new StringValue($add$(x, y), c, s);
-
- }
- return Value.prototype.binop.call(this, kind, other, context, node);
-}
-StringValue.prototype.get$code = function() {
- var buf = new StringBufferImpl("");
- buf.add("\"");
- for (var i = (0);
- i < this.actualValue.length; i++) {
- var ch = this.actualValue.charCodeAt(i);
- switch (ch) {
- case (9):
-
- buf.add("\\t");
- break;
-
- case (10):
-
- buf.add("\\n");
- break;
-
- case (13):
-
- buf.add("\\r");
- break;
-
- case (34):
-
- buf.add("\\\"");
- break;
-
- case (92):
-
- buf.add("\\\\");
- break;
-
- default:
-
- if ($gte$(ch, (32)) && $lte$(ch, (126))) {
- buf.add(this.actualValue[i]);
- }
- else {
- var hex = ch.toRadixString((16));
- switch (hex.get$length()) {
- case (1):
-
- buf.add("\\x0");
- buf.add(hex);
- break;
-
- case (2):
-
- buf.add("\\x");
- buf.add(hex);
- break;
-
- case (3):
-
- buf.add("\\u0");
- buf.add(hex);
- break;
-
- case (4):
-
- buf.add("\\u");
- buf.add(hex);
- break;
-
- default:
-
- $globals.world.internalError("unicode values greater than 2 bytes not implemented");
- break;
-
- }
- }
- break;
-
- }
- }
- buf.add("\"");
- return buf.toString();
-}
-// ********** Code for ListValue **************
-$inherits(ListValue, EvaluatedValue);
-function ListValue(values, isConst, type, span) {
- this.values = values;
- EvaluatedValue.call(this, isConst, type, span);
-}
-ListValue.prototype.get$code = function() {
- var buf = new StringBufferImpl("");
- buf.add("[");
- for (var i = (0);
- $lt$(i, this.values.get$length()); i = $add$(i, (1))) {
- if ($gt$(i, (0))) buf.add(", ");
- buf.add(this.values.$index(i).get$code());
- }
- buf.add("]");
- var listCode = buf.toString$0();
- if (!this.isConst) return listCode;
- var v = new Value($globals.world.listType, listCode, this.span);
- var immutableListCtor = $globals.world.immutableListType.getConstructor("from");
- var result = immutableListCtor.invoke($globals.world.gen.mainContext, null, new TypeValue(v.get$type(), this.span), new Arguments(null, [v]));
- return result.get$code();
-}
-ListValue.prototype.binop = function(kind, other, context, node) {
- if (!(other instanceof ListValue)) return Value.prototype.binop.call(this, kind, other, context, node);
- switch (kind) {
- case (50):
-
- return new BoolValue($eq$(this.get$type(), other.get$type()) && this.get$code() == other.get$code(), this.isConst && other.get$isConst(), node.get$span());
-
- case (51):
-
- return new BoolValue($ne$(this.get$type(), other.get$type()) || this.get$code() != other.get$code(), this.isConst && other.get$isConst(), node.get$span());
-
- }
- return Value.prototype.binop.call(this, kind, other, context, node);
-}
-ListValue.prototype.getGlobalValue = function() {
- return $globals.world.gen.globalForConst(this, this.values);
-}
-// ********** Code for MapValue **************
-$inherits(MapValue, EvaluatedValue);
-function MapValue(values, isConst, type, span) {
- this.values = values;
- EvaluatedValue.call(this, isConst, type, span);
-}
-MapValue.prototype.get$code = function() {
- var items = new ListValue(this.values, false, $globals.world.listType, this.span);
- var tp = $globals.world.coreimpl.topType;
- var f = this.isConst ? tp.getMember("_constMap") : tp.getMember("_map");
- var value = f.invoke($globals.world.gen.mainContext, null, new TypeValue(tp, null), new Arguments(null, [items]));
- return value.get$code();
-}
-MapValue.prototype.getGlobalValue = function() {
- return $globals.world.gen.globalForConst(this, this.values);
-}
-MapValue.prototype.binop = function(kind, other, context, node) {
- if (!(other instanceof MapValue)) return Value.prototype.binop.call(this, kind, other, context, node);
- switch (kind) {
- case (50):
-
- return new BoolValue($eq$(this.get$type(), other.get$type()) && this.get$code() == other.get$code(), this.isConst && other.get$isConst(), node.get$span());
-
- case (51):
-
- return new BoolValue($ne$(this.get$type(), other.get$type()) || this.get$code() != other.get$code(), this.isConst && other.get$isConst(), node.get$span());
-
- }
- return Value.prototype.binop.call(this, kind, other, context, node);
-}
-// ********** Code for ObjectValue **************
-$inherits(ObjectValue, EvaluatedValue);
-function ObjectValue(isConst, type, span) {
- this.seenNativeInitializer = false;
- this.fields = new HashMapImplementation_FieldMember$Value();
- this.fieldsInInitOrder = [];
- EvaluatedValue.call(this, isConst, type, span);
-}
-ObjectValue.prototype.get$fields = function() { return this.fields; };
-ObjectValue.prototype.get$fieldsInInitOrder = function() { return this.fieldsInInitOrder; };
-ObjectValue.prototype.get$seenNativeInitializer = function() { return this.seenNativeInitializer; };
-ObjectValue.prototype.set$seenNativeInitializer = function(value) { return this.seenNativeInitializer = value; };
-ObjectValue.prototype.get$code = function() {
- if (null == this._code) this.validateInitialized(null);
- return this._code;
-}
-ObjectValue.prototype.initFields = function() {
- var allMembers = $globals.world.gen._orderValues(this.get$type().get$genericType().getAllMembers());
- for (var $$i = allMembers.iterator(); $$i.hasNext(); ) {
- var f = $$i.next();
- if (f.get$isField() && !f.get$isStatic() && f.get$declaringType().get$isClass()) {
- this._replaceField(f, f.computeValue(), true);
- }
- }
-}
-ObjectValue.prototype.setField = function(field, value, duringInit) {
- if (value.get$isConst() && (value instanceof VariableValue)) {
- value = value.get$dynamic().get$value();
- }
- var currentValue = this.fields.$index(field);
- if (this.isConst && !value.get$isConst()) {
- $globals.world.error("used of non-const value in const intializer", value.span);
- }
- if (null == currentValue) {
- this._replaceField(field, value, duringInit);
- if (field.get$isFinal() && !duringInit) {
- $globals.world.error("cannot initialize final fields outside of initializer", value.span);
- }
- }
- else {
- if (field.get$isFinal() && null == field.computeValue()) {
- $globals.world.error("reassignment of field not allowed", value.span, field.get$span());
- }
- else {
- this._replaceField(field, value, duringInit);
- }
- }
-}
-ObjectValue.prototype._replaceField = function(field, value, duringInit) {
- if (duringInit) {
- for (var i = (0);
- i < this.fieldsInInitOrder.get$length(); i++) {
- if ($eq$(this.fieldsInInitOrder.$index(i), field)) {
- this.fieldsInInitOrder.$setindex(i);
- break;
- }
- }
- this.fieldsInInitOrder.add(field);
- }
- this.fields.$setindex(field, value);
-}
-ObjectValue.prototype.validateInitialized = function(span) {
- var buf = new StringBufferImpl("");
- buf.add("Object.create(");
- buf.add(("" + this.get$type().get$jsname() + ".prototype, "));
- buf.add("{");
- var addComma = false;
- var $$list = this.fields.getKeys();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var field = $$i.next();
- if (addComma) buf.add(", ");
- buf.add(field.get$jsname());
- buf.add(": ");
- buf.add("{\"value\": ");
- if (null == this.fields.$index(field)) {
- $globals.world.error(("Required field '" + field.get$name() + "' was not initialized"), span, field.get$span());
- buf.add("null");
- }
- else {
- buf.add(this.fields.$index(field).get$code());
- }
- buf.add(", writeable: false}");
- addComma = true;
- }
- buf.add("})");
- this._code = buf.toString$0();
-}
-ObjectValue.prototype.binop = function(kind, other, context, node) {
- if (!(other instanceof ObjectValue)) return Value.prototype.binop.call(this, kind, other, context, node);
- switch (kind) {
- case (50):
- case (48):
-
- return new BoolValue($eq$(this.get$type(), other.get$type()) && this.get$code() == other.get$code(), this.isConst && other.get$isConst(), node.get$span());
-
- case (51):
- case (49):
-
- return new BoolValue($ne$(this.get$type(), other.get$type()) || this.get$code() != other.get$code(), this.isConst && other.get$isConst(), node.get$span());
-
- }
- return Value.prototype.binop.call(this, kind, other, context, node);
-}
-// ********** Code for GlobalValue **************
-$inherits(GlobalValue, Value);
-function GlobalValue(type, code, isConst, field, name, exp, span, deps) {
- this.field = field;
- this.name = name;
- this.exp = exp;
- this.isConst = isConst;
- this.dependencies = [];
- Value.call(this, type, code, span);
- for (var $$i = deps.iterator(); $$i.hasNext(); ) {
- var dep = $$i.next();
- if ((dep instanceof GlobalValue)) {
- this.dependencies.add(dep);
- this.dependencies.addAll(dep.get$dependencies());
- }
- }
-}
-GlobalValue.prototype.get$field = function() { return this.field; };
-GlobalValue.prototype.get$name = function() { return this.name; };
-GlobalValue.prototype.get$exp = function() { return this.exp; };
-GlobalValue.prototype.get$isConst = function() { return this.isConst; };
-GlobalValue.prototype.get$actualValue = function() {
- return this.exp.get$dynamic().get$actualValue();
-}
-GlobalValue.prototype.get$constValue = function() {
- return this.isConst ? this.exp.get$constValue() : null;
-}
-GlobalValue.prototype.get$dependencies = function() { return this.dependencies; };
-GlobalValue.prototype.get$needsTemp = function() {
- return !this.isConst;
-}
-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.get$length() > other.dependencies.get$length()) {
- return (1);
- }
- else if (this.dependencies.get$length() < other.dependencies.get$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);
- }
-}
-// ********** Code for BareValue **************
-$inherits(BareValue, Value);
-function BareValue(home, outermost, span) {
- this.home = home;
- this.isType = outermost.get$isStatic();
- Value.call(this, outermost.method.get$declaringType(), null, span);
-}
-BareValue.prototype.get$isType = function() { return this.isType; };
-BareValue.prototype.get$needsTemp = function() {
- return false;
-}
-BareValue.prototype._shouldBindDynamically = function() {
- return false;
-}
-BareValue.prototype.get$code = function() {
- return this._code;
-}
-BareValue.prototype._ensureCode = function() {
- if (null == this._code) this._code = this.isType ? this.get$type().get$jsname() : this.home._makeThisCode();
-}
-BareValue.prototype._tryResolveMember = function(context, name, node) {
- var member = this.get$type().getMember(name);
- if ($eq$(member) || $ne$(member.get$declaringType(), this.get$type())) {
- var libMember = this.home.get$library().lookup(name, this.span);
- if (null != libMember) {
- return libMember.get$preciseMemberSet();
- }
- }
- this._ensureCode();
- return Value.prototype._tryResolveMember.call(this, context, name, node);
-}
-// ********** Code for SuperValue **************
-$inherits(SuperValue, Value);
-function SuperValue(parentType, span) {
- Value.call(this, parentType, "this", span);
-}
-SuperValue.prototype.get$needsTemp = function() {
- return false;
-}
-SuperValue.prototype.get$isSuper = function() {
- return true;
-}
-SuperValue.prototype._shouldBindDynamically = function() {
- return false;
-}
-SuperValue.prototype._tryUnion = function(right) {
- return (right instanceof SuperValue) ? this : null;
-}
-// ********** Code for ThisValue **************
-$inherits(ThisValue, Value);
-function ThisValue(type, code, span) {
- Value.call(this, type, code, span);
-}
-ThisValue.prototype.get$needsTemp = function() {
- return false;
-}
-ThisValue.prototype._shouldBindDynamically = function() {
- return false;
-}
-ThisValue.prototype._tryUnion = function(right) {
- return (right instanceof ThisValue) ? this : null;
-}
-// ********** Code for TypeValue **************
-$inherits(TypeValue, Value);
-function TypeValue(type, span) {
- Value.call(this, type, null, span);
-}
-TypeValue.prototype.get$needsTemp = function() {
- return false;
-}
-TypeValue.prototype.get$isType = function() {
- return true;
-}
-TypeValue.prototype._shouldBindDynamically = function() {
- return false;
-}
-TypeValue.prototype._tryUnion = function(right) {
- return (right instanceof TypeValue) ? this : null;
-}
-// ********** Code for VariableValue **************
-$inherits(VariableValue, Value);
-function VariableValue(staticType, code, span, isFinal, value) {
- this.isFinal = isFinal;
- this.value = VariableValue._unwrap(value);
- Value.call(this, staticType, code, span);
-}
-VariableValue.prototype.get$isFinal = function() { return this.isFinal; };
-VariableValue.prototype.get$value = function() { return this.value; };
-VariableValue._unwrap = function(v) {
- if (null == v) return null;
- if ((v instanceof VariableValue)) {
- v = v.get$dynamic().get$value();
- }
- return v;
-}
-VariableValue.prototype._tryUnion = function(right) {
- return Value.union(this.value, right);
-}
-VariableValue.prototype.get$needsTemp = function() {
- return false;
-}
-VariableValue.prototype.get$type = function() {
- return null != this.value ? this.value.get$type() : this.get$staticType();
-}
-VariableValue.prototype.get$staticType = function() {
- return this.type;
-}
-VariableValue.prototype.get$isConst = function() {
- return null != this.value ? this.value.get$isConst() : false;
-}
-VariableValue.prototype.replaceValue = function(v) {
- return new VariableValue(this.get$staticType(), this.get$code(), this.span, this.isFinal, v);
-}
-VariableValue.prototype.unop = function(kind, context, node) {
- if (this.value != null) {
- return this.replaceValue(this.value.unop(kind, context, node));
- }
- return Value.prototype.unop.call(this, kind, context, node);
-}
-VariableValue.prototype.binop = function(kind, other, context, node) {
- if (this.value != null) {
- return this.replaceValue(this.value.binop(kind, VariableValue._unwrap(other), context, node));
- }
- return Value.prototype.binop.call(this, kind, other, context, node);
-}
-// ********** Code for CompilerException **************
-function CompilerException(_message, _location) {
- this._lang_message = _message;
- this._location = _location;
-}
-CompilerException.prototype.toString = function() {
- if (this._location != null) {
- return ("CompilerException: " + this._location.toMessageString(this._lang_message));
- }
- else {
- return ("CompilerException: " + this._lang_message);
- }
-}
-CompilerException.prototype.toString$0 = CompilerException.prototype.toString;
-// ********** Code for CounterLog **************
-function CounterLog() {
- this.dynamicMethodCalls = (0);
- this.typeAsserts = (0);
- this.objectProtoMembers = (0);
- this.invokeCalls = (0);
- this.msetN = (0);
-}
-CounterLog.prototype.info = function() {
- if ($globals.options.legOnly) return;
- $globals.world.info(("Dynamically typed method calls: " + this.dynamicMethodCalls));
- $globals.world.info(("Generated type assertions: " + this.typeAsserts));
- $globals.world.info(("Members on Object.prototype: " + this.objectProtoMembers));
- $globals.world.info(("Invoke calls: " + this.invokeCalls));
- $globals.world.info(("msetN calls: " + this.msetN));
-}
-CounterLog.prototype.add = function(other) {
- this.dynamicMethodCalls = this.dynamicMethodCalls + other.dynamicMethodCalls;
- this.typeAsserts = this.typeAsserts + other.typeAsserts;
- this.objectProtoMembers = this.objectProtoMembers + other.objectProtoMembers;
- this.invokeCalls = this.invokeCalls + other.invokeCalls;
- this.msetN = this.msetN + other.msetN;
-}
-// ********** 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._hazardousMemberNames = new HashSetImplementation_dart_core_String();
- this.reader = new LibraryReader();
- this.counters = new CounterLog();
-}
-World.prototype.get$functionType = function() { return this.functionType; };
-World.prototype.init = function() {
- this._addHazardousMemberName("split");
- this.corelib = new Library(this.readFile("dart:core"));
- this.libraries.$setindex("dart:core", this.corelib);
- this._todo.add(this.corelib);
- this.coreimpl = this.getOrAddLibrary("dart:coreimpl");
- this.voidType = this.corelib.addType("void", null, false);
- this.dynamicType = this.corelib.addType("Dynamic", null, false);
- this.varType = this.dynamicType;
- this.objectType = this.corelib.addType("Object", null, true);
- this.numType = this.corelib.addType("num", null, false);
- this.intType = this.corelib.addType("int", null, false);
- this.doubleType = this.corelib.addType("double", null, false);
- this.boolType = this.corelib.addType("bool", null, false);
- this.stringType = this.corelib.addType("String", null, false);
- this.listType = this.corelib.addType("List", null, false);
- this.mapType = this.corelib.addType("Map", null, false);
- this.functionType = this.corelib.addType("Function", null, false);
- this.typeErrorType = this.corelib.addType("TypeError", null, true);
- this.numImplType = this.coreimpl.addType("NumImplementation", null, true);
- this.stringImplType = this.coreimpl.addType("StringImplementation", null, true);
- this.immutableListType = this.coreimpl.addType("ImmutableList", null, true);
- this.listFactoryType = this.coreimpl.addType("ListFactory", null, true);
- this.functionImplType = this.coreimpl.addType("_FunctionImplementation", null, true);
- this.nonNullBool = new NonNullableType(this.boolType);
-}
-World.prototype._addHazardousMemberName = function(name) {
- return this._hazardousMemberNames.add(name);
-}
-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 ($eq$(mset)) {
- mset = new MemberSet(member, true);
- this._members.$setindex(mset.get$name(), mset);
- }
- else {
- mset.get$members().add(member);
- }
-}
-World.prototype._addTopName = function(named) {
- if ((named instanceof Type) && named.get$isNative()) {
- if (named.get$avoidNativeName()) {
- this._addJavascriptTopName(new ExistingJsGlobal(named.get$nativeName(), named), named.get$nativeName());
- }
- else {
- this._addJavascriptTopName(named, named.get$nativeName());
- }
- }
- this._addJavascriptTopName(named, named.get$jsname());
-}
-World.prototype._addJavascriptTopName = function(named, name) {
- var existing = this._topNames.$index(name);
- if ($eq$(existing)) {
- this._topNames.$setindex(name, named);
- return;
- }
- if ((null == existing ? null == (named) : existing === named)) {
- return;
- }
- this.info($add$(("mangling matching top level name \"" + named.get$jsname() + "\" in "), ("both \"" + named.get$library().get$jsname() + "\" and \"" + existing.get$library().get$jsname() + "\"")));
- var existingPri = existing.get$jsnamePriority();
- var namedPri = named.get$jsnamePriority();
- if (existingPri > namedPri || namedPri == (0)) {
- this._renameJavascriptTopName(named);
- }
- else if (namedPri > existingPri) {
- this._renameJavascriptTopName(existing);
- }
- else {
- if (named.get$isNative()) {
- var msg = $add$($add$(("conflicting JS name \"" + name + "\" of same "), ("priority " + existingPri + ": (already defined in) ")), ("" + existing.get$span().get$locationText() + " with priority " + namedPri + ")"));
- $globals.world.info(msg, named.get$span(), existing.get$span());
- }
- else {
- this._renameJavascriptTopName(existing);
- }
- }
-}
-World.prototype._renameJavascriptTopName = function(named) {
- named._jsname = ("" + named.get$library().get$jsname() + "_" + named.get$jsname());
- var existing = this._topNames.$index(named.get$jsname());
- if ($ne$(existing) && $ne$(existing, named)) {
- $globals.world.internalError($add$(("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.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 $add$(name, "_");
- }
- else {
- return name.replaceAll("$", "$$").replaceAll(":", "$");
- }
-}
-World.prototype.compileAndSave = function() {
- var success = this.compile();
- if ($globals.options.outfile != null) {
- if (success) {
- var code = $globals.world.getGeneratedCode();
- if (!$globals.options.outfile.endsWith(".js")) {
- code = ("#!/usr/bin/env node\n" + code);
- }
- $globals.world.files.writeString($globals.options.outfile, code);
- }
- else {
- $globals.world.files.writeString($globals.options.outfile, "throw 'Sorry, but I could not generate reasonable code to run.\\n';");
- }
- }
- return success;
-}
-World.prototype.compile = function() {
- if ($globals.options.dartScript == null) {
- this.fatal("no script provided to compile");
- return false;
- }
- try {
- if ($globals.options.legOnly) {
- this.info(("[leg] compiling " + $globals.options.dartScript));
- }
- else {
- 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.legOnly) return false;
- if ($globals.legCompile == null) {
- this.fatal("requested leg enabled, but no leg compiler available");
- }
- var res = this.withTiming("[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());
- this.withTiming("name safety", (function () {
- $this.nameSafety(lib);
- })
- );
- if ($globals.experimentalAwaitPhase != null) {
- this.withTiming("await translation", to$call$0($globals.experimentalAwaitPhase));
- }
- this.withTiming("analyze pass", (function () {
- $this.analyzeCode(lib);
- })
- );
- if ($globals.options.checkOnly) return;
- this.withTiming("generate code", (function () {
- $this.generateCode(lib);
- })
- );
-}
-World.prototype.getGeneratedCode = function() {
- if (this.legCode != null) {
- return this.legCode;
- }
- else {
- return this.frogCode;
- }
-}
-World.prototype.readFile = function(filename) {
- try {
- var sourceFile = this.reader.readFile(filename);
- this.dartBytesRead = 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);
- if (filename == "dart:dom") {
- this.dom = library;
- }
- else if (filename == "dart:isolate") {
- this.isolatelib = library;
- }
- }
- return library;
-}
-World.prototype.process = function() {
- while (this._todo.get$length() > (0)) {
- var todo = this._todo;
- this._todo = [];
- for (var $$i = todo.iterator(); $$i.hasNext(); ) {
- var lib = $$i.next();
- lib.visitSources();
- }
- }
-}
-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 = $$list.iterator(); $$i.hasNext(); ) {
- var lib = $$i.next();
- lib.resolve();
- }
- var $$list = this.libraries.getValues();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var lib = $$i.next();
- lib.postResolveChecks();
- }
-}
-World.prototype.get$resolveAll = function() {
- return this.resolveAll.bind(this);
-}
-World.prototype.nameSafety = function(rootLib) {
- this.makePrivateMembersUnique(rootLib);
- this.avoidHazardousMemberNames();
-}
-World.prototype.makePrivateMembersUnique = function(rootLib) {
- var usedNames = new HashSetImplementation_dart_core_String();
- function process(lib) {
- var $$list = lib.get$_privateMembers().getKeys();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var name = $$i.next();
- if (usedNames.contains$1(name)) {
- var mset = lib.get$_privateMembers().$index(name);
- var uniqueName = ("_" + lib.get$jsname() + mset.get$jsname());
- mset.set$jsname(uniqueName);
- var $list0 = mset.get$members();
- for (var $i0 = $list0.iterator(); $i0.hasNext(); ) {
- var member = $i0.next();
- member.set$_jsname(uniqueName);
- }
- }
- else {
- usedNames.add(name);
- }
- }
- }
- var visited = new HashSetImplementation_Library();
- function visit(lib) {
- if (visited.contains$1(lib)) return;
- visited.add(lib);
- process(lib);
- var $$list = lib.get$imports();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var import_ = $$i.next();
- visit(import_.get$library());
- }
- }
- visit(rootLib);
-}
-World.prototype.avoidHazardousMemberNames = function() {
- var $this = this; // closure support
- function rename(jsname) {
- if ($this._hazardousMemberNames.contains(jsname)) {
- jsname = ("" + jsname + "$_");
- }
- return jsname;
- }
- var $$list = this._members.getKeys();
- for (var $$i = $$list.iterator(); $$i.hasNext(); ) {
- var name = $$i.next();
- var mset = this._members.$index(name);
- var renamed = false;
- var $list0 = mset.get$members();
- for (var $i0 = $list0.iterator(); $i0.hasNext(); ) {
- var member = $i0.next();
- if (!member.get$isNative() || ((member instanceof MethodMember) && member.get$hasNativeBody())) {
- var oldName = member.get$_jsname();
- member.set$_jsname(rename(oldName));
- if (member.get$_jsname() != oldName) renamed = true;
- }
- }
- if (renamed) {
- mset.set$jsname(rename(mset.get$jsname()));
- }
- }
-}
-World.prototype.findMainMethod = function(lib) {
- var main = lib.lookup("main", lib.get$span());
- if ($eq$(main)) {
- if (!$globals.options.checkOnly) this.fatal("no main method specified");
- }
- return main;
-}
-World.prototype.analyzeCode = function(lib) {
- this.gen = new WorldGenerator(this.findMainMethod(lib), new CodeWriter());
- this.gen.analyze();
-}
-World.prototype.generateCode = function(lib) {
- this.gen.run();
- this.frogCode = this.gen.writer.get$text();
- this.jsBytesWritten = this.frogCode.length;
- this.gen = null;
-}
-World.prototype._lang_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);
- }
- }
- else {
- var messageWithPrefix = $globals.options.useColors ? ($add$($add$($add$(color, prefix), $globals._NO_COLOR), message)) : ($add$(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($add$(prefix, message), span));
- }
-}
-World.prototype.error = function(message, span, span1, span2) {
- this.errors++;
- this._lang_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._lang_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._lang_message($globals._RED_COLOR, "fatal: ", message, span, span1, span2, $globals.options.throwOnFatal || $globals.options.throwOnErrors);
-}
-World.prototype.internalError = function(message, span, span1, span2) {
- this._lang_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._lang_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.counters.info();
- 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.legOnly = false;
- this.allowMockCompilation = 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.inferTypes = false;
- this.checkOnly = false;
- this.ignoreUnrecognizedFlags = false;
- this.disableBoundsChecks = false;
- this.throwOnErrors = false;
- this.throwOnWarnings = false;
- this.throwOnFatal = false;
- this.showInfo = false;
- this.showWarnings = true;
- this.useColors = true;
- this.maxInferenceIterations = (4);
- 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 passedLibDir = false;
- this.childArgs = [];
- loop:
- for (var i = (2);
- i < args.get$length(); i++) {
- var arg = args.$index(i);
- if (this.tryParseSimpleOption(arg)) continue;
- if (arg.endsWith(".dart")) {
- this.dartScript = arg;
- this.childArgs = args.getRange(i + (1), args.get$length() - i - (1));
- break loop;
- }
- else if (arg.startsWith("--out=")) {
- this.outfile = arg.substring$1("--out=".length);
- }
- else if (arg.startsWith("--libdir=")) {
- this.libDir = arg.substring$1("--libdir=".length);
- passedLibDir = true;
- }
- else if (!this.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";
- }
- }
-}
-FrogOptions.prototype.tryParseSimpleOption = function(option) {
- if (!option.startsWith("--")) return false;
- switch (option.replaceAll("_", "-")) {
- case "--leg":
- case "--enable-leg":
- case "--leg-only":
-
- this.legOnly = true;
- return true;
-
- case "--allow-mock-compilation":
-
- this.allowMockCompilation = true;
- return true;
-
- case "--enable-asserts":
-
- this.enableAsserts = true;
- return true;
-
- case "--enable-type-checks":
-
- this.enableTypeChecks = true;
- this.enableAsserts = true;
- return true;
-
- case "--verify-implements":
-
- this.verifyImplements = true;
- return true;
-
- case "--compile-all":
-
- this.compileAll = true;
- return true;
-
- case "--check-only":
-
- this.checkOnly = true;
- return true;
-
- case "--diet-parse":
-
- this.dietParse = true;
- return true;
-
- case "--ignore-unrecognized-flags":
-
- this.ignoreUnrecognizedFlags = true;
- return true;
-
- case "--verbose":
-
- this.showInfo = true;
- return true;
-
- case "--suppress-warnings":
-
- this.showWarnings = false;
- return true;
-
- case "--warnings-as-errors":
-
- this.warningsAsErrors = true;
- return true;
-
- case "--throw-on-errors":
-
- this.throwOnErrors = true;
- return true;
-
- case "--throw-on-warnings":
-
- this.throwOnWarnings = true;
- return true;
-
- case "--compile-only":
-
- this.compileOnly = true;
- return true;
-
- case "--Xforce-dynamic":
-
- this.forceDynamic = true;
- return true;
-
- case "--no-colors":
-
- this.useColors = false;
- return true;
-
- case "--Xinfer-types":
-
- this.inferTypes = true;
- return true;
-
- case "--enable-checked-mode":
- case "--checked":
-
- this.enableTypeChecks = true;
- this.enableAsserts = true;
- return true;
-
- case "--unchecked":
-
- this.disableBoundsChecks = true;
- return true;
-
- }
- return false;
-}
-// ********** Code for LibraryReader **************
-function LibraryReader() {
- 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, "../../lib/html/frog/html_frog.dart"), "dart:dom", joinPaths($globals.options.libDir, "../../lib/dom/frog/dom_frog.dart"), "dart:json", joinPaths($globals.options.libDir, "../../lib/json/json_frog.dart"), "dart:io", joinPaths($globals.options.libDir, "../../lib/compiler/implementation/lib/io.dart"), "dart:isolate", joinPaths($globals.options.libDir, "../../lib/isolate/isolate_frog.dart"), "dart:uri", joinPaths($globals.options.libDir, "../../lib/uri/uri.dart"), "dart:utf", joinPaths($globals.options.libDir, "../../lib/utf/utf.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_frog.dart"), "dart:dom", joinPaths($globals.options.libDir, "dom/dom_frog.dart"), "dart:isolate", joinPaths($globals.options.libDir, "isolate/isolate_frog.dart"), "dart:json", joinPaths($globals.options.libDir, "json/json_frog.dart"), "dart:uri", joinPaths($globals.options.libDir, "uri/uri.dart"), "dart:utf", joinPaths($globals.options.libDir, "utf/utf.dart")]);
- }
- else {
- $globals.world.error(("Invalid configuration " + $globals.options.config));
- }
-}
-LibraryReader.prototype.readFile = function(fullName) {
- var filename;
- if (fullName.startsWith("package:")) {
- filename = joinPaths(dirname($globals.options.dartScript), joinPaths("packages", fullName.substring("package:".length)));
- }
- else {
- 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;
-}
-VarMember.prototype.get$name = function() { return this.name; };
-VarMember.prototype.get$isGenerated = function() { return this.isGenerated; };
-VarMember.prototype.get$body = function() {
- return null;
-}
-VarMember.prototype.get$returnType = function() {
- return $globals.world.varType;
-}
-VarMember.prototype.invoke = function(context, node, target, args) {
- return new Value(this.get$returnType(), ("" + target.get$code() + "." + this.name + "(" + args.getCode() + ")"), node.span);
-}
-// ********** Code for VarFunctionStub **************
-$inherits(VarFunctionStub, VarMember);
-function VarFunctionStub(name, callArgs) {
- this.args = callArgs.toCallStubArgs();
- VarMember.call(this, name);
- $globals.world.functionImplType.markUsed();
- $globals.world.gen.genMethod($globals.world.functionImplType.getMember("_genStub"));
-}
-VarFunctionStub.prototype.invoke = function(context, node, target, args) {
- return VarMember.prototype.invoke.call(this, context, node, target, args);
-}
-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("}");
-}
-// ********** Code for VarMethodStub **************
-$inherits(VarMethodStub, VarMember);
-function VarMethodStub(name, member, args, body) {
- this.member = member;
- this.args = args;
- this.body = body;
- 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;
- if (!this.get$isHidden() && this._useDirectCall(this.args)) {
- $globals.world.gen._writePrototypePatch(this.get$declaringType(), this.name, $globals.world.gen._prototypeOf(this.get$declaringType(), this.member.get$jsname()), code, true);
- }
- else {
- var suffix = $globals.world.gen._writePrototypePatch(this.get$declaringType(), this.name, ("function(" + this.args.getCode() + ") {"), code, false);
- if (!suffix.endsWith(";")) {
- suffix = $add$(suffix, ";");
- }
- if (this._needsExactTypeCheck()) {
- code.enterBlock(("if (Object.getPrototypeOf(this).hasOwnProperty(\"" + this.name + "\")) {"));
- code.writeln(("" + this.body + ";"));
- code.exitBlock("}");
- var argsCode = this.args.getCode();
- if (argsCode != "") argsCode = $add$(", ", argsCode);
- code.writeln(("return Object.prototype." + this.name + ".call(this" + argsCode + ");"));
- code.exitBlock(suffix);
- }
- else {
- code.writeln(("" + this.body + ";"));
- code.exitBlock(suffix);
- }
- }
-}
-VarMethodStub.prototype._needsExactTypeCheck = function() {
- var $this = this; // closure support
- if (this.member == null || this.member.declaringType.get$isObject()) return false;
- var members = this.member.get$potentialMemberSet().members;
- return members.filter((function (m) {
- return $ne$(m, $this.member) && m.get$declaringType().get$isHiddenNativeType();
- })
- ).get$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.get$length(); i++) {
- if (method.parameters.$index(i).value.get$code() != "null") {
- return false;
- }
- }
- return method.namesInHomePositions(args);
- }
- else {
- return false;
- }
-}
-// ********** 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();
- 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 = $$list.iterator(); $$i.hasNext(); ) {
- var member = $$i.next();
- var type = member.get$declaringType();
- var target = new Value(type, "this", node.span);
- var result = member.invoke(context, node, target, this.args);
- 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);
- 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) {
-
-}
-// ********** Code for JsNames **************
-function JsNames() {}
-JsNames.get$reserved = function() {
- if (null == $globals.JsNames__reserved) {
- $globals.JsNames__reserved = new HashSetImplementation_dart_core_String();
- $globals.JsNames__reserved.addAll(const$0010);
- $globals.JsNames__reserved.addAll(const$0011);
- $globals.JsNames__reserved.addAll(const$0012);
- }
- return $globals.JsNames__reserved;
-}
-JsNames.getValid = function(name) {
- if (JsNames.get$reserved().contains(name)) {
- name = ("" + name + "$");
- }
- else if (name.contains("$")) {
- name = name.replaceAll("$", "$$");
- }
- return name;
-}
-// ********** Code for top level **************
-function _otherOperator(jsname, op) {
- return ("function " + jsname + "$complex$(x, y) {\n if (typeof(x) == 'number') {\n $throw(new IllegalArgumentException(y));\n } else if (typeof(x) == 'object') {\n return x." + jsname + "(y);\n } else {\n $throw(new NoSuchMethodException(x, \"operator " + op + "\", [y]));\n }\n}\nfunction " + jsname + "$(x, y) {\n if (typeof(x) == 'number' && typeof(y) == 'number') return x " + op + " y;\n return " + jsname + "$complex$(x, y);\n}");
-}
-function map(source, mapper) {
- var result = new Array();
- if (!!(source && source.is$List())) {
- var list = source;
- result.set$length(list.get$length());
- for (var i = (0);
- i < list.get$length(); i++) {
- result.$setindex(i, mapper(list.$index(i)));
- }
- }
- else {
- for (var $$i = source.iterator(); $$i.hasNext(); ) {
- var item = $$i.next();
- result.add(mapper(item));
- }
- }
- return result;
-}
-function reduce(source, callback, initialValue) {
- var i = source.iterator();
- var current = initialValue;
- if ($eq$(current) && i.hasNext()) {
- current = i.next();
- }
- while (i.hasNext()) {
- current = callback.call$2(current, i.next());
- }
- return current;
-}
-function orderValuesByKeys(map) {
- var keys = map.getKeys();
- keys.sort((function (x, y) {
- return x.compareTo(y);
- })
- );
- var values = [];
- for (var $$i = keys.iterator(); $$i.hasNext(); ) {
- var k = $$i.next();
- values.add(map.$index(k));
- }
- return values;
-}
-var world;
-var experimentalAwaitPhase;
-var legCompile;
-function initializeWorld(files) {
- $globals.world = new World(files);
- if (!$globals.options.legOnly) $globals.world.init();
-}
-function compile(homedir, args, files) {
- parseOptions(homedir, args, files);
- initializeWorld(files);
- return $globals.world.compileAndSave();
-}
-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++) {
- var argName = args.getName(i);
- nameBuilder.add("$");
- if (argName.contains$1("$")) {
- nameBuilder.add(("" + argName.get$length()));
- }
- nameBuilder.add(argName);
- }
- return nameBuilder.toString$0();
-}
-// ********** Library minfrog **************
-// ********** Code for top level **************
-function main() {
- var homedir = path.dirname(fs.realpathSync(get$$process().get$argv().$index((1))));
- var argv = [];
- for (var i = (0);
- i < get$$process().get$argv().get$length(); i++) {
- argv.add(get$$process().get$argv().$index(i));
- if (i == (1)) {
- var terminal = get$$process().get$env().$index("TERM");
- if ($eq$(terminal) || !terminal.startsWith("xterm")) {
- argv.add("--no_colors");
- }
- }
- }
- if (compile(homedir, argv, new NodeFileSystem())) {
- var code = $globals.world.getGeneratedCode();
- if ($globals.options.compileOnly) {
- if ($globals.options.outfile != null) {
- print$(("Compilation succeded. Code generated in: " + $globals.options.outfile));
- }
- else {
- print$("Compilation succeded.");
- }
- }
- else {
- get$$process().set$argv([argv.$index((0)), argv.$index((1))]);
- get$$process().get$argv().addAll($globals.options.childArgs);
- vm.runInNewContext(code, createSandbox());
- }
- }
- else {
- get$$process().exit((1));
- }
-}
-// 1 dynamic types.
-// 1 types
-// 0 !leaf
-// ********** Globals **************
-function $static_init(){
- $globals._GREEN_COLOR = "\x1b[32m";
- $globals._MAGENTA_COLOR = "\x1b[35m";
- $globals._NO_COLOR = "\x1b[0m";
- $globals._RED_COLOR = "\x1b[31m";
-}
-var const$0000 = Object.create(_DeletedKeySentinel.prototype, {});
-var const$0001 = Object.create(NoMoreElementsException.prototype, {});
-var const$0002 = Object.create(EmptyQueueException.prototype, {});
-var const$0006 = Object.create(IllegalAccessException.prototype, {});
-var const$0007 = ImmutableList.ImmutableList$from$factory([]);
-var const$0009 = new JSSyntaxRegExp("^[a-zA-Z]:/");
-var const$0010 = ImmutableList.ImmutableList$from$factory(["__PROTO__", "prototype", "constructor"]);
-var const$0011 = ImmutableList.ImmutableList$from$factory(["NaN", "Infinity", "undefined", "eval", "parseInt", "parseFloat", "isNan", "isFinite", "decodeURI", "decodeURIComponent", "encodeURI", "encodeURIComponent", "Object", "Function", "Array", "String", "Boolean", "Number", "Date", "RegExp", "Error", "EvalError", "RangeError", "ReferenceError", "SyntaxError", "TypeError", "URIError", "Math", "arguments", "escape", "unescape", "applicationCache", "closed", "Components", "content", "controllers", "crypto", "defaultStatus", "dialogArguments", "directories", "document", "frameElement", "frames", "fullScreen", "globalStorage", "history", "innerHeight", "innerWidth", "length", "location", "locationbar", "localStorage", "menubar", "mozInnerScreenX", "mozInnerScreenY", "mozScreenPixelsPerCssPixel", "name", "navigator", "opener", "outerHeight", "outerWidth", "pageXOffset", "pageYOffset", "parent", "personalbar", "pkcs11", "returnValue", "screen", "scrollbars", "scrollMaxX", "scrollMaxY", "self", "sessionStorage", "sidebar", "status", "statusbar", "toolbar", "top", "window", "alert", "addEventListener", "atob", "back", "blur", "btoa", "captureEvents", "clearInterval", "clearTimeout", "close", "confirm", "disableExternalCapture", "dispatchEvent", "dump", "enableExternalCapture", "escape", "find", "focus", "forward", "GeckoActiveXObject", "getAttention", "getAttentionWithCycleCount", "getComputedStyle", "getSelection", "home", "maximize", "minimize", "moveBy", "moveTo", "open", "openDialog", "postMessage", "print", "prompt", "QueryInterface", "releaseEvents", "removeEventListener", "resizeBy", "resizeTo", "restore", "routeEvent", "scroll", "scrollBy", "scrollByLines", "scrollByPages", "scrollTo", "setInterval", "setResizeable", "setTimeout", "showModalDialog", "sizeToContent", "stop", "uuescape", "updateCommands", "XPCNativeWrapper", "XPCSafeJSOjbectWrapper", "onabort", "onbeforeunload", "onchange", "onclick", "onclose", "oncontextmenu", "ondragdrop", "onerror", "onfocus", "onhashchange", "onkeydown", "onkeypress", "onkeyup", "onload", "onmousedown", "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onmozorientation", "onpaint", "onreset", "onresize", "onscroll", "onselect", "onsubmit", "onunload", "ontouchcancel", "ontouchend", "ontouchmove", "ontouchstart", "ongesturestart", "ongesturechange", "ongestureend", "uneval", "getPrototypeOf", "let", "yield", "abstract", "int", "short", "boolean", "interface", "static", "byte", "long", "char", "final", "native", "synchronized", "float", "package", "throws", "goto", "private", "transient", "implements", "protected", "volatile", "double", "public", "attachEvent", "clientInformation", "clipboardData", "createPopup", "dialogHeight", "dialogLeft", "dialogTop", "dialogWidth", "onafterprint", "onbeforedeactivate", "onbeforeprint", "oncontrolselect", "ondeactivate", "onhelp", "onresizeend", "event", "external", "Debug", "Enumerator", "Global", "Image", "ActiveXObject", "VBArray", "Components", "toString", "getClass", "constructor", "prototype", "valueOf", "Anchor", "Applet", "Attr", "Canvas", "CanvasGradient", "CanvasPattern", "CanvasRenderingContext2D", "CDATASection", "CharacterData", "Comment", "CSS2Properties", "CSSRule", "CSSStyleSheet", "Document", "DocumentFragment", "DocumentType", "DOMException", "DOMImplementation", "DOMParser", "Element", "Event", "ExternalInterface", "FlashPlayer", "Form", "Frame", "History", "HTMLCollection", "HTMLDocument", "HTMLElement", "IFrame", "Image", "Input", "JSObject", "KeyEvent", "Link", "Location", "MimeType", "MouseEvent", "Navigator", "Node", "NodeList", "Option", "Plugin", "ProcessingInstruction", "Range", "RangeException", "Screen", "Select", "Table", "TableCell", "TableRow", "TableSelection", "Text", "TextArea", "UIEvent", "Window", "XMLHttpRequest", "XMLSerializer", "XPathException", "XPathResult", "XSLTProcessor", "java", "Packages", "netscape", "sun", "JavaObject", "JavaClass", "JavaArray", "JavaMember", "$wnd", "$doc", "$entry", "$moduleName", "$moduleBase", "$gwt_version", "$sessionId", "$stack", "$stackDepth", "$location", "call"]);
-var const$0012 = ImmutableList.ImmutableList$from$factory(["break", "delete", "function", "return", "typeof", "case", "do", "if", "switch", "var", "catch", "else", "in", "this", "void", "continue", "false", "instanceof", "throw", "while", "debugger", "finally", "new", "true", "with", "default", "for", "null", "try", "abstract", "double", "goto", "native", "static", "boolean", "enum", "implements", "package", "super", "byte", "export", "import", "private", "synchronized", "char", "extends", "int", "protected", "throws", "class", "final", "interface", "public", "transient", "const", "float", "long", "short", "volatile"]);
-var const$0013 = new JSSyntaxRegExp("^[a-zA-Z][a-zA-Z_$0-9]*$");
-var $globals = {};
-$static_init();
-if (typeof window != 'undefined' && typeof document != 'undefined' &&
- window.addEventListener && document.readyState == 'loading') {
- window.addEventListener('DOMContentLoaded', function(e) {
- main();
- });
-} else {
- main();
-}
« no previous file with comments | « dart/frog/lib/node/node.dart ('k') | dart/frog/minfrog.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698