From 10aeead925d11960b4654510afca69939324f807 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Wed, 18 Mar 2020 10:37:24 +0300 Subject: [PATCH] Run gradle import instead of usage of scripting API during configurations update For Gradle 6.0 or higher ^KT-34481 --- .../DefaultScriptConfigurationManager.kt | 2 +- .../scripting/gradle/GradleImportHelper.kt | 29 +++++++++++++++++++ .../gradle/GradleScriptConfigurationLoader.kt | 6 ++++ .../kotlin/idea/scripting/gradle/utils.kt | 13 +++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleImportHelper.kt diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptConfigurationManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptConfigurationManager.kt index b68efe77c50..2120ad1a248 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptConfigurationManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptConfigurationManager.kt @@ -176,7 +176,7 @@ internal class DefaultScriptConfigurationManager(project: Project) : val shouldLoad = isFirstLoad || loadEvenWillNotBeApplied || autoReloadEnabled if (!shouldLoad) return - val postponeLoading = isPostponedLoad && !autoReloadEnabled + val postponeLoading = isPostponedLoad && !autoReloadEnabled && !isFirstLoad if (!ScriptDefinitionsManager.getInstance(project).isReady()) return val scriptDefinition = file.findScriptDefinition() ?: return diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleImportHelper.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleImportHelper.kt new file mode 100644 index 00000000000..c83c6f4f718 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleImportHelper.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2020 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. + */ + +@file:Suppress("UnstableApiUsage") + +package org.jetbrains.kotlin.idea.scripting.gradle + +import com.intellij.openapi.externalSystem.importing.ImportSpecBuilder +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil +import com.intellij.openapi.externalSystem.util.ExternalSystemUtil +import com.intellij.openapi.project.Project +import org.jetbrains.plugins.gradle.settings.GradleProjectSettings +import org.jetbrains.plugins.gradle.util.GradleConstants + +fun runPartialGradleImport(project: Project) { + // TODO: partial import + val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID) + val projectSettings = gradleSettings.getLinkedProjectsSettings() + .filterIsInstance() + .firstOrNull() ?: return + + ExternalSystemUtil.refreshProject( + projectSettings.externalProjectPath, + ImportSpecBuilder(project, GradleConstants.SYSTEM_ID) + .build() + ) +} \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationLoader.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationLoader.kt index 811e414f71a..9ec3fe09562 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationLoader.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationLoader.kt @@ -78,6 +78,12 @@ class GradleScriptConfigurationLoader(project: Project) : DefaultScriptConfigura } } + val gradleVersion = getGradleVersion(project) + if (gradleVersion != null && kotlinDslScriptsModelImportSupported(gradleVersion)) { + runPartialGradleImport(project) + return true + } + val result = getConfigurationThroughScriptingApi(ktFile, vFile, scriptDefinition) context.saveNewConfiguration(vFile, result) return true diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/utils.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/utils.kt index e6c3021f404..5842c13b0b8 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/utils.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/utils.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtScriptInitializer import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType +import org.jetbrains.plugins.gradle.settings.GradleLocalSettings import org.jetbrains.plugins.gradle.settings.GradleProjectSettings import org.jetbrains.plugins.gradle.util.GradleConstants @@ -89,4 +90,16 @@ fun kotlinDslScriptsModelImportSupported(currentGradleVersion: String): Boolean fun useScriptConfigurationFromImportOnly(): Boolean { return Registry.`is`("kotlin.gradle.scripts.useIdeaProjectImport", false) +} + +fun getGradleVersion(project: Project): String? { + val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID) + val projectSettings = gradleSettings.getLinkedProjectsSettings() + .filterIsInstance() + .firstOrNull() + + if (projectSettings != null) { + return GradleLocalSettings.getInstance(project).getGradleVersion(projectSettings.externalProjectPath) + } + return null } \ No newline at end of file