From 2c22889896159f108f0190ba512d4df12975e827 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Tue, 16 Sep 2025 08:29:31 -0500 Subject: [PATCH] fix method call reflection --- src/kiss/KissInterp2.kiss | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/kiss/KissInterp2.kiss b/src/kiss/KissInterp2.kiss index ec0775e..30e604b 100644 --- a/src/kiss/KissInterp2.kiss +++ b/src/kiss/KissInterp2.kiss @@ -60,6 +60,8 @@ (evalCC exp.def cc) (throw "Couldn't read valid expression from $s"))) ([:ReaderExpDef def] + // In case it needs to be transformed, pass this + (localVar &mut exp (object pos null def def)) (case def // Special form call ((when (specialForms.exists form) (CallExp (object def (Symbol form)) args)) @@ -72,6 +74,7 @@ (cc (Reflect.callMethod null f values))))) // Method/function call ((CallExp callable args) + (transformToFieldExp callable) (evalCC callable ->f (_evalAllCC args ->values (case callable @@ -100,16 +103,9 @@ (cc f) (return))) // Check for field access - (let [idx (ident.indexOf ".")] - (unless (= -1 idx) - (let [parts (ident.split ".") - &mut exp (object pos null def (Symbol (first parts)))] - (doFor part (parts.slice 1) - (let [safe (StringTools.startsWith part "?")] - (when safe (set part (part.substr 1))) - (set exp (object pos null def (FieldExp part exp safe))))) - (evalCC exp cc) - (return)))) + (when (transformToFieldExp exp) + (evalCC exp cc) + (return)) // Check for ident aliases (when (identAliases.exists ident) (evalCC (dictGet identAliases ident) cc) @@ -131,4 +127,21 @@ (outputs.push v) (_evalAllCC inputs cc outputs) }) - (cc outputs))) \ No newline at end of file + (cc outputs))) + +// Check if an identifier has field access in it, return true if transform it to FieldExp +(method transformToFieldExp [:ReaderExp exp] + (case exp.def + ((Symbol ident) + (let [idx (ident.indexOf ".")] + (unless (= -1 idx) + (let [parts (ident.split ".") + &mut newExp (object pos null def (Symbol (first parts)))] + (doFor part (parts.slice 1) + (let [safe (StringTools.startsWith part "?")] + (when safe (set part (part.substr 1))) + (set newExp (object pos null def (FieldExp part newExp safe))))) + (set exp.def newExp.def) + (return true))))) + (never otherwise)) + false) \ No newline at end of file