Support chunked operation
This commit is contained in:
committed by
Yan Zhulanow
parent
85d83309ae
commit
cc549d3ae5
+2
@@ -1,6 +1,7 @@
|
|||||||
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||||
package com.intellij.debugger.streams.kotlin.lib.sequence
|
package com.intellij.debugger.streams.kotlin.lib.sequence
|
||||||
|
|
||||||
|
import com.intellij.debugger.streams.kotlin.resolve.ChunkedResolver
|
||||||
import com.intellij.debugger.streams.kotlin.resolve.MapNotNullResolver
|
import com.intellij.debugger.streams.kotlin.resolve.MapNotNullResolver
|
||||||
import com.intellij.debugger.streams.lib.IntermediateOperation
|
import com.intellij.debugger.streams.lib.IntermediateOperation
|
||||||
import com.intellij.debugger.streams.lib.impl.*
|
import com.intellij.debugger.streams.lib.impl.*
|
||||||
@@ -33,6 +34,7 @@ class KotlinSequencesSupport : LibrarySupportBase() {
|
|||||||
addIntermediateOperationsSupport(OrderBasedOperation("zipWithNext", PairMapResolver()))
|
addIntermediateOperationsSupport(OrderBasedOperation("zipWithNext", PairMapResolver()))
|
||||||
|
|
||||||
addIntermediateOperationsSupport(OrderBasedOperation("mapNotNull", MapNotNullResolver()))
|
addIntermediateOperationsSupport(OrderBasedOperation("mapNotNull", MapNotNullResolver()))
|
||||||
|
addIntermediateOperationsSupport(OrderBasedOperation("chunked", ChunkedResolver()))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun filterOperations(vararg names: String): Array<IntermediateOperation> =
|
private fun filterOperations(vararg names: String): Array<IntermediateOperation> =
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||||
|
package com.intellij.debugger.streams.kotlin.resolve
|
||||||
|
|
||||||
|
import com.intellij.debugger.streams.resolve.ValuesOrderResolver
|
||||||
|
import com.intellij.debugger.streams.trace.TraceElement
|
||||||
|
import com.intellij.debugger.streams.trace.TraceInfo
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Vitaliy.Bibaev
|
||||||
|
*/
|
||||||
|
class ChunkedResolver : ValuesOrderResolver {
|
||||||
|
override fun resolve(info: TraceInfo): ValuesOrderResolver.Result {
|
||||||
|
val beforeIndex = info.valuesOrderBefore
|
||||||
|
val afterIndex = info.valuesOrderAfter
|
||||||
|
|
||||||
|
val invertedOrder = mutableMapOf<Int, MutableList<Int>>()
|
||||||
|
val beforeTimes = beforeIndex.keys.sorted().toTypedArray()
|
||||||
|
val afterTimes = afterIndex.keys.sorted().toTypedArray()
|
||||||
|
|
||||||
|
var beforeIx = 0
|
||||||
|
for (afterTime in afterTimes) {
|
||||||
|
while (beforeIx < beforeTimes.size && beforeTimes[beforeIx] < afterTime) {
|
||||||
|
invertedOrder.computeIfAbsent(afterTime, { _ -> mutableListOf() }).add(beforeTimes[beforeIx])
|
||||||
|
beforeIx += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val direct = mutableMapOf<TraceElement, List<TraceElement>>()
|
||||||
|
val reverse = mutableMapOf<TraceElement, List<TraceElement>>()
|
||||||
|
for ((timeAfter, elementAfter) in afterIndex) {
|
||||||
|
val before: List<Int> = invertedOrder[timeAfter] ?: emptyList()
|
||||||
|
val beforeElements = before.map { beforeIndex[it]!! }
|
||||||
|
beforeElements.forEach { direct[it] = listOf(elementAfter) }
|
||||||
|
reverse[elementAfter] = beforeElements
|
||||||
|
}
|
||||||
|
|
||||||
|
return ValuesOrderResolver.Result.of(direct, reverse)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,15 +13,15 @@ count
|
|||||||
after: nothing
|
after: nothing
|
||||||
mappings for chunked
|
mappings for chunked
|
||||||
direct:
|
direct:
|
||||||
1 -> nothing
|
1 -> 5
|
||||||
2 -> nothing
|
2 -> 5
|
||||||
3 -> nothing
|
3 -> 5
|
||||||
4 -> nothing
|
4 -> 5
|
||||||
6 -> nothing
|
6 -> 8
|
||||||
7 -> nothing
|
7 -> 8
|
||||||
reverse:
|
reverse:
|
||||||
nothing <- 5
|
1,2,3,4 <- 5
|
||||||
nothing <- 8
|
6,7 <- 8
|
||||||
mappings for count
|
mappings for count
|
||||||
direct:
|
direct:
|
||||||
5 -> nothing
|
5 -> nothing
|
||||||
@@ -30,6 +30,4 @@ mappings for count
|
|||||||
empty
|
empty
|
||||||
Disconnected from the target VM
|
Disconnected from the target VM
|
||||||
|
|
||||||
WRONG!
|
|
||||||
|
|
||||||
Process finished with exit code 0
|
Process finished with exit code 0
|
||||||
|
|||||||
+6
-8
@@ -13,13 +13,13 @@ count
|
|||||||
after: nothing
|
after: nothing
|
||||||
mappings for chunked
|
mappings for chunked
|
||||||
direct:
|
direct:
|
||||||
1 -> nothing
|
1 -> 3
|
||||||
2 -> nothing
|
2 -> 3
|
||||||
4 -> nothing
|
4 -> 6
|
||||||
5 -> nothing
|
5 -> 6
|
||||||
reverse:
|
reverse:
|
||||||
nothing <- 3
|
1,2 <- 3
|
||||||
nothing <- 6
|
4,5 <- 6
|
||||||
mappings for count
|
mappings for count
|
||||||
direct:
|
direct:
|
||||||
3 -> nothing
|
3 -> nothing
|
||||||
@@ -28,6 +28,4 @@ mappings for count
|
|||||||
empty
|
empty
|
||||||
Disconnected from the target VM
|
Disconnected from the target VM
|
||||||
|
|
||||||
WRONG!
|
|
||||||
|
|
||||||
Process finished with exit code 0
|
Process finished with exit code 0
|
||||||
|
|||||||
Reference in New Issue
Block a user