diff --git a/buildSrc/src/main/kotlin/InstrumentJava.kt b/buildSrc/src/main/kotlin/InstrumentJava.kt index 9688a5598c8..874b8708d71 100644 --- a/buildSrc/src/main/kotlin/InstrumentJava.kt +++ b/buildSrc/src/main/kotlin/InstrumentJava.kt @@ -1,49 +1,56 @@ import org.gradle.api.Action import org.gradle.api.Task import org.gradle.api.artifacts.Configuration -import org.gradle.api.file.FileCollection -import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.compile.JavaCompile import org.gradle.kotlin.dsl.provideDelegate import org.gradle.kotlin.dsl.withGroovyBuilder +import java.io.File /* * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -class InstrumentJava(@Transient val javaInstrumentator: Configuration, @Transient val sourceSet: SourceSet) : Action { +class InstrumentJava(@Transient val javaInstrumentator: Configuration) : Action { private val instrumentatorClasspath: String by lazy { javaInstrumentator.asPath } - private val srcDirs: FileCollection by lazy { - sourceSet.allJava.sourceDirectories - } - override fun execute(task: Task) { require(task is JavaCompile) { "$task is not of type JavaCompile!" } - task.doLast { - val anySrcDir = srcDirs.filter { it.exists() }.firstOrNull() - if (anySrcDir != null) { - task.ant.withGroovyBuilder { - "taskdef"( - "name" to "instrumentIdeaExtensions", - "classpath" to instrumentatorClasspath, - "loaderref" to "java2.loader", - "classname" to "com.intellij.ant.InstrumentIdeaExtensions" - ) - } - task.ant.withGroovyBuilder { - "instrumentIdeaExtensions"( - "srcdir" to anySrcDir, // No code should actually be compiled because of areJavaClassesCompiled==true in Javac2 - so any src folder will do. - "destdir" to task.destinationDirectory.asFile.get(), - "classpath" to task.classpath.asPath, - "includeantruntime" to false, - "instrumentNotNull" to true - ) - } + // There is a requirement for Javac.execute() to have an existen non-empty directory as a source dir for the compilation + // even if compilation is disabled. + // + // So we create an empty dummy directory during the execution. + // + // See: + // Javac.execute() - https://github.com/apache/ant/blob/9943641/src/main/org/apache/tools/ant/taskdefs/Javac.java#L1086 + // InstrumentIdeaExtensions - https://github.com/JetBrains/intellij-community/blob/9c40bdd/java/compiler/javac2/src/com/intellij/ant/InstrumentIdeaExtensions.java + // Javac2.compile() - https://github.com/JetBrains/intellij-community/blob/9c40bdd/java/compiler/javac2/src/com/intellij/ant/Javac2.java#L237 + val dummyInstrumentSrcDir = File(task.project.buildDir, "instrument_dummy_src") + val dummyInstrumentSrcRelativePath = dummyInstrumentSrcDir.relativeTo(task.project.projectDir).path.replace("\\", "/") + + task.doLast { + task.ant.withGroovyBuilder { + "taskdef"( + "name" to "instrumentIdeaExtensions", + "classpath" to instrumentatorClasspath, + "loaderref" to "java2.loader", + "classname" to "com.intellij.ant.InstrumentIdeaExtensions" + ) + } + + dummyInstrumentSrcDir.mkdirs() + + task.ant.withGroovyBuilder { + "instrumentIdeaExtensions"( + "srcdir" to dummyInstrumentSrcRelativePath, + "destdir" to task.destinationDirectory.asFile.get(), + "classpath" to task.classpath.asPath, + "includeantruntime" to false, + "instrumentNotNull" to true + ) } } } diff --git a/gradle/javaInstrumentation.gradle.kts b/gradle/javaInstrumentation.gradle.kts index a3e872d964c..8232afda8dd 100644 --- a/gradle/javaInstrumentation.gradle.kts +++ b/gradle/javaInstrumentation.gradle.kts @@ -23,7 +23,7 @@ fun Project.configureJavaInstrumentation() { javaInstrumentator("com.jetbrains.intellij.java:java-compiler-ant-tasks:${rootProject.extra["versions.intellijSdk"]}") } for (sourceSet in listOf(mainSourceSet, testSourceSet)) { - tasks.named(sourceSet.compileJavaTaskName, InstrumentJava(javaInstrumentator, sourceSet)) + tasks.named(sourceSet.compileJavaTaskName, InstrumentJava(javaInstrumentator)) } } }