diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/lib/java/JavaStandardLibrarySupportProvider.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/lib/java/JavaStandardLibrarySupportProvider.kt index 5d46af62bdd..dd271c7c5e8 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/lib/java/JavaStandardLibrarySupportProvider.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/lib/java/JavaStandardLibrarySupportProvider.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.idea.debugger.sequence.psi.impl.KotlinChainTransform import org.jetbrains.kotlin.idea.debugger.sequence.psi.impl.PackageBasedCallChecker import org.jetbrains.kotlin.idea.debugger.sequence.psi.impl.TerminatedChainBuilder import org.jetbrains.kotlin.idea.debugger.sequence.psi.java.JavaStreamChainTypeExtractor +import org.jetbrains.kotlin.idea.debugger.sequence.psi.java.StandardLibraryCallChecker import org.jetbrains.kotlin.idea.debugger.sequence.trace.dsl.JavaPeekCallFactory import org.jetbrains.kotlin.idea.debugger.sequence.trace.dsl.KotlinStatementFactory import org.jetbrains.kotlin.idea.debugger.sequence.trace.impl.KotlinTraceExpressionBuilder @@ -21,7 +22,7 @@ class JavaStandardLibrarySupportProvider : LibrarySupportProvider { private companion object { val builder = TerminatedChainBuilder( KotlinChainTransformerImpl(JavaStreamChainTypeExtractor()), - PackageBasedCallChecker("java.util.stream") + StandardLibraryCallChecker(PackageBasedCallChecker("java.util.stream")) ) val support = StandardLibrarySupport() val dsl = DslImpl(KotlinStatementFactory(JavaPeekCallFactory())) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/lib/java/StreamExLibrarySupportProvider.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/lib/java/StreamExLibrarySupportProvider.kt index c743bfd7df1..a5e7e12e24f 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/lib/java/StreamExLibrarySupportProvider.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/lib/java/StreamExLibrarySupportProvider.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.idea.debugger.sequence.psi.impl.KotlinChainTransform import org.jetbrains.kotlin.idea.debugger.sequence.psi.impl.PackageBasedCallChecker import org.jetbrains.kotlin.idea.debugger.sequence.psi.impl.TerminatedChainBuilder import org.jetbrains.kotlin.idea.debugger.sequence.psi.java.JavaStreamChainTypeExtractor +import org.jetbrains.kotlin.idea.debugger.sequence.psi.java.StreamExCallChecker import org.jetbrains.kotlin.idea.debugger.sequence.trace.dsl.JavaPeekCallFactory import org.jetbrains.kotlin.idea.debugger.sequence.trace.dsl.KotlinStatementFactory import org.jetbrains.kotlin.idea.debugger.sequence.trace.impl.KotlinTraceExpressionBuilder @@ -21,7 +22,7 @@ class StreamExLibrarySupportProvider : LibrarySupportProvider { private companion object { val streamChainBuilder = TerminatedChainBuilder( KotlinChainTransformerImpl(JavaStreamChainTypeExtractor()), - PackageBasedCallChecker("one.util.streamex") + StreamExCallChecker(PackageBasedCallChecker("one.util.streamex")) ) val support = StreamExLibrarySupport() val dsl = DslImpl(KotlinStatementFactory(JavaPeekCallFactory())) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/CallCheckerWithNameHeuristics.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/CallCheckerWithNameHeuristics.kt new file mode 100644 index 00000000000..81e6d8b2d90 --- /dev/null +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/CallCheckerWithNameHeuristics.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.debugger.sequence.psi + +import org.jetbrains.kotlin.idea.debugger.sequence.psi.sequence.SequenceCallCheckerWithNameHeuristics +import org.jetbrains.kotlin.psi.KtCallExpression + +abstract class CallCheckerWithNameHeuristics(private val nestedChecker: StreamCallChecker) : StreamCallChecker { + override fun isIntermediateCall(expression: KtCallExpression): Boolean = nestedChecker.isIntermediateCall(expression) + + override fun isTerminationCall(expression: KtCallExpression): Boolean { + val name = expression.calleeExpression?.text + if (name != null) { + return isTerminalCallName(name) && nestedChecker.isTerminationCall(expression) + } + + return nestedChecker.isTerminationCall(expression) + } + + abstract fun isTerminalCallName(callName: String): Boolean +} \ No newline at end of file diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/java/StandardLibraryCallChecker.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/java/StandardLibraryCallChecker.kt new file mode 100644 index 00000000000..39e18dcf8a8 --- /dev/null +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/java/StandardLibraryCallChecker.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.debugger.sequence.psi.java + +import org.jetbrains.kotlin.idea.debugger.sequence.psi.CallCheckerWithNameHeuristics +import org.jetbrains.kotlin.idea.debugger.sequence.psi.StreamCallChecker + +class StandardLibraryCallChecker(nestedChecker: StreamCallChecker) : CallCheckerWithNameHeuristics(nestedChecker) { + private companion object { + val TERMINATION_CALLS: Set = setOf( + "forEach", "toArray", "reduce", "collect", "min", "max", "count", "sum", "anyMatch", "allMatch", "noneMatch", "findFirst", + "findAny", "forEachOrdered", "average", "summaryStatistics" + ) + } + + override fun isTerminalCallName(callName: String): Boolean = TERMINATION_CALLS.contains(callName) +} \ No newline at end of file diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/java/StreamExCallChecker.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/java/StreamExCallChecker.kt new file mode 100644 index 00000000000..3d37d6e0eab --- /dev/null +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/java/StreamExCallChecker.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.debugger.sequence.psi.java + +import org.jetbrains.kotlin.idea.debugger.sequence.psi.CallCheckerWithNameHeuristics +import org.jetbrains.kotlin.idea.debugger.sequence.psi.StreamCallChecker + +class StreamExCallChecker(nestedChecker: StreamCallChecker): CallCheckerWithNameHeuristics(nestedChecker) { + private companion object { + val TERMINATION_CALLS: Set = setOf( + "forEach", "toArray", "reduce", "collect", "min", "max", "count", "sum", "anyMatch", "allMatch", "noneMatch", "findFirst", + "findAny", "forEachOrdered", "average", "summaryStatistics", "toList", "toSet", "toCollection", "toListAndThen", "toSetAndThen", + "toImmutableList", "toImmutableSet", "toMap", "toSortedMap", "toNavigableMap", "toImmutableMap", "toMapAndThen", "toCustomMap", + "partitioningBy", "partitioningTo", "groupingBy", "groupingTo", "grouping", "joining", "toFlatList", "toFlatCollection", + "maxBy", "maxByInt", "maxByLong", "maxByDouble", "minBy", "minByInt", "minByLong", "minByDouble", "has", "indexOf", "foldLeft", + "foldRight", "scanLeft", "scanRight", "toByteArray", "toCharArray", "toShortArray", "toBitSet", "toFloatArray", "charsToString", + "codePointsToString", "forPairs", "forKeyValue", "asByteInputStream", "into" + ) + } + + override fun isTerminalCallName(callName: String): Boolean = TERMINATION_CALLS.contains(callName) +} \ No newline at end of file diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/sequence/SequenceCallCheckerWithNameHeuristics.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/sequence/SequenceCallCheckerWithNameHeuristics.kt index 1018f2eb6b1..a3b816cef69 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/sequence/SequenceCallCheckerWithNameHeuristics.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/sequence/psi/sequence/SequenceCallCheckerWithNameHeuristics.kt @@ -5,11 +5,12 @@ package org.jetbrains.kotlin.idea.debugger.sequence.psi.sequence +import org.jetbrains.kotlin.idea.debugger.sequence.psi.CallCheckerWithNameHeuristics import org.jetbrains.kotlin.idea.debugger.sequence.psi.StreamCallChecker -import org.jetbrains.kotlin.psi.KtCallExpression -class SequenceCallCheckerWithNameHeuristics(private val nestedChecker: StreamCallChecker) : StreamCallChecker { +class SequenceCallCheckerWithNameHeuristics(nestedChecker: StreamCallChecker) : CallCheckerWithNameHeuristics(nestedChecker) { private companion object { + val TERMINATION_CALLS: Set = setOf( "all", "any", "associate", "associateBy", "associateByTo", "associateTo", "average", "chunked", "contains", "count", "distinct", "distinctBy", "elementAt", "elementAtOrElse", "elementAtOrNull", "find", "findLast", "first", "firstOrNull", "fold", @@ -20,16 +21,5 @@ class SequenceCallCheckerWithNameHeuristics(private val nestedChecker: StreamCal ) } - override fun isIntermediateCall(expression: KtCallExpression): Boolean { - return nestedChecker.isIntermediateCall(expression) - } - - override fun isTerminationCall(expression: KtCallExpression): Boolean { - val name = expression.calleeExpression?.text - if (name != null) { - return TERMINATION_CALLS.contains(name) && nestedChecker.isTerminationCall(expression) - } - - return nestedChecker.isTerminationCall(expression) - } -} \ No newline at end of file + override fun isTerminalCallName(callName: String): Boolean = TERMINATION_CALLS.contains(callName) +}