当前位置: 首页 > 知识库问答 >
问题:

在基于Xtend的Xtext代码生成器中使用Inject

宋望
2023-03-14

我是Xtext和Xtend的新手,正在尝试使用Xtext文档中的Xtext教程学习Xtext。我正在使用Xtext 2.14在Java10下运行Eclipse光子。我刚开始学习扩展教程,很早就遇到了一个问题。以下是我尝试使用代码生成器的代码:

/*
 * 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不能解析为注释类型,这是在一个Eclipse Xtext项目中根据教程中的说明生成的。

我该如何从这里开始?

共有1个答案

寇丰
2023-03-14

您可以只注入字段和post-init方法/构造函数参数

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» {
        }
    '''
}
 类似资料:
  • 我正在尝试使用xText和xtendbuilding与gradle创建第一个项目。 我按照xText文档中的指导创建了语法,还创建了xtend生成器。 在eclipse中,代码按预期生成到src-gen文件夹。 当我创建gradle脚本时,也遵循http://xtext.github.io/xtext-gradle-plugin/xtext-builder.html来构建我的代码,而不是在它生成的

  • 我用Xtext写了一个DSL。我想要的是执行DSL,从中获得一些好的结果。 我编写了myDslGenerator类,在xtend中实现接口IGenerator,以生成java代码,它运行良好。 我有两个问题; 解释器和代码生成器有什么区别?不都是为了执行DSL吗? 如何编写一个解释器?有没有一步一步的教程链接?我找到了许多使用xint生成代码的教程,但找不到任何用于编写解释器的教程。 谢谢你, 萨

  • 我在Xtext中定义了这个语法,当使用Xtend生成代码时,我希望得到编写时的选择表达式。 所以当选择表达式如x=“abc”| |(y=“pqr”

  • 我在一个现有的EMF项目中有一个Ecore模型,希望通过Xtend将所有包含类的名称打印到一个文本文件中。你是如何做到这一点的?XTend示例没有展示如何使用模型并从中获取信息。

  • 我试图理解代码生成器doGenerate如何调用。我拿了一个没有任何自定义更改的Xtext Project示例(只有问候)。由默认代码生成器看起来像这样: 运行生成的Eclipse插件并在/src中创建了新的Java项目,文件扩展名为right(src.MyDsl)。并将项目转换为xtext nature,我写了一些问候语并保存了下来。但在src gen中,我没有看到生成的文件问候语。txt。所以

  • 我目前正在研究Xtext,以创建一个可重用的DSL和一个构建在DSL之上的工件。简化后的项目布局如下: Projecta:包含基于XText的DSL、feature-project、updatesite等。 projectb:使用projectA中的工件生成代码。 projectc:使用从projectb生成的代码 使用Maven和Xtext构建projectA不是问题(网上已经有几个例子了),但