fix issue with same names causing 0 index debruijn for var

This commit is contained in:
Kasey White 2022-06-26 21:30:24 -04:00 committed by Lucas
parent 027daf30ea
commit 4eafdd2d39
3 changed files with 18 additions and 1 deletions

View File

@ -59,6 +59,8 @@ impl Converter {
self.end_scope(); self.end_scope();
self.remove_unique(parameter_name.unique);
Term::Lambda { Term::Lambda {
parameter_name: name, parameter_name: name,
body: Box::new(body), body: Box::new(body),
@ -95,6 +97,8 @@ impl Converter {
self.end_scope(); self.end_scope();
self.remove_unique(parameter_name.unique);
Term::Lambda { Term::Lambda {
parameter_name: name, parameter_name: name,
body: Box::new(body), body: Box::new(body),
@ -340,6 +344,12 @@ impl Converter {
scope.insert(unique, self.current_level); scope.insert(unique, self.current_level);
} }
fn remove_unique(&mut self, unique: Unique) {
let scope = &mut self.levels[self.current_level.0];
scope.remove(unique, self.current_level);
}
fn declare_binder(&mut self) { fn declare_binder(&mut self) {
let scope = &mut self.levels[self.current_level.0]; let scope = &mut self.levels[self.current_level.0];

View File

@ -4,6 +4,8 @@ use crate::ast::Unique;
use super::Level; use super::Level;
#[derive(Debug)]
pub struct BiMap { pub struct BiMap {
left: HashMap<Unique, Level>, left: HashMap<Unique, Level>,
right: HashMap<Level, Unique>, right: HashMap<Level, Unique>,
@ -22,6 +24,11 @@ impl BiMap {
self.right.insert(level, unique); self.right.insert(level, unique);
} }
pub(super) fn remove(&mut self, unique: Unique, level: Level) {
self.left.remove(&unique);
self.right.remove(&level);
}
pub(super) fn get(&self, unique: &Unique) -> Option<&Level> { pub(super) fn get(&self, unique: &Unique) -> Option<&Level> {
self.left.get(unique) self.left.get(unique)
} }

View File

@ -75,7 +75,6 @@ fn fibonacci() {
} }
// TODO: This is failing, see Bug: https://github.com/txpipe/aiken/issues/10 // TODO: This is failing, see Bug: https://github.com/txpipe/aiken/issues/10
#[ignore]
#[test] #[test]
fn one_way_fibonacci() { fn one_way_fibonacci() {
let bytes = include_bytes!("../test_data/fibonacci/fibonacci.flat"); let bytes = include_bytes!("../test_data/fibonacci/fibonacci.flat");
@ -86,4 +85,5 @@ fn one_way_fibonacci() {
let code = include_str!("../test_data/fibonacci/unsanitary_fibonacci.uplc"); let code = include_str!("../test_data/fibonacci/unsanitary_fibonacci.uplc");
parsed_program_matches_decoded_bytes(bytes, code); parsed_program_matches_decoded_bytes(bytes, code);
encoded_program_matches_bytes(bytes, code);
} }