Move stream call checks into separate class
This commit is contained in:
committed by
Yan Zhulanow
parent
64f399235e
commit
6d395dffbb
+2
-1
@@ -1,6 +1,7 @@
|
|||||||
package com.intellij.debugger.streams.kotlin.lib
|
package com.intellij.debugger.streams.kotlin.lib
|
||||||
|
|
||||||
import com.intellij.debugger.streams.kotlin.psi.impl.KotlinJavaStreamChainBuilder
|
import com.intellij.debugger.streams.kotlin.psi.impl.KotlinJavaStreamChainBuilder
|
||||||
|
import com.intellij.debugger.streams.kotlin.psi.impl.PackageBasedCallChecker
|
||||||
import com.intellij.debugger.streams.kotlin.trace.dsl.KotlinStatementFactory
|
import com.intellij.debugger.streams.kotlin.trace.dsl.KotlinStatementFactory
|
||||||
import com.intellij.debugger.streams.kotlin.trace.impl.KotlinTraceExpressionBuilder
|
import com.intellij.debugger.streams.kotlin.trace.impl.KotlinTraceExpressionBuilder
|
||||||
import com.intellij.debugger.streams.lib.LibrarySupport
|
import com.intellij.debugger.streams.lib.LibrarySupport
|
||||||
@@ -16,7 +17,7 @@ import com.intellij.openapi.project.Project
|
|||||||
*/
|
*/
|
||||||
class JavaStandardLibrarySupportProvider : LibrarySupportProvider {
|
class JavaStandardLibrarySupportProvider : LibrarySupportProvider {
|
||||||
private companion object {
|
private companion object {
|
||||||
val builder = KotlinJavaStreamChainBuilder()
|
val builder = KotlinJavaStreamChainBuilder(PackageBasedCallChecker("java.util.stream"))
|
||||||
val support = StandardLibrarySupport()
|
val support = StandardLibrarySupport()
|
||||||
val dsl = DslImpl(KotlinStatementFactory())
|
val dsl = DslImpl(KotlinStatementFactory())
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -1,6 +1,7 @@
|
|||||||
package com.intellij.debugger.streams.kotlin.lib
|
package com.intellij.debugger.streams.kotlin.lib
|
||||||
|
|
||||||
import com.intellij.debugger.streams.kotlin.psi.impl.KotlinJavaStreamChainBuilder
|
import com.intellij.debugger.streams.kotlin.psi.impl.KotlinJavaStreamChainBuilder
|
||||||
|
import com.intellij.debugger.streams.kotlin.psi.impl.PackageBasedCallChecker
|
||||||
import com.intellij.debugger.streams.kotlin.trace.dsl.KotlinStatementFactory
|
import com.intellij.debugger.streams.kotlin.trace.dsl.KotlinStatementFactory
|
||||||
import com.intellij.debugger.streams.kotlin.trace.impl.KotlinTraceExpressionBuilder
|
import com.intellij.debugger.streams.kotlin.trace.impl.KotlinTraceExpressionBuilder
|
||||||
import com.intellij.debugger.streams.lib.LibrarySupport
|
import com.intellij.debugger.streams.lib.LibrarySupport
|
||||||
@@ -16,7 +17,7 @@ import com.intellij.openapi.project.Project
|
|||||||
*/
|
*/
|
||||||
class StreamExLibrarySupportProvider : LibrarySupportProvider {
|
class StreamExLibrarySupportProvider : LibrarySupportProvider {
|
||||||
private companion object {
|
private companion object {
|
||||||
val streamChainBuilder = KotlinJavaStreamChainBuilder()
|
val streamChainBuilder = KotlinJavaStreamChainBuilder(PackageBasedCallChecker("one.util.streamex"))
|
||||||
val support = StreamExLibrarySupport()
|
val support = StreamExLibrarySupport()
|
||||||
val dsl = DslImpl(KotlinStatementFactory())
|
val dsl = DslImpl(KotlinStatementFactory())
|
||||||
val expressionBuilder = KotlinTraceExpressionBuilder(dsl, support.createHandlerFactory(dsl))
|
val expressionBuilder = KotlinTraceExpressionBuilder(dsl, support.createHandlerFactory(dsl))
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.intellij.debugger.streams.kotlin.psi
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Vitaliy.Bibaev
|
||||||
|
*/
|
||||||
|
interface StreamCallChecker {
|
||||||
|
fun isIntermediateCall(expression: KtCallExpression): Boolean
|
||||||
|
fun isTerminationCall(expression: KtCallExpression): Boolean
|
||||||
|
|
||||||
|
fun isStreamCall(expression: KtCallExpression): Boolean = isIntermediateCall(expression) || isTerminationCall(expression)
|
||||||
|
}
|
||||||
+9
-16
@@ -15,10 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.intellij.debugger.streams.kotlin.psi.impl
|
package com.intellij.debugger.streams.kotlin.psi.impl
|
||||||
|
|
||||||
import com.intellij.debugger.streams.kotlin.psi.StreamApiUtil
|
import com.intellij.debugger.streams.kotlin.psi.StreamCallChecker
|
||||||
import com.intellij.openapi.util.text.StringUtil
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
|
||||||
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
|
||||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||||
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
|
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -26,42 +23,38 @@ import java.util.*
|
|||||||
/**
|
/**
|
||||||
* @author Vitaliy.Bibaev
|
* @author Vitaliy.Bibaev
|
||||||
*/
|
*/
|
||||||
class KotlinJavaStreamChainBuilder : KotlinChainBuilderBase(KotlinChainTransformerImpl()) {
|
class KotlinJavaStreamChainBuilder(private val callChecker: StreamCallChecker) : KotlinChainBuilderBase(KotlinChainTransformerImpl()) {
|
||||||
override val existenceChecker: ExistenceChecker = MyExistenceChecker()
|
override val existenceChecker: ExistenceChecker = MyExistenceChecker()
|
||||||
|
|
||||||
override fun createChainsBuilder(): ChainBuilder = MyBuilderVisitor()
|
override fun createChainsBuilder(): ChainBuilder = MyBuilderVisitor()
|
||||||
|
|
||||||
private class MyExistenceChecker : ExistenceChecker() {
|
private inner class MyExistenceChecker : ExistenceChecker() {
|
||||||
override fun visitCallExpression(expression: KtCallExpression) {
|
override fun visitCallExpression(expression: KtCallExpression) {
|
||||||
// TODO: make the check more sophisticated
|
if (callChecker.isTerminationCall(expression)) {
|
||||||
val type = expression.analyze().getType(expression) ?: return
|
|
||||||
|
|
||||||
val name = type.getJetTypeFqName(false)
|
|
||||||
if (StringUtil.getPackageName(name).startsWith("java.util.stream")) {
|
|
||||||
fireElementFound()
|
fireElementFound()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MyBuilderVisitor : ChainBuilder() {
|
private inner class MyBuilderVisitor : ChainBuilder() {
|
||||||
private val myTerminationCalls = mutableSetOf<KtCallExpression>()
|
private val myTerminationCalls = mutableSetOf<KtCallExpression>()
|
||||||
private val myPreviousCalls = mutableMapOf<KtCallExpression, KtCallExpression>()
|
private val myPreviousCalls = mutableMapOf<KtCallExpression, KtCallExpression>()
|
||||||
|
|
||||||
override fun visitCallExpression(expression: KtCallExpression) {
|
override fun visitCallExpression(expression: KtCallExpression) {
|
||||||
super.visitCallExpression(expression)
|
super.visitCallExpression(expression)
|
||||||
if (!myPreviousCalls.containsKey(expression) && StreamApiUtil.isStreamCall(expression)) {
|
if (!myPreviousCalls.containsKey(expression) && callChecker.isStreamCall(expression)) {
|
||||||
updateCallTree(expression)
|
updateCallTree(expression)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateCallTree(expression: KtCallExpression) {
|
private fun updateCallTree(expression: KtCallExpression) {
|
||||||
if (StreamApiUtil.isTerminationStreamCall(expression)) {
|
if (callChecker.isTerminationCall(expression)) {
|
||||||
myTerminationCalls.add(expression)
|
myTerminationCalls.add(expression)
|
||||||
}
|
}
|
||||||
|
|
||||||
val parent = expression.parent as? KtDotQualifiedExpression ?: return
|
val parent = expression.parent as? KtDotQualifiedExpression ?: return
|
||||||
val parentCall = (parent.receiverExpression as? KtDotQualifiedExpression)?.selectorExpression
|
val parentCall = (parent.receiverExpression as? KtDotQualifiedExpression)?.selectorExpression
|
||||||
if (parentCall is KtCallExpression && StreamApiUtil.isStreamCall(parentCall)) {
|
if (parentCall is KtCallExpression && callChecker.isStreamCall(parentCall)) {
|
||||||
myPreviousCalls.put(expression, parentCall)
|
myPreviousCalls.put(expression, parentCall)
|
||||||
updateCallTree(parentCall)
|
updateCallTree(parentCall)
|
||||||
}
|
}
|
||||||
@@ -73,7 +66,7 @@ class KotlinJavaStreamChainBuilder : KotlinChainBuilderBase(KotlinChainTransform
|
|||||||
val chain = ArrayList<KtCallExpression>()
|
val chain = ArrayList<KtCallExpression>()
|
||||||
var current: KtCallExpression? = terminationCall
|
var current: KtCallExpression? = terminationCall
|
||||||
while (current != null) {
|
while (current != null) {
|
||||||
if (StreamApiUtil.isProducerStreamCall(current)) {
|
if (!callChecker.isStreamCall(current)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
chain.add(current)
|
chain.add(current)
|
||||||
|
|||||||
+8
-13
@@ -1,5 +1,8 @@
|
|||||||
package com.intellij.debugger.streams.kotlin.psi
|
package com.intellij.debugger.streams.kotlin.psi.impl
|
||||||
|
|
||||||
|
import com.intellij.debugger.streams.kotlin.psi.StreamCallChecker
|
||||||
|
import com.intellij.debugger.streams.kotlin.psi.receiverType
|
||||||
|
import com.intellij.debugger.streams.kotlin.psi.resolveType
|
||||||
import com.intellij.openapi.util.text.StringUtil
|
import com.intellij.openapi.util.text.StringUtil
|
||||||
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
||||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||||
@@ -8,20 +11,12 @@ import org.jetbrains.kotlin.types.KotlinType
|
|||||||
/**
|
/**
|
||||||
* @author Vitaliy.Bibaev
|
* @author Vitaliy.Bibaev
|
||||||
*/
|
*/
|
||||||
object StreamApiUtil {
|
class PackageBasedCallChecker(private val supportedPackage: String) : StreamCallChecker {
|
||||||
fun isStreamCall(expression: KtCallExpression): Boolean {
|
override fun isIntermediateCall(expression: KtCallExpression): Boolean {
|
||||||
return isIntermediateStreamCall(expression) || isProducerStreamCall(expression) || isTerminationStreamCall(expression)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun isProducerStreamCall(expression: KtCallExpression): Boolean {
|
|
||||||
return checkCallSupported(expression, false, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isIntermediateStreamCall(expression: KtCallExpression): Boolean {
|
|
||||||
return checkCallSupported(expression, true, true)
|
return checkCallSupported(expression, true, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isTerminationStreamCall(expression: KtCallExpression): Boolean {
|
override fun isTerminationCall(expression: KtCallExpression): Boolean {
|
||||||
return checkCallSupported(expression, true, false)
|
return checkCallSupported(expression, true, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,6 +36,6 @@ object StreamApiUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val typeName = type.getJetTypeFqName(false)
|
val typeName = type.getJetTypeFqName(false)
|
||||||
return StringUtil.getPackageName(typeName).startsWith("java.util.stream")
|
return StringUtil.getPackageName(typeName).startsWith(supportedPackage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user