collapse_pointers_of_pointers

This commit is contained in:
Andrew Morris
2023-03-09 13:08:14 +11:00
parent 9917b32903
commit 27fcd10f8f

View File

@@ -106,7 +106,7 @@ pub fn link_module(
&mut result.diagnostics,
);
// TODO: collapse_pointers_of_pointers(&mut path_and_module.module);
collapse_pointers_of_pointers(&mut path_and_module.module);
// TODO: shake_tree(&mut path_and_module.module);
result.module = Some(path_and_module.module);
@@ -141,6 +141,7 @@ where
pointer_visitor.module(module);
}
#[derive(PartialEq)]
enum PointerKind {
Definition,
Reference,
@@ -381,3 +382,35 @@ fn link_import_patterns(
*definition = new_definition;
}
}
fn collapse_pointers_of_pointers(module: &mut Module) {
let mut double_pointer_map = HashMap::<Pointer, Pointer>::new();
for definition in &mut module.definitions {
let pointer = match &definition.content {
DefinitionContent::Value(Value::Pointer(pointer)) => pointer,
_ => continue,
};
double_pointer_map.insert(definition.pointer.clone(), pointer.clone());
}
visit_pointers(module, |kind, pointer| {
if kind == PointerKind::Definition {
return;
}
let mut mapped_pointer: &Pointer = pointer;
loop {
if let Some(new_pointer) = double_pointer_map.get(mapped_pointer) {
mapped_pointer = new_pointer;
continue;
}
break;
}
*pointer = mapped_pointer.clone();
});
}