From 8d9e348424e48a43636d2c80d7cd229358b4caf2 Mon Sep 17 00:00:00 2001 From: "Vitaliy.Bibaev" Date: Wed, 15 Nov 2017 19:53:53 +0300 Subject: [PATCH] Implement proxy classes for collection handlers --- .../collections/BothSemanticsHandler.kt | 18 +++++++++ .../collections/CollectionHandlerBase.kt | 22 +++++++++++ .../CollectionIntermediateHandler.kt | 28 +++++++------ .../CollectionTerminatorHandler.kt | 39 +++++++++++++------ 4 files changed, 80 insertions(+), 27 deletions(-) create mode 100644 idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionHandlerBase.kt 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 index 910ba4a3929..19301d1212e 100644 --- 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 @@ -1,7 +1,25 @@ package com.intellij.debugger.streams.kotlin.trace.impl.handler.collections +import com.intellij.debugger.streams.trace.dsl.* +import com.intellij.debugger.streams.wrapper.IntermediateStreamCall +import com.intellij.debugger.streams.wrapper.StreamCall +import com.intellij.debugger.streams.wrapper.TerminatorStreamCall + /** * @author Vitaliy.Bibaev */ interface BothSemanticsHandler { + fun variablesDeclaration(call: StreamCall, order: Int, dsl: Dsl): List + + fun prepareResult(dsl: Dsl, variables: List): CodeBlock + + fun additionalCallsBefore(call: StreamCall, dsl: Dsl): List + + fun additionalCallsAfter(call: StreamCall, dsl: Dsl): List + + fun getResultExpression(call: StreamCall, variables: List): Expression + + fun transformAsIntermediateCall(call: IntermediateStreamCall, dsl: Dsl): IntermediateStreamCall + + fun transformAsTerminalCall(call: TerminatorStreamCall, dsl: Dsl): TerminatorStreamCall } \ No newline at end of file diff --git a/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionHandlerBase.kt b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionHandlerBase.kt new file mode 100644 index 00000000000..7e0527fd255 --- /dev/null +++ b/idea/idea-jvm/src/com/intellij/debugger/streams/kotlin/trace/impl/handler/collections/CollectionHandlerBase.kt @@ -0,0 +1,22 @@ +package com.intellij.debugger.streams.kotlin.trace.impl.handler.collections + +import com.intellij.debugger.streams.trace.TraceHandler +import com.intellij.debugger.streams.trace.dsl.Dsl +import com.intellij.debugger.streams.trace.dsl.Expression +import com.intellij.debugger.streams.trace.dsl.Variable +import com.intellij.debugger.streams.trace.dsl.VariableDeclaration +import com.intellij.debugger.streams.wrapper.StreamCall + +/** + * @author Vitaliy.Bibaev + */ +abstract class CollectionHandlerBase(order: Int, dsl: Dsl, + private val call: StreamCall, private val internalHandler: BothSemanticsHandler) + : TraceHandler { + private val declarations: List = internalHandler.variablesDeclaration(call, order, dsl) + protected val variables: List = declarations.map(VariableDeclaration::variable) + + override fun additionalVariablesDeclaration(): List = declarations + + override fun getResultExpression(): Expression = internalHandler.getResultExpression(call, variables) +} \ 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 index 199f6a846db..e47e77359da 100644 --- 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 @@ -1,38 +1,36 @@ 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.trace.dsl.* import com.intellij.debugger.streams.wrapper.IntermediateStreamCall /** * @author Vitaliy.Bibaev */ class CollectionIntermediateHandler( - private val order: Int, + 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. - } + : IntermediateCallHandler, CollectionHandlerBase(order, dsl, call, internalHandler) { override fun prepareResult(): CodeBlock { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + return internalHandler.prepareResult(dsl, variables) } - override fun additionalCallsBefore(): MutableList { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + override fun additionalCallsBefore(): List { + return internalHandler.additionalCallsBefore(call, dsl) } - override fun additionalCallsAfter(): MutableList { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + override fun additionalCallsAfter(): List { + return internalHandler.additionalCallsAfter(call, dsl) + } + + override fun transformCall(call: IntermediateStreamCall): IntermediateStreamCall { + return internalHandler.transformAsIntermediateCall(call, dsl) } override fun getResultExpression(): Expression { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + return internalHandler.getResultExpression(call, variables) } } \ 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 index 0b67ce87020..61bba089836 100644 --- 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 @@ -4,31 +4,46 @@ 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.trace.dsl.impl.TextExpression import com.intellij.debugger.streams.wrapper.IntermediateStreamCall import com.intellij.debugger.streams.wrapper.TerminatorStreamCall /** * @author Vitaliy.Bibaev */ -class CollectionTerminatorHandler(private val internalHandler: TerminatorStreamCall, +class CollectionTerminatorHandler(private val call: 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. - } + private val internalHandler: BothSemanticsHandler) + : TerminatorCallHandler, CollectionHandlerBase(Int.MAX_VALUE, dsl, call, internalHandler) { override fun prepareResult(): CodeBlock { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + val prepareResult = internalHandler.prepareResult(dsl, variables) + val additionalCallsAfter = internalHandler.additionalCallsAfter(call, dsl) + if (additionalCallsAfter.isEmpty()) { + return prepareResult + } + + return dsl.block { + +createCallAfterExpression(additionalCallsAfter) + add(prepareResult) + } } - override fun additionalCallsBefore(): MutableList { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + override fun additionalCallsBefore(): List = + internalHandler.additionalCallsBefore(call, dsl) + + override fun transformCall(call: TerminatorStreamCall): TerminatorStreamCall { + return internalHandler.transformAsTerminalCall(call, dsl) } - override fun getResultExpression(): Expression { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + private fun createCallAfterExpression(additionalCallsAfter: List): Expression { + var result: Expression = TextExpression(resultExpression) + for (call in additionalCallsAfter) { + val args = call.arguments.map { TextExpression(it.text) }.toTypedArray() + result = result.call(call.name, *args) + } + + return result } } \ No newline at end of file