diff --git a/src/imp/gen_map_get.rs b/src/imp/gen_map_get.rs index 66cf8265..624648bb 100644 --- a/src/imp/gen_map_get.rs +++ b/src/imp/gen_map_get.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use indexmap::IndexMap; use crate::fun::Name; @@ -116,13 +116,14 @@ impl Stmt { } } -type Substitutions = HashMap)>; +type Substitutions = IndexMap)>; impl Expr { fn substitute_map_gets(&mut self, id: &mut usize) -> Substitutions { fn go(e: &mut Expr, substitutions: &mut Substitutions, id: &mut usize) { match e { Expr::MapGet { nam, key } => { + go(key, substitutions, id); let new_var = gen_map_var(id); substitutions.insert(new_var.clone(), (nam.clone(), key.clone())); *e = Expr::Var { nam: new_var }; @@ -175,7 +176,7 @@ impl Expr { } fn gen_get(current: &mut Stmt, substitutions: Substitutions) -> Stmt { - substitutions.into_iter().fold(std::mem::take(current), |acc, next| { + substitutions.into_iter().rfold(std::mem::take(current), |acc, next| { let (var, (map_var, key)) = next; let map_get_call = Expr::Var { nam: Name::new("Map/get") }; let map_get_call = Expr::Call { diff --git a/tests/golden_tests/run_file/nested_map_get.bend b/tests/golden_tests/run_file/nested_map_get.bend new file mode 100644 index 00000000..a2a834e5 --- /dev/null +++ b/tests/golden_tests/run_file/nested_map_get.bend @@ -0,0 +1,5 @@ +def x: + return { 0: 1, 1: 42, 2: 0, 3: 2 } + +def main(): + return x[x[0]] + x[x[x[3]]] diff --git a/tests/snapshots/run_file__nested_map_get.bend.snap b/tests/snapshots/run_file__nested_map_get.bend.snap new file mode 100644 index 00000000..51bd5656 --- /dev/null +++ b/tests/snapshots/run_file__nested_map_get.bend.snap @@ -0,0 +1,9 @@ +--- +source: tests/golden_tests.rs +input_file: tests/golden_tests/run_file/nested_map_get.bend +--- +NumScott: +43 + +Scott: +43