diff --git a/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjRef.kt b/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjRef.kt index 1e7f770..11df61e 100644 --- a/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjRef.kt +++ b/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjRef.kt @@ -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