PY-23295 Fixed: Breadcrumbs are too short by default

Update PyBreadcrumbsInfoProvider:
* update ancestor
* remove AbstractHelper
* remove Helper.accepts
* increase element info max length
This commit is contained in:
Semyon Proshev
2017-08-03 15:23:57 +03:00
parent f995ca7c4f
commit 1def5122ec
14 changed files with 30 additions and 37 deletions
@@ -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<in PyElement>).accepts(e) } as Helper<in PyElement>?
return HELPERS.firstOrNull { it.type.isInstance(e) } as Helper<in PyElement>?
}
private fun currentOffset(e: PsiElement): Int? {
@@ -101,30 +101,23 @@ class PyBreadcrumbsInfoProvider : BreadcrumbsInfoProvider() {
}
private abstract class Helper<T : PyElement>(val type: Class<T>) {
abstract fun accepts(e: T): Boolean
abstract fun elementInfo(e: T): String
abstract fun elementTooltip(e: T): String
}
private abstract class AbstractHelper<T : PyElement>(type: Class<T>) : Helper<T>(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<T : PyElement>(type: Class<T>, val representation: String) : AbstractHelper<T>(type) {
private class SimpleHelper<T : PyElement>(type: Class<T>, val representation: String) : Helper<T>(type) {
override fun getPresentation(e: T) = representation
}
private object LambdaHelper : AbstractHelper<PyLambdaExpression>(PyLambdaExpression::class.java) {
private object LambdaHelper : Helper<PyLambdaExpression>(PyLambdaExpression::class.java) {
override fun getPresentation(e: PyLambdaExpression) = "lambda ${e.parameterList.getPresentableText(false)}"
}
private object ExceptHelper : AbstractHelper<PyExceptPart>(PyExceptPart::class.java) {
private object ExceptHelper : Helper<PyExceptPart>(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>(PyIfPart::class.java) {
private object IfHelper : Helper<PyIfPart>(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>(PyForPart::class.java) {
private object ForHelper : Helper<PyForPart>(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>(PyWhilePart::class.java) {
private object WhileHelper : Helper<PyWhilePart>(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>(PyWithStatement::class.java) {
private object WithHelper : Helper<PyWithStatement>(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>(PyClass::class.java) {
private object ClassHelper : Helper<PyClass>(PyClass::class.java) {
override fun getPresentation(e: PyClass) = e.name ?: "class"
}
private object FunctionHelper : AbstractHelper<PyFunction>(PyFunction::class.java) {
private object FunctionHelper : Helper<PyFunction>(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>(PyKeyValueExpression::class.java) {
private object KeyValueHelper : Helper<PyKeyValueExpression>(PyKeyValueExpression::class.java) {
override fun getPresentation(e: PyKeyValueExpression): String = e.key.text ?: "key"
}
}
@@ -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)
@@ -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
@@ -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")
@@ -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
@@ -3,6 +3,6 @@ async foo()
Tooltip:
async foo()
Crumb:
async with open…
async with open("file.txt")
Tooltip:
async with open("file.txt")
@@ -1,4 +1,4 @@
Crumb:
except KeyError…
except KeyError as e
Tooltip:
except KeyError as e
+1 -1
View File
@@ -1,4 +1,4 @@
Crumb:
for i in range(…
for i in range(10)
Tooltip:
for i in range(10)
@@ -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,…
@@ -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
@@ -1,4 +1,4 @@
Crumb:
with open("file…
with open("file.txt"), open("fi…
Tooltip:
with open("file.txt"), open("file2.txt")
@@ -1,4 +1,4 @@
Crumb:
with open("file…
with open("file.txt") as f
Tooltip:
with open("file.txt") as f
+1 -1
View File
@@ -1,4 +1,4 @@
Crumb:
with open("file…
with open("file.txt")
Tooltip:
with open("file.txt")
@@ -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<PsiElement> elementsFromTopToCaret(@NotNull BreadcrumbsInfoProvider provider) {
private List<PsiElement> elementsFromTopToCaret(@NotNull BreadcrumbsProvider provider) {
final List<PsiElement> 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<PsiElement> elements) {
private static String getBreadcrumbsAndTooltips(@NotNull BreadcrumbsProvider provider, @NotNull List<PsiElement> elements) {
return elements
.stream()
.flatMap(element -> Stream.of("Crumb:", provider.getElementInfo(element), "Tooltip:", provider.getElementTooltip(element)))