2

我想在我的 DSL 生成的类中生成一个 List 字段,并像这样初始化它:

private List<MyObject> myObjects= Lists.newArrayList();

我知道的唯一方法是将一些文本附加到初始化程序:

members += appRule.toField("myObjects", appRule.newTypeRef(List, it.newTypeRef(MyObject))) [
     initializer = [append('''Lists.newArrayList()''')]
]

但是,使用这种方法 JvmModelInferrer 不会导入 Guava Strings 库,因此会引发编译问题。有没有办法克服这个障碍?

4

1 回答 1

3

如果我理解您的问题(因为您指的是代码中未使用的 Guava Strings 库:)),那么您的问题是,未导入类引用 Lists。

对于这样的结构,我们在 EMF-IncQuery 中有一个辅助方法,它可以像序列化参数一样序列化类型引用。此功能依赖于可注入的 TypeReferenceSerializer 类。

def referClass(ITreeAppendable appendable, EObject ctx, Class<?> clazz, JvmTypeReference... typeArgs) {
    val ref = ctx.newTypeRef(clazz, typeArgs)
    if (ref != null) {
        appendable.serialize(ref, ctx)
    } else {
        //Class resolution error - error handling required here
        //A fallback to writing out the fqn of the class
        appendable.append(clazz.canonicalName)
    }
}

def serialize(ITreeAppendable appendable, JvmTypeReference ref, EObject ctx) {
    typeReferenceSerializer.serialize(ref, ctx, appendable)     
}
于 2013-10-20T17:02:38.050 回答