builder: split MirBuilder core methods
This commit is contained in:
58
src/mir/builder/builder_method_index.rs
Normal file
58
src/mir/builder/builder_method_index.rs
Normal file
@ -0,0 +1,58 @@
|
||||
use super::MirBuilder;
|
||||
|
||||
impl MirBuilder {
|
||||
// ----------------------
|
||||
// Method tail index (performance helper)
|
||||
// ----------------------
|
||||
fn rebuild_method_tail_index(&mut self) {
|
||||
self.comp_ctx.method_tail_index.clear();
|
||||
if let Some(ref module) = self.current_module {
|
||||
for name in module.functions.keys() {
|
||||
if let (Some(dot), Some(slash)) = (name.rfind('.'), name.rfind('/')) {
|
||||
if slash > dot {
|
||||
let tail = &name[dot..];
|
||||
self.comp_ctx
|
||||
.method_tail_index
|
||||
.entry(tail.to_string())
|
||||
.or_insert_with(Vec::new)
|
||||
.push(name.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
self.comp_ctx.method_tail_index_source_len = module.functions.len();
|
||||
} else {
|
||||
self.comp_ctx.method_tail_index_source_len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
fn ensure_method_tail_index(&mut self) {
|
||||
let need_rebuild = match self.current_module {
|
||||
Some(ref refmod) => {
|
||||
self.comp_ctx.method_tail_index_source_len != refmod.functions.len()
|
||||
}
|
||||
None => self.comp_ctx.method_tail_index_source_len != 0,
|
||||
};
|
||||
if need_rebuild {
|
||||
self.rebuild_method_tail_index();
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn method_candidates(&mut self, method: &str, arity: usize) -> Vec<String> {
|
||||
self.ensure_method_tail_index();
|
||||
let tail = format!(".{}{}", method, format!("/{}", arity));
|
||||
self.comp_ctx
|
||||
.method_tail_index
|
||||
.get(&tail)
|
||||
.cloned()
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
pub(super) fn method_candidates_tail<S: AsRef<str>>(&mut self, tail: S) -> Vec<String> {
|
||||
self.ensure_method_tail_index();
|
||||
self.comp_ctx
|
||||
.method_tail_index
|
||||
.get(tail.as_ref())
|
||||
.cloned()
|
||||
.unwrap_or_default()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user