fix issue with same names causing 0 index debruijn for var
This commit is contained in:
parent
027daf30ea
commit
4eafdd2d39
|
@ -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];
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue