diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/lib/KotlinCollectionLibrarySupport.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/lib/KotlinCollectionLibrarySupport.kt index 9086236196f..286b7d542c3 100644 --- a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/lib/KotlinCollectionLibrarySupport.kt +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/lib/KotlinCollectionLibrarySupport.kt @@ -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) } -} \ No newline at end of file + + 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 diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/resolve/FilterOrderResolver.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/resolve/FilterOrderResolver.kt new file mode 100644 index 00000000000..5a0401e36ca --- /dev/null +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/resolve/FilterOrderResolver.kt @@ -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()) + } +} \ No newline at end of file diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterIntermediateHandler.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterIntermediateHandler.kt new file mode 100644 index 00000000000..bf673d434c9 --- /dev/null +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterIntermediateHandler.kt @@ -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 { + return emptyList() + } + + override fun additionalCallsBefore(): List { + return emptyList() + } + + override fun transformCall(call: IntermediateStreamCall): IntermediateStreamCall { + // TODO: transform it + return call + } + + override fun additionalVariablesDeclaration(): List { + 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") + } + +} \ No newline at end of file diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterTerminatorHandler.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterTerminatorHandler.kt new file mode 100644 index 00000000000..f9182341b8f --- /dev/null +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterTerminatorHandler.kt @@ -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 = emptyList() + + override fun additionalVariablesDeclaration(): List { + return emptyList() + } + + override fun getResultExpression(): Expression = TextExpression("1") + + override fun prepareResult(): CodeBlock { + return dsl.block { } + } +} \ No newline at end of file diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/interpret/FilterTraceInterpreter.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/interpret/FilterTraceInterpreter.kt new file mode 100644 index 00000000000..e7b4573f8e2 --- /dev/null +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/interpret/FilterTraceInterpreter.kt @@ -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) + } +} \ No newline at end of file