在xtext中访问类定义

时间:2012-09-10 13:31:05

标签: java xtext xtend

我正在尝试编写一个DSL,用于从一个对象到另一个对象进行类型安全转换。

src classA
dst classB

map valueA to valueB with ConverterX
map valueC to valueD with ConverterY

结果应该是这样的:

class Converter
{
public void convert(ClassA a, ClassB b)
{
 a.setValueA(ConverterX.convert(b.getValueB))
 b.setValueC(ConverterY.convert(b.getValueD))

}
}

我只想为此生成代码,但我无法访问已定义的类。原因是能够使用默认转换器。只有在我能够获得参数类型的情况下,我才能选择默认转换器的实现。

2 个答案:

答案 0 :(得分:1)

您可以坚持使用JvmTypeReference,因为Xtext文档建议。您可以从jvmTypeRef.getType()获取JvmType,其中相关类型可以转换为JvmDeclaredType。这是我的帮助方法,使用JvmTypeReference获取所有bean属性(类成员)的列表:

public List<String> getFieldNamesForClass(JvmTypeReference jvmTypeRef) {
    List<String> result = new ArrayList<String>();
    if (jvmTypeRef.getType() instanceof JvmDeclaredType) {
        JvmDeclaredType declaredType = (JvmDeclaredType)jvmTypeRef.getType();
        for (JvmField field : declaredType.getDeclaredFields()) {
            result.add(field.getSimpleName());
        }
    }
    return result;
}

输出是字符串列表,字段名称,但可以很容易地更改为返回JvmField / JvmMember实例。

在bitbucket.org/espinosa/deepclonedsl上查看我的DeepCloneDSL

答案 1 :(得分:0)

我通过使用JvmDeclaredType的JvmTypeReference实例解决了这个问题。 JvmTypeReference不提供对字段和方法的访问,但JvmDeclaredType可以访问。通过了解JvmDeclaredType中存在的QualifiedName,也可以生成JvmTypeReference。