【问题标题】:XTEND - Resource ManagementXTEND - 资源管理
【发布时间】:2012-10-26 10:12:34
【问题描述】:

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

【问题讨论】:

    标签: java eclipse code-generation xtext xtend


    【解决方案1】:

    请尝试以下表达式:

    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 ]
    

    【讨论】:

    • 首先感谢您的回答。我试过你的表达,但结果是这个迭代中没有实体。它是空的。 :(
    • 我更新了答案以反映 Java 类和 EMF EClass 之间的差异。
    • 是的,谢谢你一分钟前发现类是 org.xtext.example.mydsl.myDsl.impl.EntityImpl 就像你说的。但是应该导入什么来使用 MyEPackage$Literals?
    • 定义类实体的 EPackage。请深入 EMF 了解详细信息(或使用 EntityImpl)。
    • 好吧,我的问题的一种解决方案(不是我想说的最好的解决方案之一......)是这样的 if(e.eClass().name.toString.equals("Entity"))这根本不过滤实体,而是确保它是一个实体,我可以使用它...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2012-10-05
    • 2023-03-18
    • 2016-04-10
    • 1970-01-01
    相关资源
    最近更新 更多