From 85141b753b934f09065069157fbae66c52a6b235 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Wed, 22 Apr 2020 16:27:07 +0300 Subject: [PATCH] Show notification that gradle project is needed to be imported to get code insight for kotlin scripts --- .../core/script/ScriptConfigurationManager.kt | 5 +++ .../ScriptTrafficLightRendererContributor.kt | 5 +-- .../CompositeScriptConfigurationManager.kt | 3 ++ .../configuration/DefaultScriptingSupport.kt | 4 ++ .../script/configuration/ScriptingSupport.kt | 1 + .../KotlinIdeaGradleBundle.properties | 4 +- .../scripting/gradle/GradleImportHelper.kt | 3 ++ .../gradle/GradleImportHelper.kt.201 | 3 ++ .../GradleScriptConfigurationManager.kt | 3 ++ ...leScriptOutOfSourceNotificationProvider.kt | 39 ++++++++++++------- .../gradle/GradleScriptingSupportProvider.kt | 11 ++++++ 11 files changed, 62 insertions(+), 19 deletions(-) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt index b9f634b6026..cc43997c72d 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt @@ -92,6 +92,11 @@ interface ScriptConfigurationManager { */ fun hasConfiguration(file: KtFile): Boolean + /** + * returns true when there is no configuration and highlighting should be suspended + */ + fun isConfigurationLoadingInProgress(file: KtFile): Boolean + /** * See [ScriptConfigurationUpdater]. */ diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptTrafficLightRendererContributor.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptTrafficLightRendererContributor.kt index 68f50fa8b00..e371f63631d 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptTrafficLightRendererContributor.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptTrafficLightRendererContributor.kt @@ -30,10 +30,7 @@ class ScriptTrafficLightRendererContributor : TrafficLightRendererContributor { if (!ScriptDefinitionsManager.getInstance(file.project).isReady()) { status.reasonWhySuspended = KotlinIdeaCoreBundle.message("text.loading.kotlin.script.definitions") status.errorAnalyzingFinished = false - } else if ( - !ScriptConfigurationManager.getInstance(project).hasConfiguration(file) - && !ScriptConfigurationManager.isManualConfigurationLoading(file.originalFile.virtualFile) - ) { + } else if (ScriptConfigurationManager.getInstance(project).isConfigurationLoadingInProgress(file)) { status.reasonWhySuspended = KotlinIdeaCoreBundle.message("text.loading.kotlin.script.configuration") status.errorAnalyzingFinished = false } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/CompositeScriptConfigurationManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/CompositeScriptConfigurationManager.kt index 675e4fac733..ea27044d957 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/CompositeScriptConfigurationManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/CompositeScriptConfigurationManager.kt @@ -55,6 +55,9 @@ class CompositeScriptConfigurationManager(val project: Project) : ScriptConfigur override fun hasConfiguration(file: KtFile): Boolean = getRelatedManager(file).hasCachedConfiguration(file) + override fun isConfigurationLoadingInProgress(file: KtFile): Boolean = + getRelatedManager(file).isConfigurationLoadingInProgress(file) + override val updater: ScriptConfigurationUpdater get() = object : ScriptConfigurationUpdater { override fun ensureUpToDatedConfigurationSuggested(file: KtFile) = diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt index 49ecc60289d..988df2f7cf8 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt @@ -314,6 +314,10 @@ abstract class DefaultScriptingSupportBase(val project: Project) : ScriptingSupp override fun hasCachedConfiguration(file: KtFile): Boolean = getAppliedConfiguration(file.originalFile.virtualFile) != null + override fun isConfigurationLoadingInProgress(file: KtFile): Boolean { + return !hasCachedConfiguration(file) && !ScriptConfigurationManager.isManualConfigurationLoading(file.originalFile.virtualFile) + } + override fun getOrLoadConfiguration( virtualFile: VirtualFile, preloadedKtFile: KtFile? diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/ScriptingSupport.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/ScriptingSupport.kt index 88cb11562b9..499a014d865 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/ScriptingSupport.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/ScriptingSupport.kt @@ -34,6 +34,7 @@ abstract class ScriptingSupport { abstract fun clearCaches() abstract fun hasCachedConfiguration(file: KtFile): Boolean + abstract fun isConfigurationLoadingInProgress(file: KtFile): Boolean abstract fun getOrLoadConfiguration(virtualFile: VirtualFile, preloadedKtFile: KtFile? = null): ScriptCompilationConfigurationWrapper? abstract val updater: ScriptConfigurationUpdater diff --git a/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties b/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties index f6f2a0d0b05..b9ad76dfa70 100644 --- a/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties +++ b/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties @@ -51,7 +51,9 @@ comman.name.configure.kotlin=Configure Kotlin command.name.configure.0=Configure {0} notification.title.script.configuration.has.been.changed=Script configurations has been changed. notification.text.script.configuration.has.been.changed=Gradle Project needs to be imported to load changes. +script.configurations.will.be.available.after.import=Gradle Kotlin DSL script configuration is missing. Import project to get script code insight. +script.configurations.will.be.available.after.load.changes=Gradle Kotlin DSL script configuration is missing. Load Script Configurations to get script code insight. action.label.import.project=Import Project action.label.enable.auto.import=Enable Auto-Import action.text.load.script.configurations=Load Script Configurations -action.description.load.script.configurations=Gradle Kotlin DSL script configuration has been changed. Load changes to get script code insight without loading the external Gradle project. +action.description.load.script.configurations=Gradle Kotlin DSL script configuration has been changed. Load changes to get script code insight without loading the external Gradle project. 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 index 661d3ac82ba..25dab3b34c9 100644 --- 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 @@ -31,6 +31,9 @@ fun runPartialGradleImport(project: Project) { } } +fun getMissingConfigurationNotificationText() = KotlinIdeaGradleBundle.message("script.configurations.will.be.available.after.import") +fun getMissingConfigurationActionText() = KotlinIdeaGradleBundle.message("action.label.import.project") + private const val kotlinDslNotificationGroupId = "Gradle Kotlin DSL Scripts" private var Project.notificationPanel: ScriptConfigurationChangedNotification? by UserDataProperty(Key.create("load.script.configuration.panel")) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleImportHelper.kt.201 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleImportHelper.kt.201 index b41b7cb94ad..c29a543b21f 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleImportHelper.kt.201 +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleImportHelper.kt.201 @@ -42,6 +42,9 @@ fun runPartialGradleImport(project: Project) { } } +fun getMissingConfigurationNotificationText() = KotlinIdeaGradleBundle.message("script.configurations.will.be.available.after.load.changes") +fun getMissingConfigurationActionText() = KotlinIdeaGradleBundle.message("action.text.load.script.configurations") + private var Project.shouldShowLoadConfiguraionsAction: Boolean? by UserDataProperty(Key.create("load.script.configuration.action")) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationManager.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationManager.kt index eedfe94500d..6de677bf474 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationManager.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationManager.kt @@ -87,6 +87,9 @@ class GradleScriptingSupport( override fun hasCachedConfiguration(file: KtFile): Boolean = configuration.scriptModel(file.originalFile.virtualFile) != null + // TODO: can be true during import + override fun isConfigurationLoadingInProgress(file: KtFile): Boolean = false + override fun getOrLoadConfiguration(virtualFile: VirtualFile, preloadedKtFile: KtFile?): ScriptCompilationConfigurationWrapper? { return classpathRoots.getScriptConfiguration(virtualFile) } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptOutOfSourceNotificationProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptOutOfSourceNotificationProvider.kt index 7f08a8ee97a..d3bbae5e4a2 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptOutOfSourceNotificationProvider.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptOutOfSourceNotificationProvider.kt @@ -23,22 +23,33 @@ class GradleScriptOutOfSourceNotificationProvider(private val project: Project) if (!isGradleKotlinScript(file)) return null if (file.fileType != KotlinFileType.INSTANCE) return null - if (isInAffectedGradleProjectFiles(project, file.path)) return null - - return EditorNotificationPanel().apply { - text(KotlinIdeaGradleBundle.message("text.the.associated.gradle.project.isn.t.imported")) - val loadScriptConfigurationText = KotlinIdeaGradleBundle.message("action.label.text.load.script.configuration") - createActionLabel(loadScriptConfigurationText) { - ScriptConfigurationManager.getInstance(project).forceReloadConfiguration(file, loaderForOutOfProjectScripts) + if (!isInAffectedGradleProjectFiles(project, file.path)) { + return EditorNotificationPanel().apply { + text(KotlinIdeaGradleBundle.message("text.the.associated.gradle.project.isn.t.imported")) + val loadScriptConfigurationText = KotlinIdeaGradleBundle.message("action.label.text.load.script.configuration") + createActionLabel(loadScriptConfigurationText) { + ScriptConfigurationManager.getInstance(project).forceReloadConfiguration(file, loaderForOutOfProjectScripts) + } + val link = createActionLabel("") {} + link.setIcon(AllIcons.General.ContextHelp) + link.setUseIconAsLink(true) + link.toolTipText = KotlinIdeaGradleBundle.message( + "tool.tip.text.the.external.gradle.project.needs.to.be.imported.to.get.this.script.analyzed", + loadScriptConfigurationText + ) } - val link = createActionLabel("") {} - link.setIcon(AllIcons.General.ContextHelp) - link.setUseIconAsLink(true) - link.toolTipText = KotlinIdeaGradleBundle.message( - "tool.tip.text.the.external.gradle.project.needs.to.be.imported.to.get.this.script.analyzed", - loadScriptConfigurationText - ) } + + if (GradleScriptingSupportProvider.getInstance(project).shouldShowNotificationToRunGradleImport(file)) { + return EditorNotificationPanel().apply { + text(getMissingConfigurationNotificationText()) + createActionLabel(getMissingConfigurationActionText()) { + runPartialGradleImport(project) + } + } + } + + return null } private val loaderForOutOfProjectScripts by lazy { diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptingSupportProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptingSupportProvider.kt index 1625a57e4aa..8fb8de4aba3 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptingSupportProvider.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptingSupportProvider.kt @@ -146,6 +146,7 @@ class GradleScriptingSupportProvider(val project: Project) : ScriptingSupport.Pr } override fun hasCachedConfiguration(file: KtFile): Boolean = false + override fun isConfigurationLoadingInProgress(file: KtFile): Boolean = false override fun getOrLoadConfiguration( virtualFile: VirtualFile, @@ -166,6 +167,16 @@ class GradleScriptingSupportProvider(val project: Project) : ScriptingSupport.Pr override fun recreateRootsCache(): ScriptClassRootsCache = ScriptClassRootsCache.empty(project) } + fun shouldShowNotificationToRunGradleImport(file: VirtualFile): Boolean { + if (isGradleKotlinScript(file)) { + findRoot(file)?.let { return false } + + val externalProjectSettings = findExternalProjectSettings(file) ?: return false + return kotlinDslScriptsModelImportSupported(getGradleVersion(project, externalProjectSettings)) + } + return false + } + companion object { fun getInstance(project: Project): GradleScriptingSupportProvider = EPN.getPoint(project).extensionList.firstIsInstance()