Проект IntelliJ IDEA Gradle не распознает/не обнаруживает источники, созданные Antlr

Я использую Antlr в простом проекте Kotlin/Gradle, и, хотя моя сборка Gradle генерирует источники Antlr, они недоступны для импорта в проект.

Как вы можете видеть (слева), классы (Lexer/Parser и т.д.) Генерируются. Я также настроил этот generated-src/antlr/main как исходный корень. Большинство вопросов, которые я вижу, представляют собой решение, но я уже это сделал.

Проблема сохраняется после нескольких перестроек (как в IDEA, так и в CLI), и после всех обычных проблем "Недействительный кэш и перезагрузка".

Кроме того, проблема импорта указана в сборке Gradle на CLI, поэтому она не кажется изолированной от IDEA.

Что мне здесь не хватает?

enter image description here

Здесь файл build.gradle созданный IDEA при первоначальном создании проекта, и который IDEA использует для синхронизации проекта/рабочего пространства.

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

Попробуйте добавить сгенерированные источники в идее модуля, как это сообщение Daniel Dekany здесь:

apply plugin: "idea"
...
sourceSets.main.java.srcDir new File(buildDir, 'generated/javacc')
idea {
    module {
        // Marks the already(!) added srcDir as "generated"
        generatedSourceDirs += file('build/generated/javacc')
    }
}

Ответ 3

Попробуйте добавить это в свой 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