From cdd48ec8719e1f10b6073db1fcf32b2f9b6e830a Mon Sep 17 00:00:00 2001 From: sergeych Date: Mon, 30 Mar 2026 08:53:07 +0300 Subject: [PATCH] Improved instance method resolution logic and added test for Decimal overloading. --- .../kotlin/net/sergeych/lyng/obj/ObjClass.kt | 7 +++++-- .../kotlin/net/sergeych/lyng/DecimalModuleTest.kt | 13 +++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjClass.kt b/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjClass.kt index 1441bab..75a065b 100644 --- a/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjClass.kt +++ b/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjClass.kt @@ -1180,8 +1180,11 @@ open class ObjClass( scope: Scope, name: String, args: Arguments, onNotFoundResult: (suspend () -> Obj?)? ): Obj { - getInstanceMemberOrNull(name)?.let { rec -> - val decl = rec.declaringClass ?: findDeclaringClassOf(name) ?: this + classScope?.objects?.get(name)?.let { rec -> + val decl = rec.declaringClass ?: this + if (!rec.visibility.isPublic) { + return super.invokeInstanceMethod(scope, name, args, onNotFoundResult) + } if (rec.type == ObjRecord.Type.Delegated) { val del = rec.delegate ?: scope.raiseError("Internal error: delegated member $name has no delegate") val allArgs = (listOf(this, ObjString(name)) + args.list).toTypedArray() diff --git a/lynglib/src/commonTest/kotlin/net/sergeych/lyng/DecimalModuleTest.kt b/lynglib/src/commonTest/kotlin/net/sergeych/lyng/DecimalModuleTest.kt index 4b2e3ae..1d06af0 100644 --- a/lynglib/src/commonTest/kotlin/net/sergeych/lyng/DecimalModuleTest.kt +++ b/lynglib/src/commonTest/kotlin/net/sergeych/lyng/DecimalModuleTest.kt @@ -295,4 +295,17 @@ class DecimalModuleTest { assertEquals(2, ex.pos.line) } + + @Test + fun testOverloading() = runTest { + eval(""" + import lyng.decimal + assert( 1.d is Decimal ) + assertEquals(Decimal, abs(1.d)::class) + // here the inference must work: + val t = abs(-10.d) + assert(t is Decimal) + assertEquals(10,t) + """.trimIndent()) + } }