Implement proxy classes for collection handlers

This commit is contained in:
Vitaliy.Bibaev
2017-11-15 19:53:53 +03:00
committed by Yan Zhulanow
parent 8fc64490ca
commit 8d9e348424
4 changed files with 80 additions and 27 deletions
@@ -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<VariableDeclaration>
fun prepareResult(dsl: Dsl, variables: List<Variable>): CodeBlock
fun additionalCallsBefore(call: StreamCall, dsl: Dsl): List<IntermediateStreamCall>
fun additionalCallsAfter(call: StreamCall, dsl: Dsl): List<IntermediateStreamCall>
fun getResultExpression(call: StreamCall, variables: List<Variable>): Expression
fun transformAsIntermediateCall(call: IntermediateStreamCall, dsl: Dsl): IntermediateStreamCall
fun transformAsTerminalCall(call: TerminatorStreamCall, dsl: Dsl): TerminatorStreamCall
}
@@ -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<VariableDeclaration> = internalHandler.variablesDeclaration(call, order, dsl)
protected val variables: List<Variable> = declarations.map(VariableDeclaration::variable)
override fun additionalVariablesDeclaration(): List<VariableDeclaration> = declarations
override fun getResultExpression(): Expression = internalHandler.getResultExpression(call, variables)
}
@@ -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<VariableDeclaration> {
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<IntermediateStreamCall> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
override fun additionalCallsBefore(): List<IntermediateStreamCall> {
return internalHandler.additionalCallsBefore(call, dsl)
}
override fun additionalCallsAfter(): MutableList<IntermediateStreamCall> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
override fun additionalCallsAfter(): List<IntermediateStreamCall> {
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)
}
}
@@ -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<VariableDeclaration> {
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<IntermediateStreamCall> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
override fun additionalCallsBefore(): List<IntermediateStreamCall> =
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<IntermediateStreamCall>): 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
}
}