eclipse JavaScript开发工具中的bug代码完成

Buggy code completion in eclipse JavaScript Development Tools

本文关键字:代码 bug JavaScript 开发工具 eclipse      更新时间:2023-09-26

我用file => new =>静态web项目打开一个项目。命名为MyProject,网页内容文件夹名称为WebContent。

右键单击WebContent目录并添加一个js目录。右键单击js目录,选择new => other => JavaScript源文件,并将其命名为DomStuff.js,内容如下:

var MyApp={};
MyApp.DomStuff={};
MyApp.DomStuff.someFunction=function(){
  return true;
}
MyApp.do<== here it auto completes to DomStuff

再次右键单击js目录,选择new => other => JavaScript源文件,并将其命名为WorkFlow.js

当我输入MyApp.,然后按control +空格,我得到一个框说No Default Proposals。这就像自动完成只工作当所有的代码在一个文件。

右键单击Source选项卡下的JavaScript Resources, MyProject/WebContent显示为包含全部,排除无。

这是在Eclipse版本:4.2.1与Eclipse Web开发工具3.4.1和JavaScript开发工具1.4.1。

只要我记得,我从来没有得到自动完成工作的代码以外的文件,我目前正在处理。这是正常的吗,还是我漏掉了什么设置?

当涉及到跨文件的完井时,标准JSDT似乎不确定。这是因为即使项目配置正确,那么最昂贵的源代码分析类型也只发生在打开的文件上。如果两个文件都打开,您会得到相同的结果吗?

顺便说一下,有一个JSDT的分支,它是合并到官方JSDT的候选分支,称为JSDT+NJSDoc,它非常有效地处理这种跨文件分析(并添加了其他功能):https://bitbucket.org/nexj/webtools.jsdt.core

[update]基本上,带有JSDT的Eclipse不能完成这项工作。试着用构造函数定义我所有的命名空间,但这太麻烦了。

现在尝试netbeans,它将帮助大部分闭包库和我所有的代码。比如"好"。数组不会完成,因为goog。数组从来没有定义过。当加上goog时。array=new Object()到array.js中,它就完成了。array和google。array。arraylike。这些修改后的js文件放到项目的js/libs目录下。

如果您想要让它在Eclipse中工作的麻烦方法,请继续阅读。

似乎Eclipse在将对象声明为对象字面量方面存在问题。用构造函数声明我的复杂类型似乎可以达到目的。必须在Window(大写W)上创建根对象的实例。

// this would be the way I would define
// a complex property that doesn't need
// more than one instance and is not complex
// enough to put in a separate file
myapp.workflow.objectLiteral={
  thisDoesNotCodeAssist:function(){},
  neitherDoesThis:22
};
/** if you define the complex property as
 *  a constructor it will auto complete
 *  in other files and closure compiler will 
 *  recognize it's type
 */
/** @constructor organizes flow 
 * used for Eclipse code assist */
var WorkFlow=function(){};
ProwpWithSubs=function(){};
PropWithSubs.prototype.subProp=22;
PropWithSubs.prototype.subFunction=function(){
  this.subsub=44;
};
WorkFlow.prototype.propwithsubs=new PropWithSubs();
if(ALLWAYSFALSE){
  /**needed for Eclipse code assist
   * @constructor
   */
  var MyApp=function(){};
  MyApp.prototype.workflow=new WorkFlow();
  MyApp.prototype.dom=new DOM();
  Window.prototype.myapp=new MyApp();
}else{
  myapp.workflow=new WorkFlow();
}
(更新)

下面是我用来拆分定义和实现的3个文件,以便更容易使用google闭包。

设置types.js中的主要类型

// source: js/mmyapp/types.js
goog.provide("myapp.types");
/** @constructor */
var gooblediegoog=function(){};
/** @constructor */
gooblediegoog.prototype.WorkFlow=function(){};
/** @constructor */
gooblediegoog.prototype.Dom=function(){};
myapp.types=new gooblediegoog();

一个在我的代码中根本不使用的文件,但告诉Eclipse如何自动完成:

// source: js/myapp/forCodeAssist.js
/** @const {boolean} */
var ALLWAYSFALSE=false;
if(ALLWAYSFALSE){
    /**needed for Eclipse autocomplete
     * @constructor
     */
    var MyApp=function(){};
    MyApp.prototype.types=new gooblediegoog();
    Window.prototype.myapp=new MyApp();
    MyApp.prototype.workflow=new myapp.types.WorkFlow();
    MyApp.prototype.dom=new myapp.types.Dom();
}

工作流的实现:

// source: js/myapp/workflow.js
goog.provide("myapp.workflow");
goog.require("myapp.types");
goog.require("myapp.dom");
/** @returns number|undefined */
myapp.types.WorkFlow.prototype.createOrder=function(){
    return myapp.dom.getArticleAmout();
};
myapp.workflow=new myapp.types.WorkFlow();
window['console'].log(myapp.workflow.createOrder());

可以通过将myapp.types.WorkFlow.prototype替换为myapp.workflow,删除myapp.workflow=new myapp.types.WorkFlow()并删除goog.require("myapp.types")来转换为myapp.workflow.createOrder=...语法。如果需要,也许可以在构建/编译过程中自动执行。

我不确定是否在构造函数的帮助下创建单个对象比仅仅让goog.require创建myapp要昂贵得多。