📄 javascript2.js
字号:
(function(){
var Class = _JSVM_Namespace.kernel.Class;
var Object = _JSVM_Namespace.kernel.Object;
Class.prototype.$implements = function()
{
//debugger;
for(var i = 0; i < arguments.length; i++)
{
var type = arguments[i];
try
{
if (typeof(type) == "string")
{
type = _JSVM_Namespace.kernel.Class.forName(type);
}
for (var each in type)
{
var obj = type[each];
if(typeof(obj) == "function")
this.prototype[each] = obj;
}
this.$interfaces = this.$interfaces || [];
this.$interfaces.push(type);
return this.prototype;
}
catch(ex)
{
throw new Exception(0x0018, "Class.$implements(type...) fail.", ex);
}
}
}
Object.prototype.$convert = function(asType)
{
try{
var ret = null;
if(typeof(this.convert) == "function")
{
ret = this.convert(asType);
}
if(ret != null) return ret;
ret = new asType();
var obj = Class.forName("js.lang.Cloneable").cloneObject(this);
for(var each in ret)
{
if(!/^((prototype$)|(window$)|(\_*\$))/.test(each) && typeof(ret[each]) != "function")
{
ret[each] = obj[each];
}
}
return ret;
}
catch(ex)
{
return null;
}
}
Object.$typeof = function(obj, shortName)
{
if(obj.getClass)
{
if(shortName)
{
var ret = obj.getClass().getName().split(/\./g);
return ret[ret.length - 1];
}
else
return obj.getClass().getName();
}
else
return typeof(obj);
}
})();
var _jsvmCoreFunc_extends_javascript2 = function ()
{
var jsre = _JSVM_Namespace.runtimeEnvironment;
var Exception = _JSVM_Namespace.kernel.Exception;
/* set javascript2 paresr */
jsre.JSVM.getCompiler().setParser("javascript2", new function()
{
// define RegExp variable
var regExp_import = /(^|\s|;|})(\s*)(import)(\s+)((\w+\.)*(\w+))(\s*)/g;
var regExp_class = /(^|\s|;|}\s*)(public\s+|internal\s+|private\s+)?class\s+(\w+)(\s+extends\s+[\w.]+)?(\s+implements\s+([\w.]+)(\s*,\s*[\w.]+)*)?(\s*)/;
var regExp_super = /([^A-Za-z0-9_\$]+)super([^A-Za-z0-9_\$]+)/g;
//property Attributes
var regExp_property = /(public|private)(\s+)(static)?\s*(\n\r\s*)*var([^;]*;)/;
//function Attributes
var regExp_function = /(public|private)(\s+)(static)?(\s*)(\n\r\s*)*(function)(\s+)(\w+)(\s*)/;
var regExp_const = /(const)(\s+)(\w+)(\s*)(=)(\s*)(\n\r\s*)*(\w+);/;
var regExps_comments = [/(\s|^)+\/\/([^\n\r])*/g, /(\/\*)\/?(([^\*]\/)|[^\/])*(\*\/)/g];
var regExps_strings = [/("(\\"|[^"\n\r]|(\\\r\n))*")/g, /('(\\'|[^'\n\r]|(\\\r\n))*')/g];
var strings_tmpPrefix = "${COMPILE_CONST_" + new Date().getTime();
var strings_tmpSuffix = "}";
var regExp_package = /(^|\s|;|})(\s*)(package)(\s+)((\w+)(\.\w+)*)(\s*)/;
var regExp_asExpr = /((\w+\.)*(\w+))(\s+)as(\s+)((\w+\.)*(\w+))/g;
var regExp_ass = /(get|set)(\s+)(\w+)/g;
var regExp_overload = /(public|private)?(\s+)(static)?(\s*)(\n\r\s*)*(function)(\s+)(\w+)\(\s*(([\w*]\:[\w.]+)\s*(\,\s*([\w*]\:[\w.]+))*)\s*\)/;
this.parse = function(code)
{
// store string constant
var constStrs = [];
var tmpStrs = code.match(regExps_strings[0]);
if (tmpStrs != null)
{
constStrs = constStrs.concat(tmpStrs);
}
var tmpStrs = code.match(regExps_strings[1]);
if (tmpStrs != null)
{
constStrs = constStrs.concat(tmpStrs);
}
// remove comments
code = code.replace(regExps_comments[0], "");
code = code.replace(regExps_comments[1], "");
for (var i = 0; i < constStrs.length; i++)
{
code = code.replace(constStrs[i],
(strings_tmpPrefix + i + strings_tmpSuffix));
}
// proc package
code = code.replace(regExp_package, "$1_$package(\"$5\");");
var packageName = RegExp.$5;
// proc import
code = code.replace(regExp_import, "$1var $7 = _$import(\"$5\")");
// proc super
code = code.replace(regExp_super, "$1$class.$super$2");
//getter and setter
code = code.replace(regExp_ass, "function $1$3");
while (regExp_class.test(code))
{
var shortClassName = RegExp.$3;
var superName = RegExp.$4;
var implementList = RegExp.$5;
var className = packageName + "." + shortClassName;
var classVisibility = RegExp.$2.replace(/\s+/g,"");
var superName = superName.replace(/\s+extends\s+/,"");
var implementList = implementList.replace(/\s+implements\s+/,"");
var subCode = code.split(/[^$]class/g);
var str = "\r\nvar $class = ";
if(classVisibility == "public")
str += className + " = ";
str += "function(){return " + "$"
+ shortClassName + ".apply(this,arguments);};\r\n"
+ "var " + shortClassName + " = $class;\r\n";
if (superName == "")
{
str += "$class.$extends(_JSVM_Namespace.kernel.Object);";
}
else
{
str += "$class.$extends(" + superName + ");";
}
str += "$class.$implements(" + implementList + ");";
//static fields
str += "var _$privateHandlerMap = {};";
str += "var _$getCurrentPrivateHandler = function (){var hash = this.hashCode();return (hash in _$privateHandlerMap) ? _$privateHandlerMap[hash] : (_$privateHandlerMap[hash] = {});};";
//debugger;
var overloaded = {};
while (regExp_overload.test(subCode[1]))
{
var pre = RegExp.$1 + " " + RegExp.$3 + " " + RegExp.$6 + " " + RegExp.$8;
var name = RegExp.$8;
var scode = "";
var args = RegExp.$9.split(/(\s*,\s*)/g);
var idx = [];
var arg = [];
for(var i = 0; i < args.length; i++)
{
var pair = args[i].split(/\:/g);
idx.push(pair[1]);
if(pair[0] != "") arg.push(pair[0]);
}
if(!overloaded[name])
{
overloaded[name] = true;
scode += pre + "(){var argstr = ''; var largstr = ''; for (var i = 0; i < arguments.length; i++){ argstr+=_JSVM_Namespace.kernel.Object.$typeof(arguments[i],true).replace(/\\./g,'');largstr+=_JSVM_Namespace.kernel.Object.$typeof(arguments[i]).replace(/\\./g,'');}return "+name+ "[argstr.toLowerCase()]?"+name+"[argstr.toLowerCase()].apply(this, arguments):"+name+"[largstr.toLowerCase()].apply(this, arguments);};var "+name+"={};";
}
idx = idx.join("").toLowerCase();
subCode[1] = subCode[1].replace(regExp_overload, scode + name + "." + idx + "=function("+arg.join(",")+")");
}
//members
var defin = "";
while (regExp_property.test(subCode[1]))
{
var visibility = RegExp.$1;
//if(visibility == "") visibility = "private";
var ctype = RegExp.$3;
var property = RegExp.$5;
var propertyName = property.split(/=/)[0].replace(/(^[\s\n\t\r]*)|([\s\n\r\t]*$)/g, "");
if(ctype != "static")
{
if(visibility == "public"){
defin += "this." + property;
}
else{
defin += "_$getCurrentPrivateHandler.call(this)." + property;
var regProp = new RegExp("this\\.(\\s*)((\\r\\n)(\\s*))*"+propertyName+"(?!\\w+)","g");
subCode[1] = subCode[1].replace(regProp,"_$getCurrentPrivateHandler.call(this)." + propertyName);
}
subCode[1] = subCode[1].replace(regExp_property, "");
}
else if(ctype == "static")
{
if(visibility == "public"){
subCode[1] = subCode[1].replace(regExp_property, shortClassName + "." + property);
}
else
{
var regProp = new RegExp(shortClassName+"\\.(\\s*)((\\r\\n)(\\s*))*"+propertyName+"(?!\\w+)","g");
subCode[1] = subCode[1].replace(regProp, "_$" + visibility + shortClassName + "." + propertyName);
var regDes = "_$" + visibility + shortClassName + "." + property;
regDes = "var _$" + visibility + shortClassName + "={};" + regDes;
subCode[1] = subCode[1].replace(regExp_property,regDes);
}
}
}
while (regExp_function.test(subCode[1]))
{
var visibility = RegExp.$1;
//if(visibility == "") visibility = "private";
var ctype = RegExp.$3;
var name = RegExp.$8.replace(/(^[\s\n\t\r]*)|([\s\n\r\t]*$)/g, "");
if(ctype != "static")
{
if(visibility == "public"){
subCode[1] = subCode[1].replace(regExp_function, shortClassName + ".prototype." + name + "=function");
}
else
{
var funName = "_$" + visibility + shortClassName + "_" + name;
subCode[1] = subCode[1].replace(regExp_function, "var " + funName + "=function");
var regProp = new RegExp("this\\.(\\s*)((\\r\\n)(\\s*))*" + name + "(?!\\w+)","g");
subCode[1] = subCode[1].replace(regProp, "(function(obj){return function(){return "+ funName + ".apply(obj,arguments);};})(this)");
}
}
else if(ctype == "static")
{
if(visibility == "public"){
subCode[1] = subCode[1].replace(regExp_function, shortClassName + "." + name + "=function");
}
else
{
var funName = "_$" + visibility + shortClassName + "_static"+ name;
subCode[1] = subCode[1].replace(regExp_function, "var " + funName + "=function");
var regProp = new RegExp(shortClassName+"\\.(\\s*)((\\r\\n)(\\s*))*"+name+"(?!\\w+)","g");
subCode[1] = subCode[1].replace(regProp, "(function(obj){return function(){return "+ funName + ".apply(obj,arguments);};})("+shortClassName+")");
}
}
}
while (regExp_const.test(subCode[1]))
{
var name = RegExp.$3;
var value = RegExp.$8;
var regExp = new RegExp(shortClassName + "." + name + "(?!\\w+)", "g");
subCode[1] = subCode[1].replace(regExp, value);
subCode[1] = subCode[1].replace(regExp_const, "");
}
//constructors
var regExp_con = new RegExp("function "+shortClassName + "\\((.*)\\)(\\s*)((\\r\\n)(\\s*))*{");
subCode[1] = subCode[1].replace(regExp_con, "$" + shortClassName + " = function($1){" + defin);
code = subCode.join(" class");
code = code.replace(regExp_class, "$1" + str);
code = code.replace(regExp_asExpr, "$1.$convert($6)");
}
//else
//{
//throw new Exception(0x0081,
//"JSVM.compiler.parsers['javascript2'].parse Error. "
//+ "can't found keyword 'class'.");
//}
// restore string constant
for (var i = 0; i < constStrs.length; i++)
{
code = code.replace((strings_tmpPrefix + i
+ strings_tmpSuffix), constStrs[i]);
}
return code;
}
});
jsre.JSVM.logs.log("JSVM.compiler set a parser for 'javascript2' succ.");
}
/**
* auto execute & save to jsre resource-cache
*/
try
{
var jsre = _JSVM_Namespace.runtimeEnvironment;
if (jsre.state == 1)
{
_jsvmCoreFunc_extends_javascript2();
jsre.setResource("$code{extends/javascript2}", _jsvmCoreFunc_extends_javascript2);
jsre.log("JSVM_Namespace.rtenv: "
+ "Load core function 'extends/javascript2' succ.");
}
}
catch(ex)
{
jsre.state = 0;
jsre.log("JSVM_Namespace.rtenv: "
+ "Load core function 'extends/javascript2' load fail.");
}
finally
{
jsre = _jsvmCoreFunc_extends_javascript2 = void(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -