feat: 新增 Console 和 reflect 部分完善 command

Signed-off-by: 502647092 <admin@yumc.pw>
This commit is contained in:
2017-10-10 21:01:43 +08:00
parent 59b2824413
commit d0b43487c2
14 changed files with 281 additions and 95 deletions

View File

@ -3,7 +3,7 @@
*
*/
/*global Java, base*/
(function (parent, core_dir, miao_module_dir) {
(function (parent) {
'use strict';
var File = Java.type("java.io.File");
@ -16,35 +16,37 @@
* 模块目录 /modules
* @param name 模块名称
*/
function findModule(name) {
function resolve(name) {
if (_canonical(name)) {
name = _canonical(name);
}
// 如果不是 .js 结尾就加上
if (!name.match(/.*\.js/)) {
name += ".js";
name = normalizeName(name, '.js');
return resolveAsFile(parent, name) ||
resolveAsFile(name) ||
resolveAsFile(core_dir, name) ||
resolveAsFile(miao_module_dir, name) ||
undefined;
}
/**
* 解析文件
* @constructor(file)
* @constructor(dir,file)
* @returns {*}
*/
function resolveAsFile() {
var file = arguments.length > 1 ? new File(arguments[0], arguments[1]) : new File(arguments[0]);
if (file.exists()) {
return file;
}
var jsFile = new File(name);
if (jsFile.exists()) {
return jsFile;
}
function normalizeName(fileName, ext) {
var extension = ext || '.js';
if (fileName.endsWith(extension)) {
return fileName;
}
var parentFile = new File(parent, name);
if (parentFile.exists()) {
return parentFile;
}
var coreFile = new File(core_dir, name);
if (coreFile.exists()) {
return coreFile;
}
var moduleFile = new File(miao_module_dir, name);
if (moduleFile.exists()) {
return moduleFile;
}
log.w("模块 %s 加载失败! 下列目录中未找到该模块!", name);
log.w("当前目录: %s", _canonical(jsFile));
log.w("上级目录: %s", _canonical(parentFile));
log.w("核心目录: %s", _canonical(coreFile));
log.w("模块目录: %s", _canonical(moduleFile));
return fileName + extension;
}
/**
@ -55,11 +57,43 @@
function compileJs(file) {
var cacheFile = _cacheFile(file);
base.save(cacheFile, "(function (module, exports, require) {" + base.read(file) + "});");
// 使用 load 可以保留行号和文件名称
var obj = load(cacheFile);
base.delete(cacheFile);
return obj;
}
/**
* 编译模块
* @param id
* @param name
* @param file
* @returns {Object}
*/
function compileModule(id, name, file) {
log.d('加载模块 %s 位于 %s', name, id);
// noinspection JSUnresolvedVariable
var module = {
id: id,
exports: {},
loaded: false,
require: exports(file.parentFile)
};
try {
// 预编译模块
var compiledWrapper = compileJs(file);
compiledWrapper.apply(module.exports, [
module, module.exports, module.require
]);
log.d('模块 %s 编译成功!', name);
module.loaded = true;
} catch (ex) {
log.w("模块 %s 编译失败!", name);
log.d(ex);
}
return module;
}
/**
* 获得文件规范路径
* @param file
@ -83,7 +117,11 @@
* @private
*/
function _require(name, path) {
var file = findModule(name, path);
var file = resolve(name, path);
if (file === undefined) {
log.w("模块 %s 加载失败! 未找到该模块!", name);
return;
}
// 重定向文件名称
name = file.name.split(".")[0];
var id = _canonical(file);
@ -91,27 +129,7 @@
if (module) {
return module;
}
log.d('加载模块 %s 位于 %s', name, id);
// noinspection JSUnresolvedVariable
module = {
loaded: false,
id: id,
exports: {},
require: exports(file.parentFile)
};
try {
// 预编译模块
var compiledWrapper = compileJs(file);
compiledWrapper.apply(module.exports, [
module, module.exports, module.require
]);
log.d('模块 %s 编译成功!', name);
module.loaded = true;
} catch (ex) {
log.w("模块 %s 编译失败!", name);
log.d(ex);
}
cacheModules[id] = module;
cacheModules[id] = module = compileModule(id, name, file);
return module;
}
@ -126,7 +144,7 @@
};
}
var cacheDir = parent + "/cache";
var cacheDir = parent + "/runtime";
// 等于 undefined 说明 parent 是一个字符串 需要转成File
// 可能有更加准确的方案