Fix implicit member resolution for fields

This commit is contained in:
Sergey Chernov 2026-01-25 13:00:19 +03:00
parent a4f41f17bf
commit b674ee7c18

View File

@ -2228,6 +2228,21 @@ class ImplicitThisMemberRef(
val name: String, val name: String,
val atPos: Pos val atPos: Pos
) : ObjRef { ) : ObjRef {
private fun resolveInstanceFieldRecord(th: ObjInstance, caller: ObjClass?): ObjRecord? {
if (caller == null) return null
for (cls in th.objClass.mro) {
if (cls.className == "Obj") break
val rec = cls.members[name] ?: continue
if (rec.isAbstract) continue
val decl = rec.declaringClass ?: cls
if (!canAccessMember(rec.visibility, decl, caller, name)) continue
val key = decl.mangledName(name)
th.fieldRecordForKey(key)?.let { return it }
th.instanceScope.objects[key]?.let { return it }
}
return null
}
override fun forEachVariable(block: (String) -> Unit) { override fun forEachVariable(block: (String) -> Unit) {
block(name) block(name)
} }
@ -2265,6 +2280,8 @@ class ImplicitThisMemberRef(
} }
} }
resolveInstanceFieldRecord(th, caller)?.let { return it }
val key = th.objClass.publicMemberResolution[name] ?: name val key = th.objClass.publicMemberResolution[name] ?: name
th.fieldRecordForKey(key)?.let { rec -> th.fieldRecordForKey(key)?.let { rec ->
if ((rec.type == ObjRecord.Type.Field || rec.type == ObjRecord.Type.ConstructorField) && !rec.isAbstract) if ((rec.type == ObjRecord.Type.Field || rec.type == ObjRecord.Type.ConstructorField) && !rec.isAbstract)
@ -2333,6 +2350,11 @@ class ImplicitThisMemberRef(
return return
} }
} }
resolveInstanceFieldRecord(th, caller)?.let { rec ->
scope.assign(rec, name, newValue)
return
}
} }
// 3) fallback to normal scope resolution // 3) fallback to normal scope resolution