Post-conversion code cleanup.
This commit is contained in:
@@ -39,41 +39,39 @@ import org.jetbrains.kotlin.lexer.JetTokens
|
|||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.isOverridable
|
import org.jetbrains.kotlin.psi.psiUtil.isOverridable
|
||||||
import java.awt.event.MouseEvent
|
import java.awt.event.MouseEvent
|
||||||
|
import java.util.HashSet
|
||||||
import javax.swing.Icon
|
import javax.swing.Icon
|
||||||
|
|
||||||
public class JetLineMarkerProvider : LineMarkerProvider {
|
public class JetLineMarkerProvider : LineMarkerProvider {
|
||||||
|
|
||||||
override fun getLineMarkerInfo(element: PsiElement): LineMarkerInfo<PsiElement>? {
|
override fun getLineMarkerInfo(element: PsiElement): LineMarkerInfo<PsiElement>? {
|
||||||
// all Kotlin markers are added in slow marker pass
|
// all Kotlin markers are added in slow marker pass
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun collectSlowLineMarkers(elements: List<PsiElement>, result: MutableCollection<LineMarkerInfo<PsiElement>>) {
|
override fun collectSlowLineMarkers(elements: List<PsiElement>, result: MutableCollection<LineMarkerInfo<*>>) {
|
||||||
if (elements.isEmpty()) return
|
if (elements.isEmpty()) return
|
||||||
|
|
||||||
val first = KotlinPackage.first<PsiElement>(elements)
|
val first = elements.first()
|
||||||
if (DumbService.getInstance(first.getProject()).isDumb() || !ProjectRootsUtil.isInProjectOrLibSource(elements.get(0))) {
|
if (DumbService.getInstance(first.getProject()).isDumb() || !ProjectRootsUtil.isInProjectOrLibSource(first)) return
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val functions = Sets.newHashSet<JetNamedFunction>()
|
val functions = HashSet<JetNamedFunction>()
|
||||||
val properties = Sets.newHashSet<JetProperty>()
|
val properties = HashSet<JetProperty>()
|
||||||
|
|
||||||
for (element in elements) {
|
for (element in elements) {
|
||||||
ProgressManager.checkCanceled()
|
ProgressManager.checkCanceled()
|
||||||
|
|
||||||
if (element is JetClass) {
|
when (element) {
|
||||||
collectInheritedClassMarker(element, result)
|
is JetClass -> {
|
||||||
}
|
collectInheritedClassMarker(element, result)
|
||||||
else if (element is JetNamedFunction) {
|
}
|
||||||
|
is JetNamedFunction -> {
|
||||||
functions.add(element)
|
functions.add(element)
|
||||||
collectSuperDeclarationMarkers(element, result)
|
collectSuperDeclarationMarkers(element, result)
|
||||||
}
|
}
|
||||||
else if (element is JetProperty) {
|
is JetProperty -> {
|
||||||
|
properties.add(element)
|
||||||
properties.add(element)
|
collectSuperDeclarationMarkers(element, result)
|
||||||
collectSuperDeclarationMarkers(element, result)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,68 +85,35 @@ public class JetLineMarkerProvider : LineMarkerProvider {
|
|||||||
protected val OVERRIDDEN_MARK: Icon = AllIcons.Gutter.OverridenMethod
|
protected val OVERRIDDEN_MARK: Icon = AllIcons.Gutter.OverridenMethod
|
||||||
protected val IMPLEMENTED_MARK: Icon = AllIcons.Gutter.ImplementedMethod
|
protected val IMPLEMENTED_MARK: Icon = AllIcons.Gutter.ImplementedMethod
|
||||||
|
|
||||||
private val SUBCLASSED_CLASS = MarkerType(object : NullableFunction<PsiElement, String> {
|
private val SUBCLASSED_CLASS = MarkerType(
|
||||||
override fun `fun`(element: PsiElement?): String? {
|
{ getPsiClass(it)?.let { MarkerType.getSubclassedClassTooltip(it) } },
|
||||||
val psiClass = getPsiClass(element)
|
object : LineMarkerNavigator() {
|
||||||
return if (psiClass != null) MarkerType.getSubclassedClassTooltip(psiClass) else null
|
override fun browse(e: MouseEvent?, element: PsiElement?) {
|
||||||
}
|
getPsiClass(element)?.let { MarkerType.navigateToSubclassedClass(e, it) }
|
||||||
},
|
}
|
||||||
object : LineMarkerNavigator() {
|
})
|
||||||
override fun browse(e: MouseEvent?, element: PsiElement?) {
|
|
||||||
val psiClass = getPsiClass(element)
|
|
||||||
if (psiClass != null) {
|
|
||||||
MarkerType.navigateToSubclassedClass(e, psiClass)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
private val OVERRIDDEN_FUNCTION = MarkerType(object : NullableFunction<PsiElement, String> {
|
private val OVERRIDDEN_FUNCTION = MarkerType(
|
||||||
override fun `fun`(element: PsiElement?): String? {
|
{ getPsiMethod(it)?.let { getOverriddenMethodTooltip(it) } },
|
||||||
val psiMethod = getPsiMethod(element)
|
object : LineMarkerNavigator() {
|
||||||
return if (psiMethod != null) getOverriddenMethodTooltip(psiMethod) else null
|
override fun browse(e: MouseEvent?, element: PsiElement?) {
|
||||||
}
|
getPsiMethod(element)?.let { navigateToOverriddenMethod(e, it) }
|
||||||
},
|
}
|
||||||
object : LineMarkerNavigator() {
|
})
|
||||||
override fun browse(e: MouseEvent?, element: PsiElement?) {
|
|
||||||
val psiMethod = getPsiMethod(element)
|
|
||||||
if (psiMethod != null) {
|
|
||||||
navigateToOverriddenMethod(e, psiMethod)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
private val OVERRIDDEN_PROPERTY = MarkerType(object : NullableFunction<PsiElement, String> {
|
private val OVERRIDDEN_PROPERTY = MarkerType(
|
||||||
override fun `fun`(element: PsiElement?): String? {
|
{ it?.let { getOverriddenPropertyTooltip(it.getParent() as JetProperty) } },
|
||||||
if (element == null) return null
|
object : LineMarkerNavigator() {
|
||||||
|
override fun browse(e: MouseEvent?, element: PsiElement?) {
|
||||||
assert(element.getParent() is JetProperty, "This tooltip provider should be placed only on identifies in properties")
|
element?.let { navigateToPropertyOverriddenDeclarations(e, it.getParent() as JetProperty) }
|
||||||
val property = element.getParent() as JetProperty
|
}
|
||||||
|
})
|
||||||
return getOverriddenPropertyTooltip(property)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
object : LineMarkerNavigator() {
|
|
||||||
override fun browse(e: MouseEvent?, element: PsiElement?) {
|
|
||||||
if (element == null) return
|
|
||||||
|
|
||||||
assert(element.getParent() is JetProperty, "This marker navigator should be placed only on identifies in properties")
|
|
||||||
val property = element.getParent() as JetProperty
|
|
||||||
|
|
||||||
navigateToPropertyOverriddenDeclarations(e, property)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
private fun isImplementsAndNotOverrides(descriptor: CallableMemberDescriptor, overriddenMembers: Collection<CallableMemberDescriptor>): Boolean {
|
private fun isImplementsAndNotOverrides(descriptor: CallableMemberDescriptor, overriddenMembers: Collection<CallableMemberDescriptor>): Boolean {
|
||||||
if (descriptor.getModality() == Modality.ABSTRACT) return false
|
return descriptor.getModality() != Modality.ABSTRACT && overriddenMembers.all { it.getModality() == Modality.ABSTRACT }
|
||||||
|
|
||||||
for (function in overriddenMembers) {
|
|
||||||
if (function.getModality() != Modality.ABSTRACT) return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun collectSuperDeclarationMarkers(declaration: JetDeclaration, result: MutableCollection<LineMarkerInfo<PsiElement>>) {
|
private fun collectSuperDeclarationMarkers(declaration: JetDeclaration, result: MutableCollection<LineMarkerInfo<*>>) {
|
||||||
assert((declaration is JetNamedFunction || declaration is JetProperty))
|
assert((declaration is JetNamedFunction || declaration is JetProperty))
|
||||||
|
|
||||||
if (!declaration.hasModifier(JetTokens.OVERRIDE_KEYWORD)) return
|
if (!declaration.hasModifier(JetTokens.OVERRIDE_KEYWORD)) return
|
||||||
@@ -156,48 +121,45 @@ public class JetLineMarkerProvider : LineMarkerProvider {
|
|||||||
val resolveWithParents = resolveDeclarationWithParents(declaration)
|
val resolveWithParents = resolveDeclarationWithParents(declaration)
|
||||||
if (resolveWithParents.overriddenDescriptors.isEmpty()) return
|
if (resolveWithParents.overriddenDescriptors.isEmpty()) return
|
||||||
|
|
||||||
|
val implements = isImplementsAndNotOverrides(resolveWithParents.descriptor!!, resolveWithParents.overriddenDescriptors)
|
||||||
|
|
||||||
// NOTE: Don't store descriptors in line markers because line markers are not deleted while editing other files and this can prevent
|
// NOTE: Don't store descriptors in line markers because line markers are not deleted while editing other files and this can prevent
|
||||||
// clearing the whole BindingTrace.
|
// clearing the whole BindingTrace.
|
||||||
val marker = LineMarkerInfo(declaration, declaration.getTextOffset(), if (isImplementsAndNotOverrides(resolveWithParents.descriptor, resolveWithParents.overriddenDescriptors))
|
val marker = LineMarkerInfo(
|
||||||
IMPLEMENTING_MARK
|
declaration,
|
||||||
else
|
declaration.getTextOffset(),
|
||||||
OVERRIDING_MARK, Pass.UPDATE_OVERRIDEN_MARKERS, SuperDeclarationMarkerTooltip, SuperDeclarationMarkerNavigationHandler())
|
if (implements) IMPLEMENTING_MARK else OVERRIDING_MARK,
|
||||||
|
Pass.UPDATE_OVERRIDEN_MARKERS,
|
||||||
|
SuperDeclarationMarkerTooltip,
|
||||||
|
SuperDeclarationMarkerNavigationHandler()
|
||||||
|
)
|
||||||
|
|
||||||
result.add(marker)
|
result.add(marker)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun collectInheritedClassMarker(element: JetClass, result: MutableCollection<LineMarkerInfo<PsiElement>>) {
|
private fun collectInheritedClassMarker(element: JetClass, result: MutableCollection<LineMarkerInfo<*>>) {
|
||||||
val isTrait = element.isTrait()
|
val isTrait = element.isTrait()
|
||||||
if (!(isTrait || element.hasModifier(JetTokens.OPEN_KEYWORD) || element.hasModifier(JetTokens.ABSTRACT_KEYWORD))) {
|
if (!(isTrait || element.hasModifier(JetTokens.OPEN_KEYWORD) || element.hasModifier(JetTokens.ABSTRACT_KEYWORD))) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val lightClass = LightClassUtil.getPsiClass(element)
|
val lightClass = LightClassUtil.getPsiClass(element) ?: return
|
||||||
if (lightClass == null) return
|
|
||||||
|
|
||||||
val inheritor = ClassInheritorsSearch.search(lightClass, false).findFirst()
|
if (ClassInheritorsSearch.search(lightClass, false).findFirst() == null) return
|
||||||
if (inheritor != null) {
|
|
||||||
val nameIdentifier = element.getNameIdentifier()
|
val anchor = element.getNameIdentifier() ?: element
|
||||||
val anchor = nameIdentifier ?: element
|
|
||||||
val mark = if (isTrait) IMPLEMENTED_MARK else OVERRIDDEN_MARK
|
result.add(LineMarkerInfo(
|
||||||
result.add(LineMarkerInfo(anchor, anchor.getTextOffset(), mark, Pass.UPDATE_OVERRIDEN_MARKERS, SUBCLASSED_CLASS.getTooltip(), SUBCLASSED_CLASS.getNavigationHandler()))
|
anchor,
|
||||||
}
|
anchor.getTextOffset(),
|
||||||
|
if (isTrait) IMPLEMENTED_MARK else OVERRIDDEN_MARK,
|
||||||
|
Pass.UPDATE_OVERRIDEN_MARKERS,
|
||||||
|
SUBCLASSED_CLASS.getTooltip(),
|
||||||
|
SUBCLASSED_CLASS.getNavigationHandler()
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun isImplemented(declaration: JetNamedDeclaration): Boolean {
|
private fun collectOverridingPropertiesAccessors(properties: Collection<JetProperty>, result: MutableCollection<LineMarkerInfo<*>>) {
|
||||||
if (declaration.hasModifier(JetTokens.ABSTRACT_KEYWORD)) return true
|
|
||||||
|
|
||||||
var parent = declaration.getParent()
|
|
||||||
parent = if ((parent is JetClassBody)) parent.getParent() else parent
|
|
||||||
|
|
||||||
if (parent is JetClass) {
|
|
||||||
return (parent as JetClass).isTrait() && (declaration !is JetDeclarationWithBody || !declaration.hasBody()) && (declaration !is JetWithExpressionInitializer || !declaration.hasInitializer())
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun collectOverridingPropertiesAccessors(properties: Collection<JetProperty>, result: MutableCollection<LineMarkerInfo<PsiElement>>) {
|
|
||||||
val mappingToJava = Maps.newHashMap<PsiMethod, JetProperty>()
|
val mappingToJava = Maps.newHashMap<PsiMethod, JetProperty>()
|
||||||
for (property in properties) {
|
for (property in properties) {
|
||||||
if (property.isOverridable()) {
|
if (property.isOverridable()) {
|
||||||
@@ -216,13 +178,19 @@ public class JetLineMarkerProvider : LineMarkerProvider {
|
|||||||
var anchor = property.getNameIdentifier()
|
var anchor = property.getNameIdentifier()
|
||||||
if (anchor == null) anchor = property
|
if (anchor == null) anchor = property
|
||||||
|
|
||||||
val info = LineMarkerInfo(anchor, anchor!!.getTextOffset(), if (isImplemented(property)) IMPLEMENTED_MARK else OVERRIDDEN_MARK, Pass.UPDATE_OVERRIDEN_MARKERS, OVERRIDDEN_PROPERTY.getTooltip(), OVERRIDDEN_PROPERTY.getNavigationHandler(), GutterIconRenderer.Alignment.RIGHT)
|
result.add(LineMarkerInfo(
|
||||||
|
anchor,
|
||||||
result.add(info)
|
anchor!!.getTextOffset(),
|
||||||
|
if (isImplemented(property)) IMPLEMENTED_MARK else OVERRIDDEN_MARK,
|
||||||
|
Pass.UPDATE_OVERRIDEN_MARKERS,
|
||||||
|
OVERRIDDEN_PROPERTY.getTooltip(),
|
||||||
|
OVERRIDDEN_PROPERTY.getNavigationHandler(),
|
||||||
|
GutterIconRenderer.Alignment.RIGHT
|
||||||
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun collectOverridingAccessors(functions: Collection<JetNamedFunction>, result: MutableCollection<LineMarkerInfo<PsiElement>>) {
|
private fun collectOverridingAccessors(functions: Collection<JetNamedFunction>, result: MutableCollection<LineMarkerInfo<*>>) {
|
||||||
val mappingToJava = Maps.newHashMap<PsiMethod, JetNamedFunction>()
|
val mappingToJava = Maps.newHashMap<PsiMethod, JetNamedFunction>()
|
||||||
for (function in functions) {
|
for (function in functions) {
|
||||||
if (function.isOverridable()) {
|
if (function.isOverridable()) {
|
||||||
@@ -238,13 +206,17 @@ public class JetLineMarkerProvider : LineMarkerProvider {
|
|||||||
for (function in getOverriddenDeclarations(mappingToJava, classes)) {
|
for (function in getOverriddenDeclarations(mappingToJava, classes)) {
|
||||||
ProgressManager.checkCanceled()
|
ProgressManager.checkCanceled()
|
||||||
|
|
||||||
var anchor = function.getNameIdentifier()
|
val anchor = function.getNameIdentifier() ?: function
|
||||||
if (anchor == null) anchor = function
|
|
||||||
|
|
||||||
val info = LineMarkerInfo(anchor, anchor!!.getTextOffset(), if (isImplemented(function)) IMPLEMENTED_MARK else OVERRIDDEN_MARK, Pass.UPDATE_OVERRIDEN_MARKERS, OVERRIDDEN_FUNCTION.getTooltip(), OVERRIDDEN_FUNCTION.getNavigationHandler(), GutterIconRenderer.Alignment.RIGHT)
|
result.add(LineMarkerInfo(
|
||||||
|
anchor,
|
||||||
result.add(info)
|
anchor!!.getTextOffset(),
|
||||||
|
if (isImplemented(function)) IMPLEMENTED_MARK else OVERRIDDEN_MARK,
|
||||||
|
Pass.UPDATE_OVERRIDEN_MARKERS, OVERRIDDEN_FUNCTION.getTooltip(),
|
||||||
|
OVERRIDDEN_FUNCTION.getNavigationHandler(),
|
||||||
|
GutterIconRenderer.Alignment.RIGHT
|
||||||
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.highlighter.markers
|
package org.jetbrains.kotlin.idea.highlighter.markers
|
||||||
|
|
||||||
import org.jetbrains.kotlin.psi.JetProperty
|
|
||||||
import com.intellij.psi.search.PsiElementProcessor
|
import com.intellij.psi.search.PsiElementProcessor
|
||||||
import com.intellij.psi.PsiClass
|
import com.intellij.psi.PsiClass
|
||||||
import org.jetbrains.kotlin.idea.JetBundle
|
import org.jetbrains.kotlin.idea.JetBundle
|
||||||
@@ -40,7 +39,8 @@ import javax.swing.JComponent
|
|||||||
import com.intellij.codeInsight.daemon.impl.PsiElementListNavigator
|
import com.intellij.codeInsight.daemon.impl.PsiElementListNavigator
|
||||||
import com.intellij.psi.NavigatablePsiElement
|
import com.intellij.psi.NavigatablePsiElement
|
||||||
import com.intellij.util.Function
|
import com.intellij.util.Function
|
||||||
import org.jetbrains.kotlin.idea.highlighter.markers.JetLineMarkerProvider
|
import org.jetbrains.kotlin.lexer.JetTokens
|
||||||
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
|
||||||
fun getOverriddenPropertyTooltip(property: JetProperty): String? {
|
fun getOverriddenPropertyTooltip(property: JetProperty): String? {
|
||||||
val overriddenInClassesProcessor = PsiElementProcessor.CollectElementsWithLimit<PsiClass>(5)
|
val overriddenInClassesProcessor = PsiElementProcessor.CollectElementsWithLimit<PsiClass>(5)
|
||||||
@@ -56,7 +56,7 @@ fun getOverriddenPropertyTooltip(property: JetProperty): String? {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val isImplemented = JetLineMarkerProvider.isImplemented(property)
|
val isImplemented = isImplemented(property)
|
||||||
if (overriddenInClassesProcessor.isOverflow()) {
|
if (overriddenInClassesProcessor.isOverflow()) {
|
||||||
return if (isImplemented)
|
return if (isImplemented)
|
||||||
JetBundle.message("property.is.implemented.too.many")
|
JetBundle.message("property.is.implemented.too.many")
|
||||||
@@ -113,3 +113,16 @@ fun navigateToPropertyOverriddenDeclarations(e: MouseEvent?, property: JetProper
|
|||||||
JetBundle.message("navigation.title.overriding.property", property.getName()),
|
JetBundle.message("navigation.title.overriding.property", property.getName()),
|
||||||
JetBundle.message("navigation.findUsages.title.overriding.property", property.getName()), renderer)
|
JetBundle.message("navigation.findUsages.title.overriding.property", property.getName()), renderer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public fun isImplemented(declaration: JetNamedDeclaration): Boolean {
|
||||||
|
if (declaration.hasModifier(JetTokens.ABSTRACT_KEYWORD)) return true
|
||||||
|
|
||||||
|
var parent = declaration.getParent()
|
||||||
|
parent = if (parent is JetClassBody) parent.getParent() else parent
|
||||||
|
|
||||||
|
if (parent !is JetClass) return false
|
||||||
|
|
||||||
|
return (parent as JetClass).isTrait() && (declaration !is JetDeclarationWithBody || !declaration.hasBody()) && (declaration !is JetWithExpressionInitializer || !declaration.hasInitializer())
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user