@@ -2,26 +2,38 @@ package org.utbot.framework.concrete
22
33import org.utbot.framework.plugin.api.ClassId
44import org.utbot.framework.plugin.api.MethodId
5+ import org.utbot.framework.plugin.api.UtArrayModel
56import org.utbot.framework.plugin.api.UtAssembleModel
67import org.utbot.framework.plugin.api.UtExecutableCallModel
8+ import org.utbot.framework.plugin.api.UtModel
9+ import org.utbot.framework.plugin.api.UtNullModel
10+ import org.utbot.framework.plugin.api.UtPrimitiveModel
711import org.utbot.framework.plugin.api.UtStatementModel
12+ import org.utbot.framework.plugin.api.util.defaultValueModel
813import org.utbot.framework.plugin.api.util.doubleArrayClassId
914import org.utbot.framework.plugin.api.util.doubleStreamClassId
1015import org.utbot.framework.plugin.api.util.intArrayClassId
1116import org.utbot.framework.plugin.api.util.intStreamClassId
17+ import org.utbot.framework.plugin.api.util.isPrimitiveWrapper
1218import org.utbot.framework.plugin.api.util.longArrayClassId
1319import org.utbot.framework.plugin.api.util.longStreamClassId
1420import org.utbot.framework.plugin.api.util.methodId
1521import org.utbot.framework.plugin.api.util.objectArrayClassId
1622import org.utbot.framework.plugin.api.util.streamClassId
23+ import org.utbot.framework.util.modelIdCounter
1724import org.utbot.framework.util.valueToClassId
1825
1926/* *
2027 * Max number of elements in any concrete stream.
2128 */
2229private const val STREAM_ELEMENTS_LIMIT : Int = 1_000_000
2330
24- internal abstract class AbstractStreamConstructor (private val streamClassId : ClassId , elementsClassId : ClassId ) : UtAssembleModelConstructorBase() {
31+ internal abstract class AbstractStreamConstructor (private val streamClassId : ClassId , private val elementsClassId : ClassId ) : UtAssembleModelConstructorBase() {
32+ private val singleElementClassId: ClassId = elementsClassId.elementClassId
33+ ? : error(" Stream $streamClassId elements have to be an array but $elementsClassId found" )
34+
35+ private val elementDefaultValueModel: UtModel = singleElementClassId.defaultValueModel()
36+
2537 override fun provideInstantiationCall (
2638 internalConstructor : UtModelConstructorInterface ,
2739 value : Any ,
@@ -46,10 +58,18 @@ internal abstract class AbstractStreamConstructor(private val streamClassId: Cla
4658 )
4759 }
4860
61+ val varargModelsArray = UtArrayModel (
62+ id = modelIdCounter.incrementAndGet(),
63+ classId = elementsClassId,
64+ length = models.size,
65+ constModel = elementDefaultValueModel,
66+ stores = models.mapIndexed { i, model -> i to model.wrapperModelToPrimitiveModel() }.toMap(mutableMapOf ())
67+ )
68+
4969 return UtExecutableCallModel (
5070 instance = null ,
5171 executable = ofMethodId,
52- params = models
72+ params = listOf (varargModelsArray)
5373 )
5474 }
5575
@@ -71,6 +91,30 @@ internal abstract class AbstractStreamConstructor(private val streamClassId: Cla
7191 returnType = this .streamClassId,
7292 arguments = arrayOf(elementsClassId) // vararg
7393 )
94+
95+ /* *
96+ * Transforms [this] to [UtPrimitiveModel] if it is an [UtAssembleModel] for the corresponding wrapper
97+ * (primitive int and wrapper Integer, etc.), and throws an error otherwise.
98+ */
99+ private fun UtModel.wrapperModelToPrimitiveModel (): UtModel {
100+ if (! classId.isPrimitiveWrapper) {
101+ // We do not need to transform classes other than primitive wrappers
102+ return this
103+ }
104+
105+ require(this !is UtNullModel ) {
106+ " Unexpected null value in wrapper for primitive stream ${this @AbstractStreamConstructor} "
107+ }
108+
109+ require(this is UtAssembleModel ) {
110+ " Unexpected not wrapper assemble model $this for value in wrapper " +
111+ " for primitive stream ${this @AbstractStreamConstructor.streamClassId} "
112+ }
113+
114+ return (instantiationCall.params.firstOrNull() as ? UtPrimitiveModel )
115+ ? : error(" No primitive value parameter for wrapper constructor $instantiationCall in model $this " +
116+ " in wrapper for primitive stream ${this @AbstractStreamConstructor.streamClassId} " )
117+ }
74118}
75119
76120internal class BaseStreamConstructor : AbstractStreamConstructor (streamClassId, objectArrayClassId)
0 commit comments