From 110f050c1c8a573309146908882f278ed7c8d184 Mon Sep 17 00:00:00 2001 From: Elara6331 Date: Fri, 23 Feb 2024 22:13:23 -0800 Subject: [PATCH] Fix field check for method calls --- salix.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/salix.go b/salix.go index 03f3be4..dfc2a4f 100644 --- a/salix.go +++ b/salix.go @@ -495,10 +495,18 @@ func (t *Template) execMethodCall(mc ast.MethodCall, local map[string]any) (any, if mtd.IsValid() { return t.execFunc(mtd, mc, mc.Params, local) } - // If the method doesn't exist, also check for a field storing a function. - field := rval.FieldByName(mc.Name.Value) - if field.IsValid() && field.Kind() == reflect.Func { - return t.execFunc(field, mc, mc.Params, local) + // If the method doesn't exist, we need to check for fields, so dereference any pointers + // because pointers can't have fields + for rval.Kind() == reflect.Pointer { + rval = rval.Elem() + } + // Make sure we actually have a struct + if rval.Kind() == reflect.Struct { + // If the method doesn't exist, also check for a field storing a function. + field := rval.FieldByName(mc.Name.Value) + if field.IsValid() && field.Kind() == reflect.Func { + return t.execFunc(field, mc, mc.Params, local) + } } // If neither of those exist, return an error return nil, ast.PosError(mc, "no such method: %s", mc.Name.Value)