@@ -24,13 +24,16 @@ import com.intellij.openapi.editor.markup.GutterIconRenderer
24
24
import com.intellij.openapi.progress.ProgressManager
25
25
import com.intellij.psi.PsiDocumentManager
26
26
import com.intellij.psi.PsiElement
27
+ import org.jetbrains.kotlin.descriptors.ClassDescriptor
28
+ import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
27
29
import org.jetbrains.kotlin.idea.caches.resolve.analyze
28
30
import org.jetbrains.kotlin.psi.*
29
- import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
30
31
import org.jetbrains.kotlin.psi.psiUtil.parents
31
32
import org.jetbrains.kotlin.resolve.BindingContext
32
33
import org.jetbrains.kotlin.resolve.calls.callUtil.isInlined
33
34
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
35
+ import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
36
+ import org.jetbrains.kotlin.resolve.scopes.receivers.ThisReceiver
34
37
import java.util.HashSet
35
38
36
39
public class KotlinRecursiveCallLineMarkerProvider () : LineMarkerProvider {
@@ -73,22 +76,27 @@ public class KotlinRecursiveCallLineMarkerProvider() : LineMarkerProvider {
73
76
74
77
if (resolvedCall.getCandidateDescriptor().getOriginal() != enclosingFunctionDescriptor) return false
75
78
76
- val extensionReceiver = resolvedCall.getExtensionReceiver()
77
- if (extensionReceiver is ExpressionReceiver ) {
78
- val thisTarget = (extensionReceiver.getExpression() as ? JetThisExpression )?.getInstanceReference()?.getReference()?.resolve()
79
- if (thisTarget != enclosingFunction) {
80
- return false
81
- }
82
- }
83
-
84
- val dispatchReceiver = resolvedCall.getDispatchReceiver()
85
- if (dispatchReceiver is ExpressionReceiver ) {
86
- val thisTarget = (dispatchReceiver.getExpression() as ? JetThisExpression )?.getInstanceReference()?.getReference()?.resolve()
87
- if (thisTarget != enclosingFunction.getNonStrictParentOfType<JetClassOrObject >()) {
88
- return false
79
+ fun isDifferentReceiver (receiver : ReceiverValue ): Boolean {
80
+ val receiverOwner =
81
+ when (receiver) {
82
+ is ExpressionReceiver -> {
83
+ val thisRef = (receiver.getExpression() as ? JetThisExpression )?.getInstanceReference() ? : return true
84
+ bindingContext[BindingContext .REFERENCE_TARGET , thisRef] ? : return true
85
+ }
86
+
87
+ is ThisReceiver -> receiver.getDeclarationDescriptor()
88
+ else -> return false
89
+ }
90
+
91
+ return when (receiverOwner) {
92
+ is SimpleFunctionDescriptor -> receiverOwner != enclosingFunctionDescriptor
93
+ is ClassDescriptor -> receiverOwner != enclosingFunctionDescriptor.getContainingDeclaration()
94
+ else -> throw IllegalStateException (" Unexpected receiver owner: $receiverOwner " )
89
95
}
90
96
}
91
97
98
+ if (isDifferentReceiver(resolvedCall.getExtensionReceiver())) return false
99
+ if (isDifferentReceiver(resolvedCall.getDispatchReceiver())) return false
92
100
return true
93
101
}
94
102
0 commit comments