摩纳哥-不带LSP Acorn.js的CommonJS模块的代码完成

问题描述 投票:1回答:1

我正在将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

  • sourceRoot
  • 模块
  • moduleResolution
  • baseUrl
  • 路径
  • rootDir
  • ...

但是我无法获得外部模块工作的代码完成。

是否有一种方法可以为摩纳哥编辑器设置某种“源提供程序”,所以一旦找到require(...)语句,它将触发该模块的加载,并最终使代码完成工作?我们已经为Orion和tern.js实现了这种方法:ide-orion/editorBuild/commonjs-simplified

javascript requirejs commonjs code-completion monaco-editor
1个回答
0
投票

    服务器端集成:
  1. 用于检索系统中的JavaScript模块并为每个导入的模块提供代码完成的服务器端模块:dirigible/ide-monaco-extensions

  • 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

  • © www.soinside.com 2019 - 2024. All rights reserved.