Run partial import only for specified build root

This commit is contained in:
Natalia Selezneva
2020-06-16 20:02:02 +03:00
parent 5fe47ffbec
commit bf1ad44af9
3 changed files with 57 additions and 36 deletions
@@ -22,6 +22,7 @@ import com.intellij.openapi.vfs.VirtualFile
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.idea.KotlinIcons import org.jetbrains.kotlin.idea.KotlinIcons
import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRoot
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
import org.jetbrains.kotlin.idea.util.application.getServiceSafe import org.jetbrains.kotlin.idea.util.application.getServiceSafe
import org.jetbrains.kotlin.psi.UserDataProperty import org.jetbrains.kotlin.psi.UserDataProperty
@@ -32,25 +33,26 @@ import org.jetbrains.plugins.gradle.util.GradleConstants
val scriptConfigurationsNeedToBeUpdatedBalloon val scriptConfigurationsNeedToBeUpdatedBalloon
get() = Registry.`is`("kotlin.gradle.scripts.scriptConfigurationsNeedToBeUpdatedBalloon", false) get() = Registry.`is`("kotlin.gradle.scripts.scriptConfigurationsNeedToBeUpdatedBalloon", false)
fun runPartialGradleImport(project: Project) { fun runPartialGradleImportForAllRoots(project: Project) {
getGradleProjectSettings(project).forEach { GradleBuildRootsManager.getInstance(project).getAllRoots().forEach { root ->
ExternalSystemUtil.refreshProject( runPartialGradleImport(project, root)
it.externalProjectPath,
ImportSpecBuilder(project, GradleConstants.SYSTEM_ID)
.build()
)
} }
} }
fun runPartialGradleImport(project: Project, root: GradleBuildRoot) {
ExternalSystemUtil.refreshProject(
root.pathPrefix,
ImportSpecBuilder(project, GradleConstants.SYSTEM_ID)
.build()
)
}
fun getMissingConfigurationActionText() = KotlinIdeaGradleBundle.message("action.label.import.project") fun getMissingConfigurationActionText() = KotlinIdeaGradleBundle.message("action.label.import.project")
fun autoReloadScriptConfigurations(project: Project, file: VirtualFile): Boolean { fun autoReloadScriptConfigurations(project: Project, root: GradleBuildRoot): Boolean {
val path = GradleBuildRootsManager.getInstance(project)
.getScriptInfo(file)?.buildRoot?.pathPrefix ?: return false
return ExternalSystemApiUtil return ExternalSystemApiUtil
.getSettings(project, GradleConstants.SYSTEM_ID) .getSettings(project, GradleConstants.SYSTEM_ID)
.getLinkedProjectSettings(path) .getLinkedProjectSettings(root.pathPrefix)
?.isUseAutoImport ?: false ?.isUseAutoImport ?: false
} }
@@ -61,7 +63,8 @@ private var Project.notificationPanel: ScriptConfigurationChangedNotification?
fun scriptConfigurationsNeedToBeUpdated(project: Project, file: VirtualFile) { fun scriptConfigurationsNeedToBeUpdated(project: Project, file: VirtualFile) {
if (!scriptConfigurationsNeedToBeUpdatedBalloon) return if (!scriptConfigurationsNeedToBeUpdatedBalloon) return
if (autoReloadScriptConfigurations(project, file)) { val root = GradleBuildRootsManager.getInstance(project).getScriptInfo(file)?.buildRoot ?: return
if (autoReloadScriptConfigurations(project, root)) {
// import should be run automatically by Gradle plugin // import should be run automatically by Gradle plugin
return return
} }
@@ -103,10 +106,13 @@ private class ScriptConfigurationChangedNotification(val project: Project) :
init { init {
addAction(LoadConfigurationAction()) addAction(LoadConfigurationAction())
addAction(NotificationAction.createSimple(KotlinIdeaGradleBundle.message("action.label.enable.auto.import")) { addAction(NotificationAction.createSimple(KotlinIdeaGradleBundle.message("action.label.enable.auto.import")) {
getGradleProjectSettings(project).forEach { GradleBuildRootsManager.getInstance(project).getAllRoots().forEach { root ->
it.isUseAutoImport = true val projectSettings = getGradleProjectSettings(project).find { it.externalProjectPath == root.pathPrefix }
if (projectSettings != null) {
projectSettings.isUseAutoImport = true
}
runPartialGradleImport(project, root)
} }
runPartialGradleImport(project)
}) })
} }
@@ -119,7 +125,7 @@ private class ScriptConfigurationChangedNotification(val project: Project) :
private class LoadConfigurationAction : AnAction(KotlinIdeaGradleBundle.message("action.label.import.project")) { private class LoadConfigurationAction : AnAction(KotlinIdeaGradleBundle.message("action.label.import.project")) {
override fun actionPerformed(e: AnActionEvent) { override fun actionPerformed(e: AnActionEvent) {
val project = e.project ?: return val project = e.project ?: return
runPartialGradleImport(project) runPartialGradleImportForAllRoots(project)
} }
} }
} }
@@ -23,35 +23,42 @@ import org.jetbrains.kotlin.idea.KotlinIcons
import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle
import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
import org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslScriptModelResolver import org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslScriptModelResolver
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRoot
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
import org.jetbrains.plugins.gradle.service.project.GradlePartialResolverPolicy import org.jetbrains.plugins.gradle.service.project.GradlePartialResolverPolicy
import org.jetbrains.plugins.gradle.settings.GradleProjectSettings import org.jetbrains.plugins.gradle.settings.GradleProjectSettings
import org.jetbrains.plugins.gradle.util.GradleConstants import org.jetbrains.plugins.gradle.util.GradleConstants
fun runPartialGradleImport(project: Project) { fun runPartialGradleImportForAllRoots(project: Project) {
getGradleProjectSettings(project).forEach { gradleProjectSettings -> GradleBuildRootsManager.getInstance(project).getAllRoots().forEach { root ->
ExternalSystemUtil.refreshProject( runPartialGradleImport(project, root)
gradleProjectSettings.externalProjectPath,
ImportSpecBuilder(project, GradleConstants.SYSTEM_ID)
.projectResolverPolicy(
GradlePartialResolverPolicy { it is KotlinDslScriptModelResolver }
)
)
} }
} }
fun runPartialGradleImport(project: Project, root: GradleBuildRoot) {
ExternalSystemUtil.refreshProject(
root.pathPrefix,
ImportSpecBuilder(project, GradleConstants.SYSTEM_ID)
.projectResolverPolicy(
GradlePartialResolverPolicy { it is KotlinDslScriptModelResolver }
)
)
}
fun getMissingConfigurationActionText() = KotlinIdeaGradleBundle.message("action.text.load.script.configurations") fun getMissingConfigurationActionText() = KotlinIdeaGradleBundle.message("action.text.load.script.configurations")
fun autoReloadScriptConfigurations(project: Project, file: VirtualFile): Boolean { fun autoReloadScriptConfigurations(project: Project, file: VirtualFile): Boolean {
val buildRoot = GradleBuildRootsManager.getInstance(project).getScriptInfo(file)?.buildRoot ?: return false val definition = file.findScriptDefinition(project) ?: return false
return GradleScriptDefinitionsContributor.getDefinitions(project, buildRoot.pathPrefix, buildRoot.data.gradleHome)?.any {
KotlinScriptingSettings.getInstance(project).autoReloadConfigurations(it) return KotlinScriptingSettings.getInstance(project).autoReloadConfigurations(definition)
} ?: return false
} }
fun scriptConfigurationsNeedToBeUpdated(project: Project, file: VirtualFile) { fun scriptConfigurationsNeedToBeUpdated(project: Project, file: VirtualFile) {
if (autoReloadScriptConfigurations(project, file)) { if (autoReloadScriptConfigurations(project, file)) {
runPartialGradleImport(project) GradleBuildRootsManager.getInstance(project).getScriptInfo(file)?.buildRoot?.let {
runPartialGradleImport(project, it)
}
} else { } else {
// notification is shown in LoadConfigurationAction // notification is shown in LoadConfigurationAction
} }
@@ -66,7 +73,11 @@ class LoadConfigurationAction : AnAction(
) { ) {
override fun actionPerformed(e: AnActionEvent) { override fun actionPerformed(e: AnActionEvent) {
val project = e.project ?: return val project = e.project ?: return
runPartialGradleImport(project) val editor = e.getData(CommonDataKeys.EDITOR) ?: return
val file = getKotlinScriptFile(editor) ?: return
val root = GradleBuildRootsManager.getInstance(project).getScriptInfo(file)?.buildRoot ?: return
runPartialGradleImport(project, root)
} }
override fun update(e: AnActionEvent) { override fun update(e: AnActionEvent) {
@@ -49,18 +49,22 @@ class GradleScriptNotificationProvider(private val project: Project) :
wasNotImportedAfterCreation -> EditorNotificationPanel().apply { wasNotImportedAfterCreation -> EditorNotificationPanel().apply {
text(KotlinIdeaGradleBundle.message("notification.wasNotImportedAfterCreation.text")) text(KotlinIdeaGradleBundle.message("notification.wasNotImportedAfterCreation.text"))
createActionLabel(getMissingConfigurationActionText()) { createActionLabel(getMissingConfigurationActionText()) {
runPartialGradleImport(project) val root = scriptUnderRoot.nearest
if (root != null) {
runPartialGradleImport(project, root)
}
} }
} }
notEvaluatedInLastImport -> EditorNotificationPanel().apply { notEvaluatedInLastImport -> EditorNotificationPanel().apply {
text(KotlinIdeaGradleBundle.message("notification.notEvaluatedInLastImport.text")) text(KotlinIdeaGradleBundle.message("notification.notEvaluatedInLastImport.text"))
// suggest to reimport project if something changed after import // suggest to reimport project if something changed after import
val importTs = (scriptUnderRoot.nearest as? Imported)?.data?.importTs val root = scriptUnderRoot.nearest as? Imported
if (importTs != null && !scriptUnderRoot.nearest.areRelatedFilesChangedBefore(file, importTs)) { val importTs = root?.data?.importTs
if (root != null && importTs != null && !root.areRelatedFilesChangedBefore(file, importTs)) {
createActionLabel(getMissingConfigurationActionText()) { createActionLabel(getMissingConfigurationActionText()) {
rootsManager.updateStandaloneScripts { rootsManager.updateStandaloneScripts {
runPartialGradleImport(project) runPartialGradleImport(project, root)
} }
} }
} }