Skip to content

Commit 0bdea7a

Browse files
committed
Enum classes are instantiated correctly if some methods are overriden
1 parent 4d0973c commit 0bdea7a

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgStatementConstructor.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ import org.utbot.framework.plugin.api.util.fieldClassId
6363
import org.utbot.framework.plugin.api.util.isPrimitive
6464
import org.utbot.framework.plugin.api.util.methodClassId
6565
import org.utbot.framework.plugin.api.util.denotableType
66+
import org.utbot.framework.plugin.api.util.id
67+
import org.utbot.framework.plugin.api.util.isEnum
6668
import org.utbot.framework.plugin.api.util.supertypeOfAnonymousClass
6769
import java.lang.reflect.Constructor
6870
import java.lang.reflect.Method
@@ -500,11 +502,13 @@ internal class CgStatementConstructorImpl(context: CgContext) :
500502
}
501503

502504
private fun guardEnumConstantAccess(access: CgEnumConstantAccess): ExpressionWithType {
503-
val (enumClass, constant) = access
505+
val (enumAccessClass, constant) = access
504506

505-
return if (enumClass.isAccessibleFrom(testClassPackageName)) {
506-
ExpressionWithType(enumClass, access)
507+
return if (enumAccessClass.isAccessibleFrom(testClassPackageName)) {
508+
ExpressionWithType(enumAccessClass, access)
507509
} else {
510+
val enumClass: ClassId =
511+
if (enumAccessClass.isEnum) enumAccessClass else enumAccessClass.superclass!!.id
508512
val enumClassVariable = newVar(classCgClassId) {
509513
classClassId[forName](enumClass.name)
510514
}

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import org.utbot.framework.plugin.api.util.findFieldByIdOrNull
5858
import org.utbot.framework.plugin.api.util.id
5959
import org.utbot.framework.plugin.api.util.intClassId
6060
import org.utbot.framework.plugin.api.util.isArray
61+
import org.utbot.framework.plugin.api.util.isEnum
6162
import org.utbot.framework.plugin.api.util.isPrimitiveWrapperOrString
6263
import org.utbot.framework.plugin.api.util.isStatic
6364
import org.utbot.framework.plugin.api.util.stringClassId
@@ -445,8 +446,15 @@ open class CgVariableConstructor(val context: CgContext) :
445446
}
446447

447448
private fun constructEnumConstant(model: UtEnumConstantModel, baseName: String?): CgVariable {
448-
return newVar(model.classId, baseName) {
449-
CgEnumConstantAccess(model.classId, model.value.name)
449+
val classId = model.classId
450+
451+
require(classId.isEnum ||
452+
classId.isAnonymous && classId.superclass?.isEnum == true) {
453+
"Enum constant model $model should be a enum or an anonymous class that overrides enum methods"
454+
}
455+
456+
return newVar(classId, baseName) {
457+
CgEnumConstantAccess(classId, model.value.name)
450458
}
451459
}
452460

0 commit comments

Comments
 (0)