xtext - 在基于 Xtend 的 Xtext 代码生成器中使用 Inject
问题描述
我是 Xtext 和 Xtend 的新手,我正在尝试使用 Xtext 文档中的 Xtext 教程来学习 Xtext。我在带有 Xtext 2.14 的 Java 10 下的 Eclipse Photon 上运行。我正在开始扩展教程,并且很早就遇到了问题。这是我尝试使用代码生成器的代码:
/*
* generated by Xtext 2.14.0
*/
package net.wiseoldbird.tutorial.domainmodel.generator
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.xtext.generator.AbstractGenerator
import org.eclipse.xtext.generator.IFileSystemAccess2
import org.eclipse.xtext.generator.IGeneratorContext
import net.wiseoldbird.tutorial.domainmodel.domainmodel.Entity
import com.google.inject.Inject
@Inject extension IQualifiedNameProvider;
class DomainmodelGenerator extends AbstractGenerator {
override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
for (e: resource.allContents.toIterable.filter(Entity)) {
fsa.generateFile(e.fullyQualifiedName.toString("/") + ".java", e.compile)
}
}
}
这是我的语法文件:
grammar net.wiseoldbird.tutorial.domainmodel.Domainmodel
with org.eclipse.xtext.common.Terminals
generate domainmodel "http://www.wiseoldbird.net/tutorial/domainmodel/Domainmodel"
Domainmodel :
(elements+=AbstractElement)*;
PackageDeclaration:
'package' name=QualifiedName '{'
(elements+=AbstractElement)*
'}';
AbstractElement:
PackageDeclaration | Type | Import;
QualifiedName:
ID ('.' ID)*;
Import:
'import' importedNamespace=QualifiedNameWithWildcard;
QualifiedNameWithWildcard:
QualifiedName '.*'?;
Type:
DataType | Entity;
DataType:
'datatype' name=ID;
Entity:
'entity' name=ID ('extends' superType=[Entity|QualifiedName])? '{'
(features+=Feature)*
'}';
Feature:
(many?='many')? name=ID ':' type=[Type|QualifiedName];
我的问题是 Eclipse 说 @Inject 注释有问题。它说Inject cannot be resolved to an annotation type
。这是根据教程中的说明生成的 Eclipse Xtext 项目。
我该如何从这里开始?
解决方案
您只能注入字段和初始化方法/构造函数参数
import com.google.inject.Inject
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.xtext.example.domainmodel.domainmodel.Entity
import org.eclipse.xtext.generator.AbstractGenerator
import org.eclipse.xtext.generator.IFileSystemAccess2
import org.eclipse.xtext.generator.IGeneratorContext
import org.eclipse.xtext.naming.IQualifiedNameProvider
class DomainmodelGenerator extends AbstractGenerator {
@Inject extension IQualifiedNameProvider
override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
for (e : resource.allContents.toIterable.filter(Entity)) {
fsa.generateFile(e.fullyQualifiedName.toString("/") + ".java", e.compile)
}
}
def compile(Entity e) '''
package «e.eContainer.fullyQualifiedName»;
public class «e.name» {
}
'''
}
推荐阅读
- android - 在 2 个活动之间传递图像的更好方法是什么?保存到文件还是缓存?
- c# - Kestrel:默认 Http 标头解码
- python - 为 Django 表单动态更改 DateTimePicker 的格式
- c - 我怎么能模拟 void 类型函数?
- .net - MVVM Light,TreeView ItemSource 未更新
- cassandra - 如果没有“允许过滤”,如何在 CQL 中进行条件查询?
- python - 有没有办法在我的红绿灯代码下方添加一个计数器?
- javascript - 在 javascript/jQuery 中的 N 个异步调用后执行一个函数
- jax-rs - 使用 Enunciate 进行 Swagger 注释
- docker - 在哪里最好将代理设置配置为从 docker 容器内部“pip install”