2012-11-06 37 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