aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-10-28 02:54:02 +0900
committerOphestra <cat@gensokyo.uk>2026-10-28 02:54:02 +0900
commit7e3ba55cdc4d4a7c19deb65879e8abbb12a8e458 (patch)
tree8479f6d73fde5d27c8c06d37f610376530443071
parenta491746ce9cdad4e0dce184ad2441733fadaa78a (diff)
internal/rosa/azalea: treat keys as standard value
This allows expressions like string concatenation for the KV key part. Signed-off-by: Ophestra <cat@gensokyo.uk>
-rw-r--r--internal/rosa/azalea/azalea.go13
-rw-r--r--internal/rosa/azalea/azalea_test.go27
-rw-r--r--internal/rosa/azalea/evaluate.go8
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)