use crate::ast::AstModule;
use crate::hir::HirModule;
use super::NamingError;
use super::allocate::{FunctionAssignContext, assign_names_for_function};
use super::ast_facts::collect_ast_naming_facts;
use super::common::{FunctionHints, ModuleNameAllocator, NameMap, NamingEvidence, NamingOptions};
use super::evidence::collect_naming_evidence;
use super::hints::collect_function_hints;
use super::lexical::collect_lexical_contexts;
use super::validate::validate_readability_ast;
pub fn assign_names(
module: &AstModule,
hir: &HirModule,
options: NamingOptions,
) -> Result<NameMap, NamingError> {
let evidence = collect_naming_evidence(hir)?;
assign_names_with_evidence(module, hir, &evidence, options)
}
pub fn assign_names_with_evidence(
module: &AstModule,
hir: &HirModule,
evidence: &NamingEvidence,
options: NamingOptions,
) -> Result<NameMap, NamingError> {
let ast_facts = collect_ast_naming_facts(module, hir);
let lexical_contexts = collect_lexical_contexts(module, hir)?;
validate_readability_ast(module, module.entry_function, hir)?;
let mut hints = vec![FunctionHints::default(); hir.protos.len()];
collect_function_hints(module, hir, &mut hints)?;
let mut module_names = ModuleNameAllocator::default();
let mut functions = Vec::with_capacity(hir.protos.len());
for proto in &hir.protos {
functions.push(assign_names_for_function(FunctionAssignContext {
proto,
evidence: &evidence.functions[proto.id.index()],
hints: &hints[proto.id.index()],
ast_facts: &ast_facts.functions[proto.id.index()],
options,
lexical: lexical_contexts
.function(proto.id)
.expect("lexical contexts should cover every HIR proto"),
assigned_functions: &functions,
module_names: &mut module_names,
})?);
}
Ok(NameMap {
entry_function: module.entry_function,
mode: options.mode,
functions,
})
}
#[cfg(test)]
mod tests;