From 57d390bab0807be1ad97aac6acbd7cbeed29f164 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Fri, 3 Apr 2020 19:44:14 +0300 Subject: [PATCH] Introduce new external listener to avoid failing loading dependencies during new projet creation --- .../KotlinDslScriptModelResolverCommon.kt | 6 +-- .../KotlinDslScrtiptModelProcessor.kt | 13 +++--- .../gradle/importing/KotlinDslSyncListener.kt | 44 +++++++++++++++++++ .../importing/KotlinDslSyncListener.kt.191 | 15 +++++++ idea/resources/META-INF/gradle-java.xml | 9 +++- idea/resources/META-INF/gradle-java.xml.191 | 5 ++- idea/resources/META-INF/gradle-java.xml.201 | 9 +++- 7 files changed, 89 insertions(+), 12 deletions(-) create mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.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/importing/KotlinDslScriptModelResolverCommon.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolverCommon.kt index a7b3d27f2ae..30afda644da 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolverCommon.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolverCommon.kt @@ -93,9 +93,9 @@ abstract class KotlinDslScriptModelResolverCommon : AbstractProjectResolverExten ) } else { val models = model.toListOfScriptModels() - - saveScriptModels(resolverCtx, models) - + resolverCtx.externalSystemTaskId.findProject()?.kotlinDslModels?.addAll( + models + ) if (models.containsErrors()) { throw IllegalStateException(KotlinIdeaGradleBundle.message("title.kotlin.build.script")) } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt index 662ab5188ca..7042a81f2de 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.idea.scripting.gradle.importing import com.intellij.openapi.components.service +import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId +import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager @@ -18,6 +20,7 @@ import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrap import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource import org.jetbrains.kotlin.scripting.resolve.adjustByDefinition import org.jetbrains.plugins.gradle.service.project.ProjectResolverContext +import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings import java.io.File import kotlin.script.experimental.api.* import kotlin.script.experimental.jvm.JvmDependency @@ -25,18 +28,16 @@ import kotlin.script.experimental.jvm.jdkHome import kotlin.script.experimental.jvm.jvm fun saveScriptModels( - resolverContext: ProjectResolverContext, + project: Project, + task: ExternalSystemTaskId, + javaHomeStr: String?, models: List ) { - val task = resolverContext.externalSystemTaskId - val project = task.findProject() ?: return - val settings = resolverContext.settings ?: return - val scriptConfigurations = mutableListOf>() val errorReporter = KotlinGradleDslErrorReporter(project, task) - val javaHome = settings.javaHome?.let { File(it) } + val javaHome = javaHomeStr?.let { File(it) } models.forEach { model -> val scriptFile = File(model.file) val virtualFile = VfsUtil.findFile(scriptFile.toPath(), true)!! 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 new file mode 100644 index 00000000000..49c4ccf67de --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt @@ -0,0 +1,44 @@ +/* + * 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 com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Key +import org.jetbrains.kotlin.idea.framework.GRADLE_SYSTEM_ID +import org.jetbrains.kotlin.psi.NotNullableUserDataProperty +import org.jetbrains.plugins.gradle.settings.GradleProjectSettings +import org.jetbrains.plugins.gradle.util.GradleConstants + +var Project.kotlinDslModels: ArrayList + by NotNullableUserDataProperty>( + Key("Kotlin DSL Scripts Models"), arrayListOf() + ) + +class KotlinDslSyncListener : ExternalSystemTaskNotificationListenerAdapter() { + override fun onEnd(id: ExternalSystemTaskId) { + if (id.type != ExternalSystemTaskType.RESOLVE_PROJECT || id.projectSystemId != GRADLE_SYSTEM_ID) { + return + } + + val project = id.findProject() ?: return + + val models: List = project.kotlinDslModels + project.kotlinDslModels = arrayListOf() + + if (models.isEmpty()) return + + val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID) + val projectSettings = gradleSettings.getLinkedProjectsSettings() + .filterIsInstance().firstOrNull() + ?: return + + saveScriptModels(project, id, projectSettings.gradleHome, models) + } +} 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..565bc2892b0 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt.191 @@ -0,0 +1,15 @@ +/* + * 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.project.Project +import com.intellij.openapi.util.Key +import org.jetbrains.kotlin.psi.NotNullableUserDataProperty + +var Project.kotlinDslModels: ArrayList + by NotNullableUserDataProperty>( + Key("Kotlin DSL Scripts Models"), arrayListOf() + ) diff --git a/idea/resources/META-INF/gradle-java.xml b/idea/resources/META-INF/gradle-java.xml index e48bcd17ea8..6e464eb2632 100644 --- a/idea/resources/META-INF/gradle-java.xml +++ b/idea/resources/META-INF/gradle-java.xml @@ -29,7 +29,14 @@ - + + diff --git a/idea/resources/META-INF/gradle-java.xml.191 b/idea/resources/META-INF/gradle-java.xml.191 index fc3a3e4f89c..6c4559d42fe 100644 --- a/idea/resources/META-INF/gradle-java.xml.191 +++ b/idea/resources/META-INF/gradle-java.xml.191 @@ -23,7 +23,10 @@ - + diff --git a/idea/resources/META-INF/gradle-java.xml.201 b/idea/resources/META-INF/gradle-java.xml.201 index e0dea20543d..daed15ec106 100644 --- a/idea/resources/META-INF/gradle-java.xml.201 +++ b/idea/resources/META-INF/gradle-java.xml.201 @@ -25,7 +25,14 @@ - + +