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 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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user