単純なKotlin/GradleプロジェクトでAntlrを使用していますが、GradleビルドでAntlrソースが生成されていますが、プロジェクトにインポートすることはできません。
ご覧のとおり(左側)、クラス(Lexer/Parserなど)が生成されています。私もこれを設定しましたgenerated-src/antlr/main
ディレクトリをソースルートとして。私が見るほとんどの質問はこれを解決策として挙げていますが、私はすでにそれを行っています。
この問題は、複数回の再構築(IDEAとCLIの両方)、および通常の「キャッシュの無効化と再起動」の問題の両方)の後も解決しません。
さらに、インポートの問題はCLIのGradleビルドにリストされているため、IDEAに限定されているようには見えません。
ここで何が欠けていますか?
これが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"
}
ソースではなくコンパイル済みクラスを見つけるべきではありませんか?ターゲットディレクトリにantlrで生成されたクラスが表示されますか?
これを試してください。最初に、ANTLRで生成されたクラスを参照または使用せずにプロジェクトをビルドし、ビルドが成功した後でのみ、それらを参照するコードを追加します。
(言い換えれば、私が思うに、ANTLRソースは、それらを参照するコードの後にコンパイルされます。ビルドが失敗するため、コンパイルする機会はありません)
また、これが実際に当てはまる場合は、2つのアーティファクトに分割して、それを使用するコードを使用するアーティファクトの前にANTLRアーティファクトがビルドされていることを確認することでも解決できます。
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')
}
}
これを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