Precount 'isPublic' property if descriptor available
This commit is contained in:
+47
-32
@@ -31,52 +31,35 @@ import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
|||||||
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import javax.swing.Icon
|
import javax.swing.Icon
|
||||||
|
import kotlin.properties.ReadWriteProperty
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
class KotlinStructureViewElement(val element: NavigatablePsiElement,
|
class KotlinStructureViewElement(val element: NavigatablePsiElement,
|
||||||
private val isInherited: Boolean = false) : PsiTreeElementBase<NavigatablePsiElement>(element), Queryable {
|
private val isInherited: Boolean = false) : PsiTreeElementBase<NavigatablePsiElement>(element), Queryable {
|
||||||
private var _presentation: KotlinStructureElementPresentation? = null
|
|
||||||
get() {
|
|
||||||
if (field == null) {
|
|
||||||
field = KotlinStructureElementPresentation(isInherited, element, _descriptor)
|
|
||||||
}
|
|
||||||
|
|
||||||
return field
|
private var kotlinPresentation
|
||||||
|
by AssignableLazyProperty {
|
||||||
|
KotlinStructureElementPresentation(isInherited, element, countDescriptor())
|
||||||
}
|
}
|
||||||
|
|
||||||
private val _descriptor: DeclarationDescriptor?
|
var isPublic
|
||||||
get() {
|
by AssignableLazyProperty {
|
||||||
if (!(element.isValid && element is KtDeclaration)) {
|
isPublic(countDescriptor())
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
if (element is KtAnonymousInitializer) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
return runReadAction {
|
|
||||||
if (!DumbService.isDumb(element.getProject())) {
|
|
||||||
return@runReadAction element.resolveToDescriptorIfAny()
|
|
||||||
}
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val isPublic: Boolean
|
|
||||||
get() {
|
|
||||||
return (_descriptor as? DeclarationDescriptorWithVisibility)?.visibility == Visibilities.PUBLIC
|
|
||||||
}
|
}
|
||||||
|
private set
|
||||||
|
|
||||||
constructor(element: NavigatablePsiElement, descriptor: DeclarationDescriptor, isInherited: Boolean) : this(element, isInherited){
|
constructor(element: NavigatablePsiElement, descriptor: DeclarationDescriptor, isInherited: Boolean) : this(element, isInherited){
|
||||||
if (element !is KtElement) {
|
if (element !is KtElement) {
|
||||||
// Avoid storing descriptor in fields
|
// Avoid storing descriptor in fields
|
||||||
_presentation = KotlinStructureElementPresentation(isInherited, element, descriptor)
|
kotlinPresentation = KotlinStructureElementPresentation(isInherited, element, descriptor)
|
||||||
|
isPublic = isPublic(descriptor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getPresentation(): ItemPresentation = _presentation!!
|
override fun getPresentation(): ItemPresentation = kotlinPresentation
|
||||||
override fun getLocationString(): String? = _presentation!!.locationString
|
override fun getLocationString(): String? = kotlinPresentation.locationString
|
||||||
override fun getIcon(open: Boolean): Icon? = _presentation!!.getIcon(open)
|
override fun getIcon(open: Boolean): Icon? = kotlinPresentation.getIcon(open)
|
||||||
override fun getPresentableText(): String? = _presentation!!.presentableText
|
override fun getPresentableText(): String? = kotlinPresentation.presentableText
|
||||||
|
|
||||||
@TestOnly
|
@TestOnly
|
||||||
override fun putInfo(info: MutableMap<String, String?>) {
|
override fun putInfo(info: MutableMap<String, String?>) {
|
||||||
@@ -116,6 +99,38 @@ class KotlinStructureViewElement(val element: NavigatablePsiElement,
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun isPublic(descriptor: DeclarationDescriptor?) =
|
||||||
|
(descriptor as? DeclarationDescriptorWithVisibility)?.visibility == Visibilities.PUBLIC
|
||||||
|
|
||||||
|
private fun countDescriptor(): DeclarationDescriptor? {
|
||||||
|
if (!(element.isValid && element is KtDeclaration)) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element is KtAnonymousInitializer) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return runReadAction {
|
||||||
|
if (!DumbService.isDumb(element.getProject())) {
|
||||||
|
return@runReadAction element.resolveToDescriptorIfAny()
|
||||||
|
}
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AssignableLazyProperty<in R, T : Any>(val init: () -> T) : ReadWriteProperty<R, T> {
|
||||||
|
private var _value: T? = null
|
||||||
|
|
||||||
|
override fun getValue(thisRef: R, property: KProperty<*>): T {
|
||||||
|
return _value ?: init().also { _value = it }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setValue(thisRef: R, property: KProperty<*>, value: T) {
|
||||||
|
_value = value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun KtClassOrObject.getStructureDeclarations() = primaryConstructorParameters.filter { it.hasValOrVar() } + declarations
|
fun KtClassOrObject.getStructureDeclarations() = primaryConstructorParameters.filter { it.hasValOrVar() } + declarations
|
||||||
|
|||||||
Reference in New Issue
Block a user