如何在Xtext中使用类型注解?及通过JvmModelInferrer添加类型注解
嘿,我来帮你搞定这两个Xtext相关的问题:
1. 如何在Xtext中使用类型注解?
类型注解是Java 8引入的特性,允许我们给类型本身(而非字段、方法这些元素)添加注解。在Xtext的JvmModelInferrer里,要实现类型注解,核心是给JvmTypeReference(类型引用对象)添加注解,而不是给字段、参数这些元素本身加注解。
举个简单例子:如果想给List<@NonNull String>里的String类型加@NonNull注解,你需要先创建带注解的String类型引用,再把它作为泛型参数传给List的类型引用:
val annotatedStringType = String.typeRef => [ annotations += 'org.eclipse.jdt.annotation.NonNull'.annotationRef() ] val listType = List.typeRef(annotatedStringType) // 之后可以用这个listType来生成字段、方法参数等
2. 如何生成带类型注解的字段:
public final @IdInstance long id; 你之前的代码是给字段本身添加注解,所以生成的是@IdInstance public final long id;,但你要的是给long类型加注解。解决思路很简单:先创建一个带有@IdInstance注解的long类型引用,再把这个类型引用传给toField方法就行。
修改后的代码如下:
// 第一步:创建带注解的long类型引用 val annotatedLongType = Long.TYPE.typeRef => [ annotations += 'com.tmtron.dscontrol2.qual.IdInstance'.annotationRef() ] // 第二步:用这个带注解的类型引用生成字段 members += domainId.toField('id', annotatedLongType) [ visibility = JvmVisibility.PUBLIC final = true ]
这段代码的逻辑是:annotatedLongType是一个附加了@IdInstance注解的基本类型long的引用,把它作为字段的类型传入toField后,生成的Java代码就会是你想要的:
public final @IdInstance long id;
核心区别就是:字段注解是加在JvmField对象上,而类型注解是加在JvmTypeReference对象上,找对注解的附着对象就搞定啦!
内容的提问来源于stack exchange,提问作者TmTron
相关产品推荐
相关产品推荐

