Structure view: add visibility sorter

#KT-36444 Fixed
This commit is contained in:
Toshiaki Kameyama
2020-05-04 19:00:00 +09:00
committed by Yan Zhulanow
parent 9aaba8c759
commit 498c40548b
2 changed files with 32 additions and 8 deletions
@@ -44,9 +44,9 @@ class KotlinStructureViewElement(
KotlinStructureElementPresentation(isInherited, element, countDescriptor())
}
var isPublic
var visibility
by AssignableLazyProperty {
isPublic(countDescriptor())
Visibility(countDescriptor())
}
private set
@@ -54,7 +54,7 @@ class KotlinStructureViewElement(
if (element !is KtElement) {
// Avoid storing descriptor in fields
kotlinPresentation = KotlinStructureElementPresentation(isInherited, element, descriptor)
isPublic = isPublic(descriptor)
visibility = Visibility(descriptor)
}
}
@@ -103,9 +103,6 @@ class KotlinStructureViewElement(
return result
}
private fun isPublic(descriptor: DeclarationDescriptor?) =
(descriptor as? DeclarationDescriptorWithVisibility)?.visibility == Visibilities.PUBLIC
private fun countDescriptor(): DeclarationDescriptor? {
val element = element
return when {
@@ -120,6 +117,22 @@ class KotlinStructureViewElement(
}
}
}
class Visibility(descriptor: DeclarationDescriptor?) {
private val visibility = (descriptor as? DeclarationDescriptorWithVisibility)?.visibility
val isPublic: Boolean
get() = visibility == Visibilities.PUBLIC
val accessLevel: Int?
get() = when {
visibility == Visibilities.PUBLIC -> 1
visibility == Visibilities.INTERNAL -> 2
visibility == Visibilities.PROTECTED -> 3
visibility?.let { Visibilities.isPrivate(it) } == true -> 4
else -> null
}
}
}
private class AssignableLazyProperty<in R, T : Any>(val init: () -> T) : ReadWriteProperty<R, T> {
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.structureView
import com.intellij.ide.structureView.StructureViewModel
import com.intellij.ide.structureView.StructureViewModelBase
import com.intellij.ide.structureView.StructureViewTreeElement
import com.intellij.ide.structureView.impl.java.VisibilitySorter
import com.intellij.ide.util.treeView.smartTree.*
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiElement
@@ -22,7 +23,7 @@ class KotlinStructureViewModel(ktFile: KtFile, editor: Editor?) :
StructureViewModel.ElementInfoProvider {
init {
withSorters(Sorter.ALPHA_SORTER)
withSorters(KotlinVisibilitySorter, Sorter.ALPHA_SORTER)
}
override fun isSuitable(element: PsiElement?): Boolean = element is KtDeclaration &&
@@ -51,9 +52,19 @@ class KotlinStructureViewModel(ktFile: KtFile, editor: Editor?) :
}
}
object KotlinVisibilitySorter : VisibilitySorter() {
override fun getComparator() = Comparator<Any> { a1, a2 -> a1.accessLevel() - a2.accessLevel() }
private fun Any.accessLevel() = (this as? KotlinStructureViewElement)?.visibility?.accessLevel ?: Int.MAX_VALUE
override fun getName() = ID
const val ID = "KOTLIN_VISIBILITY_SORTER"
}
object PublicElementsFilter : Filter {
override fun isVisible(treeNode: TreeElement): Boolean {
return (treeNode as? KotlinStructureViewElement)?.isPublic ?: true
return (treeNode as? KotlinStructureViewElement)?.visibility?.isPublic ?: true
}
override fun getPresentation(): ActionPresentation {