in intellij/src/main/kotlin/motif/intellij/provider/ScopeNavigationLineMarkerProvider.kt [109:167]
override fun navigate(event: MouseEvent?, element: PsiElement?) {
val psiClassElement = element?.toPsiClass()
if (psiClassElement is PsiClass) {
val scopeEdges: Array<ScopeEdge>? =
getParentScopes(psiClassElement.project, graph, psiClassElement)
if (scopeEdges == null) {
Messages.showInfoMessage(MESSAGE_NAVIGATION_NO_SCOPE, MESSAGE_TITLE)
return
}
when (scopeEdges.size) {
0 -> Messages.showInfoMessage(MESSAGE_NAVIGATION_PARENT_ROOT, MESSAGE_TITLE)
1 -> navigateToParent(scopeEdges[0])
else -> {
val mouseEvent: MouseEvent = event ?: return
val listPopup: ListPopup =
JBPopupFactory.getInstance()
.createListPopup(
object :
BaseListPopupStep<ScopeEdge>(
"Select Parent Scope",
scopeEdges.toMutableList(),
) {
override fun getTextFor(value: ScopeEdge): String =
value.parent.clazz.simpleName
override fun onChosen(
selectedValue: ScopeEdge?,
finalChoice: Boolean,
): PopupStep<*>? {
selectedValue?.let { navigateToParent(it) }
return super.onChosen(selectedValue, finalChoice)
}
},
)
listPopup.show(RelativePoint(mouseEvent))
}
}
} else {
val methodElement = element?.toPsiMethod()
if (methodElement is PsiMethod) {
val classElement = PsiTreeUtil.getParentOfType(methodElement, PsiClass::class.java)
if (isMotifScopeClass(classElement) &&
methodElement.returnType is PsiClassReferenceType) {
val returnElementClass: PsiClass? =
(methodElement.returnType as PsiClassReferenceType).resolve()
returnElementClass?.let {
val navigationElement = it.navigationElement
if (navigationElement is Navigatable &&
(navigationElement as Navigatable).canNavigate()) {
navigationElement.navigate(true)
}
}
}
}
}
project
.getService(AnalyticsService::class.java)
.logEvent(MotifAnalyticsActions.NAVIGATION_GUTTER_CLICK)
}