Skip to content

Commit 0e8827e

Browse files
Refactor: UtExecutableCallModel
1 parent 0e7c50a commit 0e8827e

File tree

22 files changed

+116
-128
lines changed

22 files changed

+116
-128
lines changed

utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/Api.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,6 @@ data class UtExecutableCallModel(
568568
override val instance: UtReferenceModel?,
569569
val executable: ExecutableId,
570570
val params: List<UtModel>,
571-
val returnValue: UtReferenceModel? = null,
572571
) : UtStatementModel(instance) {
573572
override fun toString() = withToStringThreadLocalReentrancyGuard {
574573
buildString {
@@ -578,9 +577,7 @@ data class UtExecutableCallModel(
578577
is MethodId -> executable.name
579578
}
580579

581-
if (returnValue != null) {
582-
append("val ${returnValue.modelName} = ")
583-
} else if (instance != null) {
580+
if (instance != null) {
584581
append("${instance.modelName}.")
585582
}
586583

utbot-framework/src/main/kotlin/org/utbot/engine/CollectionWrappers.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,7 @@ abstract class BaseContainerWrapper(containerClassName: String) : BaseOverridden
127127
instantiationChain += UtExecutableCallModel(
128128
instance = null,
129129
executable = constructorId(classId),
130-
params = emptyList(),
131-
returnValue = this
130+
params = emptyList()
132131
)
133132

134133
modificationsChain += parameterModels.map {

utbot-framework/src/main/kotlin/org/utbot/engine/ObjectWrappers.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,12 +245,11 @@ data class ThrowableWrapper(val throwable: Throwable) : WrapperInterface {
245245
return UtAssembleModel(addr, classId, modelName, instantiationChain)
246246
.apply {
247247
instantiationChain += when (val message = throwable.message) {
248-
null -> UtExecutableCallModel(null, constructorId(classId), emptyList(), this)
248+
null -> UtExecutableCallModel(null, constructorId(classId), emptyList())
249249
else -> UtExecutableCallModel(
250250
null,
251251
constructorId(classId, stringClassId),
252-
listOf(UtPrimitiveModel(message)),
253-
this,
252+
listOf(UtPrimitiveModel(message))
254253
)
255254
}
256255
}

utbot-framework/src/main/kotlin/org/utbot/engine/OptionalWrapper.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,11 @@ class OptionalWrapper(private val utOptionalClass: UtOptionalClass) : BaseOverri
9494
val modificationsChain = mutableListOf<UtStatementModel>()
9595
return UtAssembleModel(addr, classId, modelName, instantiationChain, modificationsChain)
9696
.apply {
97-
instantiationChain += instantiationFactoryCallModel(classId, wrapper, this)
97+
instantiationChain += instantiationFactoryCallModel(classId, wrapper)
9898
}
9999
}
100100

101-
private fun Resolver.instantiationFactoryCallModel(classId: ClassId, wrapper: ObjectValue, model: UtAssembleModel) : UtExecutableCallModel {
101+
private fun Resolver.instantiationFactoryCallModel(classId: ClassId, wrapper: ObjectValue) : UtExecutableCallModel {
102102
val valueField = FieldId(overriddenClass.id, "value")
103103
val isPresentFieldId = FieldId(overriddenClass.id, "isPresent")
104104
val values = collectFieldModels(wrapper.addr, overriddenClass.type)
@@ -115,7 +115,7 @@ class OptionalWrapper(private val utOptionalClass: UtOptionalClass) : BaseOverri
115115
"empty",
116116
classId,
117117
emptyList()
118-
), emptyList(), model
118+
), emptyList()
119119
)
120120
} else {
121121
UtExecutableCallModel(
@@ -124,7 +124,7 @@ class OptionalWrapper(private val utOptionalClass: UtOptionalClass) : BaseOverri
124124
"of",
125125
classId,
126126
listOf(utOptionalClass.elementClassId)
127-
), listOf(valueModel), model
127+
), listOf(valueModel)
128128
)
129129
}
130130
}

utbot-framework/src/main/kotlin/org/utbot/engine/Resolver.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ class Resolver(
553553
val instantiationChain = mutableListOf<UtExecutableCallModel>()
554554
UtAssembleModel(addr, classId, nextModelName(baseModelName), instantiationChain)
555555
.apply {
556-
instantiationChain += UtExecutableCallModel(null, constructorId, listOf(valueModel), this)
556+
instantiationChain += UtExecutableCallModel(null, constructorId, listOf(valueModel))
557557
}
558558
}
559559
}

utbot-framework/src/main/kotlin/org/utbot/engine/StreamWrappers.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@ abstract class StreamWrapper(
7575
instantiationChain += UtExecutableCallModel(
7676
instance = null,
7777
executable = builder,
78-
params = params,
79-
returnValue = this
78+
params = params
8079
)
8180
}
8281
}

utbot-framework/src/main/kotlin/org/utbot/engine/Strings.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,7 @@ class StringWrapper : BaseOverriddenWrapper(utStringClass.name) {
186186
instantiationChain += UtExecutableCallModel(
187187
instance = null,
188188
constructorId(classId, STRING_TYPE.classId),
189-
listOf(stringModel),
190-
this
189+
listOf(stringModel)
191190
)
192191
}
193192
}
@@ -342,8 +341,7 @@ sealed class UtAbstractStringBuilderWrapper(className: String) : BaseOverriddenW
342341
instantiationChain += UtExecutableCallModel(
343342
instance = null,
344343
constructorId,
345-
listOf(stringModel),
346-
this
344+
listOf(stringModel)
347345
)
348346
}
349347
}

utbot-framework/src/main/kotlin/org/utbot/engine/ValueConstructor.kt

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -328,15 +328,21 @@ class ValueConstructor {
328328
private fun constructFromAssembleModel(assembleModel: UtAssembleModel): Any {
329329
constructedObjects[assembleModel]?.let { return it }
330330

331-
assembleModel.allStatementsChain.forEach { statementModel ->
331+
val instantiationExecutableCall = assembleModel.instantiationChain.single() as UtExecutableCallModel
332+
val result = updateWithExecutableCallModel(instantiationExecutableCall)
333+
checkNotNull(result) {
334+
"Tracked instance can't be null for call ${instantiationExecutableCall.executable} in model $assembleModel"
335+
}
336+
constructedObjects[assembleModel] = result
337+
338+
assembleModel.modificationsChain.forEach { statementModel ->
332339
when (statementModel) {
333-
is UtExecutableCallModel -> updateWithExecutableCallModel(statementModel, assembleModel)
340+
is UtExecutableCallModel -> updateWithExecutableCallModel(statementModel)
334341
is UtDirectSetFieldModel -> updateWithDirectSetFieldModel(statementModel)
335342
}
336343
}
337344

338-
return constructedObjects[assembleModel]
339-
?: error("Can't assemble model: $assembleModel")
345+
return constructedObjects[assembleModel] ?: error("Can't assemble model: $assembleModel")
340346
}
341347

342348
private fun constructFromLambdaModel(lambdaModel: UtLambdaModel): Any {
@@ -366,12 +372,13 @@ class ValueConstructor {
366372
}
367373

368374
/**
369-
* Updates instance state with [UtExecutableCallModel] invocation.
375+
* Updates instance state with [callModel] invocation.
376+
*
377+
* @return the result of [callModel] invocation
370378
*/
371379
private fun updateWithExecutableCallModel(
372380
callModel: UtExecutableCallModel,
373-
assembleModel: UtAssembleModel,
374-
) {
381+
): Any? {
375382
val executable = callModel.executable
376383
val instanceValue = callModel.instance?.let { value(it) }
377384
val params = callModel.params.map { value(it) }
@@ -381,15 +388,7 @@ class ValueConstructor {
381388
is ConstructorId -> executable.call(params)
382389
}
383390

384-
// Ignore result if returnId is null. Otherwise add it to instance cache.
385-
callModel.returnValue?.let {
386-
checkNotNull(result) { "Tracked instance can't be null for call $executable in model $assembleModel" }
387-
388-
//If statement is final instantiating, add result to constructed objects cache
389-
if (callModel == assembleModel.finalInstantiationModel) {
390-
constructedObjects[assembleModel] = result
391-
}
392-
}
391+
return result
393392
}
394393

395394
/**

utbot-framework/src/main/kotlin/org/utbot/framework/assemble/AssembleModelGenerator.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ class AssembleModelGenerator(private val methodPackageName: String) {
251251
val constructorInfo = constructorAnalyzer.analyze(constructorId)
252252

253253
instantiatedModels[compositeModel] = this
254-
instantiationChain += constructorCall(compositeModel, this, constructorInfo)
254+
instantiationChain += constructorCall(compositeModel, constructorInfo)
255255

256256
compositeModel.fields.forEach { (fieldId, fieldModel) ->
257257
if (fieldId.isStatic) {
@@ -342,7 +342,6 @@ class AssembleModelGenerator(private val methodPackageName: String) {
342342
*/
343343
private fun constructorCall(
344344
compositeModel: UtCompositeModel,
345-
instance: UtAssembleModel,
346345
constructorInfo: ConstructorAssembleInfo,
347346
): UtExecutableCallModel {
348347
val constructorParams = constructorInfo.constructorId.parameters.withIndex()
@@ -355,7 +354,7 @@ class AssembleModelGenerator(private val methodPackageName: String) {
355354
assembleModel(fieldModel)
356355
}
357356

358-
return UtExecutableCallModel(null, constructorInfo.constructorId, constructorParams, instance)
357+
return UtExecutableCallModel(null, constructorInfo.constructorId, constructorParams)
359358
}
360359

361360
/**

utbot-framework/src/main/kotlin/org/utbot/framework/assemble/AssemblePrimitiveWrapper.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ fun assemble(model: UtPrimitiveModel): UtAssembleModel {
3737
instance = null,
3838
executable = constructorCall.executableId,
3939
params = listOf(model),
40-
returnValue = null,
4140
)
4241

4342
return UtAssembleModel(

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/tree/CgVariableConstructor.kt

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import org.utbot.framework.codegen.model.constructor.util.typeCast
1616
import org.utbot.framework.codegen.model.tree.CgAllocateArray
1717
import org.utbot.framework.codegen.model.tree.CgDeclaration
1818
import org.utbot.framework.codegen.model.tree.CgEnumConstantAccess
19+
import org.utbot.framework.codegen.model.tree.CgExecutableCall
1920
import org.utbot.framework.codegen.model.tree.CgExpression
2021
import org.utbot.framework.codegen.model.tree.CgFieldAccess
2122
import org.utbot.framework.codegen.model.tree.CgGetJavaClass
@@ -200,50 +201,63 @@ internal class CgVariableConstructor(val context: CgContext) :
200201
}
201202

202203
private fun constructAssemble(model: UtAssembleModel, baseName: String?): CgValue {
203-
for (statementModel in model.allStatementsChain) {
204+
val instantiationExecutableCall = model.instantiationChain.single() as UtExecutableCallModel
205+
processInstantiationStatement(model, instantiationExecutableCall, baseName)
206+
207+
for (statementModel in model.modificationsChain) {
204208
when (statementModel) {
205209
is UtDirectSetFieldModel -> {
206210
val instance = declareOrGet(statementModel.instance)
207211
// fields here are supposed to be accessible, so we assign them directly without any checks
208212
instance[statementModel.fieldId] `=` declareOrGet(statementModel.fieldModel)
209213
}
210214
is UtExecutableCallModel -> {
211-
val executable = statementModel.executable
212-
val params = statementModel.params
213-
val cgCall = when (executable) {
214-
is MethodId -> {
215-
val caller = statementModel.instance?.let { declareOrGet(it) }
216-
val args = params.map { declareOrGet(it) }
217-
caller[executable](*args.toTypedArray())
218-
}
219-
is ConstructorId -> {
220-
val args = params.map { declareOrGet(it) }
221-
executable(*args.toTypedArray())
222-
}
223-
}
224-
225-
// if call result is stored in a variable
226-
if (statementModel.returnValue == null) {
227-
+cgCall
228-
} else {
229-
val type = when (executable) {
230-
is MethodId -> executable.returnType
231-
is ConstructorId -> executable.classId
232-
}
233-
234-
// Don't use redundant constructors for primitives and String
235-
val initExpr = if (isPrimitiveWrapperOrString(type)) cgLiteralForWrapper(params) else cgCall
236-
newVar(type, statementModel.returnValue, baseName) { initExpr }
237-
.takeIf { statementModel == model.finalInstantiationModel }
238-
?.also { valueByModelId[model.id] = it }
239-
}
215+
+createCgExecutableCallFromUtExecutableCall(statementModel)
240216
}
241217
}
242218
}
243219

244220
return valueByModelId.getValue(model.id)
245221
}
246222

223+
private fun processInstantiationStatement(
224+
model: UtAssembleModel,
225+
executableCall: UtExecutableCallModel,
226+
baseName: String?
227+
) {
228+
val executable = executableCall.executable
229+
val params = executableCall.params
230+
val cgCall = createCgExecutableCallFromUtExecutableCall(executableCall)
231+
232+
val type = when (executable) {
233+
is MethodId -> executable.returnType
234+
is ConstructorId -> executable.classId
235+
}
236+
// Don't use redundant constructors for primitives and String
237+
val initExpr = if (isPrimitiveWrapperOrString(type)) cgLiteralForWrapper(params) else cgCall
238+
newVar(type, model, baseName) { initExpr }
239+
.takeIf { executableCall == model.finalInstantiationModel }
240+
?.also { valueByModelId[model.id] = it }
241+
}
242+
243+
244+
private fun createCgExecutableCallFromUtExecutableCall(statementModel: UtExecutableCallModel): CgExecutableCall {
245+
val executable = statementModel.executable
246+
val params = statementModel.params
247+
val cgCall = when (executable) {
248+
is MethodId -> {
249+
val caller = statementModel.instance?.let { declareOrGet(it) }
250+
val args = params.map { declareOrGet(it) }
251+
caller[executable](*args.toTypedArray())
252+
}
253+
is ConstructorId -> {
254+
val args = params.map { declareOrGet(it) }
255+
executable(*args.toTypedArray())
256+
}
257+
}
258+
return cgCall
259+
}
260+
247261
/**
248262
* Makes a replacement of constructor call to instantiate a primitive wrapper
249263
* with direct setting of the value. The reason is that in Kotlin constructors

utbot-framework/src/main/kotlin/org/utbot/framework/concrete/IterableConstructors.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import org.utbot.framework.plugin.api.UtExecutableCallModel
77
import org.utbot.framework.plugin.api.UtStatementModel
88
import org.utbot.framework.plugin.api.util.booleanClassId
99
import org.utbot.framework.plugin.api.util.id
10-
import org.utbot.framework.plugin.api.util.jClass
1110
import org.utbot.framework.plugin.api.util.objectClassId
1211
import org.utbot.framework.util.valueToClassId
1312

@@ -30,8 +29,7 @@ internal class CollectionConstructor : UtAssembleModelConstructorBase() {
3029
instantiationChain += UtExecutableCallModel(
3130
instance = null,
3231
ConstructorId(classId, emptyList()),
33-
emptyList(),
34-
this
32+
emptyList()
3533
)
3634

3735
val addMethodId = MethodId(classId, "add", booleanClassId, listOf(objectClassId))
@@ -56,8 +54,7 @@ internal class MapConstructor : UtAssembleModelConstructorBase() {
5654
instantiationChain += UtExecutableCallModel(
5755
instance = null,
5856
ConstructorId(classId, emptyList()),
59-
emptyList(),
60-
this
57+
emptyList()
6158
)
6259

6360
val putMethodId = MethodId(classId, "put", objectClassId, listOf(objectClassId, objectClassId))

utbot-framework/src/main/kotlin/org/utbot/framework/concrete/MockValueConstructor.kt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -358,9 +358,16 @@ class MockValueConstructor(
358358
private fun constructFromAssembleModel(assembleModel: UtAssembleModel): Any {
359359
constructedObjects[assembleModel]?.let { return it }
360360

361-
assembleModel.allStatementsChain.forEach { statementModel ->
361+
val instantiationExecutableCall = assembleModel.instantiationChain.single() as UtExecutableCallModel
362+
val result = updateWithExecutableCallModel(instantiationExecutableCall)
363+
checkNotNull(result) {
364+
"Tracked instance can't be null for call ${instantiationExecutableCall.executable} in model $assembleModel"
365+
}
366+
constructedObjects[assembleModel] = result
367+
368+
assembleModel.modificationsChain.forEach { statementModel ->
362369
when (statementModel) {
363-
is UtExecutableCallModel -> updateWithExecutableCallModel(statementModel, assembleModel)
370+
is UtExecutableCallModel -> updateWithExecutableCallModel(statementModel)
364371
is UtDirectSetFieldModel -> updateWithDirectSetFieldModel(statementModel)
365372
}
366373
}
@@ -398,12 +405,13 @@ class MockValueConstructor(
398405
}
399406

400407
/**
401-
* Updates instance state with [UtExecutableCallModel] invocation.
408+
* Updates instance state with [callModel] invocation.
409+
*
410+
* @return the result of [callModel] invocation
402411
*/
403412
private fun updateWithExecutableCallModel(
404413
callModel: UtExecutableCallModel,
405-
assembleModel: UtAssembleModel,
406-
) {
414+
): Any? {
407415
val executable = callModel.executable
408416
val instanceValue = callModel.instance?.let { value(it) }
409417
val params = callModel.params.map { value(it) }
@@ -413,15 +421,7 @@ class MockValueConstructor(
413421
is ConstructorId -> executable.call(params)
414422
}
415423

416-
// Ignore result if returnId is null. Otherwise add it to instance cache.
417-
callModel.returnValue?.let {
418-
checkNotNull(result) { "Tracked instance can't be null for call $executable in model $assembleModel" }
419-
420-
//If statement is final instantiating, add result to constructed objects cache
421-
if (callModel == assembleModel.finalInstantiationModel) {
422-
constructedObjects[assembleModel] = result
423-
}
424-
}
424+
return result
425425
}
426426

427427
/**

0 commit comments

Comments
 (0)