increased test coverage (83.9%)

This commit is contained in:
2026-05-21 03:06:52 +02:00
parent 1055569dd6
commit a62f27b104
10 changed files with 190 additions and 45 deletions
+23 -21
View File
@@ -40,23 +40,7 @@ func evalContextValue(ctx kern.ExprContext, opTerm *scan.Term) (v any, err error
}
if sourceCtx != nil {
if formatter, ok := sourceCtx.(kern.DictFormat); ok {
v = formatter.ToDict()
} else if formatter, ok := sourceCtx.(kern.Formatter); ok {
v = formatter.ToString(0)
} else {
// keys := sourceCtx.EnumVars(func(name string) bool { return name[0] != '_' })
keys := sourceCtx.EnumVars(nil)
d := make(map[string]any)
for _, key := range keys {
d[key], _ = sourceCtx.GetVar(key)
}
keys = sourceCtx.EnumFuncs(func(name string) bool { return true })
for _, key := range keys {
d[key], _ = sourceCtx.GetFuncInfo(key)
}
v = d
}
v = contextToDict(sourceCtx)
} else if childValue != nil {
it, ok := childValue.(kern.Iterator)
if !ok {
@@ -64,18 +48,14 @@ func evalContextValue(ctx kern.ExprContext, opTerm *scan.Term) (v any, err error
}
if err == nil {
var item any
// values := kern.NewListA()
values := kern.NewLinkedListA()
for item, err = it.Next(); err == nil; item, err = it.Next() {
// values.AppendItem(item)
values.PushBack(item)
}
if err == io.EOF {
err = nil
v = values
}
// } else {
// err = opTerm.ErrIncompatiblePrefixPostfixType(childValue)
}
} else {
err = opTerm.ErrIncompatiblePrefixPostfixType(childValue)
@@ -83,6 +63,28 @@ func evalContextValue(ctx kern.ExprContext, opTerm *scan.Term) (v any, err error
return
}
func contextToDict(ctx kern.ExprContext) (dict *kern.DictType) {
// Variables
keys := ctx.EnumVars(nil)
vars := kern.MakeDict()
for _, key := range keys {
value, _ := ctx.GetVar(key)
vars.SetItem(key, value)
}
// Functions
keys = ctx.EnumFuncs(func(name string) bool { return true })
funcs := kern.MakeDict()
for _, key := range keys {
funcInfo, _ := ctx.GetFuncInfo(key)
funcs.SetItem(key, funcInfo)
}
dict = kern.MakeDict()
dict.SetItem("vars", vars)
dict.SetItem("funcs", funcs)
return
}
// init
func init() {
scan.RegisterTermConstructor(scan.SymDoubleDollar, newContextTerm)