xtend toEnumerateType /通过xtend生成Java枚举的示例?

时间:2014-04-09 09:46:19

标签: java enums xtext xtend

我需要使用xtend 2.5通过DSL生成Java枚举。我的语法看起来像这样:

grammar de.mytest.xtext.enumdsl.EnumDsl with org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations

import "http://www.eclipse.org/emf/2002/Ecore" as ecore
import "http://www.eclipse.org/xtext/xbase/Xbase" as xbase

EnumModel:
    pckg=EnumPackage;

EnumPackage:
    {EnumPackage} 
    importSection=XImportSection?
    'package' name=QualifiedName '{'
        (enums+=MyEnum)*
    '}';

MyEnum:
    'enum' name=ValidID '{' (items+=ValidID)* '}';

使用这种语法,DSL可能如下所示:

package de.mytest.enumpackage {
    enum MyEnumTest {
        YES
        NO
        MAYBE
    }
}

预期产生的Java枚举将是:

package de.mytest.enumpackage;

public enum MyEnumTest {
    YES,
    NO,
    MAYBE
}

我尝试使用toEnumerateType()实现xtend方法infer(),但没有成功。另外我无法找到任何示例!我的google-fu似乎不够好!

使用toEnumerateLiteral(),它也可以在toClass()中运行,但它显然会生成一个类......

你有什么想法吗?

先谢谢,迈克尔

2 个答案:

答案 0 :(得分:1)

这应该适合你:

myEnum.toEnumerationType(myEnum.name) [
  myEnum.items.forEach [ literal |
    myEnum.toEnumerationLiteral(literal)
  ]
]

答案 1 :(得分:0)

非常感谢提示,塞巴斯蒂安。我不得不稍微修改一下。这是方法,最终对我有用: - )

class EnumDslJvmModelInferrer extends AbstractModelInferrer {

    @Inject extension JvmTypesBuilder
    def dispatch void infer(EnumModel element, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
        element.pckg.enums.forEach[ myEnum |
            acceptor.accept(myEnum.toEnumerationType(element.pckg.name+"."+myEnum.name)[]).initializeLater[
                myEnum.items.forEach [ literal |
                    it.members += myEnum.toEnumerationLiteral(literal)
                ]
            ]
        ]
    }
}