Fix order of ExternalSystemListeners

This commit is contained in:
Sergey Rostov
2020-05-22 18:46:34 +03:00
parent 06dbbe2452
commit 53983a99e5
7 changed files with 28 additions and 70 deletions
@@ -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<ScriptDefinition> {
@@ -155,17 +156,14 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD
): List<ScriptDefinition> = 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(
@@ -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<GradleScriptDefinitionsContributor>(
project
)
gradleDefinitionsContributor?.reloadIfNecessary()
}
}
}
internal class GradleSyncState {
var isSyncInProgress: Boolean = false
}
@@ -101,6 +101,7 @@ private fun KotlinDslScriptsModel.toListOfScriptModels(project: Project): List<K
}
class KotlinDslGradleBuildSync(val workingDir: String, val taskId: ExternalSystemTaskId) {
var project: Project? = null
val projectRoots = mutableSetOf<String>()
val models = mutableListOf<KotlinDslScriptModel>()
var failed = false
@@ -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<GradleScriptDefinitionsContributor>(project)?.reloadIfNecessary()
saveScriptModels(project, sync)
}
-5
View File
@@ -29,13 +29,8 @@
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinTargetDataService"/>
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.KotlinJavaMPPSourceSetDataService"/>
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryDataService"/>
<externalSystemTaskNotificationListener
id="GradleScriptDefinitionsUpdater"
implementation="org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptDefinitionsUpdater"
/>
<externalSystemTaskNotificationListener
implementation="org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslSyncListener"
order="after GradleScriptDefinitionsUpdater"
/>
<editorNotificationProvider implementation="org.jetbrains.kotlin.idea.scripting.gradle.MissingGradleScriptConfigurationNotificationProvider"/>
+1 -2
View File
@@ -24,8 +24,7 @@
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.KotlinJavaMPPSourceSetDataService"/>
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryDataService"/>
<externalSystemTaskNotificationListener
id="GradleScriptDefinitionsUpdater"
implementation="org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptDefinitionsUpdater"
implementation="org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslSyncListener"
/>
<editorNotificationProvider implementation="org.jetbrains.kotlin.idea.scripting.gradle.MissingGradleScriptConfigurationNotificationProvider"/>
@@ -25,13 +25,8 @@
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinTargetDataService"/>
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.KotlinJavaMPPSourceSetDataService"/>
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryDataService"/>
<externalSystemTaskNotificationListener
id="GradleScriptDefinitionsUpdater"
implementation="org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptDefinitionsUpdater"
/>
<externalSystemTaskNotificationListener
implementation="org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslSyncListener"
order="after GradleScriptDefinitionsUpdater"
/>
<editorNotificationProvider implementation="org.jetbrains.kotlin.idea.scripting.gradle.MissingGradleScriptConfigurationNotificationProvider"/>