Simplify checks that stream chain exists

This commit is contained in:
Vitaliy.Bibaev
2017-10-14 19:12:37 +03:00
committed by Yan Zhulanow
parent 6d395dffbb
commit 5fe0f167ca
2 changed files with 12 additions and 14 deletions
@@ -29,7 +29,8 @@ abstract class KotlinChainBuilderBase(private val transformer: ChainTransformer<
protected abstract val existenceChecker: ExistenceChecker protected abstract val existenceChecker: ExistenceChecker
override fun isChainExists(startElement: PsiElement): Boolean { 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()) { while (element != null && !existenceChecker.isFound()) {
existenceChecker.reset() existenceChecker.reset()
element.accept(existenceChecker) element.accept(existenceChecker)
@@ -13,28 +13,25 @@ import org.jetbrains.kotlin.types.KotlinType
*/ */
class PackageBasedCallChecker(private val supportedPackage: String) : StreamCallChecker { class PackageBasedCallChecker(private val supportedPackage: String) : StreamCallChecker {
override fun isIntermediateCall(expression: KtCallExpression): Boolean { override fun isIntermediateCall(expression: KtCallExpression): Boolean {
return checkCallSupported(expression, true, true) return checkReceiverSupported(expression) && checkResultSupported(expression, true)
} }
override fun isTerminationCall(expression: KtCallExpression): Boolean { override fun isTerminationCall(expression: KtCallExpression): Boolean {
return checkCallSupported(expression, true, false) return checkReceiverSupported(expression) && checkResultSupported(expression, false)
} }
private fun checkCallSupported(expression: KtCallExpression, private fun checkResultSupported(expression: KtCallExpression,
shouldSupportReceiver: Boolean, shouldSupportResult: Boolean): Boolean {
shouldSupportResult: Boolean): Boolean {
val receiverType = expression.receiverType()
val resultType = expression.resolveType() val resultType = expression.resolveType()
return shouldSupportResult == isSupportedType(resultType)
return (receiverType == null || // there is no producer or producer is a static method
shouldSupportReceiver == isSupportedType(receiverType)) && shouldSupportResult == isSupportedType(resultType)
} }
private fun isSupportedType(type: KotlinType?): Boolean { private fun checkReceiverSupported(expression: KtCallExpression): Boolean {
if (type == null) { val receiverType = expression.receiverType()
return false return receiverType != null && isSupportedType(receiverType)
} }
private fun isSupportedType(type: KotlinType): Boolean {
val typeName = type.getJetTypeFqName(false) val typeName = type.getJetTypeFqName(false)
return StringUtil.getPackageName(typeName).startsWith(supportedPackage) return StringUtil.getPackageName(typeName).startsWith(supportedPackage)
} }