2012-11-06 176 views
1

我對Xtend有一個非常具體的問題。XTEND - 資源管理

在每一個例子,我讀到XTEXT/XTEND我看到這樣的內容:

override void doGenerate(Resource resource, IFileSystemAccess fsa) { 
for(e: resource.allContents.toIterable.filter(typeof(Entity))) { 
    fsa.generateFile(
    e.fullyQualifiedName.toString("/") + ".java", 
    e.compile) 
} 
} 

嘛,所以要更具體的行resource.allContents.toIterable.filter(typeof(Entity))) 是引起了我的問題之一。我想知道如何從所有的實體中去掉資源樹而沒有實體的子類。方法過濾器獲取資源中類型實體及其子類的所有對象,但我只想省略子類並僅獲取實體。

回答

2

請嘗試以下表達式:

allContents.toIterable.filter(typeof(Entity)).filter[ getClass == typeof(Entity) ] 

第一個過濾器表達式是在你描述(而第二過濾器表達式,可以確保您不會產生任何亞型,它返回一個可迭代的意義類型安全。

如果你使用EMF,這將不會產生任何結果,因爲Entity是一個接口,具體的類將是EntityImpl。在這種情況下,我建議使用EMF API篩選所有'真實'實體:

allContents.toIterable 
    .filter(typeof(Entity)) 
    .filter[ eClass == MyEPackage$Literals::ENTITY ] 
+0

首先感謝您的回答。我試過你的表達式,但是結果是這個迭代中沒有實體。它是空的。 :( – soMasu

+0

我更新了答案,以反映Java類和EMF EClass之間的差異。 –

+0

是的,謝謝你發現,一分鐘前,類是org.xtext.example.mydsl.myDsl.impl.EntityImpl像你說的那樣。應該導入使用MyEPackage $ Literals? – soMasu