From 8fc64490cad66c15821419c920f7faf931fac61d Mon Sep 17 00:00:00 2001 From: "Vitaliy.Bibaev" Date: Wed, 15 Nov 2017 18:12:08 +0300 Subject: [PATCH] Add abstractions to implement handlers for kotlin collections --- .../lib/KotlinCollectionLibrarySupport.kt | 25 +++++------- .../collections/BothSemanticCallWrapper.kt | 21 ++++++++++ .../collections/BothSemanticsHandler.kt | 7 ++++ .../CollectionIntermediateHandler.kt | 38 +++++++++++++++++++ .../CollectionTerminatorHandler.kt | 34 +++++++++++++++++ .../handler/collections/FilterCallHandler.kt | 7 ++++ .../collections/FilterIntermediateHandler.kt | 38 ------------------- .../collections/FilterTerminatorHandler.kt | 28 -------------- 8 files changed, 117 insertions(+), 81 deletions(-) create mode 100644 idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/BothSemanticCallWrapper.kt create mode 100644 idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/BothSemanticsHandler.kt create mode 100644 idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionIntermediateHandler.kt create mode 100644 idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionTerminatorHandler.kt create mode 100644 idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterCallHandler.kt delete mode 100644 idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterIntermediateHandler.kt delete mode 100644 idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterTerminatorHandler.kt 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 286b7d542c3..79f85443e9e 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,8 +1,7 @@ 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.handler.collections.* import com.intellij.debugger.streams.kotlin.trace.impl.interpret.FilterTraceInterpreter import com.intellij.debugger.streams.lib.IntermediateOperation import com.intellij.debugger.streams.lib.TerminalOperation @@ -20,9 +19,7 @@ import com.intellij.debugger.streams.wrapper.TerminatorStreamCall */ class KotlinCollectionLibrarySupport : LibrarySupportBase() { init { - addOperation(FilterOperation("filter", - { num, call, dsl -> FilterIntermediateHandler(num, call, dsl) }, - { call, resultExpression, dsl -> FilterTerminatorHandler(call, resultExpression, dsl)})) + addOperation(FilterOperation("filter", FilterCallHandler())) } private fun addOperation(operation: CollectionOperation) { @@ -31,23 +28,21 @@ class KotlinCollectionLibrarySupport : LibrarySupportBase() { } private abstract class CollectionOperation(override val name: String, - private val intermediateHandlerProvider: IntermediateHandlerProvider, - private val terminatorCallProvider: TerminatorHandlerProvider) + handler: BothSemanticsHandler) : IntermediateOperation, TerminalOperation { + + private val wrapper = BothSemanticCallWrapper(handler) + override fun getTraceHandler(callOrder: Int, call: IntermediateStreamCall, dsl: Dsl): IntermediateCallHandler = - intermediateHandlerProvider(callOrder, call, dsl) + wrapper.createIntermediateHandler(callOrder, call, dsl) override fun getTraceHandler(call: TerminatorStreamCall, resultExpression: String, dsl: Dsl): TerminatorCallHandler = - terminatorCallProvider(call, resultExpression, dsl) + wrapper.createTerminatorHandler(call, resultExpression, dsl) } - private class FilterOperation(name: String, intermediateHandlerProvider: IntermediateHandlerProvider, - terminatorHandlerProvider: TerminatorHandlerProvider) - : CollectionOperation(name, intermediateHandlerProvider, terminatorHandlerProvider) { + private class FilterOperation(name: String, handler: BothSemanticsHandler) + : CollectionOperation(name, handler) { 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/trace/impl/handler/collections/BothSemanticCallWrapper.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/BothSemanticCallWrapper.kt new file mode 100644 index 00000000000..b9df27c3677 --- /dev/null +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/BothSemanticCallWrapper.kt @@ -0,0 +1,21 @@ +package com.intellij.debugger.streams.kotlin.trace.impl.handler.collections + +import com.intellij.debugger.streams.trace.IntermediateCallHandler +import com.intellij.debugger.streams.trace.TerminatorCallHandler +import com.intellij.debugger.streams.trace.dsl.Dsl +import com.intellij.debugger.streams.wrapper.IntermediateStreamCall +import com.intellij.debugger.streams.wrapper.TerminatorStreamCall + +/** + * Unlike java streams, most operations in kotlin collections are intermediate and terminal simultaneously. + * To avoid using of the same code in two places we will implement common logic in the {@link BothSemanticsHandler}. + * + * @author Vitaliy.Bibaev + */ +class BothSemanticCallWrapper(private val handler: BothSemanticsHandler) { + fun createIntermediateHandler(order: Int, call: IntermediateStreamCall, dsl: Dsl): IntermediateCallHandler = + CollectionIntermediateHandler(order, call, dsl, handler) + + fun createTerminatorHandler(call: TerminatorStreamCall, resultExpression: String, dsl: Dsl): TerminatorCallHandler = + CollectionTerminatorHandler(call, resultExpression, dsl, handler) +} diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/BothSemanticsHandler.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/BothSemanticsHandler.kt new file mode 100644 index 00000000000..910ba4a3929 --- /dev/null +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/BothSemanticsHandler.kt @@ -0,0 +1,7 @@ +package com.intellij.debugger.streams.kotlin.trace.impl.handler.collections + +/** + * @author Vitaliy.Bibaev + */ +interface BothSemanticsHandler { +} \ No newline at end of file diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionIntermediateHandler.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionIntermediateHandler.kt new file mode 100644 index 00000000000..199f6a846db --- /dev/null +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionIntermediateHandler.kt @@ -0,0 +1,38 @@ +package com.intellij.debugger.streams.kotlin.trace.impl.handler.collections + +import com.intellij.debugger.streams.trace.IntermediateCallHandler +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.wrapper.IntermediateStreamCall + +/** + * @author Vitaliy.Bibaev + */ +class CollectionIntermediateHandler( + private val order: Int, + private val call: IntermediateStreamCall, + private val dsl: Dsl, + private val internalHandler: BothSemanticsHandler) + : IntermediateCallHandler { + override fun additionalVariablesDeclaration(): MutableList { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun prepareResult(): CodeBlock { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun additionalCallsBefore(): MutableList { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun additionalCallsAfter(): MutableList { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getResultExpression(): Expression { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionTerminatorHandler.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionTerminatorHandler.kt new file mode 100644 index 00000000000..0b67ce87020 --- /dev/null +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionTerminatorHandler.kt @@ -0,0 +1,34 @@ +package com.intellij.debugger.streams.kotlin.trace.impl.handler.collections + +import com.intellij.debugger.streams.trace.TerminatorCallHandler +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.wrapper.IntermediateStreamCall +import com.intellij.debugger.streams.wrapper.TerminatorStreamCall + +/** + * @author Vitaliy.Bibaev + */ +class CollectionTerminatorHandler(private val internalHandler: TerminatorStreamCall, + private val resultExpression: String, + private val dsl: Dsl, + private val handler: BothSemanticsHandler) + : TerminatorCallHandler { + override fun additionalVariablesDeclaration(): MutableList { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun prepareResult(): CodeBlock { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun additionalCallsBefore(): MutableList { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getResultExpression(): Expression { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterCallHandler.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterCallHandler.kt new file mode 100644 index 00000000000..c2aaa218aa8 --- /dev/null +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterCallHandler.kt @@ -0,0 +1,7 @@ +package com.intellij.debugger.streams.kotlin.trace.impl.handler.collections + +/** + * @author Vitaliy.Bibaev + */ +class FilterCallHandler : BothSemanticsHandler { +} \ 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 deleted file mode 100644 index bf673d434c9..00000000000 --- a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterIntermediateHandler.kt +++ /dev/null @@ -1,38 +0,0 @@ -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 deleted file mode 100644 index f9182341b8f..00000000000 --- a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/FilterTerminatorHandler.kt +++ /dev/null @@ -1,28 +0,0 @@ -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