Make aliased call not look up predeclarations (#9244)

This commit is contained in:
Jakub Žádník 2023-05-20 00:46:22 +03:00 committed by GitHub
parent 01a00641f9
commit 429c4332b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 7 deletions

View File

@ -149,3 +149,9 @@ fn alias_multiword_name() {
let actual = nu!(r#"alias "foo bar" = echo 'test'; foo bar"#); let actual = nu!(r#"alias "foo bar" = echo 'test'; foo bar"#);
assert_eq!(actual.out, "test"); assert_eq!(actual.out, "test");
} }
#[test]
fn alias_ordering() {
let actual = nu!(r#"alias bar = echo; def echo [] { 'dummy echo' }; bar 'foo'"#);
assert_eq!(actual.out, "foo");
}

View File

@ -171,9 +171,9 @@ fn use_export_env_combined() {
sandbox.with_files(vec![FileWithContentToBeTrimmed( sandbox.with_files(vec![FileWithContentToBeTrimmed(
"spam.nu", "spam.nu",
r#" r#"
def foo [] { 'foo' }
alias bar = foo alias bar = foo
export-env { let-env FOO = (bar) } export-env { let-env FOO = (bar) }
def foo [] { 'foo' }
"#, "#,
)]); )]);

View File

@ -804,6 +804,8 @@ pub fn parse_alias(
} }
let starting_error_count = working_set.parse_errors.len(); let starting_error_count = working_set.parse_errors.len();
working_set.search_predecls = false;
let expr = parse_call( let expr = parse_call(
working_set, working_set,
replacement_spans, replacement_spans,
@ -811,6 +813,8 @@ pub fn parse_alias(
false, // TODO: Should this be set properly??? false, // TODO: Should this be set properly???
); );
working_set.search_predecls = true;
if starting_error_count != working_set.parse_errors.len() { if starting_error_count != working_set.parse_errors.len() {
if let Some(e) = working_set.parse_errors.get(starting_error_count) { if let Some(e) = working_set.parse_errors.get(starting_error_count) {
if let ParseError::MissingPositional(..) = e { if let ParseError::MissingPositional(..) = e {

View File

@ -952,6 +952,8 @@ pub struct StateWorkingSet<'a> {
pub currently_parsed_cwd: Option<PathBuf>, pub currently_parsed_cwd: Option<PathBuf>,
/// All previously parsed module files. Used to protect against circular imports. /// All previously parsed module files. Used to protect against circular imports.
pub parsed_module_files: Vec<PathBuf>, pub parsed_module_files: Vec<PathBuf>,
/// Whether or not predeclarations are searched when looking up a command (used with aliases)
pub search_predecls: bool,
pub parse_errors: Vec<ParseError>, pub parse_errors: Vec<ParseError>,
} }
@ -1130,6 +1132,7 @@ impl<'a> StateWorkingSet<'a> {
type_scope: TypeScope::default(), type_scope: TypeScope::default(),
currently_parsed_cwd: permanent_state.currently_parsed_cwd.clone(), currently_parsed_cwd: permanent_state.currently_parsed_cwd.clone(),
parsed_module_files: vec![], parsed_module_files: vec![],
search_predecls: true,
parse_errors: vec![], parse_errors: vec![],
} }
} }
@ -1456,9 +1459,11 @@ impl<'a> StateWorkingSet<'a> {
let mut visibility: Visibility = Visibility::new(); let mut visibility: Visibility = Visibility::new();
for scope_frame in self.delta.scope.iter().rev() { for scope_frame in self.delta.scope.iter().rev() {
if let Some(decl_id) = scope_frame.predecls.get(name) { if self.search_predecls {
if visibility.is_decl_id_visible(decl_id) { if let Some(decl_id) = scope_frame.predecls.get(name) {
return Some(*decl_id); if visibility.is_decl_id_visible(decl_id) {
return Some(*decl_id);
}
} }
} }
@ -1466,9 +1471,11 @@ impl<'a> StateWorkingSet<'a> {
for overlay_frame in scope_frame.active_overlays(&mut removed_overlays).rev() { for overlay_frame in scope_frame.active_overlays(&mut removed_overlays).rev() {
visibility.append(&overlay_frame.visibility); visibility.append(&overlay_frame.visibility);
if let Some(decl_id) = overlay_frame.predecls.get(name) { if self.search_predecls {
if visibility.is_decl_id_visible(decl_id) { if let Some(decl_id) = overlay_frame.predecls.get(name) {
return Some(*decl_id); if visibility.is_decl_id_visible(decl_id) {
return Some(*decl_id);
}
} }
} }