From 5fe0f167ca1fb00a4758fc0be3577a448893a6f3 Mon Sep 17 00:00:00 2001 From: "Vitaliy.Bibaev" Date: Sat, 14 Oct 2017 19:12:37 +0300 Subject: [PATCH] Simplify checks that stream chain exists --- .../kotlin/psi/impl/KotlinChainBuilderBase.kt | 3 ++- .../psi/impl/PackageBasedCallChecker.kt | 23 ++++++++----------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/psi/impl/KotlinChainBuilderBase.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/psi/impl/KotlinChainBuilderBase.kt index dcc91e8c5e6..03e71e5a7ec 100644 --- a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/psi/impl/KotlinChainBuilderBase.kt +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/psi/impl/KotlinChainBuilderBase.kt @@ -29,7 +29,8 @@ abstract class KotlinChainBuilderBase(private val transformer: ChainTransformer< protected abstract val existenceChecker: ExistenceChecker override fun isChainExists(startElement: PsiElement): Boolean { - var element: PsiElement? = PsiUtil.ignoreWhiteSpaces(startElement) + var element: PsiElement? = getLatestElementInScope(PsiUtil.ignoreWhiteSpaces(startElement)) + existenceChecker.reset() while (element != null && !existenceChecker.isFound()) { existenceChecker.reset() element.accept(existenceChecker) diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/psi/impl/PackageBasedCallChecker.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/psi/impl/PackageBasedCallChecker.kt index e653b58cda5..761ec732248 100644 --- a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/psi/impl/PackageBasedCallChecker.kt +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/psi/impl/PackageBasedCallChecker.kt @@ -13,28 +13,25 @@ import org.jetbrains.kotlin.types.KotlinType */ class PackageBasedCallChecker(private val supportedPackage: String) : StreamCallChecker { override fun isIntermediateCall(expression: KtCallExpression): Boolean { - return checkCallSupported(expression, true, true) + return checkReceiverSupported(expression) && checkResultSupported(expression, true) } override fun isTerminationCall(expression: KtCallExpression): Boolean { - return checkCallSupported(expression, true, false) + return checkReceiverSupported(expression) && checkResultSupported(expression, false) } - private fun checkCallSupported(expression: KtCallExpression, - shouldSupportReceiver: Boolean, - shouldSupportResult: Boolean): Boolean { - val receiverType = expression.receiverType() + private fun checkResultSupported(expression: KtCallExpression, + shouldSupportResult: Boolean): Boolean { val resultType = expression.resolveType() - - return (receiverType == null || // there is no producer or producer is a static method - shouldSupportReceiver == isSupportedType(receiverType)) && shouldSupportResult == isSupportedType(resultType) + return shouldSupportResult == isSupportedType(resultType) } - private fun isSupportedType(type: KotlinType?): Boolean { - if (type == null) { - return false - } + private fun checkReceiverSupported(expression: KtCallExpression): Boolean { + val receiverType = expression.receiverType() + return receiverType != null && isSupportedType(receiverType) + } + private fun isSupportedType(type: KotlinType): Boolean { val typeName = type.getJetTypeFqName(false) return StringUtil.getPackageName(typeName).startsWith(supportedPackage) }