Minor. Moved stuff from companion object to top-level.
This commit is contained in:
+125
-127
@@ -78,145 +78,143 @@ public class KotlinLineMarkerProvider : LineMarkerProvider {
|
||||
collectOverridingAccessors(functions, result)
|
||||
collectOverridingPropertiesAccessors(properties, result)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
public val OVERRIDING_MARK: Icon = AllIcons.Gutter.OverridingMethod
|
||||
public val IMPLEMENTING_MARK: Icon = AllIcons.Gutter.ImplementingMethod
|
||||
protected val OVERRIDDEN_MARK: Icon = AllIcons.Gutter.OverridenMethod
|
||||
protected val IMPLEMENTED_MARK: Icon = AllIcons.Gutter.ImplementedMethod
|
||||
private val OVERRIDING_MARK: Icon = AllIcons.Gutter.OverridingMethod
|
||||
private val IMPLEMENTING_MARK: Icon = AllIcons.Gutter.ImplementingMethod
|
||||
private val OVERRIDDEN_MARK: Icon = AllIcons.Gutter.OverridenMethod
|
||||
private val IMPLEMENTED_MARK: Icon = AllIcons.Gutter.ImplementedMethod
|
||||
|
||||
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(
|
||||
{ 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(
|
||||
{ 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 {
|
||||
return descriptor.getModality() != Modality.ABSTRACT && overriddenMembers.all { it.getModality() == Modality.ABSTRACT }
|
||||
}
|
||||
|
||||
private fun collectSuperDeclarationMarkers(declaration: JetDeclaration, result: MutableCollection<LineMarkerInfo<*>>) {
|
||||
assert((declaration is JetNamedFunction || declaration is JetProperty))
|
||||
|
||||
if (!declaration.hasModifier(JetTokens.OVERRIDE_KEYWORD)) return
|
||||
|
||||
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 (implements) IMPLEMENTING_MARK else OVERRIDING_MARK,
|
||||
Pass.UPDATE_OVERRIDEN_MARKERS,
|
||||
SuperDeclarationMarkerTooltip,
|
||||
SuperDeclarationMarkerNavigationHandler()
|
||||
)
|
||||
|
||||
result.add(marker)
|
||||
}
|
||||
|
||||
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
|
||||
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) }
|
||||
}
|
||||
})
|
||||
|
||||
val lightClass = LightClassUtil.getPsiClass(element) ?: return
|
||||
|
||||
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()
|
||||
))
|
||||
}
|
||||
|
||||
private fun collectOverridingPropertiesAccessors(properties: Collection<JetProperty>, result: MutableCollection<LineMarkerInfo<*>>) {
|
||||
val mappingToJava = Maps.newHashMap<PsiMethod, JetProperty>()
|
||||
for (property in properties) {
|
||||
if (property.isOverridable()) {
|
||||
val accessorsPsiMethods = LightClassUtil.getLightClassPropertyMethods(property)
|
||||
for (psiMethod in accessorsPsiMethods) {
|
||||
mappingToJava.put(psiMethod, property)
|
||||
}
|
||||
}
|
||||
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) }
|
||||
}
|
||||
})
|
||||
|
||||
val classes = collectContainingClasses(mappingToJava.keySet())
|
||||
|
||||
for (property in getOverriddenDeclarations(mappingToJava, classes)) {
|
||||
ProgressManager.checkCanceled()
|
||||
|
||||
var anchor = property.getNameIdentifier()
|
||||
if (anchor == null) anchor = property
|
||||
|
||||
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 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 collectOverridingAccessors(functions: Collection<JetNamedFunction>, result: MutableCollection<LineMarkerInfo<*>>) {
|
||||
val mappingToJava = Maps.newHashMap<PsiMethod, JetNamedFunction>()
|
||||
for (function in functions) {
|
||||
if (function.isOverridable()) {
|
||||
val method = LightClassUtil.getLightClassMethod(function)
|
||||
if (method != null) {
|
||||
mappingToJava.put(method, function)
|
||||
}
|
||||
}
|
||||
}
|
||||
private fun isImplementsAndNotOverrides(descriptor: CallableMemberDescriptor, overriddenMembers: Collection<CallableMemberDescriptor>): Boolean {
|
||||
return descriptor.getModality() != Modality.ABSTRACT && overriddenMembers.all { it.getModality() == Modality.ABSTRACT }
|
||||
}
|
||||
|
||||
val classes = collectContainingClasses(mappingToJava.keySet())
|
||||
private fun collectSuperDeclarationMarkers(declaration: JetDeclaration, result: MutableCollection<LineMarkerInfo<*>>) {
|
||||
assert((declaration is JetNamedFunction || declaration is JetProperty))
|
||||
|
||||
for (function in getOverriddenDeclarations(mappingToJava, classes)) {
|
||||
ProgressManager.checkCanceled()
|
||||
if (!declaration.hasModifier(JetTokens.OVERRIDE_KEYWORD)) return
|
||||
|
||||
val anchor = function.getNameIdentifier() ?: function
|
||||
val resolveWithParents = resolveDeclarationWithParents(declaration)
|
||||
if (resolveWithParents.overriddenDescriptors.isEmpty()) return
|
||||
|
||||
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
|
||||
))
|
||||
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 (implements) IMPLEMENTING_MARK else OVERRIDING_MARK,
|
||||
Pass.UPDATE_OVERRIDEN_MARKERS,
|
||||
SuperDeclarationMarkerTooltip,
|
||||
SuperDeclarationMarkerNavigationHandler()
|
||||
)
|
||||
|
||||
result.add(marker)
|
||||
}
|
||||
|
||||
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) ?: return
|
||||
|
||||
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()
|
||||
))
|
||||
}
|
||||
|
||||
private fun collectOverridingPropertiesAccessors(properties: Collection<JetProperty>, result: MutableCollection<LineMarkerInfo<*>>) {
|
||||
val mappingToJava = Maps.newHashMap<PsiMethod, JetProperty>()
|
||||
for (property in properties) {
|
||||
if (property.isOverridable()) {
|
||||
val accessorsPsiMethods = LightClassUtil.getLightClassPropertyMethods(property)
|
||||
for (psiMethod in accessorsPsiMethods) {
|
||||
mappingToJava.put(psiMethod, property)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val classes = collectContainingClasses(mappingToJava.keySet())
|
||||
|
||||
for (property in getOverriddenDeclarations(mappingToJava, classes)) {
|
||||
ProgressManager.checkCanceled()
|
||||
|
||||
var anchor = property.getNameIdentifier()
|
||||
if (anchor == null) anchor = property
|
||||
|
||||
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<*>>) {
|
||||
val mappingToJava = Maps.newHashMap<PsiMethod, JetNamedFunction>()
|
||||
for (function in functions) {
|
||||
if (function.isOverridable()) {
|
||||
val method = LightClassUtil.getLightClassMethod(function)
|
||||
if (method != null) {
|
||||
mappingToJava.put(method, function)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val classes = collectContainingClasses(mappingToJava.keySet())
|
||||
|
||||
for (function in getOverriddenDeclarations(mappingToJava, classes)) {
|
||||
ProgressManager.checkCanceled()
|
||||
|
||||
val anchor = function.getNameIdentifier() ?: function
|
||||
|
||||
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
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user