2010-01-06 61 views
5

我正在開發一個插件,它採用實現某個接口(IDomain)的工作空間中的所有枚舉,解析代碼(使用AST)對枚舉做一些修改並將其標記爲使用註釋處理(@ IDomainInfo)。奇怪的JavaCore IType緩存問題

例如,它需要像成才這樣:

public 
enum SomeEnum implements IDomain { 
    // ... 
} 

,併產生這樣的:

public @IDomainInfo(domainId = 1) 
enum SomeEnum implements IDomain { 
    // Some changes here... 
} 

的@IDomainInfo背後的想法是,註釋的枚舉沒有再被處理由插件。

基本上,我所要完成的任務是使用JavaSearch API進行搜索以查找實現IDomain(簡單任務)的所有枚舉,並且因此得到IJavaElements的列表(實際上是IType的實例) 。然後我調用一個遍歷結果列表的方法,並創建所有未使用@IDomainInfo註釋的IType實例的新列表,然後處理結果列表:對於每個未註釋的IType執行一些工作,使用@註釋IType, IDomainInfo註解(使用AST),然後將結果保存到文件中(使用IFile,所以我可以在不刷新的情況下看到更改,事實上,如果我在編輯器中打開enum,我會立即刷新它:-)

所有這些工作正常,但如果我打開@IDomainInfo註釋枚舉(僅用於測試),然後刪除@IDomainInfo,保存該文件(我敢肯定),然後調用完成我所描述的所有工作的操作之前,當我到達從未註釋的部分過濾帶註釋的IType的部分時,代碼如下所示:

for (IType type : typeList) { 
     IAnnotation annotation = type.getAnnotation(「IDomainInfo」); 

     if (!annotation.exists()) { 
     // The annotation does not exist, so add the type to the 
     // list of elements to update and go on... 
     ret.add(type); 
     continue; 
     } 
// Something else here... 
    } 

好吧,結果是對於我剛剛保存的文件,IType檢測到我剛刪除的註釋,好像它仍然存在。如果我關閉並重新開啓eclipse,一切正常。

現在,我剛剛檢查和三重檢查了我的代碼,所以我確定我沒有保留舊版IType的舊版本,但仍然帶有註釋版本(我所有的IType都來自新鮮的java搜索調用每次我運行該操作)。

所以問題是,我可能會做錯什麼?我的意思是,我剛剛閱讀了JavaCore API多次,以檢查如果我可能使用它錯誤,或者如果我有一些概念上的缺陷,但我真的沒有線索,它就像如果日食會緩存IType忽略更改我剛剛在編輯器中提出: -/

如果任何人有一個想法,我想明白了很多:-)

+0

我找到了這篇博文。也許你可以試試。 http://samindaw.wordpress.com/2008/11/11/eclipse-plugin-giving-errors-due-to-noclassdeffound-eventhough-class-is-in-the-library-or-issued-fixed-not-反映在跑步類/這(我認爲這是一個「解決方案):http://www.eclipsezone.com/eclipse/forums/t61566.html再見, – 2012-03-06 10:24:30

回答

0

何時或如何叫你的插件?你註冊了一個資源監聽器,還是它是一個項目構建器或其他東西?如果資源偵聽器調用它,那麼您的插件可能正在讀取您的IType的「主副本」,該副本尚未保存。因此,您的更改仍在工作副本中。