From 3dc314d5098434a8322d9f69c9e0e71eca22db7b Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Thu, 17 May 2018 17:04:04 +0300 Subject: [PATCH] Remove com.intellij usages from Gradle plugin --- .../GradleKotlinCompilerRunner.kt | 6 +++--- .../gradle/internal/KaptGenerateStubsTask.kt | 13 +++++-------- .../kotlin/gradle/internal/KaptTask.kt | 7 +++---- .../plugin/KotlinGradleBuildServices.kt | 6 ------ .../kotlin/gradle/plugin/KotlinPlugin.kt | 11 +++-------- .../kotlin/gradle/tasks/SourceRoots.kt | 4 ++-- .../kotlin/gradle/tasks/SyncOutputTask.kt | 4 ++-- .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 4 ++-- .../kotlin/gradle/utils/fileUtils.kt | 19 ++++++++++++++++++- 9 files changed, 38 insertions(+), 36 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt index f4c8c4e5d50..3d600b9e489 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageRenderer -import com.intellij.openapi.util.io.FileUtil import org.gradle.api.invocation.Gradle import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.daemon.client.CompileServiceSession @@ -40,6 +39,7 @@ import org.jetbrains.kotlin.gradle.utils.relativeToRoot import org.jetbrains.kotlin.gradle.plugin.kotlinDebug import org.jetbrains.kotlin.gradle.tasks.InspectClassesForMultiModuleIC import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.utils.newTmpFile import org.jetbrains.kotlin.incremental.* import java.io.ByteArrayOutputStream import java.io.File @@ -404,7 +404,7 @@ internal class GradleCompilerRunner(private val project: Project) : KotlinCompil val log = project.logger if (clientIsAliveFlagFile == null || !clientIsAliveFlagFile!!.exists()) { val projectName = project.rootProject.name.normalizeForFlagFile() - clientIsAliveFlagFile = FileUtil.createTempFile("kotlin-compiler-in-$projectName-", ".alive", /*deleteOnExit =*/ true) + clientIsAliveFlagFile = newTmpFile(prefix = "kotlin-compiler-in-$projectName-", suffix = ".alive") log.kotlinDebug { CREATED_CLIENT_FILE_PREFIX + clientIsAliveFlagFile!!.canonicalPath } } else { @@ -429,7 +429,7 @@ internal class GradleCompilerRunner(private val project: Project) : KotlinCompil val log = project.logger if (sessionFlagFile == null || !sessionFlagFile!!.exists()) { val sessionFilesDir = sessionsDir(project).apply { mkdirs() } - sessionFlagFile = FileUtil.createTempFile(sessionFilesDir, "kotlin-compiler-", ".salive", /*deleteOnExit =*/ true) + sessionFlagFile = newTmpFile(prefix = "kotlin-compiler-", suffix = ".salive", directory = sessionFilesDir) log.kotlinDebug { CREATED_SESSION_FILE_PREFIX + sessionFlagFile!!.relativeToRoot(project) } } else { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt index e8d4267bfc2..3274c1c7e03 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.gradle.internal -import com.intellij.openapi.util.io.FileUtil import org.gradle.api.artifacts.Configuration import org.gradle.api.file.FileCollection import org.gradle.api.tasks.* @@ -27,6 +26,7 @@ import org.jetbrains.kotlin.gradle.tasks.FilteringSourceRootsContainer import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.SourceRoots import org.jetbrains.kotlin.gradle.incremental.ChangedFiles +import org.jetbrains.kotlin.gradle.utils.isParentOf import org.jetbrains.kotlin.incremental.classpathAsList import org.jetbrains.kotlin.incremental.destinationAsFile import org.jetbrains.kotlin.gradle.utils.pathsAsStringRelativeTo @@ -62,13 +62,10 @@ open class KaptGenerateStubsTask : KotlinCompile() { super.setSource(sourceRootsContainer.set(sources)) } - private fun isSourceRootAllowed(source: File): Boolean { - fun File.isInside(parent: File) = FileUtil.isAncestor(parent, this, /* strict = */ false) - - return !source.isInside(destinationDir) && - !source.isInside(stubsDir) && - !source.isInside(generatedSourcesDir) - } + private fun isSourceRootAllowed(source: File): Boolean = + !destinationDir.isParentOf(source) && + !stubsDir.isParentOf(source) && + !generatedSourcesDir.isParentOf(source) override fun setupCompilerArgs(args: K2JVMCompilerArguments, defaultsOnly: Boolean) { kotlinCompileTask.setupCompilerArgs(args) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt index 35726206c89..15470493d46 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt @@ -1,7 +1,5 @@ package org.jetbrains.kotlin.gradle.internal -import com.intellij.openapi.util.io.FileUtil -import com.intellij.openapi.util.text.StringUtil.compareVersionNumbers import org.gradle.api.GradleException import org.gradle.api.artifacts.Configuration import org.gradle.api.file.FileCollection @@ -11,9 +9,11 @@ import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl +import org.jetbrains.kotlin.gradle.plugin.compareVersionNumbers import org.jetbrains.kotlin.gradle.plugin.PLUGIN_CLASSPATH_CONFIGURATION_NAME import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.utils.isJavaFile +import org.jetbrains.kotlin.gradle.utils.isParentOf import org.jetbrains.kotlin.gradle.utils.toSortedPathsArray import java.io.File @@ -101,8 +101,7 @@ open class KaptTask : ConventionTask(), CompilerArgumentAwareWithInput FileCollection ): Boolean { - val getClassesDirs = ReflectionUtil.findMethod( - javaClass.methods.asList(), - "getClassesDirs" - ) ?: return false + val getClassesDirs = javaClass.methods.firstOrNull { it.name == "getClassesDirs" && it.parameterCount == 0 } + ?: return false val classesDirs = getClassesDirs(this) as? ConfigurableFileCollection ?: return false @@ -262,7 +257,7 @@ internal class Kotlin2JsSourceSetProcessor( kotlinTask.kotlinOptions.outputFile = kotlinTask.outputFile.absolutePath val outputDir = kotlinTask.outputFile.parentFile - if (FileUtil.isAncestor(outputDir, project.rootDir, false)) + if (outputDir.isParentOf(project.rootDir)) throw InvalidUserDataException( "The output directory '$outputDir' (defined by outputFile of $kotlinTask) contains or " + "matches the project root directory '${project.rootDir}'.\n" + diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SourceRoots.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SourceRoots.kt index f86c99d5e63..bc5703d5042 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SourceRoots.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SourceRoots.kt @@ -3,10 +3,10 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.api.file.FileTree import org.gradle.api.file.SourceDirectorySet import org.gradle.api.logging.Logger -import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.gradle.plugin.kotlinDebug import org.jetbrains.kotlin.gradle.utils.isJavaFile import org.jetbrains.kotlin.gradle.utils.isKotlinFile +import org.jetbrains.kotlin.gradle.utils.isParentOf import java.io.File import java.util.* @@ -35,7 +35,7 @@ internal sealed class SourceRoots(val kotlinSourceFiles: List) { for (sourceDir in sourceDirs) { for (sourceRoot in allSourceRoots) { - if (FileUtil.isAncestor(sourceRoot, sourceDir, /* strict = */false)) { + if (sourceRoot.isParentOf(sourceDir)) { resultRoots.add(sourceRoot) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt index 34ca318d08c..9c7aae1bf19 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt @@ -20,8 +20,8 @@ import org.gradle.api.DefaultTask import org.gradle.api.tasks.* import org.gradle.api.tasks.incremental.IncrementalTaskInputs import org.gradle.api.tasks.incremental.InputFileDetails -import com.intellij.openapi.util.io.FileUtil.isAncestor import org.jetbrains.kotlin.gradle.plugin.kotlinDebug +import org.jetbrains.kotlin.gradle.utils.isParentOf import java.io.File import java.io.ObjectInputStream import java.io.ObjectOutputStream @@ -175,7 +175,7 @@ internal open class SyncOutputTask : DefaultTask() { } private fun File.siblingInJavaDir(baseDir: File? = null): File { - val base = baseDir ?: classesDirs.find { isAncestor(it, this, true) }!! + val base = baseDir ?: classesDirs.find { it.isParentOf(this, strict = true) }!! return File(javaOutputDir, this.relativeTo(base).path) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 568441d4a63..538b282c492 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.gradle.tasks -import com.intellij.openapi.util.io.FileUtil import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.file.FileCollection @@ -35,6 +34,7 @@ import org.jetbrains.kotlin.gradle.internal.prepareCompilerArguments import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.utils.ParsedGradleVersion import org.jetbrains.kotlin.gradle.utils.toSortedPathsArray +import org.jetbrains.kotlin.gradle.utils.isParentOf import org.jetbrains.kotlin.incremental.* import org.jetbrains.kotlin.utils.LibraryUtils import java.io.File @@ -416,7 +416,7 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl it is AbstractCompile && it !is JavaCompile && it !is AbstractKotlinCompile<*> && - FileUtil.isAncestor(javaOutputDir!!, it.destinationDir, /* strict = */ false) + javaOutputDir!!.isParentOf(it.destinationDir) } as? AbstractCompile if (illegalTask != null) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt index 1211f707e92..57fe1fc7eeb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.utils import org.gradle.api.Project import java.io.File +import java.nio.file.Paths import java.util.* internal fun File.isJavaFile() = @@ -31,4 +32,20 @@ internal fun File.relativeToRoot(project: Project): String = relativeOrCanonical(project.rootProject.rootDir) internal fun Iterable.toSortedPathsArray(): Array = - map { it.canonicalPath }.toTypedArray().also { Arrays.sort(it) } \ No newline at end of file + map { it.canonicalPath }.toTypedArray().also { Arrays.sort(it) } + +internal fun newTmpFile(prefix: String, suffix: String? = null, directory: File? = null, deleteOnExit: Boolean = true) = + File.createTempFile(prefix, suffix, directory).apply { + if (deleteOnExit) deleteOnExit() + } + +internal fun File.isParentOf(childCandidate: File, strict: Boolean = false): Boolean { + val parentPath = Paths.get(this.absolutePath).normalize() + val childCandidatePath = Paths.get(childCandidate.absolutePath).normalize() + + return if (strict) { + childCandidatePath.startsWith(parentPath) && parentPath != childCandidate + } else { + childCandidatePath.startsWith(parentPath) + } +} \ No newline at end of file