IntelliJ IDEA Gradle 项目无法识别/定位 Antlr 生成的源

2022-09-03 08:06:27

我在一个简单的Kotlin/Gradle项目中使用Antlr,虽然我的Gradle版本正在生成Antlr源代码,但它们不能导入到项目中。

如您所见(在左侧),正在生成类(Lexer/Parser 等)。我还将此目录配置为源根目录。我看到的大多数问题都将其列为解决方案,但我已经做到了。generated-src/antlr/main

在多次重建(在 IDEA 和 CLI 中)以及所有常见的“使缓存无效并重新启动”问题之后,问题仍然存在。

此外,导入问题列在 CLI 上的 Gradle 版本中,因此它似乎并不孤立于 IDEA。

我在这里错过了什么?

enter image description here

以下是 IDEA 最初创建项目时生成的文件,以及 IDEA 用于项目/工作区同步的文件。build.gradle

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.2.50'
}

group 'com.craigotis'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

apply plugin: 'antlr'

dependencies {
    antlr "org.antlr:antlr4:4.5"
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

答案 1

难道它不应该找到编译的类而不是源代码吗?您是否在目标目录中看到 antlr 生成的类?

请尝试以下操作:首先在不引用或使用任何 ANTLR 生成的类的情况下生成项目,并且仅在生成成功后,添加引用它们的代码。

(换句话说,我认为发生这种情况的是,您的ANTLR源代码是在引用它们的代码之后编译的。他们从来没有机会编译,因为之前构建失败了)

此外,如果真的是这种情况,您也可以通过将工件拆分为两个工件来解决它,并确保ANTLR一个是在具有使用它的代码之前构建的。


答案 2

尝试将其添加到您的 :build.gradle

sourceSets {
  main.java.srcDirs += "${project.buildDir}/generated-src/antlr/main"
}

generateGrammarSource {
  arguments += ["-visitor", "-package", "com.craigotis.sprint.core.antlr"]
  outputDirectory = file("${project.buildDir}/generated-src/antlr/main/com/craigotis/sprint/core/antlr")
}

compileKotlin.dependsOn generateGrammarSource

推荐