IJPL-850 extract intellij.platform.navbar.compatibility.backend module (2/2)

GitOrigin-RevId: a98a521db78189f60906d5c6dc563f8b956c1e49
This commit is contained in:
Daniil Ovchinnikov
2024-03-27 19:28:20 +00:00
committed by intellij-monorepo-bot
parent c5684a12a8
commit 81ec05aefa
20 changed files with 67 additions and 189 deletions
+1
View File
@@ -1012,6 +1012,7 @@
<module fileurl="file://$PROJECT_DIR$/platform/ml-impl/intellij.platform.ml.impl.iml" filepath="$PROJECT_DIR$/platform/ml-impl/intellij.platform.ml.impl.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/navbar/shared/intellij.platform.navbar.iml" filepath="$PROJECT_DIR$/platform/navbar/shared/intellij.platform.navbar.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/navbar/backend/intellij.platform.navbar.backend.iml" filepath="$PROJECT_DIR$/platform/navbar/backend/intellij.platform.navbar.backend.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/navbar.compatibility/backend/intellij.platform.navbar.compatibility.backend.iml" filepath="$PROJECT_DIR$/platform/navbar.compatibility/backend/intellij.platform.navbar.compatibility.backend.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/navbar.compatibility/monolith/intellij.platform.navbar.compatibility.monolith.iml" filepath="$PROJECT_DIR$/platform/navbar.compatibility/monolith/intellij.platform.navbar.compatibility.monolith.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/navbar.compatibility/testFramework/intellij.platform.navbar.compatibility.testFramework.iml" filepath="$PROJECT_DIR$/platform/navbar.compatibility/testFramework/intellij.platform.navbar.compatibility.testFramework.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/navbar/ide/intellij.platform.navbar.ide.iml" filepath="$PROJECT_DIR$/platform/navbar/ide/intellij.platform.navbar.ide.iml" />
@@ -1,29 +1,8 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.actions
import com.intellij.ide.impl.dataRules.GetDataRule
import com.intellij.ide.navbar.ide.IdeNavBarVmItem
import com.intellij.ide.navbar.impl.DefaultNavBarItem
import com.intellij.ide.navbar.impl.ModuleNavBarItem
import com.intellij.ide.navbar.impl.PsiNavBarItem
import com.intellij.ide.navigationToolbar.NavBarModelExtension
import com.intellij.ide.projectView.impl.ProjectRootsUtil
import com.intellij.ide.util.DeleteHandler.DefaultDeleteProvider
import com.intellij.model.Pointer
import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ui.configuration.actions.ModuleDeleteProvider
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.navbar.NavBarVmItem
import com.intellij.platform.navbar.backend.NavBarItem
import com.intellij.pom.Navigatable
import com.intellij.psi.PsiDirectory
import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiUtilCore
import com.intellij.util.containers.toArray
import org.jetbrains.annotations.VisibleForTesting
import com.intellij.openapi.actionSystem.DataProvider
/**
* Fast extension data without selection (allows to override cut/copy/paste providers)
@@ -36,122 +15,10 @@ internal fun extensionData(dataId: String): Any? {
private val emptyDataProvider = DataProvider { null }
private fun extensionData(dataId: String, provider: DataProvider): Any? {
fun extensionData(dataId: String, provider: DataProvider): Any? {
for (modelExtension in NavBarModelExtension.EP_NAME.extensionList) {
val data = modelExtension.getData(dataId, provider)
if (data != null) return data
}
return provider.getData(dataId)
}
internal class BgtDataRule : GetDataRule {
override fun getData(dataProvider: DataProvider): Any? {
val project = CommonDataKeys.PROJECT.getData(dataProvider)
?: return null
val selection = NavBarVmItem.SELECTED_ITEMS.getData(dataProvider)
?: return null
val pointers = selection.map {
(it as IdeNavBarVmItem).pointer
}
return DataProvider {
getBgData(project, pointers, it)
}
}
}
@VisibleForTesting
fun getBgData(project: Project, selection: List<Pointer<out NavBarItem>>, dataId: String): Any? {
val selectedItems = lazy(LazyThreadSafetyMode.NONE) {
ApplicationManager.getApplication().assertReadAccessAllowed()
selection.mapNotNull {
it.dereference()
}
}
if (LangDataKeys.IDE_VIEW.`is`(dataId)) {
return NavBarIdeView(selectedItems)
}
val provider = DataProvider {
getBgData(project, selectedItems, it)
}
return extensionData(dataId, provider)
}
private fun getBgData(project: Project, selectedItems: Lazy<List<NavBarItem>>, dataId: String): Any? = when (dataId) {
CommonDataKeys.PROJECT.name -> {
project
}
PlatformCoreDataKeys.MODULE.name -> {
selectedItems.value
.firstNotNullOfOrNull {
(it as? ModuleNavBarItem)?.data
}
?: selectedItems.value
.firstNotNullOfOrNull {
(it as? PsiNavBarItem)?.data?.let { psi ->
ModuleUtilCore.findModuleForPsiElement(psi)
}
}
}
LangDataKeys.MODULE_CONTEXT.name -> {
val dir = selectedItems.value
.firstNotNullOfOrNull {
(it as? PsiNavBarItem)?.data as? PsiDirectory
}
if (dir != null && ProjectRootsUtil.isModuleContentRoot(dir.virtualFile, project)) {
ModuleUtilCore.findModuleForPsiElement(dir)
}
else {
null
}
}
CommonDataKeys.PSI_ELEMENT.name -> {
selectedItems.value
.firstNotNullOfOrNull {
(it as? PsiNavBarItem)?.data
}
}
PlatformCoreDataKeys.PSI_ELEMENT_ARRAY.name -> {
selectedItems.value
.mapNotNull {
(it as? PsiNavBarItem)?.data
}
.ifEmpty { null }
?.toArray(PsiElement.EMPTY_ARRAY)
}
CommonDataKeys.VIRTUAL_FILE_ARRAY.name -> {
selectedItems.value
.mapNotNull {
(it as? PsiNavBarItem)?.data?.let { psi ->
PsiUtilCore.getVirtualFile(psi)
}
}
.toSet()
.ifEmpty { null }
?.toArray(VirtualFile.EMPTY_ARRAY)
}
CommonDataKeys.NAVIGATABLE_ARRAY.name -> {
selectedItems.value
.mapNotNull {
(it as? DefaultNavBarItem<*>)?.data as? Navigatable
}
.ifEmpty { null }
?.toArray(Navigatable.EMPTY_NAVIGATABLE_ARRAY)
}
PlatformDataKeys.DELETE_ELEMENT_PROVIDER.name -> {
val hasModule = selectedItems.value.firstNotNullOfOrNull {
(it as? ModuleNavBarItem)?.data
} != null
if (hasModule) {
ModuleDeleteProvider.getInstance()
}
else {
DefaultDeleteProvider()
}
}
PlatformDataKeys.SELECTED_ITEM.name -> selectedItems.value.firstOrNull()
PlatformDataKeys.SELECTED_ITEMS.name -> selectedItems.value.toTypedArray()
else -> {
null
}
}
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" packagePrefix="com.intellij.platform.navbar.compatibility.backend" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="jetbrains-annotations" level="project" />
<orderEntry type="module" module-name="intellij.platform.core" />
<orderEntry type="module" module-name="intellij.platform.editor" />
<orderEntry type="module" module-name="intellij.platform.analysis" />
<orderEntry type="module" module-name="intellij.platform.ide" />
<orderEntry type="module" module-name="intellij.platform.core.ui" />
<orderEntry type="module" module-name="intellij.platform.util.ui" />
<orderEntry type="module" module-name="intellij.platform.lang.impl" />
<orderEntry type="module" module-name="intellij.platform.navbar.backend" />
</component>
</module>
@@ -0,0 +1,13 @@
<idea-plugin package="com.intellij.platform.navbar.compatibility.backend">
<!--<dependencies>-->
<!-- <module name="intellij.platform.navbar.backend"/>-->
<!--</dependencies>-->
<extensions defaultExtensionNs="com.intellij">
<getDataRule key="navigationBarItem" type="context" order="last"
implementationClass="com.intellij.platform.navbar.compatibility.backend.DefaultNavBarItemDataRule"/>
<getDataRule key="bgtDataProvider" type="provider"
implementationClass="com.intellij.platform.navbar.compatibility.backend.BgtDataRule"/>
<navbar.item.provider order="last"
implementation="com.intellij.platform.navbar.compatibility.backend.DefaultNavBarItemProvider"/>
</extensions>
</idea-plugin>
@@ -1,12 +1,8 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.actions
package com.intellij.platform.navbar.compatibility.backend
import com.intellij.ide.impl.dataRules.GetDataRule
import com.intellij.ide.navbar.ide.IdeNavBarVmItem
import com.intellij.ide.navbar.impl.DefaultNavBarItem
import com.intellij.ide.navbar.impl.ModuleNavBarItem
import com.intellij.ide.navbar.impl.PsiNavBarItem
import com.intellij.ide.navigationToolbar.NavBarModelExtension
import com.intellij.ide.navbar.actions.extensionData
import com.intellij.ide.projectView.impl.ProjectRootsUtil
import com.intellij.ide.util.DeleteHandler.DefaultDeleteProvider
import com.intellij.model.Pointer
@@ -25,25 +21,6 @@ import com.intellij.psi.util.PsiUtilCore
import com.intellij.util.containers.toArray
import org.jetbrains.annotations.VisibleForTesting
/**
* Fast extension data without selection (allows to override cut/copy/paste providers)
*
* TODO consider a new extension for that OR new API for cut/copy/paste
*/
internal fun extensionData(dataId: String): Any? {
return extensionData(dataId, emptyDataProvider)
}
private val emptyDataProvider = DataProvider { null }
private fun extensionData(dataId: String, provider: DataProvider): Any? {
for (modelExtension in NavBarModelExtension.EP_NAME.extensionList) {
val data = modelExtension.getData(dataId, provider)
if (data != null) return data
}
return provider.getData(dataId)
}
internal class BgtDataRule : GetDataRule {
override fun getData(dataProvider: DataProvider): Any? {
@@ -1,5 +1,5 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.impl
package com.intellij.platform.navbar.compatibility.backend
import com.intellij.icons.AllIcons
import com.intellij.ide.navigationToolbar.NavBarModelExtension
@@ -1,8 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.actions
package com.intellij.platform.navbar.compatibility.backend
import com.intellij.ide.impl.dataRules.GetDataRule
import com.intellij.ide.navbar.impl.*
import com.intellij.openapi.actionSystem.CommonDataKeys.*
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.actionSystem.DataProvider
@@ -1,5 +1,5 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.impl
package com.intellij.platform.navbar.compatibility.backend
import com.intellij.diagnostic.PluginException
import com.intellij.ide.navigationToolbar.NavBarModelExtension
@@ -26,7 +26,7 @@ import org.jetbrains.annotations.VisibleForTesting
*
* @see com.intellij.ide.navigationToolbar.NavBarModelExtension
*/
class DefaultNavBarItemProvider : NavBarItemProvider {
internal class DefaultNavBarItemProvider : NavBarItemProvider {
@RequiresReadLock
@RequiresBackgroundThread
@@ -1,7 +1,6 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.ide
package com.intellij.platform.navbar.compatibility.backend
import com.intellij.ide.navbar.impl.isModuleContentRoot
import com.intellij.model.Pointer
import com.intellij.openapi.application.readAction
import com.intellij.platform.navbar.NavBarItemPresentation
@@ -1,8 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.actions
package com.intellij.platform.navbar.compatibility.backend
import com.intellij.ide.IdeView
import com.intellij.ide.navbar.impl.psiDirectories
import com.intellij.ide.util.DirectoryChooserUtil
import com.intellij.platform.navbar.backend.NavBarItem
import com.intellij.pom.Navigatable
@@ -1,5 +1,5 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.ide
package com.intellij.platform.navbar.compatibility.backend
import com.intellij.ide.ui.VirtualFileAppearanceListener
import com.intellij.openapi.project.Project
@@ -1,5 +1,5 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.impl
package com.intellij.platform.navbar.compatibility.backend
import com.intellij.ide.projectView.impl.ProjectRootsUtil
import com.intellij.openapi.application.ApplicationManager
@@ -0,0 +1,5 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
@Internal
package com.intellij.platform.navbar.compatibility.backend;
import org.jetbrains.annotations.ApiStatus.Internal;
@@ -14,5 +14,6 @@
<orderEntry type="module" module-name="intellij.platform.lang.impl" />
<orderEntry type="module" module-name="intellij.platform.navbar.backend" />
<orderEntry type="module" module-name="intellij.platform.navbar.ide" />
<orderEntry type="module" module-name="intellij.platform.navbar.compatibility.backend" />
</component>
</module>
@@ -1,4 +1,7 @@
<idea-plugin package="com.intellij.platform.navbar.compatibility.monolith">
<dependencies>
<module name="intellij.platform.navbar.compatibility.backend"/>
</dependencies>
<extensions defaultExtensionNs="com.intellij">
<!--suppress PluginXmlValidity -->
<projectService serviceInterface="com.intellij.platform.navbar.ide.NavBarServiceDelegate"
@@ -2,10 +2,6 @@
package com.intellij.platform.navbar.compatibility.monolith
import com.intellij.codeInsight.navigation.actions.navigateRequest
import com.intellij.ide.navbar.ide.IdeNavBarVmItem
import com.intellij.ide.navbar.ide.fireOnFileChanges
import com.intellij.ide.navbar.ide.toVmItems
import com.intellij.ide.navbar.impl.ProjectNavBarItem
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.readAction
@@ -13,6 +9,10 @@ import com.intellij.openapi.project.Project
import com.intellij.platform.navbar.NavBarVmItem
import com.intellij.platform.navbar.backend.NavBarItem
import com.intellij.platform.navbar.backend.impl.pathToItem
import com.intellij.platform.navbar.compatibility.backend.IdeNavBarVmItem
import com.intellij.platform.navbar.compatibility.backend.ProjectNavBarItem
import com.intellij.platform.navbar.compatibility.backend.fireOnFileChanges
import com.intellij.platform.navbar.compatibility.backend.toVmItems
import com.intellij.platform.navbar.ide.NavBarServiceDelegate
import com.intellij.platform.navbar.ide.fireOnIdeActivity
import kotlinx.coroutines.Dispatchers
@@ -10,7 +10,8 @@
<orderEntry type="library" name="kotlin-stdlib" level="project" />
<orderEntry type="module" module-name="intellij.platform.core.ui" />
<orderEntry type="module" module-name="intellij.platform.lang.impl" />
<orderEntry type="module" module-name="intellij.platform.navbar.backend" exported="" />
<orderEntry type="module" module-name="intellij.platform.navbar.ide" exported="" />
<orderEntry type="module" module-name="intellij.platform.navbar.backend" />
<orderEntry type="module" module-name="intellij.platform.navbar.ide" />
<orderEntry type="module" module-name="intellij.platform.navbar.compatibility.backend" />
</component>
</module>
@@ -1,9 +1,6 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.navbar.compatibility.testFramework
import com.intellij.ide.navbar.actions.getBgData
import com.intellij.ide.navbar.impl.DefaultNavBarItem
import com.intellij.ide.navbar.impl.compatibilityNavBarItem
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.actionSystem.DataKey
import com.intellij.openapi.project.Project
@@ -11,6 +8,9 @@ import com.intellij.platform.navbar.NavBarItemPresentation
import com.intellij.platform.navbar.backend.NavBarItem
import com.intellij.platform.navbar.backend.impl.children
import com.intellij.platform.navbar.backend.impl.pathToItem
import com.intellij.platform.navbar.compatibility.backend.DefaultNavBarItem
import com.intellij.platform.navbar.compatibility.backend.compatibilityNavBarItem
import com.intellij.platform.navbar.compatibility.backend.getBgData
import com.intellij.platform.navbar.ide.contextModel
import com.intellij.util.concurrency.annotations.RequiresReadLock
import org.jetbrains.annotations.ApiStatus.Internal
@@ -697,18 +697,9 @@
<applicationService serviceInterface="com.intellij.modcommand.ModCommandExecutor"
serviceImplementation="com.intellij.lang.impl.modcommand.ModCommandExecutorImpl" overrides="true"/>
<navbar.item.provider implementation="com.intellij.ide.navbar.impl.DefaultNavBarItemProvider" order="last"/>
<getDataRule key="navigationBarItem"
implementationClass="com.intellij.ide.navbar.actions.DefaultNavBarItemDataRule"
type="context"
order="last"/>
<getDataRule key="cutProvider" type="fast" implementationClass="com.intellij.ide.navbar.ide.CutProviderDataRule"/>
<getDataRule key="copyProvider" type="fast" implementationClass="com.intellij.ide.navbar.ide.CopyProviderDataRule"/>
<getDataRule key="pasteProvider" type="fast" implementationClass="com.intellij.ide.navbar.ide.PasteProviderDataRule"/>
<getDataRule key="bgtDataProvider"
implementationClass="com.intellij.ide.navbar.actions.BgtDataRule"
type="provider"/>
<statistician key="completion" implementationClass="com.intellij.codeInsight.completion.DefaultCompletionStatistician" order="last"/>
@@ -9,6 +9,7 @@
<!-- should be here, otherwise not loaded in tests (in unit test mode, the platform prefix is `PlatformLangXml) -->
<content>
<module name="intellij.platform.navbar.compatibility.backend"/>
<module name="intellij.platform.navbar.compatibility.monolith"/>
<module name="intellij.platform.settings.local"/>
</content>