RecursiveMethodCallMarkerInfo and SuspendCallMarkerInfo forced to target Leaf-elements

because of restriction added in IDEA 173
This commit is contained in:
Nicolay Mitropolsky
2017-10-25 19:44:51 +03:00
committed by Nikolay Krasko
parent 34bdc04fbe
commit dd45780de9
3 changed files with 18 additions and 9 deletions
@@ -53,7 +53,7 @@ class KotlinRecursiveCallLineMarkerProvider : LineMarkerProvider {
val lineNumber = element.getLineNumber() val lineNumber = element.getLineNumber()
if (lineNumber !in markedLineNumbers && isRecursiveCall(element)) { if (lineNumber !in markedLineNumbers && isRecursiveCall(element)) {
markedLineNumbers.add(lineNumber) markedLineNumbers.add(lineNumber)
result.add(RecursiveMethodCallMarkerInfo(element)) result.add(RecursiveMethodCallMarkerInfo(getElementForLineMark(element)))
} }
} }
} }
@@ -113,8 +113,8 @@ class KotlinRecursiveCallLineMarkerProvider : LineMarkerProvider {
return true return true
} }
private class RecursiveMethodCallMarkerInfo(callElement: KtElement) private class RecursiveMethodCallMarkerInfo(callElement: PsiElement)
: LineMarkerInfo<KtElement>( : LineMarkerInfo<PsiElement>(
callElement, callElement,
callElement.textRange, callElement.textRange,
AllIcons.Gutter.RecursiveMethod, AllIcons.Gutter.RecursiveMethod,
@@ -125,7 +125,7 @@ class KotlinRecursiveCallLineMarkerProvider : LineMarkerProvider {
) { ) {
override fun createGutterRenderer(): GutterIconRenderer? { override fun createGutterRenderer(): GutterIconRenderer? {
return object : LineMarkerInfo.LineMarkerGutterIconRenderer<KtElement>(this) { return object : LineMarkerInfo.LineMarkerGutterIconRenderer<PsiElement>(this) {
override fun getClickAction() = null // to place breakpoint on mouse click override fun getClickAction() = null // to place breakpoint on mouse click
} }
} }
@@ -133,6 +133,15 @@ class KotlinRecursiveCallLineMarkerProvider : LineMarkerProvider {
} }
internal fun getElementForLineMark(callElement: PsiElement): PsiElement =
when (callElement) {
is KtSimpleNameExpression -> callElement.getReferencedNameElement()
else ->
// a fallback,
//but who knows what to reference in KtArrayAccessExpression ?
generateSequence(callElement, { it.firstChild }).last()
}
private fun PsiElement.getLineNumber(): Int { private fun PsiElement.getLineNumber(): Int {
return PsiDocumentManager.getInstance(project).getDocument(containingFile)!!.getLineNumber(textOffset) return PsiDocumentManager.getInstance(project).getDocument(containingFile)!!.getLineNumber(textOffset)
} }
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
class KotlinSuspendCallLineMarkerProvider : LineMarkerProvider { class KotlinSuspendCallLineMarkerProvider : LineMarkerProvider {
private class SuspendCallMarkerInfo(callElement: KtElement, message: String) : LineMarkerInfo<KtElement>( private class SuspendCallMarkerInfo(callElement: PsiElement, message: String) : LineMarkerInfo<PsiElement>(
callElement, callElement,
callElement.textRange, callElement.textRange,
KotlinIcons.SUSPEND_CALL, KotlinIcons.SUSPEND_CALL,
@@ -35,7 +35,7 @@ class KotlinSuspendCallLineMarkerProvider : LineMarkerProvider {
GutterIconRenderer.Alignment.RIGHT GutterIconRenderer.Alignment.RIGHT
) { ) {
override fun createGutterRenderer(): GutterIconRenderer? { override fun createGutterRenderer(): GutterIconRenderer? {
return object : LineMarkerInfo.LineMarkerGutterIconRenderer<KtElement>(this) { return object : LineMarkerInfo.LineMarkerGutterIconRenderer<PsiElement>(this) {
override fun getClickAction(): AnAction? = null override fun getClickAction(): AnAction? = null
} }
} }
@@ -59,9 +59,9 @@ class KotlinSuspendCallLineMarkerProvider : LineMarkerProvider {
markedLineNumbers += lineNumber markedLineNumbers += lineNumber
result += if (element is KtForExpression) { result += if (element is KtForExpression) {
SuspendCallMarkerInfo(element.loopRange!!, "Suspending iteration") SuspendCallMarkerInfo(getElementForLineMark(element.loopRange!!), "Suspending iteration")
} else { } else {
SuspendCallMarkerInfo(element, "Suspend function call") SuspendCallMarkerInfo(getElementForLineMark(element), "Suspend function call")
} }
} }
} }
@@ -1,6 +1,6 @@
operator fun Any.get(a: Int) { operator fun Any.get(a: Int) {
if (a > 0) { if (a > 0) {
<lineMarker descr="Recursive call">this[a - 1]</lineMarker> <lineMarker descr="Recursive call">this</lineMarker>[a - 1]
} }
} }