2012-10-31 38 views
3

我目前正在開發一個eclipse插件。這個插件包含一個項目性質,取決於jsdt的javaScript性質。在JavaScript驗證中出現的錯誤錯誤

現在有一些細節我自然界的項目可以包含的JavaScript有些特別。

  • 它們可以包含「編譯器提示」,這是與#
  • 開始basicly陳述它們可以包含的功能

外return語句但在這兩個點的標準審定JSDT進來將它們標記爲錯誤(通常是正確的)。我已經設法在JavaScript驗證器的屬性中過濾掉了這些錯誤(手動)。

我的問題是,我如何排除這些錯誤自動驗證jsdt與我的性質的項目?

回答

0

的研究很多後,刪除標記和調試的時間我終於管理刪除我想要的錯誤。在糟糕的不好的方式的方式,但我已經到了一個地步,我只是想這工作,不管它是如何做的。

如果你想刪除了一個過程中,你需要做的JSDT驗證過程中創建存在的問題如下(你不能ommit任何東西):

所以有兩件事基本上必須關心。

  1. 將被創建或已經在驗證過程結束創建實際問題標記。

  2. 由驗證過程創建的問題。它們的類型爲CategorizedProblem,可以通過傳遞給reconcile()方法的ReconcileContext對象獲得。

在我看來,該CategorizedProblem旨意被翻譯成驗證過程後問題標記。

所以,你需要做的是:

  • 刪除所有文件的所有不必要的問題標記在buildStarting(這消除問題標記在你的項目中即將被驗證的所有文件)
  • 迭代的ReconcileContextgetProblems()
  • CategorizedProblem對象創建包含一個新的陣列只有CategorizedProblem是你想保留
  • 設置這一新的陣列到ReconcileContextputProblems()
  • 該文件再次刪除不需要的標記(我不知道爲什麼這是必要的,請不要問,我不在乎了: - /)

的示例實現這樣的validationParticipant看起來是這樣的:(此人會過濾掉的問題抱怨return語句之外的方法:

[...ommited imports ...] 

public class MyValidationParticipant extends org.eclipse.wst.jsdt.core.compiler.ValidationParticipant{ 

@Override 
public boolean isActive(IJavaScriptProject project) { 
    return true; 
} 



@Override 
public void buildStarting(BuildContext[] files, boolean isBatch) {  
    super.buildStarting(files, isBatch);  
    for(BuildContext context : files){ 
     IFile file = context.getFile(); 
     deleteUnwantedMarkers(file); 
    } 
} 


@Override 
public void reconcile(ReconcileContext context) { 

    IResource resource = context.getWorkingCopy().getResource(); 
    CategorizedProblem[] newProblems = new CategorizedProblem[0]; 
    ArrayList<CategorizedProblem> newProblemList = new ArrayList<CategorizedProblem>(); 

    CategorizedProblem[] probs = context.getProblems("org.eclipse.wst.jsdt.core.problem"); 
    if(probs != null){ 
     for(CategorizedProblem p : probs){ 
      if(!(p.getMessage().equals("Cannot return from outside a function or method."))){     
        newProblemList.add(p);      
       }     
      } 
     } 
    }   
    context.putProblems("org.eclipse.wst.jsdt.core.problem", newProblemList.toArray(newProblems));  

    deleteUnwantedMarkers(resource); 
} 

public static void deleteUnwantedMarkers(IResource resource){ 
    if(resource.isSynchronized(IResource.DEPTH_INFINITE)){ 
     try {     
      IMarker[] markers = resource.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE); 
      if(markers != null && markers.length > 0){ 
       for(IMarker m : markers){ 
        Object message = m.getAttribute(IMarker.MESSAGE); 
        if(message.equals("Cannot return from outside a function or method.")){       
         m.delete(); 
        }         
       } 
      } 

     }catch (CoreException e) {    
      e.printStackTrace(); 
     } 
    }  
} 
} 

正如我所說的,這是怎樣的一個不好解決的,因爲代碼依賴於字符串錯誤消息。應該有更好的方法來確定你不想擁有的問題。

不要忘記在ValidationParticipant的plugin.xml中添加適當的擴展名。

1

JSDT使用生成語法錯誤的具體語法分析器。 你不能禁用它。只能配置語義錯誤或警告。

但是,您可以禁用JSDT的整個驗證。

下面的解決方案將抑制在我們保存對java腳本文件的一些更改時生成的錯誤和警告。 (自動生成,生成)

  1. 打開項目對話框。
  2. 選擇建設者項目。
  3. 取消選中「JavaScript驗證器」。並按確定按鈕。
  4. 問題察看

該溶液中取出當前的錯誤和警告不能消除錯誤或警告註釋編輯器中編輯時。只有在編輯它們時,它們纔會暫時顯示在編輯器上。

+0

有一個名爲「validationParticipant」的擴展點,我真的覺得自己可以做我需要的東西,但我只是不明白。 – Chris

+0

我的意思是「自動」也是「程序化」,所以使用dialouqes來解決這個問題並沒有幫助。 – Chris