diff --git a/python/src/com/jetbrains/python/breadcrumbs/PyBreadcrumbsInfoProvider.kt b/python/src/com/jetbrains/python/breadcrumbs/PyBreadcrumbsInfoProvider.kt index e76ddd51f721..9822bd66613c 100644 --- a/python/src/com/jetbrains/python/breadcrumbs/PyBreadcrumbsInfoProvider.kt +++ b/python/src/com/jetbrains/python/breadcrumbs/PyBreadcrumbsInfoProvider.kt @@ -23,12 +23,12 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.impl.source.tree.LeafElement import com.intellij.psi.util.PsiTreeUtil -import com.intellij.xml.breadcrumbs.BreadcrumbsInfoProvider +import com.intellij.ui.breadcrumbs.BreadcrumbsProvider import com.jetbrains.python.PyTokenTypes import com.jetbrains.python.PythonLanguage import com.jetbrains.python.psi.* -class PyBreadcrumbsInfoProvider : BreadcrumbsInfoProvider() { +class PyBreadcrumbsInfoProvider : BreadcrumbsProvider { companion object { private val LANGUAGES = arrayOf(PythonLanguage.getInstance()) @@ -74,7 +74,7 @@ class PyBreadcrumbsInfoProvider : BreadcrumbsInfoProvider() { if (e !is PyElement) return null @Suppress("UNCHECKED_CAST") - return HELPERS.firstOrNull { it.type.isInstance(e) && (it as Helper).accepts(e) } as Helper? + return HELPERS.firstOrNull { it.type.isInstance(e) } as Helper? } private fun currentOffset(e: PsiElement): Int? { @@ -101,30 +101,23 @@ class PyBreadcrumbsInfoProvider : BreadcrumbsInfoProvider() { } private abstract class Helper(val type: Class) { - abstract fun accepts(e: T): Boolean - abstract fun elementInfo(e: T): String - abstract fun elementTooltip(e: T): String - } - - private abstract class AbstractHelper(type: Class) : Helper(type) { - override fun accepts(e: T): Boolean = true - override fun elementInfo(e: T): String = getTruncatedPresentation(e, 16) - override fun elementTooltip(e: T): String = getTruncatedPresentation(e, 96) + fun elementInfo(e: T): String = getTruncatedPresentation(e, 32) + fun elementTooltip(e: T): String = getTruncatedPresentation(e, 96) abstract fun getPresentation(e: T): String private fun getTruncatedPresentation(e: T, maxLength: Int) = StringUtil.shortenTextWithEllipsis(getPresentation(e), maxLength, 0, true) } - private class SimpleHelper(type: Class, val representation: String) : AbstractHelper(type) { + private class SimpleHelper(type: Class, val representation: String) : Helper(type) { override fun getPresentation(e: T) = representation } - private object LambdaHelper : AbstractHelper(PyLambdaExpression::class.java) { + private object LambdaHelper : Helper(PyLambdaExpression::class.java) { override fun getPresentation(e: PyLambdaExpression) = "lambda ${e.parameterList.getPresentableText(false)}" } - private object ExceptHelper : AbstractHelper(PyExceptPart::class.java) { + private object ExceptHelper : Helper(PyExceptPart::class.java) { override fun getPresentation(e: PyExceptPart): String { val exceptClass = e.exceptClass ?: return "except" val target = e.target ?: return "except ${exceptClass.text}" @@ -133,7 +126,7 @@ class PyBreadcrumbsInfoProvider : BreadcrumbsInfoProvider() { } } - private object IfHelper : AbstractHelper(PyIfPart::class.java) { + private object IfHelper : Helper(PyIfPart::class.java) { override fun getPresentation(e: PyIfPart): String { val prefix = if (e.isElif) "elif" else "if" val condition = e.condition ?: return prefix @@ -142,7 +135,7 @@ class PyBreadcrumbsInfoProvider : BreadcrumbsInfoProvider() { } } - private object ForHelper : AbstractHelper(PyForPart::class.java) { + private object ForHelper : Helper(PyForPart::class.java) { override fun getPresentation(e: PyForPart): String { val parent = e.parent val prefix = if (parent is PyForStatement && parent.isAsync) "async for" else "for" @@ -154,7 +147,7 @@ class PyBreadcrumbsInfoProvider : BreadcrumbsInfoProvider() { } } - private object WhileHelper : AbstractHelper(PyWhilePart::class.java) { + private object WhileHelper : Helper(PyWhilePart::class.java) { override fun getPresentation(e: PyWhilePart): String { val condition = e.condition ?: return "while" @@ -162,7 +155,7 @@ class PyBreadcrumbsInfoProvider : BreadcrumbsInfoProvider() { } } - private object WithHelper : AbstractHelper(PyWithStatement::class.java) { + private object WithHelper : Helper(PyWithStatement::class.java) { override fun getPresentation(e: PyWithStatement): String { val getItemPresentation = fun(item: PyWithItem): String? { val expression = item.expression ?: return null @@ -181,11 +174,11 @@ class PyBreadcrumbsInfoProvider : BreadcrumbsInfoProvider() { } } - private object ClassHelper : AbstractHelper(PyClass::class.java) { + private object ClassHelper : Helper(PyClass::class.java) { override fun getPresentation(e: PyClass) = e.name ?: "class" } - private object FunctionHelper : AbstractHelper(PyFunction::class.java) { + private object FunctionHelper : Helper(PyFunction::class.java) { override fun getPresentation(e: PyFunction): String { val prefix = if (e.isAsync) "async " else "" val name = e.name ?: return "function" @@ -194,7 +187,7 @@ class PyBreadcrumbsInfoProvider : BreadcrumbsInfoProvider() { } } - private object KeyValueHelper : AbstractHelper(PyKeyValueExpression::class.java) { + private object KeyValueHelper : Helper(PyKeyValueExpression::class.java) { override fun getPresentation(e: PyKeyValueExpression): String = e.key.text ?: "key" } } diff --git a/python/testData/breadcrumbs/asyncFor_crumbs.txt b/python/testData/breadcrumbs/asyncFor_crumbs.txt index 3793270b94fd..fdc2238586c6 100644 --- a/python/testData/breadcrumbs/asyncFor_crumbs.txt +++ b/python/testData/breadcrumbs/asyncFor_crumbs.txt @@ -3,6 +3,6 @@ async foo() Tooltip: async foo() Crumb: -async for i in … +async for i in range(10) Tooltip: async for i in range(10) \ No newline at end of file diff --git a/python/testData/breadcrumbs/asyncSeveralWithAs_crumbs.txt b/python/testData/breadcrumbs/asyncSeveralWithAs_crumbs.txt index 7d2f7603ca92..3174f980107c 100644 --- a/python/testData/breadcrumbs/asyncSeveralWithAs_crumbs.txt +++ b/python/testData/breadcrumbs/asyncSeveralWithAs_crumbs.txt @@ -3,6 +3,6 @@ async foo() Tooltip: async foo() Crumb: -async with open… +async with open("file.txt") as … Tooltip: async with open("file.txt") as f, open("file2.txt") as f2 \ No newline at end of file diff --git a/python/testData/breadcrumbs/asyncSeveralWith_crumbs.txt b/python/testData/breadcrumbs/asyncSeveralWith_crumbs.txt index d8056429af39..d2579240ad88 100644 --- a/python/testData/breadcrumbs/asyncSeveralWith_crumbs.txt +++ b/python/testData/breadcrumbs/asyncSeveralWith_crumbs.txt @@ -3,6 +3,6 @@ async foo() Tooltip: async foo() Crumb: -async with open… +async with open("file.txt"), op… Tooltip: async with open("file.txt"), open("file2.txt") \ No newline at end of file diff --git a/python/testData/breadcrumbs/asyncWithAs_crumbs.txt b/python/testData/breadcrumbs/asyncWithAs_crumbs.txt index c896acf30ab6..9207ec77b8bd 100644 --- a/python/testData/breadcrumbs/asyncWithAs_crumbs.txt +++ b/python/testData/breadcrumbs/asyncWithAs_crumbs.txt @@ -3,6 +3,6 @@ async foo() Tooltip: async foo() Crumb: -async with open… +async with open("file.txt") as f Tooltip: async with open("file.txt") as f \ No newline at end of file diff --git a/python/testData/breadcrumbs/asyncWith_crumbs.txt b/python/testData/breadcrumbs/asyncWith_crumbs.txt index 302b39b58b00..f7ced479865c 100644 --- a/python/testData/breadcrumbs/asyncWith_crumbs.txt +++ b/python/testData/breadcrumbs/asyncWith_crumbs.txt @@ -3,6 +3,6 @@ async foo() Tooltip: async foo() Crumb: -async with open… +async with open("file.txt") Tooltip: async with open("file.txt") \ No newline at end of file diff --git a/python/testData/breadcrumbs/exceptAs_crumbs.txt b/python/testData/breadcrumbs/exceptAs_crumbs.txt index d8e4cdf88ec1..84fc4a324231 100644 --- a/python/testData/breadcrumbs/exceptAs_crumbs.txt +++ b/python/testData/breadcrumbs/exceptAs_crumbs.txt @@ -1,4 +1,4 @@ Crumb: -except KeyError… +except KeyError as e Tooltip: except KeyError as e \ No newline at end of file diff --git a/python/testData/breadcrumbs/for_crumbs.txt b/python/testData/breadcrumbs/for_crumbs.txt index bdd11a58c458..ee3f89d76426 100644 --- a/python/testData/breadcrumbs/for_crumbs.txt +++ b/python/testData/breadcrumbs/for_crumbs.txt @@ -1,4 +1,4 @@ Crumb: -for i in range(… +for i in range(10) Tooltip: for i in range(10) \ No newline at end of file diff --git a/python/testData/breadcrumbs/largeLambda_crumbs.txt b/python/testData/breadcrumbs/largeLambda_crumbs.txt index 9d919548e8d3..04f9a6341808 100644 --- a/python/testData/breadcrumbs/largeLambda_crumbs.txt +++ b/python/testData/breadcrumbs/largeLambda_crumbs.txt @@ -1,4 +1,4 @@ Crumb: -lambda (a, aa, … +lambda (a, aa, aaa, aaaa, aaaaa… Tooltip: lambda (a, aa, aaa, aaaa, aaaaa, aaaaaa, aaaaaaa, aaaaaaaa, aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa,… \ No newline at end of file diff --git a/python/testData/breadcrumbs/severalWithAs_crumbs.txt b/python/testData/breadcrumbs/severalWithAs_crumbs.txt index 7429e98fafec..004a9c86e5ac 100644 --- a/python/testData/breadcrumbs/severalWithAs_crumbs.txt +++ b/python/testData/breadcrumbs/severalWithAs_crumbs.txt @@ -1,4 +1,4 @@ Crumb: -with open("file… +with open("file.txt") as f, ope… Tooltip: with open("file.txt") as f, open("file2.txt") as f2 \ No newline at end of file diff --git a/python/testData/breadcrumbs/severalWith_crumbs.txt b/python/testData/breadcrumbs/severalWith_crumbs.txt index e590e41e808f..652cc355035c 100644 --- a/python/testData/breadcrumbs/severalWith_crumbs.txt +++ b/python/testData/breadcrumbs/severalWith_crumbs.txt @@ -1,4 +1,4 @@ Crumb: -with open("file… +with open("file.txt"), open("fi… Tooltip: with open("file.txt"), open("file2.txt") \ No newline at end of file diff --git a/python/testData/breadcrumbs/withAs_crumbs.txt b/python/testData/breadcrumbs/withAs_crumbs.txt index ef64791b33fd..4c96f4cd14fb 100644 --- a/python/testData/breadcrumbs/withAs_crumbs.txt +++ b/python/testData/breadcrumbs/withAs_crumbs.txt @@ -1,4 +1,4 @@ Crumb: -with open("file… +with open("file.txt") as f Tooltip: with open("file.txt") as f \ No newline at end of file diff --git a/python/testData/breadcrumbs/with_crumbs.txt b/python/testData/breadcrumbs/with_crumbs.txt index f5bc80910d6a..8aa91c6aed85 100644 --- a/python/testData/breadcrumbs/with_crumbs.txt +++ b/python/testData/breadcrumbs/with_crumbs.txt @@ -1,4 +1,4 @@ Crumb: -with open("file… +with open("file.txt") Tooltip: with open("file.txt") \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/breadcrumbs/PyBreadcrumbsTest.java b/python/testSrc/com/jetbrains/python/breadcrumbs/PyBreadcrumbsTest.java index ad6f0d6becf5..60da8fd8d1d0 100644 --- a/python/testSrc/com/jetbrains/python/breadcrumbs/PyBreadcrumbsTest.java +++ b/python/testSrc/com/jetbrains/python/breadcrumbs/PyBreadcrumbsTest.java @@ -17,7 +17,7 @@ package com.jetbrains.python.breadcrumbs; import com.google.common.collect.Lists; import com.intellij.psi.PsiElement; -import com.intellij.xml.breadcrumbs.BreadcrumbsInfoProvider; +import com.intellij.ui.breadcrumbs.BreadcrumbsProvider; import com.jetbrains.python.fixtures.PyTestCase; import com.jetbrains.python.psi.LanguageLevel; import one.util.streamex.StreamEx; @@ -203,7 +203,7 @@ public class PyBreadcrumbsTest extends PyTestCase { } @NotNull - private List elementsFromTopToCaret(@NotNull BreadcrumbsInfoProvider provider) { + private List elementsFromTopToCaret(@NotNull BreadcrumbsProvider provider) { final List fromElementToNullExcluded = StreamEx .iterate(myFixture.getFile().findElementAt(myFixture.getCaretOffset()), provider::getParent) .takeWhile(Objects::nonNull) @@ -214,7 +214,7 @@ public class PyBreadcrumbsTest extends PyTestCase { } @NotNull - private static String getBreadcrumbsAndTooltips(@NotNull BreadcrumbsInfoProvider provider, @NotNull List elements) { + private static String getBreadcrumbsAndTooltips(@NotNull BreadcrumbsProvider provider, @NotNull List elements) { return elements .stream() .flatMap(element -> Stream.of("Crumb:", provider.getElementInfo(element), "Tooltip:", provider.getElementTooltip(element)))