@@ -2,26 +2,38 @@ package org.utbot.framework.concrete
2
2
3
3
import org.utbot.framework.plugin.api.ClassId
4
4
import org.utbot.framework.plugin.api.MethodId
5
+ import org.utbot.framework.plugin.api.UtArrayModel
5
6
import org.utbot.framework.plugin.api.UtAssembleModel
6
7
import 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
7
11
import org.utbot.framework.plugin.api.UtStatementModel
12
+ import org.utbot.framework.plugin.api.util.defaultValueModel
8
13
import org.utbot.framework.plugin.api.util.doubleArrayClassId
9
14
import org.utbot.framework.plugin.api.util.doubleStreamClassId
10
15
import org.utbot.framework.plugin.api.util.intArrayClassId
11
16
import org.utbot.framework.plugin.api.util.intStreamClassId
17
+ import org.utbot.framework.plugin.api.util.isPrimitiveWrapper
12
18
import org.utbot.framework.plugin.api.util.longArrayClassId
13
19
import org.utbot.framework.plugin.api.util.longStreamClassId
14
20
import org.utbot.framework.plugin.api.util.methodId
15
21
import org.utbot.framework.plugin.api.util.objectArrayClassId
16
22
import org.utbot.framework.plugin.api.util.streamClassId
23
+ import org.utbot.framework.util.modelIdCounter
17
24
import org.utbot.framework.util.valueToClassId
18
25
19
26
/* *
20
27
* Max number of elements in any concrete stream.
21
28
*/
22
29
private const val STREAM_ELEMENTS_LIMIT : Int = 1_000_000
23
30
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
+
25
37
override fun provideInstantiationCall (
26
38
internalConstructor : UtModelConstructorInterface ,
27
39
value : Any ,
@@ -46,10 +58,18 @@ internal abstract class AbstractStreamConstructor(private val streamClassId: Cla
46
58
)
47
59
}
48
60
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
+
49
69
return UtExecutableCallModel (
50
70
instance = null ,
51
71
executable = ofMethodId,
52
- params = models
72
+ params = listOf (varargModelsArray)
53
73
)
54
74
}
55
75
@@ -71,6 +91,30 @@ internal abstract class AbstractStreamConstructor(private val streamClassId: Cla
71
91
returnType = this .streamClassId,
72
92
arguments = arrayOf(elementsClassId) // vararg
73
93
)
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
+ }
74
118
}
75
119
76
120
internal class BaseStreamConstructor : AbstractStreamConstructor (streamClassId, objectArrayClassId)
0 commit comments