mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 09:55:42 +02:00
This reverts commit d4798d6ee1
.
This commit is contained in:
@ -1604,104 +1604,87 @@ pub fn parse_string_interpolation(
|
||||
|
||||
let mut b = start;
|
||||
|
||||
let mut consecutive_backslashes: usize = 0;
|
||||
|
||||
while b != end {
|
||||
let current_byte = contents[b - start];
|
||||
if contents[b - start] == b'('
|
||||
&& (if double_quote && (b - start) > 0 {
|
||||
contents[b - start - 1] != b'\\'
|
||||
} else {
|
||||
true
|
||||
})
|
||||
&& mode == InterpolationMode::String
|
||||
{
|
||||
mode = InterpolationMode::Expression;
|
||||
if token_start < b {
|
||||
let span = Span {
|
||||
start: token_start,
|
||||
end: b,
|
||||
};
|
||||
let str_contents = working_set.get_span_contents(span);
|
||||
|
||||
match mode {
|
||||
InterpolationMode::String => {
|
||||
let preceding_consecutive_backslashes = consecutive_backslashes;
|
||||
let str_contents = if double_quote {
|
||||
let (str_contents, err) = unescape_string(str_contents, span);
|
||||
error = error.or(err);
|
||||
|
||||
let is_backslash = current_byte == b'\\';
|
||||
consecutive_backslashes = if is_backslash {
|
||||
preceding_consecutive_backslashes + 1
|
||||
str_contents
|
||||
} else {
|
||||
0
|
||||
str_contents.to_vec()
|
||||
};
|
||||
|
||||
if current_byte == b'('
|
||||
&& (!double_quote || preceding_consecutive_backslashes % 2 == 0)
|
||||
{
|
||||
mode = InterpolationMode::Expression;
|
||||
output.push(Expression {
|
||||
expr: Expr::String(String::from_utf8_lossy(&str_contents).to_string()),
|
||||
span,
|
||||
ty: Type::String,
|
||||
custom_completion: None,
|
||||
});
|
||||
token_start = b;
|
||||
}
|
||||
}
|
||||
if mode == InterpolationMode::Expression {
|
||||
let byte = contents[b - start];
|
||||
if let Some(b'\'') = delimiter_stack.last() {
|
||||
if byte == b'\'' {
|
||||
delimiter_stack.pop();
|
||||
}
|
||||
} else if let Some(b'"') = delimiter_stack.last() {
|
||||
if byte == b'"' {
|
||||
delimiter_stack.pop();
|
||||
}
|
||||
} else if let Some(b'`') = delimiter_stack.last() {
|
||||
if byte == b'`' {
|
||||
delimiter_stack.pop();
|
||||
}
|
||||
} else if byte == b'\'' {
|
||||
delimiter_stack.push(b'\'')
|
||||
} else if byte == b'"' {
|
||||
delimiter_stack.push(b'"');
|
||||
} else if byte == b'`' {
|
||||
delimiter_stack.push(b'`')
|
||||
} else if byte == b'(' {
|
||||
delimiter_stack.push(b')');
|
||||
} else if byte == b')' {
|
||||
if let Some(b')') = delimiter_stack.last() {
|
||||
delimiter_stack.pop();
|
||||
}
|
||||
if delimiter_stack.is_empty() {
|
||||
mode = InterpolationMode::String;
|
||||
|
||||
if token_start < b {
|
||||
let span = Span {
|
||||
start: token_start,
|
||||
end: b,
|
||||
};
|
||||
let str_contents = working_set.get_span_contents(span);
|
||||
|
||||
let str_contents = if double_quote {
|
||||
let (str_contents, err) = unescape_string(str_contents, span);
|
||||
error = error.or(err);
|
||||
|
||||
str_contents
|
||||
} else {
|
||||
str_contents.to_vec()
|
||||
end: b + 1,
|
||||
};
|
||||
|
||||
output.push(Expression {
|
||||
expr: Expr::String(String::from_utf8_lossy(&str_contents).to_string()),
|
||||
span,
|
||||
ty: Type::String,
|
||||
custom_completion: None,
|
||||
});
|
||||
token_start = b;
|
||||
let (expr, err) =
|
||||
parse_full_cell_path(working_set, None, span, expand_aliases_denylist);
|
||||
error = error.or(err);
|
||||
output.push(expr);
|
||||
}
|
||||
}
|
||||
}
|
||||
InterpolationMode::Expression => {
|
||||
let byte = current_byte;
|
||||
if let Some(b'\'') = delimiter_stack.last() {
|
||||
if byte == b'\'' {
|
||||
delimiter_stack.pop();
|
||||
}
|
||||
} else if let Some(b'"') = delimiter_stack.last() {
|
||||
if byte == b'"' {
|
||||
delimiter_stack.pop();
|
||||
}
|
||||
} else if let Some(b'`') = delimiter_stack.last() {
|
||||
if byte == b'`' {
|
||||
delimiter_stack.pop();
|
||||
}
|
||||
} else if byte == b'\'' {
|
||||
delimiter_stack.push(b'\'')
|
||||
} else if byte == b'"' {
|
||||
delimiter_stack.push(b'"');
|
||||
} else if byte == b'`' {
|
||||
delimiter_stack.push(b'`')
|
||||
} else if byte == b'(' {
|
||||
delimiter_stack.push(b')');
|
||||
} else if byte == b')' {
|
||||
if let Some(b')') = delimiter_stack.last() {
|
||||
delimiter_stack.pop();
|
||||
}
|
||||
if delimiter_stack.is_empty() {
|
||||
mode = InterpolationMode::String;
|
||||
|
||||
if token_start < b {
|
||||
let span = Span {
|
||||
start: token_start,
|
||||
end: b + 1,
|
||||
};
|
||||
|
||||
let (expr, err) = parse_full_cell_path(
|
||||
working_set,
|
||||
None,
|
||||
span,
|
||||
expand_aliases_denylist,
|
||||
);
|
||||
error = error.or(err);
|
||||
output.push(expr);
|
||||
}
|
||||
|
||||
token_start = b + 1;
|
||||
continue;
|
||||
}
|
||||
token_start = b + 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
b += 1;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user