diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/gradleScriptTemplateProvider.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/gradleScriptTemplateProvider.kt index 2ce439973b2..c08214f4441 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/gradleScriptTemplateProvider.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/gradleScriptTemplateProvider.kt @@ -16,30 +16,54 @@ package org.jetbrains.kotlin.idea.core.script +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.project.Project +import org.gradle.tooling.ProjectConnection import org.jetbrains.kotlin.script.ScriptTemplateProvider -import org.jetbrains.plugins.gradle.service.GradleInstallationManager +import org.jetbrains.plugins.gradle.service.execution.GradleExecutionHelper +import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings import java.io.File -class GradleScriptTemplateProvider(project: Project, gim: GradleInstallationManager?): ScriptTemplateProvider { +class GradleScriptTemplateProvider(project: Project): ScriptTemplateProvider { - private val gradleHome: File? = project.basePath?.let { gim?.getGradleHome(project, it) } - private val gradleLibsPath: File? = gradleHome?.let { File(it, "lib") }?.let { if (it.exists()) it else null } + private val gradleExeSettings: GradleExecutionSettings? by lazy { + try { + ExternalSystemApiUtil.getExecutionSettings( + project, + com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.toCanonicalPath(project.basePath!!), + org.jetbrains.plugins.gradle.util.GradleConstants.SYSTEM_ID) + } + catch (e: NoClassDefFoundError) { + // TODO: log warning and consider displaying it to user + null + } + catch (e: ClassNotFoundException) { + null // see todo above + } + } override val id: String = "Gradle" override val version: Int = 1 - override val isValid: Boolean = gradleHome != null + override val isValid: Boolean get() = gradleExeSettings?.gradleHome != null override val templateClassName: String = "org.gradle.script.lang.kotlin.KotlinBuildScript" - override val dependenciesClasspath: Iterable = - gradleLibsPath?.listFiles { file -> file.extension == "jar" && depLibsPrefixes.any { file.name.startsWith(it) } } - ?.map { it.canonicalPath } + override val dependenciesClasspath: Iterable by lazy { + gradleExeSettings?.gradleHome?.let { File(it, "lib") } + ?.let { if (it.exists()) it else null } + ?.listFiles { file -> file.extension == "jar" && depLibsPrefixes.any { file.name.startsWith(it) } } + ?.map { it.canonicalPath } ?: emptyList() - override val environment: Map? = mapOf( - "gradleHome" to gradleHome, - "projectRoot" to (project.basePath ?: project.baseDir.canonicalPath )?.let { File(it) }) + } + override val environment: Map? by lazy { mapOf( + "gradleHome" to gradleExeSettings?.gradleHome?.let { File(it) }, + "projectRoot" to (project.basePath ?: project.baseDir.canonicalPath)?.let { File(it) }, + "projectActionExecutor" to { action: (ProjectConnection) -> Unit -> + GradleExecutionHelper().execute(project.basePath!!, null) { action(it) } }, + "gradleJavaHome" to gradleExeSettings?.javaHome) + } companion object { private val depLibsPrefixes = listOf("gradle-script-kotlin", "gradle-core") } } +