Add 'as' keyword to 'overlay add' (#6314)

This commit is contained in:
Jakub Žádník
2022-08-13 17:28:18 +03:00
committed by GitHub
parent 20528e96c7
commit 8783742060
4 changed files with 231 additions and 53 deletions

View File

@ -160,6 +160,10 @@ pub enum ParseError {
)]
CantRemoveDefaultOverlay(String, #[label = "can't remove overlay"] Span),
#[error("Cannot add overlay.")]
#[diagnostic(code(nu::parser::cant_add_overlay_help), url(docsrs), help("{0}"))]
CantAddOverlayHelp(String, #[label = "cannot add this overlay"] Span),
#[error("Not found.")]
#[diagnostic(code(nu::parser::not_found), url(docsrs))]
NotFound(#[label = "did not find anything under this name"] Span),
@ -342,6 +346,7 @@ impl ParseError {
ParseError::OverlayPrefixMismatch(_, _, s) => *s,
ParseError::CantRemoveLastOverlay(s) => *s,
ParseError::CantRemoveDefaultOverlay(_, s) => *s,
ParseError::CantAddOverlayHelp(_, s) => *s,
ParseError::NotFound(s) => *s,
ParseError::DuplicateCommandDef(s) => *s,
ParseError::UnknownCommand(s) => *s,

View File

@ -5,7 +5,7 @@ use nu_protocol::{
ImportPatternMember, Pipeline,
},
engine::{StateWorkingSet, DEFAULT_OVERLAY_NAME},
span, Exportable, Module, PositionalArg, Span, SyntaxShape, Type,
span, Exportable, Module, PositionalArg, Span, Spanned, SyntaxShape, Type,
};
use std::collections::HashSet;
use std::path::{Path, PathBuf};
@ -2126,6 +2126,36 @@ pub fn parse_overlay_add(
);
};
let new_name = if let Some(kw_expression) = call.positional_nth(1) {
if let Some(new_name_expression) = kw_expression.as_keyword() {
if let Some(new_name) = new_name_expression.as_string() {
Some(Spanned {
item: new_name,
span: new_name_expression.span,
})
} else {
return (
garbage_pipeline(spans),
Some(ParseError::TypeMismatch(
Type::String,
new_name_expression.ty.clone(),
new_name_expression.span,
)),
);
}
} else {
return (
garbage_pipeline(spans),
Some(ParseError::ExpectedKeyword(
"as keyword".to_string(),
kw_expression.span,
)),
);
}
} else {
None
};
let has_prefix = call.has_flag("prefix");
let pipeline = Pipeline::from_vec(vec![Expression {
@ -2162,6 +2192,18 @@ pub fn parse_overlay_add(
);
}
if let Some(new_name) = new_name {
if new_name.item != overlay_name {
return (
pipeline,
Some(ParseError::CantAddOverlayHelp(
format!("Cannot add overlay as '{}' because it already exsits under the name '{}'", new_name.item, overlay_name),
new_name.span,
)),
);
}
}
// Activate existing overlay
let module_id = overlay_frame.origin;
@ -2186,7 +2228,7 @@ pub fn parse_overlay_add(
working_set.find_module(overlay_name.as_bytes())
{
Some((
overlay_name,
new_name.map(|spanned| spanned.item).unwrap_or(overlay_name),
working_set.get_module(module_id).clone(),
module_id,
))
@ -2236,7 +2278,11 @@ pub fn parse_overlay_add(
let _ = working_set.add_block(block);
let module_id = working_set.add_module(&overlay_name, module.clone());
Some((overlay_name, module, module_id))
Some((
new_name.map(|spanned| spanned.item).unwrap_or(overlay_name),
module,
module_id,
))
} else {
return (
pipeline,