From 53983a99e590292c32840ad75244e569a9e4579c Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Fri, 22 May 2020 18:46:34 +0300 Subject: [PATCH] Fix order of ExternalSystemListeners --- .../gradle/GradleScriptDefinitionsProvider.kt | 33 +++++++-------- .../gradle/GradleScriptDefinitionsUpdater.kt | 41 ------------------- .../KotlinDslScriptModelProcessor.kt | 1 + .../gradle/importing/KotlinDslSyncListener.kt | 10 ++++- 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, 28 insertions(+), 70 deletions(-) delete mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsUpdater.kt 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 de935af6ad8..6b52537b508 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 @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor 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 @@ -127,7 +128,7 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD return default.distinct().asSequence() } - return sequenceOf(ErrorGradleScriptDefinition()) + return sequenceOf(ErrorGradleScriptDefinition(project)) } private fun tryToLoadOldBuildScriptDefinition(): List { @@ -155,17 +156,14 @@ 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) { Logger.getInstance(GradleScriptDefinitionsContributor::class.java) .info("[kts] error loading gradle script templates: ${t.message}") } - listOf( - ErrorGradleScriptDefinition( - t.message - ) - ) + listOf(ErrorGradleScriptDefinition(project, t.message)) } @@ -225,6 +223,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, @@ -258,15 +258,13 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD } // TODO: refactor - minimize - private class ErrorGradleScriptDefinition(message: String? = null) : + private class ErrorGradleScriptDefinition(project: Project, message: String? = null) : ScriptDefinition.FromLegacy( ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration), - LegacyDefinition( - message - ) + LegacyDefinition(project, message) ) { - private class LegacyDefinition(message: String?) : KotlinScriptDefinitionAdapterFromNewAPIBase() { + private class LegacyDefinition(project: Project, message: String?) : KotlinScriptDefinitionAdapterFromNewAPIBase() { companion object { private const val KOTLIN_DSL_SCRIPT_EXTENSION = "gradle.kts" } @@ -279,9 +277,7 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD override val baseClass: KClass<*> = ScriptTemplateWithArgs::class override val dependencyResolver: DependenciesResolver = - ErrorScriptDependenciesResolver( - message - ) + ErrorScriptDependenciesResolver(project, message) override fun toString(): String = "ErrorGradleScriptDefinition" } @@ -290,9 +286,14 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD override fun hashCode(): Int = name.hashCode() } - private class ErrorScriptDependenciesResolver(private val message: String? = null) : DependenciesResolver { + private class ErrorScriptDependenciesResolver( + private val project: Project, + private val message: String? = null + ) : DependenciesResolver { override fun resolve(scriptContents: ScriptContents, environment: Environment): ResolveResult { - val failureMessage = if (GradleScriptDefinitionsUpdater.gradleState.isSyncInProgress) { + val importTasks = KotlinDslSyncListener.instance.tasks + val importInProgress = synchronized(importTasks) { importTasks.values.any { it.project == project } } + val failureMessage = if (importInProgress) { 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/KotlinDslScriptModelProcessor.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessor.kt index f34a0f6697e..68941e38974 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessor.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessor.kt @@ -101,6 +101,7 @@ private fun KotlinDslScriptsModel.toListOfScriptModels(project: Project): List() val models = mutableListOf() var failed = false 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 8e006b607e6..4df38b84d2f 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 @@ -9,7 +9,9 @@ import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListener 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 import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager import java.util.* @@ -26,10 +28,12 @@ class KotlinDslSyncListener : ExternalSystemTaskNotificationListenerAdapter() { if (!isGradleProjectResolve(id)) return if (workingDir == null) return - synchronized(tasks) { tasks[id] = KotlinDslGradleBuildSync(workingDir, id) } + val task = KotlinDslGradleBuildSync(workingDir, id) + synchronized(tasks) { tasks[id] = task } // project may be null in case of new project val project = id.findProject() ?: return + task.project = project GradleBuildRootsManager.getInstance(project).markImportingInProgress(workingDir) } @@ -40,6 +44,10 @@ class KotlinDslSyncListener : ExternalSystemTaskNotificationListenerAdapter() { // project may be null in case of new project val project = id.findProject() ?: return + + @Suppress("DEPRECATION") + ScriptDefinitionContributor.find(project)?.reloadIfNecessary() + saveScriptModels(project, sync) } 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 @@ -