Skip to content

Commit 23a22b3

Browse files
authored
Support hidden fields in code generation (#763)
Support hidden fields access in code generation
1 parent 34a51c5 commit 23a22b3

File tree

16 files changed

+429
-170
lines changed

16 files changed

+429
-170
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ val floatWrapperClassId = java.lang.Float::class.id
144144
val doubleWrapperClassId = java.lang.Double::class.id
145145

146146
val classClassId = java.lang.Class::class.id
147+
val fieldClassId = java.lang.reflect.Field::class.id
148+
val methodClassId = java.lang.reflect.Method::class.id
149+
val constructorClassId = java.lang.reflect.Constructor::class.id
147150

148151
// We consider void wrapper as primitive wrapper
149152
// because voidClassId is considered primitive here

utbot-framework-test/src/test/kotlin/org/utbot/examples/objects/HiddenFieldAccessModifiersTest.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import org.utbot.testcheckers.eq
77
internal class HiddenFieldAccessModifiersTest : UtValueTestCaseChecker(testClass = HiddenFieldAccessModifiersExample::class) {
88
@Test
99
fun testCheckSuperFieldEqualsOne() {
10-
// TODO: currently, codegen can't handle tests with field hiding (see #646)
11-
withEnabledTestingCodeGeneration(testCodeGeneration = false) {
10+
withEnabledTestingCodeGeneration(testCodeGeneration = true) {
1211
check(
1312
HiddenFieldAccessModifiersExample::checkSuperFieldEqualsOne,
1413
eq(3),

utbot-framework-test/src/test/kotlin/org/utbot/examples/objects/HiddenFieldExampleTest.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ internal class HiddenFieldExampleTest : UtValueTestCaseChecker(testClass = Hidde
2121

2222
@Test
2323
fun testCheckSuccField() {
24-
// TODO: currently, codegen can't handle tests with field hiding (see #646)
25-
withEnabledTestingCodeGeneration(testCodeGeneration = false) {
24+
withEnabledTestingCodeGeneration(testCodeGeneration = true) {
2625
check(
2726
HiddenFieldExample::checkSuccField,
2827
eq(5),

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/builtin/ReflectionBuiltins.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import java.lang.reflect.InvocationTargetException
2121

2222
internal val reflectionBuiltins: Set<MethodId>
2323
get() = setOf(
24-
setAccessible, invoke, newInstance, get, forName,
24+
setAccessible, invoke, newInstance, getMethodId, forName,
2525
getDeclaredMethod, getDeclaredConstructor, allocateInstance,
2626
getClass, getDeclaredField, isEnumConstant, getFieldName,
27-
equals, getSuperclass, set, newArrayInstance,
27+
equals, getSuperclass, setMethodId, newArrayInstance,
2828
setArrayElement, getArrayElement, getTargetException,
2929
)
3030

@@ -49,7 +49,7 @@ internal val newInstance = methodId(
4949
arguments = arrayOf(Array<Any>::class.id)
5050
)
5151

52-
internal val get = methodId(
52+
internal val getMethodId = methodId(
5353
classId = Field::class.id,
5454
name = "get",
5555
returnType = objectClassId,
@@ -132,7 +132,7 @@ internal val getSuperclass = methodId(
132132
returnType = Class::class.id
133133
)
134134

135-
internal val set = methodId(
135+
internal val setMethodId = methodId(
136136
classId = Field::class.id,
137137
name = "set",
138138
returnType = voidClassId,

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/builtin/UtilMethodBuiltins.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ internal abstract class UtilMethodProvider(val utilClassId: ClassId) {
6969
get() = utilClassId.utilMethodId(
7070
name = "setField",
7171
returnType = voidClassId,
72-
arguments = arrayOf(objectClassId, stringClassId, objectClassId)
72+
arguments = arrayOf(objectClassId, stringClassId, stringClassId, objectClassId)
7373
)
7474

7575
val setStaticFieldMethodId: MethodId
@@ -83,7 +83,7 @@ internal abstract class UtilMethodProvider(val utilClassId: ClassId) {
8383
get() = utilClassId.utilMethodId(
8484
name = "getFieldValue",
8585
returnType = objectClassId,
86-
arguments = arrayOf(objectClassId, stringClassId)
86+
arguments = arrayOf(objectClassId, stringClassId, stringClassId)
8787
)
8888

8989
val getStaticFieldValueMethodId: MethodId

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/context/CgContext.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,9 @@ internal interface CgContextOwner {
162162
// java.lang.reflect.Executable is a superclass of both of these types.
163163
var declaredExecutableRefs: PersistentMap<ExecutableId, CgVariable>
164164

165+
// Variables of java.lang.reflect.Field type declared in the current name scope
166+
var declaredFieldRefs: PersistentMap<FieldId, CgVariable>
167+
165168
// generated this instance for method under test
166169
var thisInstance: CgValue?
167170

@@ -308,6 +311,7 @@ internal interface CgContextOwner {
308311
val prevVariableNames = existingVariableNames
309312
val prevDeclaredClassRefs = declaredClassRefs
310313
val prevDeclaredExecutableRefs = declaredExecutableRefs
314+
val prevDeclaredFieldRefs = declaredFieldRefs
311315
val prevValueByModel = IdentityHashMap(valueByModel)
312316
val prevValueByModelId = valueByModelId.toMutableMap()
313317
return try {
@@ -316,6 +320,7 @@ internal interface CgContextOwner {
316320
existingVariableNames = prevVariableNames
317321
declaredClassRefs = prevDeclaredClassRefs
318322
declaredExecutableRefs = prevDeclaredExecutableRefs
323+
declaredFieldRefs = prevDeclaredFieldRefs
319324
valueByModel = prevValueByModel
320325
valueByModelId = prevValueByModelId
321326
}
@@ -416,6 +421,7 @@ internal data class CgContext(
416421
override var existingVariableNames: PersistentSet<String> = persistentSetOf(),
417422
override var declaredClassRefs: PersistentMap<ClassId, CgVariable> = persistentMapOf(),
418423
override var declaredExecutableRefs: PersistentMap<ExecutableId, CgVariable> = persistentMapOf(),
424+
override var declaredFieldRefs: PersistentMap<FieldId, CgVariable> = persistentMapOf(),
419425
override var thisInstance: CgValue? = null,
420426
override val methodArguments: MutableList<CgValue> = mutableListOf(),
421427
override val codeGenerationErrors: MutableMap<CgMethodTestSet, MutableMap<String, Int>> = mutableMapOf(),

0 commit comments

Comments
 (0)