簡體   English   中英

Eclipse JavaScript開發工具中的錯誤代碼完成

[英]Buggy code completion in eclipse JavaScript Development Tools

我用文件=>新=>靜態Web項目打開一個項目。 將其命名為MyProject,Web內容文件夾名稱為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 就像自動完成僅在所有代碼都在一個文件中時才起作用。

右鍵單擊“源”選項卡下的“ JavaScript Resources ,將MyProject / WebContent列為“全部包含”而沒有排除。

這是Eclipse版本:4.2.1,帶有Eclipse Web Developer Tools 3.4.1和JavaScript Development Tools 1.4.1。

只要我記得我從未獲得過自動完成功能,無法處理當前正在處理的文件之外的代碼。 這是正常現象還是我在這里缺少設置?

當跨文件完成時,標准JSDT似乎不確定。 這是因為,即使正確配置了項目,但其源代碼分析中最昂貴的類型僅發生在打開的文件上。 如果兩個文件都打開,您得到的結果是否相同?

順便說一下,有一個JSDT的分支,可以合並到稱為JSDT + NJSDoc的官方JSDT,它可以非常有效地處理這種跨文件分析(並添加其他功能): https ://bitbucket.org/nexj/webtools 。 jsdt.core

[更新]基本上,使用JSDT的Eclipse無法完成這項工作。 試圖用構造函數定義我的所有名稱空間,但這太麻煩了。

現在嘗試netbeans,它將對大多數閉包庫和我的所有代碼提供幫助。 諸如goog.array之類的事情將無法完成,因為goog.array從未定義。 將goog.array = new Object()添加到array.js時,它將完成goog.array和goog.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 Closure更容易。

在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.prototypemyapp.workflow ,除去myapp.workflow=new myapp.types.WorkFlow()和除去goog.require("myapp.types") 如果需要,也許可以在構建/編譯過程中將其自動化。

我不確定在構造函數的幫助下創建單個對象是否比僅用goog.require創建myapp.workflow並向其添加屬性(如在關閉庫中完成)要昂貴得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM