mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 01:24:58 +02:00
Allow overlays to import prefixed definitions (#6301)
* WIP * Fix overlay prefix not preserving correctly * Work around failing REPL tests * Remove wrong code when removing with --keep-custom
This commit is contained in:
@ -124,6 +124,18 @@ pub enum ParseError {
|
||||
#[diagnostic(code(nu::parser::active_overlay_not_found), url(docsrs))]
|
||||
ActiveOverlayNotFound(#[label = "not an active overlay"] Span),
|
||||
|
||||
#[error("Overlay prefix mismatch.")]
|
||||
#[diagnostic(
|
||||
code(nu::parser::overlay_prefix_mismatch),
|
||||
url(docsrs),
|
||||
help("Overlay {0} already exists {1} a prefix. To add it again, do it {1} the --prefix flag.")
|
||||
)]
|
||||
OverlayPrefixMismatch(
|
||||
String,
|
||||
String,
|
||||
#[label = "already exists {1} a prefix"] Span,
|
||||
),
|
||||
|
||||
#[error("Module or overlay not found.")]
|
||||
#[diagnostic(
|
||||
code(nu::parser::module_or_overlay_not_found),
|
||||
@ -327,6 +339,7 @@ impl ParseError {
|
||||
ParseError::ModuleNotFound(s) => *s,
|
||||
ParseError::ModuleOrOverlayNotFound(s) => *s,
|
||||
ParseError::ActiveOverlayNotFound(s) => *s,
|
||||
ParseError::OverlayPrefixMismatch(_, _, s) => *s,
|
||||
ParseError::CantRemoveLastOverlay(s) => *s,
|
||||
ParseError::CantRemoveDefaultOverlay(_, s) => *s,
|
||||
ParseError::NotFound(s) => *s,
|
||||
|
@ -702,21 +702,23 @@ pub fn parse_export(
|
||||
|
||||
let mut result = vec![];
|
||||
|
||||
let decl_name = working_set.get_span_contents(spans[2]);
|
||||
let decl_name = trim_quotes(decl_name);
|
||||
if let Some(decl_name_span) = spans.get(2) {
|
||||
let decl_name = working_set.get_span_contents(*decl_name_span);
|
||||
let decl_name = trim_quotes(decl_name);
|
||||
|
||||
if let Some(decl_id) = working_set.find_decl(decl_name, &Type::Any) {
|
||||
result.push(Exportable::Decl {
|
||||
name: decl_name.to_vec(),
|
||||
id: decl_id,
|
||||
});
|
||||
} else {
|
||||
error = error.or_else(|| {
|
||||
Some(ParseError::InternalError(
|
||||
"failed to find added declaration".into(),
|
||||
span(&spans[1..]),
|
||||
))
|
||||
});
|
||||
if let Some(decl_id) = working_set.find_decl(decl_name, &Type::Any) {
|
||||
result.push(Exportable::Decl {
|
||||
name: decl_name.to_vec(),
|
||||
id: decl_id,
|
||||
});
|
||||
} else {
|
||||
error = error.or_else(|| {
|
||||
Some(ParseError::InternalError(
|
||||
"failed to find added declaration".into(),
|
||||
span(&spans[1..]),
|
||||
))
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
result
|
||||
@ -2032,7 +2034,13 @@ pub fn parse_overlay_new(
|
||||
|
||||
let module_id = working_set.add_module(&overlay_name, Module::new());
|
||||
|
||||
working_set.add_overlay(overlay_name.as_bytes().to_vec(), module_id, vec![], vec![]);
|
||||
working_set.add_overlay(
|
||||
overlay_name.as_bytes().to_vec(),
|
||||
module_id,
|
||||
vec![],
|
||||
vec![],
|
||||
false,
|
||||
);
|
||||
|
||||
(pipeline, None)
|
||||
}
|
||||
@ -2118,6 +2126,8 @@ pub fn parse_overlay_add(
|
||||
);
|
||||
};
|
||||
|
||||
let has_prefix = call.has_flag("prefix");
|
||||
|
||||
let pipeline = Pipeline::from_vec(vec![Expression {
|
||||
expr: Expr::Call(call),
|
||||
span: span(spans),
|
||||
@ -2125,15 +2135,36 @@ pub fn parse_overlay_add(
|
||||
custom_completion: None,
|
||||
}]);
|
||||
|
||||
// TODO: Add support for it -- needs to play well with overlay remove
|
||||
let has_prefix = false; //call.has_flag("prefix");
|
||||
|
||||
let cwd = working_set.get_cwd();
|
||||
|
||||
let mut error = None;
|
||||
|
||||
let result = if let Some(module_id) = working_set.find_overlay_origin(overlay_name.as_bytes()) {
|
||||
let result = if let Some(overlay_frame) = working_set.find_overlay(overlay_name.as_bytes()) {
|
||||
if has_prefix && !overlay_frame.prefixed {
|
||||
return (
|
||||
pipeline,
|
||||
Some(ParseError::OverlayPrefixMismatch(
|
||||
overlay_name,
|
||||
"without".to_string(),
|
||||
overlay_name_span,
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
if !has_prefix && overlay_frame.prefixed {
|
||||
return (
|
||||
pipeline,
|
||||
Some(ParseError::OverlayPrefixMismatch(
|
||||
overlay_name,
|
||||
"with".to_string(),
|
||||
overlay_name_span,
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
// Activate existing overlay
|
||||
let module_id = overlay_frame.origin;
|
||||
|
||||
if let Some(new_module_id) = working_set.find_module(overlay_name.as_bytes()) {
|
||||
if module_id == new_module_id {
|
||||
Some((overlay_name, Module::new(), module_id))
|
||||
@ -2237,6 +2268,7 @@ pub fn parse_overlay_add(
|
||||
module_id,
|
||||
decls_to_lay,
|
||||
aliases_to_lay,
|
||||
has_prefix,
|
||||
);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user