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

时间:2013-06-13 16:09:49

标签: javascript eclipse jsdt

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

右键单击WebContent目录并添加js目​​录。右键单击js目录并选择new =>其他=> JavaScript源文件,并使用以下内容将其命名为DomStuff.js:

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

再次右键单击js目录并选择new =&gt;其他=&gt; JavaScript源文件并将其命名为WorkFlow.js

当我输入MyApp.然后按控制+空格时,我会收到一个显示No Default Proposals的框。它就像自动完成仅在所有代码都在一个文件中时才有效。

右键单击“源”选项卡下的JavaScript Resources,MyProject / WebContent列为all all,不包括任何内容。

这是Eclipse版本:4.2.1,带有Eclipse Web Developer Tools 3.4.1和JavaScript开发工具1.4.1。

只要我记得我从来没有完成自动完成工作我目前正在处理的文件之外的代码。这是正常的还是我错过了一些设置?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

<强> [更新] 基本上Eclipse与JSDT无法完成这项工作。试图用构造函数定义我的所有命名空间,但这太麻烦了。

现在尝试netbeans,它将帮助大部分闭包库和我的所有代码。像goog.array这样的东西无法完成,因为goog.array永远不会定义。将goog.array = new Object()添加到array.js时,它将完成goog.array和goog.array.ArrayLike。这些modded 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个文件来分析定义和实现,因此谷歌关闭时更容易。

在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.workflow.createOrder=...替换为myapp.types.WorkFlow.prototype,删除myapp.workflow并删除myapp.workflow=new myapp.types.WorkFlow(),即可转换为goog.require("myapp.types")语法。如果需要,也许这可以在构建/编译过程中自动化。

我不确定在构造函数的帮助下创建单个对象是否比仅仅goog.require创建myapp.workflow并像以前一样添加属性(并且已经完成)要昂贵得多在封闭库中。)