Add the ability to remove and list aliases (#3879)

* Add the ability to remove and list aliases

* Fix failing unit tests

* Add a test to check unalias shadowing blocks
This commit is contained in:
soumil-07
2021-08-17 19:26:35 +05:30
committed by GitHub
parent 2b7390c2a1
commit 9bd408449e
9 changed files with 110 additions and 16 deletions

View File

@ -1902,7 +1902,7 @@ fn parse_call(
)),
);
}
} else if lite_cmd.parts[0].item == "alias" {
} else if lite_cmd.parts[0].item == "alias" || lite_cmd.parts[0].item == "unalias" {
let error = parse_alias(&lite_cmd, scope);
if error.is_none() {
return (Some(ClassifiedCommand::Internal(internal_command)), None);
@ -2048,26 +2048,41 @@ fn expand_shorthand_forms(
}
fn parse_alias(call: &LiteCommand, scope: &dyn ParserScope) -> Option<ParseError> {
if call.parts.len() == 2 && (call.parts[1].item == "--help" || (call.parts[1].item == "-h")) {
return None;
}
if call.parts[0].item == "alias" {
if (call.parts.len() == 1)
|| (call.parts.len() == 2
&& (call.parts[1].item == "--help" || (call.parts[1].item == "-h")))
{
return None;
}
if call.parts.len() < 4 {
return Some(ParseError::mismatch("alias", call.parts[0].clone()));
}
if call.parts.len() < 4 {
return Some(ParseError::mismatch("alias", call.parts[0].clone()));
}
if call.parts[0].item != "alias" {
return Some(ParseError::mismatch("alias", call.parts[0].clone()));
}
if call.parts[0].item != "alias" {
return Some(ParseError::mismatch("alias", call.parts[0].clone()));
}
if call.parts[2].item != "=" {
return Some(ParseError::mismatch("=", call.parts[2].clone()));
if call.parts[2].item != "=" {
return Some(ParseError::mismatch("=", call.parts[2].clone()));
}
} else {
// unalias
if call.parts.len() != 2 {
return Some(ParseError::mismatch("unalias", call.parts[0].clone()));
}
}
let name = call.parts[1].item.clone();
let args: Vec<_> = call.parts.iter().skip(3).cloned().collect();
scope.add_alias(&name, args);
match call.parts[0].item.as_str() {
"alias" => scope.add_alias(&name, args),
"unalias" => {
scope.remove_alias(&name);
}
_ => unreachable!(),
};
None
}

View File

@ -13,6 +13,8 @@ pub trait ParserScope: Debug {
fn get_alias(&self, name: &str) -> Option<Vec<Spanned<String>>>;
fn remove_alias(&self, name: &str);
fn add_alias(&self, name: &str, replacement: Vec<Spanned<String>>);
fn enter_scope(&self);