Skip to content

Commit e9e085b

Browse files
committed
refactor!: move reserved variable name checking near is_variable and add_variable
1 parent 13e5399 commit e9e085b

3 files changed

Lines changed: 59 additions & 48 deletions

File tree

crates/nu-parser/src/parse_keywords.rs

Lines changed: 12 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,6 @@ pub const ALIASABLE_PARSER_KEYWORDS: &[&[u8]] = &[
5858
b"overlay use",
5959
];
6060

61-
pub const RESERVED_VARIABLE_NAMES: [&str; 4] = ["in", "nu", "env", "it"];
62-
63-
pub fn ensure_not_reserved_variable_name(working_set: &mut StateWorkingSet, lvalue: &Expression) {
64-
if lvalue.as_var().is_none() {
65-
return;
66-
}
67-
68-
let var_name = String::from_utf8_lossy(working_set.get_span_contents(lvalue.span))
69-
.trim_start_matches('$')
70-
.to_string();
71-
72-
verify_not_reserved_variable_name(working_set, &var_name, lvalue.span);
73-
}
74-
7561
/// These parser keywords cannot be aliased (either not possible, or support not yet added)
7662
pub const UNALIASABLE_PARSER_KEYWORDS: &[&[u8]] = &[
7763
b"alias",
@@ -389,13 +375,6 @@ pub fn parse_for(working_set: &mut StateWorkingSet, lite_command: &LiteCommand)
389375
Expression::new(working_set, Expr::Call(call), call_span, Type::Nothing)
390376
}
391377

392-
/// If `name` is a keyword, emit an error.
393-
fn verify_not_reserved_variable_name(working_set: &mut StateWorkingSet, name: &str, span: Span) {
394-
if RESERVED_VARIABLE_NAMES.contains(&name) {
395-
working_set.error(ParseError::NameIsBuiltinVar(name.to_string(), span))
396-
}
397-
}
398-
399378
// This is meant for parsing attribute blocks without an accompanying `def` or `extern`. It's
400379
// necessary to provide consistent syntax highlighting, completions, and helpful errors
401380
//
@@ -721,18 +700,18 @@ fn parse_def_inner(
721700
let mut result = None;
722701

723702
if let (Some(mut signature), Some(block_id)) = (sig.as_signature(), block.as_block()) {
724-
for arg_name in &signature.required_positional {
725-
verify_not_reserved_variable_name(working_set, &arg_name.name, sig.span);
726-
}
727-
for arg_name in &signature.optional_positional {
728-
verify_not_reserved_variable_name(working_set, &arg_name.name, sig.span);
729-
}
730-
if let Some(arg_name) = &signature.rest_positional {
731-
verify_not_reserved_variable_name(working_set, &arg_name.name, sig.span);
732-
}
733-
for flag_name in &signature.get_names() {
734-
verify_not_reserved_variable_name(working_set, flag_name, sig.span);
735-
}
703+
// for arg_name in &signature.required_positional {
704+
// verify_not_reserved_variable_name(working_set, &arg_name.name, sig.span);
705+
// }
706+
// for arg_name in &signature.optional_positional {
707+
// verify_not_reserved_variable_name(working_set, &arg_name.name, sig.span);
708+
// }
709+
// if let Some(arg_name) = &signature.rest_positional {
710+
// verify_not_reserved_variable_name(working_set, &arg_name.name, sig.span);
711+
// }
712+
// for flag_name in &signature.get_names() {
713+
// verify_not_reserved_variable_name(working_set, flag_name, sig.span);
714+
// }
736715

737716
if has_wrapped {
738717
if let Some(rest) = &signature.rest_positional {
@@ -3282,8 +3261,6 @@ pub fn parse_let(working_set: &mut StateWorkingSet, spans: &[Span]) -> Pipeline
32823261
working_set.error(ParseError::ExtraTokens(spans[idx + 2]));
32833262
}
32843263

3285-
ensure_not_reserved_variable_name(working_set, &lvalue);
3286-
32873264
let var_id = lvalue.as_var();
32883265
let rhs_type = rvalue.ty.clone();
32893266

@@ -3398,8 +3375,6 @@ pub fn parse_const(working_set: &mut StateWorkingSet, spans: &[Span]) -> (Pipeli
33983375
working_set.error(ParseError::ExtraTokens(spans[idx + 2]));
33993376
}
34003377

3401-
ensure_not_reserved_variable_name(working_set, &lvalue);
3402-
34033378
let var_id = lvalue.as_var();
34043379
let rhs_type = rvalue.ty.clone();
34053380

@@ -3561,8 +3536,6 @@ pub fn parse_mut(working_set: &mut StateWorkingSet, spans: &[Span]) -> Pipeline
35613536
working_set.error(ParseError::ExtraTokens(spans[idx + 2]));
35623537
}
35633538

3564-
ensure_not_reserved_variable_name(working_set, &lvalue);
3565-
35663539
let var_id = lvalue.as_var();
35673540
let rhs_type = rvalue.ty.clone();
35683541

crates/nu-parser/src/parse_patterns.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
use crate::{
44
lex, lite_parse,
5-
parser::{is_variable, parse_value},
5+
parser::{ensure_not_reserved_variable_name, is_variable, parse_value},
66
};
77
use nu_protocol::{
88
ParseError, Span, SyntaxShape, Type, VarId,
@@ -54,8 +54,10 @@ fn parse_variable_pattern_helper(working_set: &mut StateWorkingSet, span: Span)
5454
if let Some(var_id) = working_set.find_variable_in_current_frame(bytes) {
5555
Some(var_id)
5656
} else {
57-
let var_id = working_set.add_variable(bytes.to_vec(), span, Type::Any, false);
57+
let name = bytes.to_vec();
58+
ensure_not_reserved_variable_name(working_set, &name, span);
5859

60+
let var_id = working_set.add_variable(name, span, Type::Any, false);
5961
Some(var_id)
6062
}
6163
} else {

crates/nu-parser/src/parser.rs

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,6 @@ pub fn parse_internal_call(
10361036
let _ = working_set.add_span(call.head);
10371037

10381038
let decl = working_set.get_decl(decl_id);
1039-
let decl_name = decl.name().to_string();
10401039
let signature = working_set.get_signature(decl);
10411040
let output = signature.get_output_type();
10421041

@@ -1379,12 +1378,6 @@ pub fn parse_internal_call(
13791378
// Maybe more `CallKind::Invalid` if errors found during argument parsing.
13801379
let call_kind = check_call(working_set, command_span, &signature, &call);
13811380

1382-
if decl_name == "let"
1383-
&& let Some(lvalue) = call.positional_nth(0)
1384-
{
1385-
ensure_not_reserved_variable_name(working_set, lvalue);
1386-
}
1387-
13881381
deprecation
13891382
.into_iter()
13901383
.filter_map(|entry| entry.parse_warning(&signature.name, &call))
@@ -3774,6 +3767,8 @@ pub fn parse_var_with_opt_type(
37743767
return (garbage(working_set, spans[*spans_idx - 1]), None);
37753768
}
37763769

3770+
ensure_not_reserved_variable_name(working_set, &var_name, name_span);
3771+
37773772
let id = working_set.add_variable(var_name, spans[*spans_idx - 1], ty.clone(), mutable);
37783773

37793774
(
@@ -3789,6 +3784,8 @@ pub fn parse_var_with_opt_type(
37893784
return (garbage(working_set, spans[*spans_idx]), None);
37903785
}
37913786

3787+
ensure_not_reserved_variable_name(working_set, &var_name, name_span);
3788+
37923789
let id = working_set.add_variable(var_name, spans[*spans_idx], Type::Any, mutable);
37933790

37943791
working_set.error(ParseError::MissingType(spans[*spans_idx]));
@@ -3808,6 +3805,8 @@ pub fn parse_var_with_opt_type(
38083805
return (garbage(working_set, spans[*spans_idx]), None);
38093806
}
38103807

3808+
ensure_not_reserved_variable_name(working_set, &var_name, name_span);
3809+
38113810
let id = working_set.add_variable(
38123811
var_name,
38133812
Span::concat(&spans[*spans_idx..*spans_idx + 1]),
@@ -3822,6 +3821,23 @@ pub fn parse_var_with_opt_type(
38223821
}
38233822
}
38243823

3824+
const RESERVED_VARIABLE_NAMES: [&[u8]; 3] = [b"in", b"nu", b"env"];
3825+
3826+
pub(crate) fn ensure_not_reserved_variable_name(
3827+
working_set: &mut StateWorkingSet,
3828+
name: &[u8],
3829+
span: Span,
3830+
) {
3831+
let var_name = name.strip_prefix(b"$").unwrap_or(name);
3832+
3833+
if RESERVED_VARIABLE_NAMES.contains(&var_name) {
3834+
working_set.error(ParseError::NameIsBuiltinVar(
3835+
String::from_utf8_lossy(var_name).to_string(),
3836+
span,
3837+
))
3838+
}
3839+
}
3840+
38253841
pub fn expand_to_cell_path(
38263842
working_set: &mut StateWorkingSet,
38273843
expression: &mut Expression,
@@ -4196,6 +4212,12 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
41964212
))
41974213
}
41984214

4215+
ensure_not_reserved_variable_name(
4216+
working_set,
4217+
&variable_name,
4218+
span,
4219+
);
4220+
41994221
let var_id = working_set.add_variable(
42004222
variable_name,
42014223
span,
@@ -4285,6 +4307,12 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
42854307
))
42864308
}
42874309

4310+
ensure_not_reserved_variable_name(
4311+
working_set,
4312+
&variable_name,
4313+
span,
4314+
);
4315+
42884316
let var_id = working_set.add_variable(
42894317
variable_name,
42904318
span,
@@ -4357,6 +4385,12 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
43574385
))
43584386
}
43594387

4388+
ensure_not_reserved_variable_name(
4389+
working_set,
4390+
optional_param,
4391+
span,
4392+
);
4393+
43604394
let var_id = working_set.add_variable(
43614395
optional_param.to_vec(),
43624396
span,
@@ -4390,6 +4424,8 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
43904424
))
43914425
}
43924426

4427+
ensure_not_reserved_variable_name(working_set, contents, span);
4428+
43934429
let var_id =
43944430
working_set.add_variable(contents_vec, span, Type::Any, false);
43954431

0 commit comments

Comments
 (0)