Skip to content

Commit 273e97b

Browse files
sergeypospelovlehvolk
authored andcommitted
Field descriptors fix (#126)
Fix field descriptors and add a test #
1 parent 87987d8 commit 273e97b

File tree

4 files changed

+46
-5
lines changed

4 files changed

+46
-5
lines changed

build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,11 @@ fun MavenPublication.addPom() {
268268
name.set("Azat Abdullin")
269269
email.set("[email protected]")
270270
}
271+
developer {
272+
id.set("sergeypospelov")
273+
name.set("Sergey Pospelov")
274+
email.set("[email protected]")
275+
}
271276
developer {
272277
id.set("UnitTestBot")
273278
name.set("UnitTestBot Team")

jacodb-core/src/main/kotlin/org/jacodb/impl/cfg/JcInstListBuilder.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,7 @@ class JcInstListBuilder(val method: JcMethod,val instList: JcInstList<JcRawInst>
305305
JcLocalVar(value.name, value.typeName.asType())
306306

307307
override fun visitJcRawFieldRef(value: JcRawFieldRef): JcExpr {
308-
val instance = value.instance?.accept(this) as? JcValue
309-
val klass = (instance?.type ?: value.declaringClass.asType()) as JcClassType
308+
val klass = value.declaringClass.asType() as JcClassType
310309
val field = klass.findFieldOrNull(value.fieldName)
311310
?: throw IllegalStateException("${klass.typeName}#${value.fieldName} not found")
312311
return JcFieldRef(value.instance?.accept(this) as? JcValue, field)

jacodb-core/src/test/kotlin/org/jacodb/testing/cfg/InstructionsTest.kt

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@ import org.jacodb.api.JcClassProcessingTask
2424
import org.jacodb.api.JcMethod
2525
import org.jacodb.api.RegisteredLocation
2626
import org.jacodb.api.cfg.*
27+
import org.jacodb.api.ext.*
2728
import org.jacodb.api.ext.cfg.callExpr
2829
import org.jacodb.api.ext.cfg.locals
2930
import org.jacodb.api.ext.cfg.values
30-
import org.jacodb.api.ext.findClass
31-
import org.jacodb.api.ext.findMethodOrNull
32-
import org.jacodb.api.ext.humanReadableSignature
3331
import org.jacodb.testing.BaseTest
3432
import org.jacodb.testing.WithDB
3533
import org.jacodb.testing.cfg.RealMethodResolution.Virtual
3634
import org.jacodb.testing.cfg.RealMethodResolution.VirtualImpl
35+
import org.jacodb.testing.structure.FieldsAndMethods
3736
import org.jacodb.testing.primitives.Primitives
37+
import org.jacodb.testing.Common
3838
import org.junit.jupiter.api.Assertions.*
3939
import org.junit.jupiter.api.Test
4040
import org.junit.jupiter.api.condition.DisabledOnJre
@@ -216,6 +216,34 @@ class InstructionsTest : BaseTest() {
216216
assertEquals(cp.findClass<VirtualImpl>(), actionCallExpr.method.method.enclosingClass)
217217
assertEquals(cp.findClass<Virtual>(), actionCallExpr.declaredMethod.method.enclosingClass)
218218
}
219+
220+
@Test
221+
fun `resolving field descriptors should work`() {
222+
val parent = cp.findClass<Common.Common1>()
223+
val child = cp.findClass<FieldsAndMethods.Common1Child>()
224+
225+
// public int field
226+
val methodWithPublicFieldInt = child.findMethodOrNull("accessIntField")!!
227+
val assignInstInt = methodWithPublicFieldInt.instList
228+
.filterIsInstance<JcAssignInst>()
229+
.single()
230+
val fieldInt = (assignInstInt.rhv as JcFieldRef).field
231+
232+
assertEquals(parent, fieldInt.enclosingType.jcClass)
233+
assertEquals(cp.int, fieldInt.fieldType)
234+
235+
236+
// public boolean field
237+
val methodWithPublicFieldBoolean = child.findMethodOrNull("accessBooleanField")!!
238+
val assignInstBoolean = methodWithPublicFieldBoolean.instList
239+
.filterIsInstance<JcAssignInst>()
240+
.single()
241+
val fieldBoolean = (assignInstBoolean.rhv as JcFieldRef).field
242+
243+
assertEquals(child, fieldBoolean.enclosingType.jcClass)
244+
assertEquals(cp.boolean, fieldBoolean.fieldType)
245+
}
246+
219247
}
220248

221249
fun JcMethod.dumpInstructions(): String {

jacodb-core/src/testFixtures/java/org/jacodb/testing/structure/FieldsAndMethods.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,18 @@ public class FieldsAndMethods {
2323
public static class Common1Child extends Common.Common1 {
2424
private int privateFieldsAndMethods;
2525

26+
private boolean publicField;
27+
2628
private void privateFieldsAndMethods() {
2729
}
2830

31+
private int accessIntField() {
32+
return ((Common.Common1) this).publicField;
33+
}
34+
35+
private boolean accessBooleanField() {
36+
return publicField;
37+
}
2938
}
3039

3140
}

0 commit comments

Comments
 (0)