From 879fe9b493b9b377da0b5de8c297c6730c428e70 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Fri, 15 May 2020 18:36:34 +0300 Subject: [PATCH] Fix order of ExternalSystemListeners in 201 the order of ExternalSystemListener.EP isn't guaranteed. But we need to update script definitions and only then we can store script models, because they need to know script definitions additional classpath --- .../gradle/GradleScriptDefinitionsProvider.kt | 6 ++- .../gradle/GradleScriptDefinitionsUpdater.kt | 41 -------------- .../gradle/importing/KotlinDslSyncListener.kt | 48 ++++++++++++++--- .../importing/KotlinDslSyncListener.kt.191 | 53 +++++++++++++++++++ idea/resources/META-INF/gradle-java.xml | 5 -- idea/resources/META-INF/gradle-java.xml.191 | 3 +- idea/resources/META-INF/gradle-java.xml.201 | 5 -- 7 files changed, 100 insertions(+), 61 deletions(-) delete mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsUpdater.kt create mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt.191 diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsProvider.kt index f606109975d..47ba9be4c50 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsProvider.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsProvider.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionSourceAsContributor import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager import org.jetbrains.kotlin.idea.core.script.loadDefinitionsFromTemplates +import org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslSyncListener import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinitionAdapterFromNewAPIBase import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition import org.jetbrains.kotlin.scripting.definitions.getEnvironment @@ -139,6 +140,7 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD ): List = try { doLoadGradleTemplates(templateClass, dependencySelector, additionalResolverClasspath) } catch (t: Throwable) { + scriptingDebugLog { "error loading gradle script templates ${t.message}" } // TODO: review exception handling failedToLoad.set(true) if (t is IllegalStateException) { @@ -209,6 +211,8 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD dependencySelector.matches(it.name) }.takeIf { it.isNotEmpty() }?.asList() ?: error(KotlinIdeaGradleBundle.message("error.text.missing.jars.in.gradle.directory")) + scriptingDebugLog { "loading gradle script templates from $templateClasspath" } + return loadDefinitionsFromTemplates( listOf(templateClass), templateClasspath, @@ -276,7 +280,7 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD private class ErrorScriptDependenciesResolver(private val message: String? = null) : DependenciesResolver { override fun resolve(scriptContents: ScriptContents, environment: Environment): ResolveResult { - val failureMessage = if (GradleScriptDefinitionsUpdater.gradleState.isSyncInProgress) { + val failureMessage = if (KotlinDslSyncListener.gradleState.isSyncInProgress) { KotlinIdeaGradleBundle.message("error.text.highlighting.is.impossible.during.gradle.import") } else { message ?: KotlinIdeaGradleBundle.message( diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsUpdater.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsUpdater.kt deleted file mode 100644 index 58622685dbd..00000000000 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsUpdater.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2010-2019 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. - */ - -package org.jetbrains.kotlin.idea.scripting.gradle - -import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId -import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListenerAdapter -import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType -import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor -import org.jetbrains.kotlin.idea.framework.GRADLE_SYSTEM_ID - -class GradleScriptDefinitionsUpdater : ExternalSystemTaskNotificationListenerAdapter() { - companion object { - internal val gradleState = GradleSyncState() - } - - override fun onStart(id: ExternalSystemTaskId, workingDir: String?) { - if (id.type == ExternalSystemTaskType.RESOLVE_PROJECT && id.projectSystemId == GRADLE_SYSTEM_ID) { - gradleState.isSyncInProgress = true - } - } - - override fun onEnd(id: ExternalSystemTaskId) { - if (id.type == ExternalSystemTaskType.RESOLVE_PROJECT && id.projectSystemId == GRADLE_SYSTEM_ID) { - gradleState.isSyncInProgress = false - - val project = id.findProject() ?: return - val gradleDefinitionsContributor = - ScriptDefinitionContributor.find( - project - ) - gradleDefinitionsContributor?.reloadIfNecessary() - } - } -} - -internal class GradleSyncState { - var isSyncInProgress: Boolean = false -} \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt index f6e78171caf..66e3fc3f47b 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt @@ -8,26 +8,60 @@ package org.jetbrains.kotlin.idea.scripting.gradle.importing import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListenerAdapter import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType +import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor import org.jetbrains.kotlin.idea.framework.GRADLE_SYSTEM_ID +import org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptDefinitionsContributor class KotlinDslSyncListener : ExternalSystemTaskNotificationListenerAdapter() { override fun onStart(id: ExternalSystemTaskId, workingDir: String?) { - if (id.type != ExternalSystemTaskType.RESOLVE_PROJECT) return - if (id.projectSystemId != GRADLE_SYSTEM_ID) return - + if (!isGradleProjectImport(id)) return if (workingDir == null) return + + gradleState.isSyncInProgress = true + val project = id.findProject() ?: return project.kotlinGradleDslSync[id] = KotlinDslGradleBuildSync(workingDir, id) } override fun onEnd(id: ExternalSystemTaskId) { - if (id.type != ExternalSystemTaskType.RESOLVE_PROJECT) return - if (id.projectSystemId != GRADLE_SYSTEM_ID) return + if (!isGradleProjectImport(id)) return + + gradleState.isSyncInProgress = false val project = id.findProject() ?: return - val sync = project.kotlinGradleDslSync.remove(id) ?: return - saveScriptModels(project, sync) + @Suppress("DEPRECATION") + ScriptDefinitionContributor.find(project)?.reloadIfNecessary() + + val sync = project.kotlinGradleDslSync.remove(id) + if (sync != null) { + // For Gradle 6.0 or higher + saveScriptModels(project, sync) + } + } + + override fun onCancel(id: ExternalSystemTaskId) { + if (!isGradleProjectImport(id)) return + + gradleState.isSyncInProgress = false + + val project = id.findProject() ?: return + + project.kotlinGradleDslSync.remove(id) + } + + private fun isGradleProjectImport(id: ExternalSystemTaskId): Boolean { + return id.type == ExternalSystemTaskType.RESOLVE_PROJECT || id.projectSystemId == GRADLE_SYSTEM_ID + } + + companion object { + internal val gradleState = GradleSyncState() } } + +// TODO: state should be stored by gradle build, +// now it is marked as complete after first gradle project was imported +internal class GradleSyncState { + var isSyncInProgress: Boolean = false +} diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt.191 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt.191 new file mode 100644 index 00000000000..e9e22a6817e --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt.191 @@ -0,0 +1,53 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.idea.scripting.gradle.importing + +import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId +import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListenerAdapter +import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType +import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor +import org.jetbrains.kotlin.idea.framework.GRADLE_SYSTEM_ID +import org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptDefinitionsContributor + +class KotlinDslSyncListener : ExternalSystemTaskNotificationListenerAdapter() { + override fun onStart(id: ExternalSystemTaskId, workingDir: String?) { + if (!isGradleProjectImport(id)) return + if (workingDir == null) return + + gradleState.isSyncInProgress = true + } + + override fun onEnd(id: ExternalSystemTaskId) { + if (!isGradleProjectImport(id)) return + + gradleState.isSyncInProgress = false + + val project = id.findProject() ?: return + + @Suppress("DEPRECATION") + ScriptDefinitionContributor.find(project)?.reloadIfNecessary() + } + + override fun onCancel(id: ExternalSystemTaskId) { + if (!isGradleProjectImport(id)) return + + gradleState.isSyncInProgress = false + } + + private fun isGradleProjectImport(id: ExternalSystemTaskId): Boolean { + return id.type == ExternalSystemTaskType.RESOLVE_PROJECT || id.projectSystemId == GRADLE_SYSTEM_ID + } + + companion object { + internal val gradleState = GradleSyncState() + } +} + +// TODO: state should be stored by gradle build, +// now it is marked as complete after first gradle project was imported +internal class GradleSyncState { + var isSyncInProgress: Boolean = false +} diff --git a/idea/resources/META-INF/gradle-java.xml b/idea/resources/META-INF/gradle-java.xml index 7060ef8a9ad..fca081cbffe 100644 --- a/idea/resources/META-INF/gradle-java.xml +++ b/idea/resources/META-INF/gradle-java.xml @@ -29,13 +29,8 @@ - diff --git a/idea/resources/META-INF/gradle-java.xml.191 b/idea/resources/META-INF/gradle-java.xml.191 index 970cd8d16c7..a2168c345fb 100644 --- a/idea/resources/META-INF/gradle-java.xml.191 +++ b/idea/resources/META-INF/gradle-java.xml.191 @@ -24,8 +24,7 @@ diff --git a/idea/resources/META-INF/gradle-java.xml.201 b/idea/resources/META-INF/gradle-java.xml.201 index 8d26365a679..99de71d92cb 100644 --- a/idea/resources/META-INF/gradle-java.xml.201 +++ b/idea/resources/META-INF/gradle-java.xml.201 @@ -25,13 +25,8 @@ -