2019-04-11 15:23:14 -07:00
|
|
|
use crate::common::*;
|
2019-04-11 12:30:29 -07:00
|
|
|
use CompilationErrorKind::*;
|
|
|
|
|
2019-09-21 15:35:03 -07:00
|
|
|
pub(crate) struct AliasResolver<'a, 'b>
|
2019-04-11 12:30:29 -07:00
|
|
|
where
|
|
|
|
'a: 'b,
|
|
|
|
{
|
2019-04-11 15:23:14 -07:00
|
|
|
aliases: &'b BTreeMap<&'a str, Alias<'a>>,
|
|
|
|
recipes: &'b BTreeMap<&'a str, Recipe<'a>>,
|
2019-04-11 12:30:29 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a: 'b, 'b> AliasResolver<'a, 'b> {
|
2019-09-21 15:35:03 -07:00
|
|
|
pub(crate) fn resolve_aliases(
|
2019-04-11 15:23:14 -07:00
|
|
|
aliases: &BTreeMap<&'a str, Alias<'a>>,
|
|
|
|
recipes: &BTreeMap<&'a str, Recipe<'a>>,
|
2019-04-11 12:30:29 -07:00
|
|
|
) -> CompilationResult<'a, ()> {
|
2019-11-07 10:55:15 -08:00
|
|
|
let resolver = AliasResolver { aliases, recipes };
|
2019-04-11 12:30:29 -07:00
|
|
|
|
|
|
|
resolver.resolve()?;
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn resolve(&self) -> CompilationResult<'a, ()> {
|
|
|
|
for alias in self.aliases.values() {
|
|
|
|
self.resolve_alias(alias)?;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn resolve_alias(&self, alias: &Alias<'a>) -> CompilationResult<'a, ()> {
|
2019-11-07 10:55:15 -08:00
|
|
|
let token = alias.name.token();
|
2019-04-11 12:30:29 -07:00
|
|
|
// Make sure the alias doesn't conflict with any recipe
|
2019-11-07 10:55:15 -08:00
|
|
|
if let Some(recipe) = self.recipes.get(alias.name.lexeme()) {
|
2019-04-11 12:30:29 -07:00
|
|
|
return Err(token.error(AliasShadowsRecipe {
|
2019-11-07 10:55:15 -08:00
|
|
|
alias: alias.name.lexeme(),
|
|
|
|
recipe_line: recipe.line_number(),
|
2019-04-11 12:30:29 -07:00
|
|
|
}));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Make sure the target recipe exists
|
2019-11-07 10:55:15 -08:00
|
|
|
if self.recipes.get(alias.target.lexeme()).is_none() {
|
2019-04-11 12:30:29 -07:00
|
|
|
return Err(token.error(UnknownAliasTarget {
|
2019-11-07 10:55:15 -08:00
|
|
|
alias: alias.name.lexeme(),
|
|
|
|
target: alias.target.lexeme(),
|
2019-04-11 12:30:29 -07:00
|
|
|
}));
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|