Post-conversion code cleanup.

This commit is contained in:
Evgeny Gerashchenko
2015-04-17 15:23:17 +03:00
parent 94311f262b
commit 04e438f4f8
2 changed files with 102 additions and 117 deletions
@@ -39,41 +39,39 @@ import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.isOverridable
import java.awt.event.MouseEvent
import java.util.HashSet
import javax.swing.Icon
public class JetLineMarkerProvider : LineMarkerProvider {
override fun getLineMarkerInfo(element: PsiElement): LineMarkerInfo<PsiElement>? {
// all Kotlin markers are added in slow marker pass
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
val first = KotlinPackage.first<PsiElement>(elements)
if (DumbService.getInstance(first.getProject()).isDumb() || !ProjectRootsUtil.isInProjectOrLibSource(elements.get(0))) {
return
}
val first = elements.first()
if (DumbService.getInstance(first.getProject()).isDumb() || !ProjectRootsUtil.isInProjectOrLibSource(first)) return
val functions = Sets.newHashSet<JetNamedFunction>()
val properties = Sets.newHashSet<JetProperty>()
val functions = HashSet<JetNamedFunction>()
val properties = HashSet<JetProperty>()
for (element in elements) {
ProgressManager.checkCanceled()
if (element is JetClass) {
collectInheritedClassMarker(element, result)
}
else if (element is JetNamedFunction) {
functions.add(element)
collectSuperDeclarationMarkers(element, result)
}
else if (element is JetProperty) {
properties.add(element)
collectSuperDeclarationMarkers(element, result)
when (element) {
is JetClass -> {
collectInheritedClassMarker(element, result)
}
is JetNamedFunction -> {
functions.add(element)
collectSuperDeclarationMarkers(element, result)
}
is JetProperty -> {
properties.add(element)
collectSuperDeclarationMarkers(element, result)
}
}
}
@@ -87,68 +85,35 @@ public class JetLineMarkerProvider : LineMarkerProvider {
protected val OVERRIDDEN_MARK: Icon = AllIcons.Gutter.OverridenMethod
protected val IMPLEMENTED_MARK: Icon = AllIcons.Gutter.ImplementedMethod
private val SUBCLASSED_CLASS = MarkerType(object : NullableFunction<PsiElement, String> {
override fun `fun`(element: PsiElement?): String? {
val psiClass = getPsiClass(element)
return if (psiClass != null) MarkerType.getSubclassedClassTooltip(psiClass) else null
}
},
object : LineMarkerNavigator() {
override fun browse(e: MouseEvent?, element: PsiElement?) {
val psiClass = getPsiClass(element)
if (psiClass != null) {
MarkerType.navigateToSubclassedClass(e, psiClass)
}
}
})
private val SUBCLASSED_CLASS = MarkerType(
{ getPsiClass(it)?.let { MarkerType.getSubclassedClassTooltip(it) } },
object : LineMarkerNavigator() {
override fun browse(e: MouseEvent?, element: PsiElement?) {
getPsiClass(element)?.let { MarkerType.navigateToSubclassedClass(e, it) }
}
})
private val OVERRIDDEN_FUNCTION = MarkerType(object : NullableFunction<PsiElement, String> {
override fun `fun`(element: PsiElement?): String? {
val psiMethod = getPsiMethod(element)
return if (psiMethod != null) getOverriddenMethodTooltip(psiMethod) else null
}
},
object : LineMarkerNavigator() {
override fun browse(e: MouseEvent?, element: PsiElement?) {
val psiMethod = getPsiMethod(element)
if (psiMethod != null) {
navigateToOverriddenMethod(e, psiMethod)
}
}
})
private val OVERRIDDEN_FUNCTION = MarkerType(
{ getPsiMethod(it)?.let { getOverriddenMethodTooltip(it) } },
object : LineMarkerNavigator() {
override fun browse(e: MouseEvent?, element: PsiElement?) {
getPsiMethod(element)?.let { navigateToOverriddenMethod(e, it) }
}
})
private val OVERRIDDEN_PROPERTY = MarkerType(object : NullableFunction<PsiElement, String> {
override fun `fun`(element: PsiElement?): String? {
if (element == null) return null
assert(element.getParent() is JetProperty, "This tooltip provider should be placed only on identifies in properties")
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 val OVERRIDDEN_PROPERTY = MarkerType(
{ it?.let { getOverriddenPropertyTooltip(it.getParent() as JetProperty) } },
object : LineMarkerNavigator() {
override fun browse(e: MouseEvent?, element: PsiElement?) {
element?.let { navigateToPropertyOverriddenDeclarations(e, it.getParent() as JetProperty) }
}
})
private fun isImplementsAndNotOverrides(descriptor: CallableMemberDescriptor, overriddenMembers: Collection<CallableMemberDescriptor>): Boolean {
if (descriptor.getModality() == Modality.ABSTRACT) return false
for (function in overriddenMembers) {
if (function.getModality() != Modality.ABSTRACT) return false
}
return true
return descriptor.getModality() != Modality.ABSTRACT && overriddenMembers.all { it.getModality() == Modality.ABSTRACT }
}
private fun collectSuperDeclarationMarkers(declaration: JetDeclaration, result: MutableCollection<LineMarkerInfo<PsiElement>>) {
private fun collectSuperDeclarationMarkers(declaration: JetDeclaration, result: MutableCollection<LineMarkerInfo<*>>) {
assert((declaration is JetNamedFunction || declaration is JetProperty))
if (!declaration.hasModifier(JetTokens.OVERRIDE_KEYWORD)) return
@@ -156,48 +121,45 @@ public class JetLineMarkerProvider : LineMarkerProvider {
val resolveWithParents = resolveDeclarationWithParents(declaration)
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
// clearing the whole BindingTrace.
val marker = LineMarkerInfo(declaration, declaration.getTextOffset(), if (isImplementsAndNotOverrides(resolveWithParents.descriptor, resolveWithParents.overriddenDescriptors))
IMPLEMENTING_MARK
else
OVERRIDING_MARK, Pass.UPDATE_OVERRIDEN_MARKERS, SuperDeclarationMarkerTooltip, SuperDeclarationMarkerNavigationHandler())
val marker = LineMarkerInfo(
declaration,
declaration.getTextOffset(),
if (implements) IMPLEMENTING_MARK else OVERRIDING_MARK,
Pass.UPDATE_OVERRIDEN_MARKERS,
SuperDeclarationMarkerTooltip,
SuperDeclarationMarkerNavigationHandler()
)
result.add(marker)
}
private fun collectInheritedClassMarker(element: JetClass, result: MutableCollection<LineMarkerInfo<PsiElement>>) {
private fun collectInheritedClassMarker(element: JetClass, result: MutableCollection<LineMarkerInfo<*>>) {
val isTrait = element.isTrait()
if (!(isTrait || element.hasModifier(JetTokens.OPEN_KEYWORD) || element.hasModifier(JetTokens.ABSTRACT_KEYWORD))) {
return
}
val lightClass = LightClassUtil.getPsiClass(element)
if (lightClass == null) return
val lightClass = LightClassUtil.getPsiClass(element) ?: return
val inheritor = ClassInheritorsSearch.search(lightClass, false).findFirst()
if (inheritor != null) {
val nameIdentifier = element.getNameIdentifier()
val anchor = nameIdentifier ?: element
val mark = if (isTrait) IMPLEMENTED_MARK else OVERRIDDEN_MARK
result.add(LineMarkerInfo(anchor, anchor.getTextOffset(), mark, Pass.UPDATE_OVERRIDEN_MARKERS, SUBCLASSED_CLASS.getTooltip(), SUBCLASSED_CLASS.getNavigationHandler()))
}
if (ClassInheritorsSearch.search(lightClass, false).findFirst() == null) return
val anchor = element.getNameIdentifier() ?: element
result.add(LineMarkerInfo(
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 {
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>>) {
private fun collectOverridingPropertiesAccessors(properties: Collection<JetProperty>, result: MutableCollection<LineMarkerInfo<*>>) {
val mappingToJava = Maps.newHashMap<PsiMethod, JetProperty>()
for (property in properties) {
if (property.isOverridable()) {
@@ -216,13 +178,19 @@ public class JetLineMarkerProvider : LineMarkerProvider {
var anchor = property.getNameIdentifier()
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(info)
result.add(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
))
}
}
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>()
for (function in functions) {
if (function.isOverridable()) {
@@ -238,13 +206,17 @@ public class JetLineMarkerProvider : LineMarkerProvider {
for (function in getOverriddenDeclarations(mappingToJava, classes)) {
ProgressManager.checkCanceled()
var anchor = function.getNameIdentifier()
if (anchor == null) anchor = function
val anchor = function.getNameIdentifier() ?: 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(info)
result.add(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
))
}
}
}
}
}
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.idea.highlighter.markers
import org.jetbrains.kotlin.psi.JetProperty
import com.intellij.psi.search.PsiElementProcessor
import com.intellij.psi.PsiClass
import org.jetbrains.kotlin.idea.JetBundle
@@ -40,7 +39,8 @@ import javax.swing.JComponent
import com.intellij.codeInsight.daemon.impl.PsiElementListNavigator
import com.intellij.psi.NavigatablePsiElement
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? {
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()) {
return if (isImplemented)
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.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())
}