Xtext:通过JvmModelInferrer的通配符泛型类型

时间:2013-10-20 14:49:56

标签: eclipse dsl xtext

我必须使用从DSL生成的类来实现外部接口。其中一种实现方法具有以下特征:

public void execute(SomeType<? extends OtherType> param1, ...) {...}

在JvmModelInferrer中,我将DSL的相应元素映射到方法上并添加了如下参数:

parameters += appRule.toParameter("param1", appRule.newTypeRef(SomeType, it.newTypeRef("? extends OtherType")))

几乎有效,但会产生一个非常奇怪的输出:

public void execute(final /*SomeType<? extends OtherType> */Object param1, ...) {...}

我想可能有其他设置强制生成器使用我提供的通用参数,但无法真正找到它。

1 个答案:

答案 0 :(得分:1)

基本上,您应该在模型中设置类型参数,而不是在字符串中创建它。为此,我们在EMF-IncQuery中使用以下构造:

it.parameters += pattern.toParameter("processor", 
      pattern.newTypeRef(typeof (IMatchProcessor),
                         cloneWithProxies(matchClassReference).wildCardSuper))

这里,cloneWithProxies由JvmTypesBuilder提供(可以注入),而wildCardSuper是我们编写的帮助方法:

public JvmWildcardTypeReference wildCardSuper(JvmTypeReference clone) {
        JvmWildcardTypeReference result = factory.createJvmWildcardTypeReference();
        JvmLowerBound lowerBound = factory.createJvmLowerBound();
        lowerBound.setTypeReference(clone);
        result.getConstraints().add(lowerBound);
        return result;
}