@@ -24,8 +24,9 @@ import org.utbot.fuzzer.objectModelProviders
2424import org.utbot.fuzzer.providers.ConstantsModelProvider.fuzzed
2525import java.lang.reflect.Constructor
2626import java.lang.reflect.Field
27+ import java.lang.reflect.Member
2728import java.lang.reflect.Method
28- import java.lang.reflect.Modifier
29+ import java.lang.reflect.Modifier.*
2930import java.util.function.BiConsumer
3031import java.util.function.IntSupplier
3132
@@ -67,7 +68,7 @@ class ObjectModelProvider : ModelProvider {
6768 .filterNot { it== stringClassId|| it.isPrimitiveWrapper }
6869 .flatMap { classId->
6970 collectConstructors(classId) { javaConstructor->
70- isPublic (javaConstructor)
71+ isAccessible (javaConstructor, description.packageName )
7172 }.sortedWith(
7273 primitiveParameterizedConstructorsFirstAndThenByParameterCount
7374 ).take(limit)
@@ -81,7 +82,7 @@ class ObjectModelProvider : ModelProvider {
8182 .flatMap { (constructorId, fuzzedParameters)->
8283if (constructorId.parameters.isEmpty()) {
8384 sequenceOf(assembleModel(idGenerator.asInt, constructorId, emptyList()))+
84- generateModelsWithFieldsInitialization(constructorId, concreteValues)
85+ generateModelsWithFieldsInitialization(constructorId,description, concreteValues)
8586 }
8687else {
8788 fuzzedParameters.map { params->
@@ -98,8 +99,8 @@ class ObjectModelProvider : ModelProvider {
9899 }
99100 }
100101
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 )
103104val syntheticClassFieldsSetterMethodDescription= FuzzedMethodDescription (
104105" ${constructorId.classId.simpleName} <syntheticClassFieldSetter>" ,
105106 voidClassId,
@@ -115,16 +116,16 @@ class ObjectModelProvider : ModelProvider {
115116 fieldValues.asSequence().mapIndexedNotNull { index, value->
116117val field= fields[index]
117118when {
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- )
123119 field.canBeSetDirectly-> UtDirectSetFieldModel (
124120 fuzzedModel.model,
125121FieldId (constructorId.classId, field.name),
126122 value.model
127123 )
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+ )
128129else -> null
129130 }
130131 }.forEach(modificationChain::add)
@@ -141,8 +142,16 @@ class ObjectModelProvider : ModelProvider {
141142 }
142143 }
143144
144- private fun isPublic (javaConstructor : Constructor <* >):Boolean {
145- return javaConstructor.modifiersand 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
146155 }
147156
148157private fun FuzzedMethodDescription.fuzzParameters (constructorId : ConstructorId ,vararg modelProviders : ModelProvider ):Sequence <List <FuzzedValue >> {
@@ -168,26 +177,26 @@ class ObjectModelProvider : ModelProvider {
168177 }
169178 }
170179
171- private fun findSuitableFields (classId : ClassId ):List <FieldDescription > {
180+ private fun findSuitableFields (classId : ClassId , description : FuzzedMethodDescription ):List <FieldDescription > {
172181val jClass= classId.jClass
173182return jClass.declaredFields.map { field->
174183FieldDescription (
175184 field.name,
176185 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 )
179188 )
180189 }
181190 }
182191
183- private fun Class <* >.findPublicSetterIfHasPublicGetter (field : Field ):Method ? {
192+ private fun Class <* >.findPublicSetterIfHasPublicGetter (field : Field , description : FuzzedMethodDescription ):Method ? {
184193val postfixName= field.name.capitalize()
185194val setterName= " set$postfixName "
186195val getterName= " get$postfixName "
187196val 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) {
189198 declaredMethods.find {
190- it has Modifier . PUBLIC &&
199+ isAccessible(it, description.packageName) &&
191200 it.name== setterName&&
192201 it.parameterCount== 1 &&
193202 it.parameterTypes[0 ]== field.type
@@ -196,18 +205,6 @@ class ObjectModelProvider : ModelProvider {
196205null
197206 }
198207 }
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 )= (modifiersand modifier)!= 0
209-
210- private infix fun Method.has (modifier : Int )= (modifiersand modifier)!= 0
211208
212209private val primitiveParameterizedConstructorsFirstAndThenByParameterCount=
213210 compareByDescending<ConstructorId > { constructorId->