【问题标题】:How to specify order of Xtext Language generation for the XtextGenerator?如何为 XtextGenerator 指定 Xtext 语言生成的顺序?
【发布时间】:2019-08-29 16:16:26
【问题描述】:

我们有一个项目,其中包含两个 Xtext 语法,遵循此线程中的描述:https://www.eclipse.org/forums/index.php/t/1079008/

我们的语言生成模块有一个 XtextGenerator 块和两个语言块。一种语言块通过 'referencedResource' 属性引用另一种语言块。

将语法放在一个项目中是有意义的,因为它们紧密相关,并且一种语法依赖于另一种语法。

但是,在运行Langauge Generation模块时,所依赖的语言似乎是在依赖语言之后生成的,导致所依赖语言的.genmodel出现FileNotFoundException。

为什么依赖的语言是在依赖的语言之后生成的?是否可以指定生成语言的顺序?

我已经试过了:

  • 将 GenerateBxLang 模块拆分为两个模块,每个模块生成一种语言。但是,在运行模块之前会执行清理。这会导致运行第二个模块删除运行第一个模块的结果。
  • 更改模块中语言块的顺序,但这没有任何区别。

语言生成模块代码如下:

module com.a.b.GenerateLang

import org.eclipse.xtext.xtext.generator.*
import org.eclipse.emf.mwe.utils.StandaloneSetup
import org.eclipse.xtext.xtext.generator.model.project.*

var rootPath = ".."

Workflow {

    component = XtextGenerator {
        configuration = {
            project = StandardProjectConfig {
                baseName = "com.a.b"
                rootPath = rootPath
                runtimeTest = {
                    enabled = true
                }
                genericIde = {
                    enabled = true
                }
                mavenLayout = true
            }
            code = {
                encoding = "UTF-8"
                lineDelimiter = "\n"
                fileHeader = "/*\n * generated by Xtext \${version}\n */"
            }
        }
        language = StandardLanguage {
            name = "com.a.b.BxLang"
            fileExtensions = "bxlang"
            referencedResource =
            "platform:/resource/com.a.b/model/generated/BxLangSubjectScope.genmodel" 
            serializer = {
                generateStub = false
            }
            validator = {
                generateDeprecationValidation = true
            }
            junitSupport = {
                junitVersion = "5"
            }
        }
        language = StandardLanguage {
            name = "com.a.b.BxLangSubjectScope"
            fileExtensions = "bxscope"
            serializer = {
                generateStub = false
            }
            validator = {
                generateDeprecationValidation = true
            }
            junitSupport = {
                junitVersion = "5"
            }
        }
    }
}

运行上述语言生成模块会导致以下错误:

359  [main] ERROR mf.mwe2.launch.runtime.Mwe2Launcher  - Problems running workflow com.a.b.GenerateBxLang: java.io.FileNotFoundException: /model/generated/BxLangSubjectScope.genmodel (No such file or directory)
java.lang.RuntimeException: Problems running workflow com.a.b.GenerateBxLang: java.io.FileNotFoundException: /model/generated/BxLangSubjectScope.genmodel (No such file or directory)

【问题讨论】:

  • 你有没有尝试引用Resource第一个语法文件而不是genmodel?
  • 感谢克里斯蒂安的快速回答!我已将 referencedResource 更新为以下内容:“platform:/resource/com.a.b/src/main/java/com/a/b/BxLangSubjectScope.xtext”,现在首先生成正确的语言。有什么办法可以让我自己发现这一点吗?我只在文档和其他示例中找到了引用 genmodel 的配置。

标签: java dsl xtext


【解决方案1】:

解决方案正如 Christian Dietrich 对原始问题的评论:

referencedResource 应该是语法文件,而不是 genmodel。正确的参考如下:

referencedResource =
          "platform:/resource/com.a.b/src/main/java/com/a/b/BxLangSubjectScope.xtext" 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2018-09-23
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多