diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml
index 15de8406f3e3..41bb6913370d 100644
--- a/java/java-impl/src/META-INF/JavaPlugin.xml
+++ b/java/java-impl/src/META-INF/JavaPlugin.xml
@@ -1062,6 +1062,7 @@
+
diff --git a/java/java-impl/src/com/intellij/ide/bookmark/providers/PackageBookmark.kt b/java/java-impl/src/com/intellij/ide/bookmark/providers/PackageBookmark.kt
new file mode 100644
index 000000000000..2da205af0e9f
--- /dev/null
+++ b/java/java-impl/src/com/intellij/ide/bookmark/providers/PackageBookmark.kt
@@ -0,0 +1,35 @@
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+package com.intellij.ide.bookmark.providers
+
+import com.intellij.ide.bookmark.Bookmark
+import com.intellij.ide.projectView.impl.nodes.PackageElement
+import java.util.Objects
+
+internal class PackageBookmark(override val provider: PackageBookmarkProvider, val element: PackageElement) : Bookmark {
+
+ internal val name
+ get() = element.`package`.qualifiedName
+
+ internal val module
+ get() = element.module?.name
+
+ internal val library
+ get() = element.isLibraryElement
+
+ override val attributes: Map
+ get() = module?.let { mapOf("package" to name, "module" to it, "library" to library.toString()) }
+ ?: mapOf("package" to name, "library" to library.toString())
+
+ override fun createNode() = PackageNode(provider.project, this)
+
+ override fun canNavigate() = element.`package`.canNavigate()
+ override fun canNavigateToSource() = element.`package`.canNavigateToSource()
+ override fun navigate(requestFocus: Boolean) = element.`package`.navigate(requestFocus)
+
+ override fun hashCode() = Objects.hash(provider, element)
+ override fun equals(other: Any?) = other === this || other is PackageBookmark
+ && other.provider == provider
+ && other.element == element
+
+ override fun toString() = "PackageBookmark(package=$name,module=$module,library=$library,provider=$provider)"
+}
diff --git a/java/java-impl/src/com/intellij/ide/bookmark/providers/PackageBookmarkProvider.kt b/java/java-impl/src/com/intellij/ide/bookmark/providers/PackageBookmarkProvider.kt
new file mode 100644
index 000000000000..d687927e7deb
--- /dev/null
+++ b/java/java-impl/src/com/intellij/ide/bookmark/providers/PackageBookmarkProvider.kt
@@ -0,0 +1,47 @@
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+package com.intellij.ide.bookmark.providers
+
+import com.intellij.ide.bookmark.Bookmark
+import com.intellij.ide.bookmark.BookmarkProvider
+import com.intellij.ide.projectView.impl.nodes.PackageElement
+import com.intellij.ide.util.treeView.AbstractTreeNode
+import com.intellij.ide.util.treeView.NodeDescriptor
+import com.intellij.openapi.module.ModuleManager
+import com.intellij.openapi.project.Project
+import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService
+import com.intellij.openapi.util.text.StringUtil
+import com.intellij.psi.JavaPsiFacade
+
+internal class PackageBookmarkProvider(private val project: Project) : BookmarkProvider {
+ override fun getWeight() = 100
+ override fun getProject() = project
+
+ internal val moduleManager
+ get() = if (project.isDisposed) null else ModuleManager.getInstance(project)
+
+ internal val projectSettingsService
+ get() = if (project.isDisposed) null else ProjectSettingsService.getInstance(project)
+
+ override fun compare(bookmark1: Bookmark, bookmark2: Bookmark): Int {
+ bookmark1 as PackageBookmark
+ bookmark2 as PackageBookmark
+ StringUtil.naturalCompare(bookmark1.name, bookmark2.name).let { if (it != 0) return it }
+ StringUtil.naturalCompare(bookmark1.module, bookmark2.module).let { if (it != 0) return it }
+ if (bookmark1.library && !bookmark2.library) return +1
+ if (!bookmark1.library && bookmark2.library) return -1
+ return 0
+ }
+
+ override fun createBookmark(map: MutableMap): PackageBookmark? {
+ val psi = map["package"]?.let { JavaPsiFacade.getInstance(project).findPackage(it) } ?: return null
+ val module = map["module"]?.let { ModuleManager.getInstance(project).findModuleByName(it) }
+ return PackageBookmark(this, PackageElement(module, psi, map["library"].toBoolean()))
+ }
+
+ override fun createBookmark(context: Any?): PackageBookmark? = when (context) {
+ is AbstractTreeNode<*> -> createBookmark(context.value)
+ is NodeDescriptor<*> -> createBookmark(context.element)
+ is PackageElement -> PackageBookmark(this, context)
+ else -> null
+ }
+}
diff --git a/java/java-impl/src/com/intellij/ide/bookmark/providers/PackageNode.kt b/java/java-impl/src/com/intellij/ide/bookmark/providers/PackageNode.kt
new file mode 100644
index 000000000000..72bb6634c53e
--- /dev/null
+++ b/java/java-impl/src/com/intellij/ide/bookmark/providers/PackageNode.kt
@@ -0,0 +1,20 @@
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+package com.intellij.ide.bookmark.providers
+
+import com.intellij.ide.bookmark.ui.tree.BookmarkNode
+import com.intellij.ide.projectView.PresentationData
+import com.intellij.ide.projectView.impl.CompoundIconProvider
+import com.intellij.ide.util.treeView.AbstractTreeNode
+import com.intellij.openapi.project.Project
+
+internal class PackageNode(project: Project, bookmark: PackageBookmark) : BookmarkNode(project, bookmark) {
+
+ override fun getChildren() = emptyList>()
+
+ override fun update(presentation: PresentationData) {
+ presentation.setIcon(wrapIcon(CompoundIconProvider.findIcon(value?.element?.`package`, 0)))
+ presentation.tooltip = bookmarkDescription
+ presentation.presentableText = value?.name
+ presentation.locationString = value?.module
+ }
+}
diff --git a/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiClassFavoriteNodeProvider.java b/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiClassFavoriteNodeProvider.java
index 32008adea14f..29129c8eb8c2 100644
--- a/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiClassFavoriteNodeProvider.java
+++ b/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiClassFavoriteNodeProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ide.favoritesTreeView;
@@ -24,11 +24,12 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.presentation.java.ClassPresentationUtil;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
-public class PsiClassFavoriteNodeProvider extends FavoriteNodeProvider {
+public class PsiClassFavoriteNodeProvider extends FavoriteNodeProvider implements AbstractUrlFavoriteConverter {
@Override
public Collection> getFavoriteNodes(final DataContext context, @NotNull final ViewSettings viewSettings) {
final Project project = CommonDataKeys.PROJECT.getData(context);
@@ -131,7 +132,12 @@ public class PsiClassFavoriteNodeProvider extends FavoriteNodeProvider {
if (DumbService.isDumb(project)) {
return null;
}
+ var context = createBookmarkContext(project, url, moduleName);
+ return context == null ? null : new Object[]{context};
+ }
+ @Override
+ public @Nullable Object createBookmarkContext(@NotNull Project project, @NotNull String url, @Nullable String moduleName) {
GlobalSearchScope scope = null;
if (moduleName != null) {
final Module module = ModuleManager.getInstance(project).findModuleByName(moduleName);
@@ -142,8 +148,6 @@ public class PsiClassFavoriteNodeProvider extends FavoriteNodeProvider {
if (scope == null) {
scope = GlobalSearchScope.allScope(project);
}
- final PsiClass aClass = JavaPsiFacade.getInstance(project).findClass(url, scope);
- if (aClass == null) return null;
- return new Object[]{aClass};
+ return JavaPsiFacade.getInstance(project).findClass(url, scope);
}
}
\ No newline at end of file
diff --git a/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiFieldFavoriteNodeProvider.java b/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiFieldFavoriteNodeProvider.java
index 96931400b4eb..feb9e7c498a2 100644
--- a/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiFieldFavoriteNodeProvider.java
+++ b/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiFieldFavoriteNodeProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ide.favoritesTreeView;
@@ -21,11 +21,12 @@ import com.intellij.psi.PsiField;
import com.intellij.psi.presentation.java.ClassPresentationUtil;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
-public class PsiFieldFavoriteNodeProvider extends FavoriteNodeProvider {
+public class PsiFieldFavoriteNodeProvider extends FavoriteNodeProvider implements AbstractUrlFavoriteConverter {
@Override
public Collection> getFavoriteNodes(final DataContext context, @NotNull final ViewSettings viewSettings) {
final Project project = CommonDataKeys.PROJECT.getData(context);
@@ -113,14 +114,19 @@ public class PsiFieldFavoriteNodeProvider extends FavoriteNodeProvider {
@Override
public Object[] createPathFromUrl(final Project project, final String url, final String moduleName) {
if (DumbService.isDumb(project)) return null;
+ var context = createBookmarkContext(project, url, moduleName);
+ return context == null ? null : new Object[]{context};
+ }
+
+ @Override
+ public @Nullable Object createBookmarkContext(@NotNull Project project, @NotNull String url, @Nullable String moduleName) {
final Module module = moduleName != null ? ModuleManager.getInstance(project).findModuleByName(moduleName) : null;
final GlobalSearchScope scope = module != null ? GlobalSearchScope.moduleScope(module) : GlobalSearchScope.allScope(project);
final String[] paths = url.split(";");
if (paths.length != 2) return null;
final PsiClass aClass = JavaPsiFacade.getInstance(project).findClass(paths[0], scope);
if (aClass == null) return null;
- final PsiField aField = aClass.findFieldByName(paths[1], false);
- return new Object[]{aField};
+ return aClass.findFieldByName(paths[1], false);
}
diff --git a/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiMethodFavoriteNodeProvider.java b/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiMethodFavoriteNodeProvider.java
index f9e3abe8b84d..ff55e32563bf 100644
--- a/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiMethodFavoriteNodeProvider.java
+++ b/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiMethodFavoriteNodeProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ide.favoritesTreeView;
@@ -21,11 +21,12 @@ import com.intellij.psi.PsiMethod;
import com.intellij.psi.presentation.java.ClassPresentationUtil;
import com.intellij.psi.util.PsiFormatUtil;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
-public class PsiMethodFavoriteNodeProvider extends FavoriteNodeProvider {
+public class PsiMethodFavoriteNodeProvider extends FavoriteNodeProvider implements AbstractUrlFavoriteConverter {
@Override
public Collection> getFavoriteNodes(final DataContext context, @NotNull final ViewSettings viewSettings) {
final Project project = CommonDataKeys.PROJECT.getData(context);
@@ -115,8 +116,12 @@ public class PsiMethodFavoriteNodeProvider extends FavoriteNodeProvider {
@Override
public Object[] createPathFromUrl(final Project project, final String url, final String moduleName) {
if (DumbService.isDumb(project)) return null;
- final PsiMethod method = RefMethodImpl.findPsiMethod(PsiManager.getInstance(project), url);
- if (method == null) return null;
- return new Object[]{method};
+ var context = createBookmarkContext(project, url, moduleName);
+ return context == null ? null : new Object[]{context};
+ }
+
+ @Override
+ public @Nullable Object createBookmarkContext(@NotNull Project project, @NotNull String url, @Nullable String moduleName) {
+ return RefMethodImpl.findPsiMethod(PsiManager.getInstance(project), url);
}
}
\ No newline at end of file
diff --git a/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiPackageFavoriteNodeProvider.java b/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiPackageFavoriteNodeProvider.java
index f52b440e0810..4b814608aa9b 100644
--- a/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiPackageFavoriteNodeProvider.java
+++ b/java/java-impl/src/com/intellij/ide/favoritesTreeView/PsiPackageFavoriteNodeProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ide.favoritesTreeView;
@@ -26,13 +26,14 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
-public class PsiPackageFavoriteNodeProvider extends FavoriteNodeProvider {
+public class PsiPackageFavoriteNodeProvider extends FavoriteNodeProvider implements AbstractUrlFavoriteConverter {
@Override
public Collection> getFavoriteNodes(final DataContext context, @NotNull final ViewSettings viewSettings) {
final Project project = CommonDataKeys.PROJECT.getData(context);
@@ -170,12 +171,17 @@ public class PsiPackageFavoriteNodeProvider extends FavoriteNodeProvider {
@Override
public Object[] createPathFromUrl(final Project project, final String url, final String moduleName) {
+ var context = createBookmarkContext(project, url, moduleName);
+ return context == null ? null : new Object[]{context};
+ }
+
+ @Override
+ public @Nullable Object createBookmarkContext(@NotNull Project project, @NotNull String url, @Nullable String moduleName) {
final Module module = moduleName != null ? ModuleManager.getInstance(project).findModuleByName(moduleName) : null;
// module can be null if 'show module' turned off
final PsiPackage aPackage = JavaPsiFacade.getInstance(project).findPackage(url);
if (aPackage == null) return null;
- PackageElement packageElement = new PackageElement(module, aPackage, false);
- return new Object[]{packageElement};
+ return new PackageElement(module, aPackage, false);
}
@Override
diff --git a/platform/lang-impl/src/com/intellij/ide/bookmark/providers/LineBookmarkProvider.kt b/platform/lang-impl/src/com/intellij/ide/bookmark/providers/LineBookmarkProvider.kt
index c5656aef8851..d0f1ab4bafdc 100644
--- a/platform/lang-impl/src/com/intellij/ide/bookmark/providers/LineBookmarkProvider.kt
+++ b/platform/lang-impl/src/com/intellij/ide/bookmark/providers/LineBookmarkProvider.kt
@@ -2,7 +2,6 @@
package com.intellij.ide.bookmark.providers
import com.intellij.ide.bookmark.*
-import com.intellij.ide.favoritesTreeView.AbstractUrlFavoriteAdapter
import com.intellij.ide.projectView.impl.DirectoryUrl
import com.intellij.ide.projectView.impl.PsiFileUrl
import com.intellij.ide.util.treeView.AbstractTreeNode
@@ -15,8 +14,6 @@ import com.intellij.openapi.editor.event.EditorMouseEvent
import com.intellij.openapi.editor.event.EditorMouseEventArea
import com.intellij.openapi.editor.event.EditorMouseListener
import com.intellij.openapi.fileEditor.FileDocumentManager
-import com.intellij.openapi.progress.ProcessCanceledException
-import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.SystemInfo
import com.intellij.openapi.util.TextRange
@@ -61,8 +58,7 @@ class LineBookmarkProvider(private val project: Project) : BookmarkProvider, Edi
is AbstractTreeNode<*> -> createBookmark(context.value)
is NodeDescriptor<*> -> createBookmark(context.element)
// below // migrate old bookmarks and favorites
- is com.intellij.ide.bookmarks.Bookmark -> createBookmark(context.file, context.line) //
- is AbstractUrlFavoriteAdapter -> createBookmark(context)
+ is com.intellij.ide.bookmarks.Bookmark -> createBookmark(context.file, context.line)
is DirectoryUrl -> createBookmark(context.url)
is PsiFileUrl -> createBookmark(context.url)
// above // migrate old bookmarks and favorites
@@ -87,12 +83,6 @@ class LineBookmarkProvider(private val project: Project) : BookmarkProvider, Edi
?.let { VirtualFileManager.getInstance().findFileByUrl(it) }
?.let { createBookmark(it, line) }
- private fun createBookmark(adapter: AbstractUrlFavoriteAdapter) = when {
- !adapter.nodeProvider::class.java.name.startsWith("com.intellij.ide.favoritesTreeView.Psi") -> null
- DumbService.isDumb(project) -> throw ProcessCanceledException() // wait for the end of indexing
- else -> adapter.createPath(project)?.singleOrNull()?.let { createBookmark(it) }
- }
-
private fun createBookmark(element: PsiElement): FileBookmark? {
if (element is PsiFileSystemItem) return element.virtualFile?.let { createBookmark(it) }
if (element is PsiCompiledElement) return null
diff --git a/platform/lang-impl/src/com/intellij/ide/bookmark/providers/ModuleBookmark.kt b/platform/lang-impl/src/com/intellij/ide/bookmark/providers/ModuleBookmark.kt
index d924402ee3d5..7474608ed7a5 100644
--- a/platform/lang-impl/src/com/intellij/ide/bookmark/providers/ModuleBookmark.kt
+++ b/platform/lang-impl/src/com/intellij/ide/bookmark/providers/ModuleBookmark.kt
@@ -2,11 +2,10 @@
package com.intellij.ide.bookmark.providers
import com.intellij.ide.bookmark.Bookmark
-import com.intellij.ide.bookmark.ui.tree.ModuleNode
import org.jetbrains.annotations.Nls
-import java.util.*
+import java.util.Objects
-class ModuleBookmark(override val provider: ModuleBookmarkProvider, val name: @Nls String, val isGroup: Boolean) : Bookmark {
+internal class ModuleBookmark(override val provider: ModuleBookmarkProvider, val name: @Nls String, val isGroup: Boolean) : Bookmark {
override val attributes: Map
get() = when (isGroup) {
diff --git a/platform/lang-impl/src/com/intellij/ide/bookmark/providers/ModuleBookmarkProvider.kt b/platform/lang-impl/src/com/intellij/ide/bookmark/providers/ModuleBookmarkProvider.kt
index ceb525135669..5376f7b37aa5 100644
--- a/platform/lang-impl/src/com/intellij/ide/bookmark/providers/ModuleBookmarkProvider.kt
+++ b/platform/lang-impl/src/com/intellij/ide/bookmark/providers/ModuleBookmarkProvider.kt
@@ -12,8 +12,8 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService
import com.intellij.openapi.util.text.StringUtil
-class ModuleBookmarkProvider(private val project: Project) : BookmarkProvider {
- override fun getWeight() = 10
+internal class ModuleBookmarkProvider(private val project: Project) : BookmarkProvider {
+ override fun getWeight() = 200
override fun getProject() = project
internal val moduleManager
@@ -23,14 +23,11 @@ class ModuleBookmarkProvider(private val project: Project) : BookmarkProvider {
get() = if (project.isDisposed) null else ProjectSettingsService.getInstance(project)
override fun compare(bookmark1: Bookmark, bookmark2: Bookmark): Int {
- val moduleBookmark1 = bookmark1 as? ModuleBookmark
- val moduleBookmark2 = bookmark2 as? ModuleBookmark
- if (moduleBookmark1 == null && moduleBookmark2 == null) return 0
- if (moduleBookmark1 == null) return -1
- if (moduleBookmark2 == null) return 1
- if (moduleBookmark1.isGroup && !moduleBookmark2.isGroup) return -1
- if (!moduleBookmark1.isGroup && moduleBookmark2.isGroup) return 1
- return StringUtil.naturalCompare(moduleBookmark1.name, moduleBookmark2.name)
+ bookmark1 as ModuleBookmark
+ bookmark2 as ModuleBookmark
+ if (bookmark1.isGroup && !bookmark2.isGroup) return -1
+ if (!bookmark1.isGroup && bookmark2.isGroup) return +1
+ return StringUtil.naturalCompare(bookmark1.name, bookmark2.name)
}
override fun createBookmark(map: MutableMap) =
diff --git a/platform/lang-impl/src/com/intellij/ide/bookmark/ui/tree/ModuleNode.kt b/platform/lang-impl/src/com/intellij/ide/bookmark/providers/ModuleNode.kt
similarity index 77%
rename from platform/lang-impl/src/com/intellij/ide/bookmark/ui/tree/ModuleNode.kt
rename to platform/lang-impl/src/com/intellij/ide/bookmark/providers/ModuleNode.kt
index 957aa7bdd846..da3cf025b986 100644
--- a/platform/lang-impl/src/com/intellij/ide/bookmark/ui/tree/ModuleNode.kt
+++ b/platform/lang-impl/src/com/intellij/ide/bookmark/providers/ModuleNode.kt
@@ -1,14 +1,14 @@
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
-package com.intellij.ide.bookmark.ui.tree
+package com.intellij.ide.bookmark.providers
import com.intellij.icons.AllIcons.Nodes
-import com.intellij.ide.bookmark.providers.ModuleBookmark
+import com.intellij.ide.bookmark.ui.tree.BookmarkNode
import com.intellij.ide.projectView.PresentationData
import com.intellij.ide.util.treeView.AbstractTreeNode
import com.intellij.openapi.project.Project
import com.intellij.ui.SimpleTextAttributes
-class ModuleNode(project: Project, bookmark: ModuleBookmark) : BookmarkNode(project, bookmark) {
+internal class ModuleNode(project: Project, bookmark: ModuleBookmark) : BookmarkNode(project, bookmark) {
override fun getChildren() = emptyList>()
diff --git a/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/AbstractUrlBookmarkProvider.kt b/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/AbstractUrlBookmarkProvider.kt
new file mode 100644
index 000000000000..af3a9f82e2b3
--- /dev/null
+++ b/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/AbstractUrlBookmarkProvider.kt
@@ -0,0 +1,20 @@
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+package com.intellij.ide.favoritesTreeView
+
+import com.intellij.ide.bookmark.Bookmark
+import com.intellij.ide.bookmark.BookmarkProvider
+import com.intellij.openapi.project.Project
+
+internal class AbstractUrlBookmarkProvider(private val project: Project) : BookmarkProvider {
+ override fun getWeight() = Int.MAX_VALUE
+ override fun getProject() = project
+
+ override fun compare(bookmark1: Bookmark?, bookmark2: Bookmark?) = 0
+
+ override fun createBookmark(map: Map): Bookmark? = null
+
+ override fun createBookmark(context: Any?) = when (context) {
+ is AbstractUrlFavoriteAdapter -> context.createBookmark(project)
+ else -> null
+ }
+}
diff --git a/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/AbstractUrlFavoriteAdapter.java b/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/AbstractUrlFavoriteAdapter.java
index c84cd1a57c2a..88fbc9963614 100644
--- a/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/AbstractUrlFavoriteAdapter.java
+++ b/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/AbstractUrlFavoriteAdapter.java
@@ -1,13 +1,18 @@
-// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ide.favoritesTreeView;
+import com.intellij.ide.bookmark.Bookmark;
import com.intellij.ide.projectView.impl.AbstractUrl;
+import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
public class AbstractUrlFavoriteAdapter extends AbstractUrl {
+ private static final Logger LOG = Logger.getInstance(AbstractUrlFavoriteAdapter.class);
+
@NotNull
private final FavoriteNodeProvider myNodeProvider;
@@ -21,6 +26,17 @@ public class AbstractUrlFavoriteAdapter extends AbstractUrl {
return myNodeProvider.createPathFromUrl(project, url, moduleName);
}
+ @Nullable Bookmark createBookmark(@NotNull Project project) {
+ if (myNodeProvider instanceof AbstractUrlFavoriteConverter) {
+ var converter = (AbstractUrlFavoriteConverter)myNodeProvider;
+ var bookmark = converter.createBookmark(project, url, moduleName);
+ if (bookmark != null) return bookmark;
+ var id = myNodeProvider.getFavoriteTypeId();
+ LOG.warn("cannot convert favorite: id=" + id + "; module=" + moduleName + "; url: " + url);
+ }
+ return null;
+ }
+
@Override
protected AbstractUrl createUrl(String moduleName, String url) {
return null;
diff --git a/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/AbstractUrlFavoriteConverter.java b/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/AbstractUrlFavoriteConverter.java
new file mode 100644
index 000000000000..32cc68f62e56
--- /dev/null
+++ b/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/AbstractUrlFavoriteConverter.java
@@ -0,0 +1,20 @@
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+package com.intellij.ide.favoritesTreeView;
+
+import com.intellij.ide.bookmark.Bookmark;
+import com.intellij.ide.bookmark.BookmarksManager;
+import com.intellij.openapi.project.Project;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public interface AbstractUrlFavoriteConverter {
+ @Nullable Object createBookmarkContext(@NotNull Project project, @NotNull String url, @Nullable String moduleName);
+
+ default @Nullable Bookmark createBookmark(@NotNull Project project, @NotNull String url, @Nullable String moduleName) {
+ BookmarksManager manager = BookmarksManager.getInstance(project);
+ if (manager == null) return null;
+ Object context = createBookmarkContext(project, url, moduleName);
+ if (context == null) return null;
+ return manager.createBookmark(context);
+ }
+}
diff --git a/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml b/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml
index 298fa9a99b47..eb64466b35a5 100644
--- a/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml
+++ b/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml
@@ -75,6 +75,7 @@
+