Fix implicit member resolution for fields
This commit is contained in:
parent
a4f41f17bf
commit
b674ee7c18
@ -2228,6 +2228,21 @@ class ImplicitThisMemberRef(
|
||||
val name: String,
|
||||
val atPos: Pos
|
||||
) : 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) {
|
||||
block(name)
|
||||
}
|
||||
@ -2265,6 +2280,8 @@ class ImplicitThisMemberRef(
|
||||
}
|
||||
}
|
||||
|
||||
resolveInstanceFieldRecord(th, caller)?.let { return it }
|
||||
|
||||
val key = th.objClass.publicMemberResolution[name] ?: name
|
||||
th.fieldRecordForKey(key)?.let { rec ->
|
||||
if ((rec.type == ObjRecord.Type.Field || rec.type == ObjRecord.Type.ConstructorField) && !rec.isAbstract)
|
||||
@ -2333,6 +2350,11 @@ class ImplicitThisMemberRef(
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
resolveInstanceFieldRecord(th, caller)?.let { rec ->
|
||||
scope.assign(rec, name, newValue)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 3) fallback to normal scope resolution
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user