Skip to content

Fixed wrong assertions for lambda fields #1101

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Oct 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ object UtVoidModel : UtModel(voidClassId)
* Model for enum constant
*/
data class UtEnumConstantModel(
override val id: Int?,
override val id: Int,
override val classId: ClassId,
val value: Enum<*>
) : UtReferenceModel(id, classId) {
Expand All @@ -351,7 +351,7 @@ data class UtEnumConstantModel(
* Model for class reference
*/
data class UtClassRefModel(
override val id: Int?,
override val id: Int,
override val classId: ClassId,
val value: Class<*>
) : UtReferenceModel(id, classId) {
Expand Down Expand Up @@ -455,9 +455,7 @@ data class UtArrayModel(
return true
}

override fun hashCode(): Int {
return id
}
override fun hashCode(): Int = id
}

/**
Expand Down Expand Up @@ -524,9 +522,7 @@ data class UtAssembleModel private constructor(
return id == other.id
}

override fun hashCode(): Int {
return id ?: 0
}
override fun hashCode(): Int = id ?: 0
}

/**
Expand Down Expand Up @@ -554,7 +550,7 @@ data class UtAssembleModel private constructor(
*/
// TODO: what about support for Kotlin lambdas and function types? See https://github.com/UnitTestBot/UTBotJava/issues/852
class UtLambdaModel(
override val id: Int?,
override val id: Int,
val samType: ClassId,
val declaringClass: ClassId,
val lambdaName: String,
Expand All @@ -569,6 +565,19 @@ class UtLambdaModel(
?: error("More than one method with name $lambdaName found in class: ${declaringClass.canonicalName}")

override fun toString(): String = "Anonymous function $lambdaName implementing functional interface $declaringClass"

override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false

other as UtLambdaModel

if (id != other.id) return false

return true
}

override fun hashCode(): Int = id
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,33 @@ object OpenModulesContainer {
openPackage("java.base", "java.lang")
openPackage("java.base", "java.lang.reflect")
openPackage("java.base", "sun.security.provider")
openPackage("java.base", "jdk.internal.event")
openPackage("java.base", "jdk.internal.jimage")
openPackage("java.base", "jdk.internal.jimage.decompressor")
openPackage("java.base", "jdk.internal.jmod")
openPackage("java.base", "jdk.internal.jtrfs")
openPackage("java.base", "jdk.internal.loader")
openPackage("java.base", "jdk.internal.logger")
openPackage("java.base", "jdk.internal.math")
openPackage("java.base", "jdk.internal.misc")
openPackage("java.base", "jdk.internal.module")
openPackage("java.base", "jdk.internal.org.objectweb.asm.commons")
openPackage("java.base", "jdk.internal.org.objectweb.asm.signature")
openPackage("java.base", "jdk.internal.org.objectweb.asm.tree")
openPackage("java.base", "jdk.internal.org.objectweb.asm.tree.analysis")
openPackage("java.base", "jdk.internal.org.objectweb.asm.util")
openPackage("java.base", "jdk.internal.org.xml.sax")
openPackage("java.base", "jdk.internal.org.xml.sax.helpers")
openPackage("java.base", "jdk.internal.perf")
openPackage("java.base", "jdk.internal.platform")
openPackage("java.base", "jdk.internal.ref")
openPackage("java.base", "jdk.internal.reflect")
openPackage("java.base", "jdk.internal.util")
openPackage("java.base", "jdk.internal.util.jar")
openPackage("java.base", "jdk.internal.util.xml")
openPackage("java.base", "jdk.internal.util.xml.impl")
openPackage("java.base", "jdk.internal.vm")
openPackage("java.base", "jdk.internal.vm.annotation")
add("--illegal-access=warn")
}
}
Expand Down
10 changes: 7 additions & 3 deletions utbot-framework/src/main/kotlin/org/utbot/engine/Resolver.kt
Original file line number Diff line number Diff line change
Expand Up @@ -662,12 +662,15 @@ class Resolver(
builder.toString()
}

return UtLambdaModel(
val lambdaModel = UtLambdaModel(
id = addr,
samType = samType,
declaringClass = declaringClass.id,
lambdaName = lambdaName
)
addConstructedModel(addr, lambdaModel)

return lambdaModel
}

private fun constructEnum(addr: Address, type: RefType, clazz: Class<*>): UtEnumConstantModel {
Expand Down Expand Up @@ -1136,12 +1139,13 @@ fun Traverser.toMethodResult(value: Any?, sootType: Type): MethodResult {
else -> {
workaround(RUN_CONCRETE) {
val className = value.javaClass.id.name
val superclassName = value.javaClass.superclass.name
val superClass = value.javaClass.superclass

val refTypeName = when {
// hardcoded string is used cause class is not public
className in typesOfObjectsToRecreate -> className
superclassName == PrintStream::class.qualifiedName -> superclassName
// superClass is null for Object class
superClass != null && superClass.name == PrintStream::class.qualifiedName -> superClass.name
// we want to generate an unbounded symbolic variable for every unknown class as well
else -> workaround(MAKE_SYMBOLIC) { className }
}
Expand Down