@@ -24,8 +24,9 @@ import org.utbot.fuzzer.objectModelProviders
24
24
import org.utbot.fuzzer.providers.ConstantsModelProvider.fuzzed
25
25
import java.lang.reflect.Constructor
26
26
import java.lang.reflect.Field
27
+ import java.lang.reflect.Member
27
28
import java.lang.reflect.Method
28
- import java.lang.reflect.Modifier
29
+ import java.lang.reflect.Modifier.*
29
30
import java.util.function.BiConsumer
30
31
import java.util.function.IntSupplier
31
32
@@ -67,7 +68,7 @@ class ObjectModelProvider : ModelProvider {
67
68
.filterNot { it == stringClassId || it.isPrimitiveWrapper }
68
69
.flatMap { classId ->
69
70
collectConstructors(classId) { javaConstructor ->
70
- isPublic (javaConstructor)
71
+ isAccessible (javaConstructor, description.packageName )
71
72
}.sortedWith(
72
73
primitiveParameterizedConstructorsFirstAndThenByParameterCount
73
74
).take(limit)
@@ -81,7 +82,7 @@ class ObjectModelProvider : ModelProvider {
81
82
.flatMap { (constructorId, fuzzedParameters) ->
82
83
if (constructorId.parameters.isEmpty()) {
83
84
sequenceOf(assembleModel(idGenerator.asInt, constructorId, emptyList())) +
84
- generateModelsWithFieldsInitialization(constructorId, concreteValues)
85
+ generateModelsWithFieldsInitialization(constructorId, description, concreteValues)
85
86
}
86
87
else {
87
88
fuzzedParameters.map { params ->
@@ -98,8 +99,8 @@ class ObjectModelProvider : ModelProvider {
98
99
}
99
100
}
100
101
101
- private fun generateModelsWithFieldsInitialization (constructorId : ConstructorId , concreteValues : Collection <FuzzedConcreteValue >): Sequence <FuzzedValue > {
102
- val fields = findSuitableFields(constructorId.classId)
102
+ private fun generateModelsWithFieldsInitialization (constructorId : ConstructorId , description : FuzzedMethodDescription , concreteValues : Collection <FuzzedConcreteValue >): Sequence <FuzzedValue > {
103
+ val fields = findSuitableFields(constructorId.classId, description )
103
104
val syntheticClassFieldsSetterMethodDescription = FuzzedMethodDescription (
104
105
" ${constructorId.classId.simpleName} <syntheticClassFieldSetter>" ,
105
106
voidClassId,
@@ -115,16 +116,16 @@ class ObjectModelProvider : ModelProvider {
115
116
fieldValues.asSequence().mapIndexedNotNull { index, value ->
116
117
val field = fields[index]
117
118
when {
118
- field.setter != null -> UtExecutableCallModel (
119
- fuzzedModel.model,
120
- MethodId (constructorId.classId, field.setter.name, field.setter.returnType.id, listOf (field.classId)),
121
- listOf (value.model)
122
- )
123
119
field.canBeSetDirectly -> UtDirectSetFieldModel (
124
120
fuzzedModel.model,
125
121
FieldId (constructorId.classId, field.name),
126
122
value.model
127
123
)
124
+ field.setter != null -> UtExecutableCallModel (
125
+ fuzzedModel.model,
126
+ MethodId (constructorId.classId, field.setter.name, field.setter.returnType.id, listOf (field.classId)),
127
+ listOf (value.model)
128
+ )
128
129
else -> null
129
130
}
130
131
}.forEach(modificationChain::add)
@@ -141,8 +142,16 @@ class ObjectModelProvider : ModelProvider {
141
142
}
142
143
}
143
144
144
- private fun isPublic (javaConstructor : Constructor <* >): Boolean {
145
- return javaConstructor.modifiers and Modifier .PUBLIC != 0
145
+ private fun isAccessible (member : Member , packageName : String? ): Boolean {
146
+ return isPublic(member.modifiers) ||
147
+ (isPackagePrivate(member.modifiers) && member.declaringClass.`package`.name == packageName)
148
+ }
149
+
150
+ private fun isPackagePrivate (modifiers : Int ): Boolean {
151
+ val hasAnyAccessModifier = isPrivate(modifiers)
152
+ || isProtected(modifiers)
153
+ || isProtected(modifiers)
154
+ return ! hasAnyAccessModifier
146
155
}
147
156
148
157
private fun FuzzedMethodDescription.fuzzParameters (constructorId : ConstructorId , vararg modelProviders : ModelProvider ): Sequence <List <FuzzedValue >> {
@@ -168,26 +177,26 @@ class ObjectModelProvider : ModelProvider {
168
177
}
169
178
}
170
179
171
- private fun findSuitableFields (classId : ClassId ): List <FieldDescription > {
180
+ private fun findSuitableFields (classId : ClassId , description : FuzzedMethodDescription ): List <FieldDescription > {
172
181
val jClass = classId.jClass
173
182
return jClass.declaredFields.map { field ->
174
183
FieldDescription (
175
184
field.name,
176
185
field.type.id,
177
- field.isPublic && ! field.isFinal && ! field.isStatic ,
178
- jClass.findPublicSetterIfHasPublicGetter(field)
186
+ isAccessible( field, description.packageName) && ! isFinal( field.modifiers) && ! isStatic( field.modifiers) ,
187
+ jClass.findPublicSetterIfHasPublicGetter(field, description )
179
188
)
180
189
}
181
190
}
182
191
183
- private fun Class <* >.findPublicSetterIfHasPublicGetter (field : Field ): Method ? {
192
+ private fun Class <* >.findPublicSetterIfHasPublicGetter (field : Field , description : FuzzedMethodDescription ): Method ? {
184
193
val postfixName = field.name.capitalize()
185
194
val setterName = " set$postfixName "
186
195
val getterName = " get$postfixName "
187
196
val getter = try { getDeclaredMethod(getterName) } catch (_: NoSuchMethodException ) { return null }
188
- return if (getter has Modifier . PUBLIC && getter.returnType == field.type) {
197
+ return if (isAccessible( getter, description.packageName) && getter.returnType == field.type) {
189
198
declaredMethods.find {
190
- it has Modifier . PUBLIC &&
199
+ isAccessible(it, description.packageName) &&
191
200
it.name == setterName &&
192
201
it.parameterCount == 1 &&
193
202
it.parameterTypes[0 ] == field.type
@@ -196,18 +205,6 @@ class ObjectModelProvider : ModelProvider {
196
205
null
197
206
}
198
207
}
199
- private val Field .isPublic
200
- get() = has(Modifier .PUBLIC )
201
-
202
- private val Field .isFinal
203
- get() = has(Modifier .FINAL )
204
-
205
- private val Field .isStatic
206
- get() = has(Modifier .STATIC )
207
-
208
- private infix fun Field.has (modifier : Int ) = (modifiers and modifier) != 0
209
-
210
- private infix fun Method.has (modifier : Int ) = (modifiers and modifier) != 0
211
208
212
209
private val primitiveParameterizedConstructorsFirstAndThenByParameterCount =
213
210
compareByDescending<ConstructorId > { constructorId ->
0 commit comments