我正在将Monaco编辑器集成到Eclipse Dirigible Web IDE中。
到目前为止是集成编辑器的方式:ide-monaco/editor.html
在Dirigible中,我们使用基于Mozila Rhino,Nashorn,J2V8或GraalVM(不是NodeJS)作为目标编程语言的服务器端JavaScript。
为了实现模块化,我们根据CommonJS规范通过require(...moduleName..)
加载模块。
这是我们拥有的此类模块(API)的示例:
这里是此API的示例用法:
现在回到摩纳哥主题,我正在尝试实现已加载模块的代码完成,例如:
var response = require("http/v4/response");
...
我找到了有关如何提供外部库的示例:
monaco.languages.typescript.javascriptDefaults.addExtraLib('var response = {println: /** Prints the text in the response */ function(text) {}}', 'js:response.js');
Dirigible Monaco Code Completion with Extra Lib
但是一旦声明了var response
,它就会隐藏代码完成选项:
Dirigible Monaco Shadowed Code Completion Options
我发现有几个摩纳哥CompilerOptions:
但是我无法获得外部模块工作的代码完成。
是否有一种方法可以为摩纳哥编辑器设置某种“源提供程序”,所以一旦找到require(...)
语句,它将触发该模块的加载,并最终使代码完成工作?我们已经为Orion和tern.js实现了这种方法:ide-orion/editorBuild/commonjs-simplified
exports.parse = function(moduleName) {
var content = contentManager.getText(moduleName + ".js");
var comments = [];
var nodes = acorn.parse(content, {
onComment: comments,
ranges: true
});
var functionDeclarations = nodes.body
.filter(e => e.type === "FunctionDeclaration")
.map(function(element) {
let name = element.id.name;
let expression = element.expression
let functions = element.body.body
.filter(e => e.type === "ExpressionStatement")
.map(e => extractExpression(e, comments))
.filter(e => e !== null);
return {
name: name,
functions: functions
}
});
var result = nodes.body
.filter(e => e.type === "ExpressionStatement")
.map(function(element) {
return extractExpression(element, comments, functionDeclarations);
}).filter(e => e !== null);
return result;
}
function extractExpression(element, comments, functionDeclarations) {
let expression = element.expression;
if (expression && expression.type === "AssignmentExpression" && expression.operator === "=") {
let left = expression.left;
let right = expression.right;
if (right.type === "FunctionExpression") {
let properties = right.params.map(e => e.name);
let name = left.property.name + "(" + properties.join(", ") + ")";
let documentation = extractDocumentation(comments, element, name);
documentation = formatDocumentation(documentation, name, true);
let returnStatement = right.body.body.filter(e => e.type === "ReturnStatement")[0];
let returnType = null;
if (functionDeclarations && returnStatement && returnStatement.argument.type === "NewExpression") {
returnType = returnStatement.argument.callee.name;
returnType = functionDeclarations.filter(e => e.name === returnType)[0];
}
return {
name: name,
documentation: documentation,
returnType: returnType,
isFunction: true
};
} else if (right.type === "Literal") {
let name = left.property.name;
let documentation = extractDocumentation(comments, element, name);
documentation = formatDocumentation(documentation, name, false);
return {
name: name,
documentation: documentation,
isProperty: true
};
}
}
return null;
}
...
完整的文件可以在这里找到:suggestionsParser.js
客户端集成
检索系统中可用的JavaScript模块:editor.html#L204-L212
每个模块获得建议:editor.html#L215-L225
- 为
require(...)
添加额外的库:editor.html#L301- 注册模块的完成项目提供者:editor.html#L302-L329
- 注册建议的完成项目提供者(功能/属性):editor.html#L330-L367