1

我有一个关于 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))) 是给我带来问题的那条线。我想知道如何在没有实体子类的情况下从所有实体中向下走资源树。方法过滤器获取资源中实体类型的所有对象及其子类,但我只想省略子类而只获取实体。

4

1 回答 1

2

请尝试以下表达式:

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

在您描述的意义上,第一个过滤器表达式是类型安全的(它返回一个 Iterable 而第二个过滤器表达式确保您不会产生任何子类型。

如果您使用 EMF,这将不会产生任何结果,因为 Entity 是一个接口,而具体类将类似于 EntityImpl。在这种情况下,我建议使用 EMF API 过滤所有“真实”实体:

allContents.toIterable
  .filter(typeof(Entity))
  .filter[ eClass == MyEPackage$Literals::ENTITY ]
于 2012-11-06T12:57:20.203 回答