我需要使用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()中运行,但它显然会生成一个类......
你有什么想法吗?
先谢谢,迈克尔
答案 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)
]
]
]
}
}