Support chunked operation

This commit is contained in:
Vitaliy.Bibaev
2017-12-21 18:28:38 +03:00
committed by Yan Zhulanow
parent 85d83309ae
commit cc549d3ae5
4 changed files with 55 additions and 18 deletions
@@ -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.
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.lib.IntermediateOperation
import com.intellij.debugger.streams.lib.impl.*
@@ -33,6 +34,7 @@ class KotlinSequencesSupport : LibrarySupportBase() {
addIntermediateOperationsSupport(OrderBasedOperation("zipWithNext", PairMapResolver()))
addIntermediateOperationsSupport(OrderBasedOperation("mapNotNull", MapNotNullResolver()))
addIntermediateOperationsSupport(OrderBasedOperation("chunked", ChunkedResolver()))
}
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
mappings for chunked
direct:
1 -> nothing
2 -> nothing
3 -> nothing
4 -> nothing
6 -> nothing
7 -> nothing
1 -> 5
2 -> 5
3 -> 5
4 -> 5
6 -> 8
7 -> 8
reverse:
nothing <- 5
nothing <- 8
1,2,3,4 <- 5
6,7 <- 8
mappings for count
direct:
5 -> nothing
@@ -30,6 +30,4 @@ mappings for count
empty
Disconnected from the target VM
WRONG!
Process finished with exit code 0
@@ -13,13 +13,13 @@ count
after: nothing
mappings for chunked
direct:
1 -> nothing
2 -> nothing
4 -> nothing
5 -> nothing
1 -> 3
2 -> 3
4 -> 6
5 -> 6
reverse:
nothing <- 3
nothing <- 6
1,2 <- 3
4,5 <- 6
mappings for count
direct:
3 -> nothing
@@ -28,6 +28,4 @@ mappings for count
empty
Disconnected from the target VM
WRONG!
Process finished with exit code 0