Add stubs for filter operations

This commit is contained in:
Vitaliy.Bibaev
2017-10-27 19:23:58 +03:00
committed by Yan Zhulanow
parent 385a82567f
commit cd4577ea78
5 changed files with 127 additions and 17 deletions
@@ -1,5 +1,9 @@
package com.intellij.debugger.streams.kotlin.lib
import com.intellij.debugger.streams.kotlin.resolve.FilterOrderResolver
import com.intellij.debugger.streams.kotlin.trace.impl.handler.collections.FilterIntermediateHandler
import com.intellij.debugger.streams.kotlin.trace.impl.handler.collections.FilterTerminatorHandler
import com.intellij.debugger.streams.kotlin.trace.impl.interpret.FilterTraceInterpreter
import com.intellij.debugger.streams.lib.IntermediateOperation
import com.intellij.debugger.streams.lib.TerminalOperation
import com.intellij.debugger.streams.lib.impl.LibrarySupportBase
@@ -16,8 +20,9 @@ import com.intellij.debugger.streams.wrapper.TerminatorStreamCall
*/
class KotlinCollectionLibrarySupport : LibrarySupportBase() {
init {
addIntermediateOperationsSupport()
addTerminationOperationsSupport()
addOperation(FilterOperation("filter",
{ num, call, dsl -> FilterIntermediateHandler(num, call, dsl) },
{ call, resultExpression, dsl -> FilterTerminatorHandler(call, resultExpression, dsl)}))
}
private fun addOperation(operation: CollectionOperation) {
@@ -25,20 +30,24 @@ class KotlinCollectionLibrarySupport : LibrarySupportBase() {
addTerminationOperationsSupport(operation)
}
private class CollectionOperation : IntermediateOperation, TerminalOperation {
override val name: String
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val traceInterpreter: CallTraceInterpreter
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val valuesOrderResolver: ValuesOrderResolver
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
private abstract class CollectionOperation(override val name: String,
private val intermediateHandlerProvider: IntermediateHandlerProvider,
private val terminatorCallProvider: TerminatorHandlerProvider)
: IntermediateOperation, TerminalOperation {
override fun getTraceHandler(callOrder: Int, call: IntermediateStreamCall, dsl: Dsl): IntermediateCallHandler =
intermediateHandlerProvider(callOrder, call, dsl)
override fun getTraceHandler(callOrder: Int, call: IntermediateStreamCall, dsl: Dsl): IntermediateCallHandler {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getTraceHandler(call: TerminatorStreamCall, resultExpression: String, dsl: Dsl): TerminatorCallHandler {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getTraceHandler(call: TerminatorStreamCall, resultExpression: String, dsl: Dsl): TerminatorCallHandler =
terminatorCallProvider(call, resultExpression, dsl)
}
}
private class FilterOperation(name: String, intermediateHandlerProvider: IntermediateHandlerProvider,
terminatorHandlerProvider: TerminatorHandlerProvider)
: CollectionOperation(name, intermediateHandlerProvider, terminatorHandlerProvider) {
override val traceInterpreter: CallTraceInterpreter = FilterTraceInterpreter()
override val valuesOrderResolver: ValuesOrderResolver = FilterOrderResolver()
}
}
private typealias IntermediateHandlerProvider = (Int, IntermediateStreamCall, Dsl) -> IntermediateCallHandler
private typealias TerminatorHandlerProvider = (TerminatorStreamCall, String, Dsl) -> TerminatorCallHandler
@@ -0,0 +1,13 @@
package com.intellij.debugger.streams.kotlin.resolve
import com.intellij.debugger.streams.resolve.ValuesOrderResolver
import com.intellij.debugger.streams.trace.TraceInfo
/**
* @author Vitaliy.Bibaev
*/
class FilterOrderResolver : ValuesOrderResolver {
override fun resolve(info: TraceInfo): ValuesOrderResolver.Result {
return ValuesOrderResolver.Result.of(emptyMap(), emptyMap())
}
}
@@ -0,0 +1,38 @@
package com.intellij.debugger.streams.kotlin.trace.impl.handler.collections
import com.intellij.debugger.streams.trace.dsl.*
import com.intellij.debugger.streams.trace.dsl.impl.TextExpression
import com.intellij.debugger.streams.trace.impl.handler.unified.HandlerBase
import com.intellij.debugger.streams.wrapper.IntermediateStreamCall
/**
* @author Vitaliy.Bibaev
*/
class FilterIntermediateHandler(number: Int, call: IntermediateStreamCall, dsl: Dsl) : HandlerBase.Intermediate(dsl) {
private val itemsMap = dsl.linkedMap(dsl.types.INT, call.typeBefore, "filter${number}ItemsMap")
override fun additionalCallsAfter(): List<IntermediateStreamCall> {
return emptyList()
}
override fun additionalCallsBefore(): List<IntermediateStreamCall> {
return emptyList()
}
override fun transformCall(call: IntermediateStreamCall): IntermediateStreamCall {
// TODO: transform it
return call
}
override fun additionalVariablesDeclaration(): List<VariableDeclaration> {
return listOf(itemsMap.defaultDeclaration())
}
override fun getResultExpression(): Expression {
return dsl.newArray(dsl.types.ANY, TextExpression("values"))
}
override fun prepareResult(): CodeBlock {
return itemsMap.convertToArray(dsl, "values")
}
}
@@ -0,0 +1,28 @@
package com.intellij.debugger.streams.kotlin.trace.impl.handler.collections
import com.intellij.debugger.streams.trace.dsl.CodeBlock
import com.intellij.debugger.streams.trace.dsl.Dsl
import com.intellij.debugger.streams.trace.dsl.Expression
import com.intellij.debugger.streams.trace.dsl.VariableDeclaration
import com.intellij.debugger.streams.trace.dsl.impl.TextExpression
import com.intellij.debugger.streams.trace.impl.handler.unified.HandlerBase
import com.intellij.debugger.streams.wrapper.IntermediateStreamCall
import com.intellij.debugger.streams.wrapper.TerminatorStreamCall
/**
* @author Vitaliy.Bibaev
*/
class FilterTerminatorHandler(call: TerminatorStreamCall, resultExpression: String, dsl: Dsl)
: HandlerBase.Terminal(dsl) {
override fun additionalCallsBefore(): List<IntermediateStreamCall> = emptyList()
override fun additionalVariablesDeclaration(): List<VariableDeclaration> {
return emptyList()
}
override fun getResultExpression(): Expression = TextExpression("1")
override fun prepareResult(): CodeBlock {
return dsl.block { }
}
}
@@ -0,0 +1,22 @@
package com.intellij.debugger.streams.kotlin.trace.impl.interpret
import com.intellij.debugger.streams.trace.CallTraceInterpreter
import com.intellij.debugger.streams.trace.TraceInfo
import com.intellij.debugger.streams.trace.impl.interpret.ValuesOrderInfo
import com.intellij.debugger.streams.trace.impl.interpret.ex.UnexpectedValueTypeException
import com.intellij.debugger.streams.wrapper.StreamCall
import com.sun.jdi.ArrayReference
import com.sun.jdi.Value
/**
* @author Vitaliy.Bibaev
*/
class FilterTraceInterpreter : CallTraceInterpreter {
override fun resolve(call: StreamCall, value: Value): TraceInfo {
if (value !is ArrayReference) throw UnexpectedValueTypeException("array reference excepted, but actual: ${value.type().name()}")
val times = value.getValue(0)
val values = value.getValue(1)
val predicateResults = value.getValue(0)
return ValuesOrderInfo.empty(call)
}
}