diff options
Diffstat (limited to 'internal/rosa')
| -rw-r--r-- | internal/rosa/azalea/azalea.go | 13 | ||||
| -rw-r--r-- | internal/rosa/azalea/azalea_test.go | 27 | ||||
| -rw-r--r-- | internal/rosa/azalea/evaluate.go | 8 |
3 files changed, 23 insertions, 25 deletions
diff --git a/internal/rosa/azalea/azalea.go b/internal/rosa/azalea/azalea.go index bd24ef4e..5e044214 100644 --- a/internal/rosa/azalea/azalea.go +++ b/internal/rosa/azalea/azalea.go @@ -121,10 +121,7 @@ func (p *parser) parseVal() (v Val) { type Array []Val // A KV holds a key/value pair. -type KV struct { - K String - V Val -} +type KV struct{ K, V Val } // An Arg represents an argument of [Func]. type Arg struct { @@ -235,9 +232,8 @@ func (p *parser) parseExpr() any { p.scan() return v - case scanner.String: - pair := KV{K: p.parseString()} - p.scan() + default: + pair := KV{K: p.parseVal()} switch p.tok { case ';': break @@ -252,9 +248,6 @@ func (p *parser) parseExpr() any { panic(ExprError(p.tok)) } v = append(v, pair) - - default: - panic(ExprError(p.tok)) } } diff --git a/internal/rosa/azalea/azalea_test.go b/internal/rosa/azalea/azalea_test.go index 73330412..6e184737 100644 --- a/internal/rosa/azalea/azalea_test.go +++ b/internal/rosa/azalea/azalea_test.go @@ -44,10 +44,15 @@ func TestParse(t *testing.T) { {"empty pairs", `{}`, []any{[]KV(nil)}, nil}, {"short kv", `{"\x00":v;}`, []any{[]KV{ - {K: "\x00", V: Val{Ident("v")}}, + {K: Val{String("\x00")}, V: Val{Ident("v")}}, }}, nil}, {"truncated kv", `{"\x00"`, nil, ExprError(scanner.EOF)}, - {"ident kv", `{v="";}`, nil, ExprError(scanner.Ident)}, + {"ident kv", `{v:"";}`, []any{[]KV{ + {K: Val{Ident("v")}, V: Val{String("")}}, + }}, nil}, + {"append kv", `{v+"\x00"+_v:"";}`, []any{[]KV{ + {K: Val{Ident("v"), String("\x00"), Ident("_v")}, V: Val{String("")}}, + }}, nil}, {"empty array", `[]`, []any{Array(nil)}, nil}, {"integer array", `[9]`, []any{Array{{Int(9)}}}, nil}, @@ -100,15 +105,15 @@ func TestParse(t *testing.T) { Args: []Arg{ {K: []Ident{Ident("configure")}, V: Val{[]KV{ - {K: String("disable-multilib")}, - {K: String("enable-default-pie")}, - {K: String("disable-nls")}, - {K: String("with-gnu-as")}, - {K: String("with-gnu-ld")}, - {K: String("with-system-zlib")}, - {K: String("enable-languages"), V: Val{String("c,c++,go")}}, - {K: String("with-native-system-header-dir"), V: Val{String("/system/include")}}, - {K: String("with-multilib-list"), V: Val{Func{ + {K: Val{String("disable-multilib")}}, + {K: Val{String("enable-default-pie")}}, + {K: Val{String("disable-nls")}}, + {K: Val{String("with-gnu-as")}}, + {K: Val{String("with-gnu-ld")}}, + {K: Val{String("with-system-zlib")}}, + {K: Val{String("enable-languages")}, V: Val{String("c,c++,go")}}, + {K: Val{String("with-native-system-header-dir")}, V: Val{String("/system/include")}}, + {K: Val{String("with-multilib-list")}, V: Val{Func{ Ident: Ident("arch"), Args: []Arg{ diff --git a/internal/rosa/azalea/evaluate.go b/internal/rosa/azalea/evaluate.go index 9b7b08d0..1fb730f3 100644 --- a/internal/rosa/azalea/evaluate.go +++ b/internal/rosa/azalea/evaluate.go @@ -200,7 +200,6 @@ func (e EvaluationError) Error() string { } var ( - // IdentTools is a special array argument in a package declaration whose // values of [Ident] are kept as is when passed to a [PF]. IdentTools = unique.Make(Ident("tools")) @@ -317,9 +316,10 @@ func evaluateAny(d PF, s []Frame, expr, rp any) bool { case []KV: r := make([][2]string, 0, len(e)) for i := range e { - var _r string - if e[i].V == nil || evaluate(d, s, e[i].V, &_r) { - r = append(r, [2]string{string(e[i].K), _r}) + var _r [2]string + if evaluate(d, s, e[i].K, &_r[0]) && + (e[i].V == nil || evaluate(d, s, e[i].V, &_r[1])) { + r = append(r, _r) } } store(rp, r) |
