Skip to content

Commit 32a3394

Browse files
committed
Additional corrections on a call
1 parent 8b587a9 commit 32a3394

File tree

5 files changed

+28
-60
lines changed

5 files changed

+28
-60
lines changed

Diff for: utbot-framework-test/src/test/kotlin/org/utbot/framework/modificators/UtBotFieldModificatorsTest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ internal class UtBotFieldModificatorsTest {
192192

193193
//We use sorting here to make comparing with sorted in advance expected collections easier
194194
private fun runFieldModificatorsSearch(analysisMode: AnalysisMode) =
195-
fieldsModificatorsSearcher.findModificators(analysisMode, null)
195+
fieldsModificatorsSearcher.findModificators(analysisMode)
196196
.map { (key, value) ->
197197
val modificatorNames = value.filterNot { it.name.startsWith("direct_set_") }.map { it.name }
198198
key.name to modificatorNames.toSortedSet()

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

+17-12
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,21 @@ import org.utbot.framework.plugin.api.hasDefaultValue
3636
import org.utbot.framework.plugin.api.isMockModel
3737
import org.utbot.framework.plugin.api.util.defaultValueModel
3838
import org.utbot.framework.plugin.api.util.executableId
39+
import org.utbot.framework.plugin.api.util.isSubtypeOf
3940
import org.utbot.framework.plugin.api.util.jClass
4041
import org.utbot.framework.util.nextModelName
4142
import java.lang.reflect.Constructor
4243
import java.util.IdentityHashMap
4344

4445
/**
4546
* Creates [UtAssembleModel] from any [UtModel] or it's inner models if possible
46-
* during generation test for [packageName].
47+
tmp * during generation test for [basePackageName].
4748
*
4849
* Needs utContext be set and Soot be initialized.
4950
*
5051
* Note: Caches class related information, can be reused if classes don't change.
5152
*/
52-
class AssembleModelGenerator(private val packageName: String) {
53+
class AssembleModelGenerator(private val basePackageName: String) {
5354

5455
//Instantiated models are stored to avoid cyclic references during reference graph analysis
5556
private val instantiatedModels: IdentityHashMap<UtModel, UtReferenceModel> =
@@ -100,8 +101,7 @@ class AssembleModelGenerator(private val packageName: String) {
100101
* Note: Two identity equal [UtModel]s are represented by one instance model.
101102
*/
102103
fun createAssembleModels(models: List<UtModel>): IdentityHashMap<UtModel, UtModel> {
103-
val allModelsAreLocatedInPackage = models.all { it.classId.packageName.startsWith(packageName)}
104-
if (!UtSettings.useAssembleModelGenerator || !allModelsAreLocatedInPackage) {
104+
if (!UtSettings.useAssembleModelGenerator) {
105105
return IdentityHashMap<UtModel, UtModel>().apply { models.forEach { put(it, it) } }
106106
}
107107

@@ -172,7 +172,7 @@ class AssembleModelGenerator(private val packageName: String) {
172172
private fun assembleModel(utModel: UtModel): UtModel {
173173
val collectedCallChain = callChain.toMutableList()
174174

175-
// we cannot create an assemble model for an anonymous class instance
175+
// We cannot create an assemble model for an anonymous class instance
176176
if (utModel.classId.isAnonymous) {
177177
return utModel
178178
}
@@ -257,7 +257,7 @@ class AssembleModelGenerator(private val packageName: String) {
257257
if (fieldId.isFinal) {
258258
throw AssembleException("Final field $fieldId can't be set in an object of the class $classId")
259259
}
260-
if (!fieldId.type.isAccessibleFrom(packageName)) {
260+
if (!fieldId.type.isAccessibleFrom(basePackageName)) {
261261
throw AssembleException(
262262
"Field $fieldId can't be set in an object of the class $classId because its type is inaccessible"
263263
)
@@ -399,10 +399,10 @@ class AssembleModelGenerator(private val packageName: String) {
399399
}
400400

401401
private val ClassId.isVisible : Boolean
402-
get() = this.isPublic || !this.isPrivate && this.packageName.startsWith(this@AssembleModelGenerator.packageName)
402+
get() = this.isPublic || !this.isPrivate && this.packageName.startsWith(basePackageName)
403403

404404
private val Constructor<*>.isVisible : Boolean
405-
get() = this.isPublic || !this.isPrivate && this.declaringClass.packageName.startsWith(packageName)
405+
get() = this.isPublic || !this.isPrivate && this.declaringClass.packageName.startsWith(basePackageName)
406406

407407
/**
408408
* Creates setter or direct setter call to set a field.
@@ -441,7 +441,7 @@ class AssembleModelGenerator(private val packageName: String) {
441441
* Finds setters and direct accessors for fields of particular class.
442442
*/
443443
private fun findSettersAndDirectAccessors(classId: ClassId): Map<FieldId, StatementId> {
444-
val allModificatorsOfClass = modificatorsSearcher.findModificators(SettersAndDirectAccessors, classId)
444+
val allModificatorsOfClass = modificatorsSearcher.findModificators(SettersAndDirectAccessors)
445445

446446
return allModificatorsOfClass
447447
.mapNotNull { (fieldId, possibleModificators) ->
@@ -457,9 +457,12 @@ class AssembleModelGenerator(private val packageName: String) {
457457
*/
458458
private fun chooseModificator(
459459
fieldId: FieldId,
460-
settersAndDirectAccessors: Set<StatementId>
460+
settersAndDirectAccessors: Set<StatementId>,
461461
): StatementId? {
462-
val directAccessors = settersAndDirectAccessors.filterIsInstance<DirectFieldAccessId>()
462+
val directAccessors = settersAndDirectAccessors
463+
.filterIsInstance<DirectFieldAccessId>()
464+
.filter {it.fieldId.isAccessibleFrom(basePackageName) }
465+
463466
if (directAccessors.any()) {
464467
return directAccessors.singleOrNull()
465468
?: throw AssembleException(
@@ -468,7 +471,9 @@ class AssembleModelGenerator(private val packageName: String) {
468471
}
469472

470473
if (settersAndDirectAccessors.any()) {
471-
return settersAndDirectAccessors.singleOrNull()
474+
return settersAndDirectAccessors
475+
.filterIsInstance<ExecutableId>()
476+
.singleOrNull { it.isAccessibleFrom(basePackageName) }
472477
?: throw AssembleException(
473478
"Field $fieldId has more than one setter: ${settersAndDirectAccessors.joinToString(" ")}"
474479
)

Diff for: utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/util/FieldIdUtil.kt

+4-6
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ import org.utbot.framework.plugin.api.util.voidClassId
1313
*
1414
* @param context context in which code is generated (it is needed because the method needs to know package and language)
1515
*/
16-
// TODO: change parameter from packageName: String to context: CgContext in ClassId.isAccessibleFrom and ExecutableId.isAccessibleFrom ?
17-
private fun FieldId.isAccessibleFrom(context: CgContext): Boolean {
18-
val packageName = context.testClassPackageName
16+
fun FieldId.isAccessibleFrom(packageName: String): Boolean {
1917
val isClassAccessible = declaringClass.isAccessibleFrom(packageName)
2018
val isAccessibleByVisibility = isPublic || (declaringClass.packageName == packageName && (isPackagePrivate || isProtected))
2119
val isAccessibleFromPackageByModifiers = isAccessibleByVisibility && !isSynthetic
@@ -36,7 +34,7 @@ internal infix fun FieldId.canBeReadFrom(context: CgContext): Boolean {
3634
return true
3735
}
3836

39-
return isAccessibleFrom(context)
37+
return isAccessibleFrom(context.testClassPackageName)
4038
}
4139

4240
private fun FieldId.canBeSetViaSetterFrom(context: CgContext): Boolean =
@@ -49,12 +47,12 @@ internal fun FieldId.canBeSetFrom(context: CgContext): Boolean {
4947
if (context.codegenLanguage == CodegenLanguage.KOTLIN) {
5048
// Kotlin will allow direct write access if both getter and setter is defined
5149
// !isAccessibleFrom(context) is important here because above rule applies to final fields only if they are not accessible in Java terms
52-
if (!isAccessibleFrom(context) && !isStatic && canBeReadViaGetterFrom(context) && canBeSetViaSetterFrom(context)) {
50+
if (!isAccessibleFrom(context.testClassPackageName) && !isStatic && canBeReadViaGetterFrom(context) && canBeSetViaSetterFrom(context)) {
5351
return true
5452
}
5553
}
5654

57-
return isAccessibleFrom(context) && !isFinal
55+
return isAccessibleFrom(context.testClassPackageName) && !isFinal
5856
}
5957

6058
/**

Diff for: utbot-framework/src/main/kotlin/org/utbot/framework/modifications/DirectAccessorsAnalyzer.kt

+5-4
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,22 @@ class DirectAccessorsAnalyzer {
1717
*/
1818
fun collectDirectAccesses(classIds: Set<ClassId>): Set<DirectFieldAccessId> =
1919
classIds
20-
.flatMap { classId -> collectFieldsInPackage(classId) }
20+
.flatMap { classId -> collectFields(classId) }
2121
.map { fieldId -> DirectFieldAccessId(fieldId.declaringClass, directSetterName(fieldId), fieldId) }
2222
.toSet()
2323

2424
/**
25-
* Collect all fields with different non-private modifiers from class [classId].
25+
* Collect all fields with different non-private modifiers
26+
* from class [classId] or it's base classes.
2627
*/
27-
private fun collectFieldsInPackage(classId: ClassId): Set<FieldId> {
28+
private fun collectFields(classId: ClassId): Set<FieldId> {
2829
var clazz = classId.jClass
2930

3031
val fieldIds = mutableSetOf<Field>()
3132
fieldIds += clazz.declaredFields.filterNot { Modifier.isPrivate(it.modifiers) }
3233
while (clazz.superclass != null) {
3334
clazz = clazz.superclass
34-
fieldIds += clazz.declaredFields.filter { Modifier.isPublic(it.modifiers) || Modifier.isProtected(it.modifiers) }
35+
fieldIds += clazz.declaredFields.filterNot { Modifier.isPrivate(it.modifiers) }
3536
}
3637

3738

Diff for: utbot-framework/src/main/kotlin/org/utbot/framework/modifications/UtBotFieldsModificatorsSearcher.kt

+1-37
Original file line numberDiff line numberDiff line change
@@ -14,43 +14,7 @@ class UtBotFieldsModificatorsSearcher {
1414

1515
fun delete(classIds: Set<ClassId>) = statementsStorage.delete(classIds)
1616

17-
/**
18-
* Finds field modificators.
19-
*
20-
* @param analysisMode represents which type of modificators (e.g. setters) are considered.
21-
* @param methodUnderTest describes an analyzed method an it's location.
22-
*/
23-
fun findModificators(analysisMode: AnalysisMode, classUnderTest: ClassId? = null): Map<FieldId, Set<StatementId>> {
24-
val modificators = findModificators(analysisMode)
25-
26-
if (classUnderTest == null) {
27-
return modificators
28-
}
29-
30-
val filteredModifications = mutableMapOf<FieldId, Set<StatementId>>()
31-
for ((fieldId, statements) in modificators) {
32-
val filteredStmts = statements.filter { stmt -> fieldId.isAccessibleBy(stmt, classUnderTest!!) }
33-
filteredModifications[fieldId] = filteredStmts.toSet()
34-
}
35-
36-
return filteredModifications
37-
}
38-
39-
/**
40-
* Verifies that this field is accessible with [statementId] from the location of [methodUnderTest].
41-
*/
42-
private fun FieldId.isAccessibleBy(statementId: StatementId, classUnderTest: ClassId): Boolean {
43-
val basePackageName = classUnderTest.packageName
44-
val classPackageName = statementId.classId.packageName
45-
46-
if (this.isPublic) return true
47-
if (this.isProtected) return classPackageName == basePackageName || statementId.classId.isSubtypeOf(classUnderTest)
48-
if (this.isPackagePrivate) return classPackageName == basePackageName
49-
if (this.isPrivate) return classUnderTest == statementId.classId
50-
return error("Unexpected modifier for field $this")
51-
}
52-
53-
private fun findModificators(analysisMode: AnalysisMode): Map<FieldId, Set<StatementId>> {
17+
fun findModificators(analysisMode: AnalysisMode): Map<FieldId, Set<StatementId>> {
5418
statementsStorage.updateCaches()
5519
return findModificatorsInCache(analysisMode)
5620
}

0 commit comments

Comments
 (0)