| 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();
|
| -}
|
|
|