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)
|
collectOverridingAccessors(functions, result)
|
||||||
collectOverridingPropertiesAccessors(properties, result)
|
collectOverridingPropertiesAccessors(properties, result)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
private val OVERRIDING_MARK: Icon = AllIcons.Gutter.OverridingMethod
|
||||||
public val OVERRIDING_MARK: Icon = AllIcons.Gutter.OverridingMethod
|
private val IMPLEMENTING_MARK: Icon = AllIcons.Gutter.ImplementingMethod
|
||||||
public val IMPLEMENTING_MARK: Icon = AllIcons.Gutter.ImplementingMethod
|
private val OVERRIDDEN_MARK: Icon = AllIcons.Gutter.OverridenMethod
|
||||||
protected val OVERRIDDEN_MARK: Icon = AllIcons.Gutter.OverridenMethod
|
private val IMPLEMENTED_MARK: Icon = AllIcons.Gutter.ImplementedMethod
|
||||||
protected val IMPLEMENTED_MARK: Icon = AllIcons.Gutter.ImplementedMethod
|
|
||||||
|
|
||||||
private val SUBCLASSED_CLASS = MarkerType(
|
private val SUBCLASSED_CLASS = MarkerType(
|
||||||
{ getPsiClass(it)?.let { MarkerType.getSubclassedClassTooltip(it) } },
|
{ getPsiClass(it)?.let { MarkerType.getSubclassedClassTooltip(it) } },
|
||||||
object : LineMarkerNavigator() {
|
object : LineMarkerNavigator() {
|
||||||
override fun browse(e: MouseEvent?, element: PsiElement?) {
|
override fun browse(e: MouseEvent?, element: PsiElement?) {
|
||||||
getPsiClass(element)?.let { MarkerType.navigateToSubclassedClass(e, it) }
|
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
|
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
|
||||||
val lightClass = LightClassUtil.getPsiClass(element) ?: return
|
private val OVERRIDDEN_FUNCTION = MarkerType(
|
||||||
|
{ getPsiMethod(it)?.let { getOverriddenMethodTooltip(it) } },
|
||||||
if (ClassInheritorsSearch.search(lightClass, false).findFirst() == null) return
|
object : LineMarkerNavigator() {
|
||||||
|
override fun browse(e: MouseEvent?, element: PsiElement?) {
|
||||||
val anchor = element.getNameIdentifier() ?: element
|
getPsiMethod(element)?.let { navigateToOverriddenMethod(e, it) }
|
||||||
|
|
||||||
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())
|
private val OVERRIDDEN_PROPERTY = MarkerType(
|
||||||
|
{ it?.let { getOverriddenPropertyTooltip(it.getParent() as JetProperty) } },
|
||||||
for (property in getOverriddenDeclarations(mappingToJava, classes)) {
|
object : LineMarkerNavigator() {
|
||||||
ProgressManager.checkCanceled()
|
override fun browse(e: MouseEvent?, element: PsiElement?) {
|
||||||
|
element?.let { navigateToPropertyOverriddenDeclarations(e, it.getParent() as JetProperty) }
|
||||||
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<*>>) {
|
private fun isImplementsAndNotOverrides(descriptor: CallableMemberDescriptor, overriddenMembers: Collection<CallableMemberDescriptor>): Boolean {
|
||||||
val mappingToJava = Maps.newHashMap<PsiMethod, JetNamedFunction>()
|
return descriptor.getModality() != Modality.ABSTRACT && overriddenMembers.all { it.getModality() == Modality.ABSTRACT }
|
||||||
for (function in functions) {
|
}
|
||||||
if (function.isOverridable()) {
|
|
||||||
val method = LightClassUtil.getLightClassMethod(function)
|
|
||||||
if (method != null) {
|
|
||||||
mappingToJava.put(method, function)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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)) {
|
if (!declaration.hasModifier(JetTokens.OVERRIDE_KEYWORD)) return
|
||||||
ProgressManager.checkCanceled()
|
|
||||||
|
|
||||||
val anchor = function.getNameIdentifier() ?: function
|
val resolveWithParents = resolveDeclarationWithParents(declaration)
|
||||||
|
if (resolveWithParents.overriddenDescriptors.isEmpty()) return
|
||||||
|
|
||||||
result.add(LineMarkerInfo(
|
val implements = isImplementsAndNotOverrides(resolveWithParents.descriptor!!, resolveWithParents.overriddenDescriptors)
|
||||||
anchor,
|
|
||||||
anchor!!.getTextOffset(),
|
// NOTE: Don't store descriptors in line markers because line markers are not deleted while editing other files and this can prevent
|
||||||
if (isImplemented(function)) IMPLEMENTED_MARK else OVERRIDDEN_MARK,
|
// clearing the whole BindingTrace.
|
||||||
Pass.UPDATE_OVERRIDEN_MARKERS, OVERRIDDEN_FUNCTION.getTooltip(),
|
val marker = LineMarkerInfo(
|
||||||
OVERRIDDEN_FUNCTION.getNavigationHandler(),
|
declaration,
|
||||||
GutterIconRenderer.Alignment.RIGHT
|
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