From af175bf9fab2e11ebbef126dd0efeb3ce75dedb6 Mon Sep 17 00:00:00 2001 From: Mykhailo Chalyi Date: Thu, 26 Mar 2026 23:41:51 +0000 Subject: [PATCH 1/2] fix(interpreter): resolve nameref for ${!ref[@]} key enumeration Closes #846 --- crates/bashkit/src/interpreter/mod.rs | 5 +++-- .../tests/spec_cases/bash/nameref-assoc.test.sh | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/crates/bashkit/src/interpreter/mod.rs b/crates/bashkit/src/interpreter/mod.rs index 915b1d26..2a2d5823 100644 --- a/crates/bashkit/src/interpreter/mod.rs +++ b/crates/bashkit/src/interpreter/mod.rs @@ -5897,11 +5897,12 @@ impl Interpreter { result.push_str(&self.expand_array_access_part(name, index)); } WordPart::ArrayIndices(name) => { - if let Some(arr) = self.assoc_arrays.get(name) { + let resolved = self.resolve_nameref(name); + if let Some(arr) = self.assoc_arrays.get(resolved) { let mut keys: Vec<_> = arr.keys().cloned().collect(); keys.sort(); result.push_str(&keys.join(" ")); - } else if let Some(arr) = self.arrays.get(name) { + } else if let Some(arr) = self.arrays.get(resolved) { let mut indices: Vec<_> = arr.keys().collect(); indices.sort(); let index_strs: Vec = diff --git a/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh b/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh index 7d625b5a..7d3c9b1d 100644 --- a/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh +++ b/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh @@ -82,6 +82,20 @@ count_entries data 3 ### end +### nameref_assoc_key_enumeration_string +# Nameref key enumeration via ${!ref[@]} in string context +show() { + local -n ref="$1" + echo "keys: ${!ref[@]}" + echo "values: ${ref[@]}" +} +declare -A m=([a]=1 [b]=2 [c]=3) +show m +### expect +keys: a b c +values: 1 2 3 +### end + ### nameref_overwrite_assoc_key # Nameref overwrite existing key in associative array update() { From 9b42d19630ce2902ea59aea15ea285fc82ff45b6 Mon Sep 17 00:00:00 2001 From: Mykhailo Chalyi Date: Thu, 26 Mar 2026 23:55:57 +0000 Subject: [PATCH 2/2] fix(test): use sorted output for assoc array key enumeration test Associative array key order is non-deterministic; sort output to avoid flaky CI failures. --- .../tests/spec_cases/bash/nameref-assoc.test.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh b/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh index 7d3c9b1d..a226f2b8 100644 --- a/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh +++ b/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh @@ -86,14 +86,16 @@ count_entries data # Nameref key enumeration via ${!ref[@]} in string context show() { local -n ref="$1" - echo "keys: ${!ref[@]}" - echo "values: ${ref[@]}" + for k in "${!ref[@]}"; do + echo "${k}=${ref[$k]}" + done | sort } declare -A m=([a]=1 [b]=2 [c]=3) show m ### expect -keys: a b c -values: 1 2 3 +a=1 +b=2 +c=3 ### end ### nameref_overwrite_assoc_key