don't run subcommand if it's surrounded with backtick quote (#14210)

# Description
Fixes: #14202
After looking into the issue, I think #13910 it's not good to cut the
span if it's in external argument.
This pr is somehow revert the change, and fix
https://github.com/nushell/nushell/issues/13431 in another way.

It introduce a new state named `State::BackTickQuote`, so if an external
arg include backtick quote, it enters the state, so backtick quote won't
be the body of a string.

# User-Facing Changes
### Before
```nushell
> ^echo `(echo aa)`
aa
> ^echo `"aa"`   # maybe it's not right to remove the inner quote.
aa
```
### After
```nushell
> ^echo `(echo aa)`
(echo aa)
> ^echo `"aa"`    # inner quote is keeped if there are backtick quote outside.
"aa"
```

# Tests + Formatting
Added 3 tests.
This commit is contained in:
Wind
2024-10-31 23:13:05 +08:00
committed by GitHub
parent 4907575d3d
commit 0a2fb137af
3 changed files with 43 additions and 32 deletions

View File

@ -1026,6 +1026,16 @@ pub fn test_external_call_head_interpolated_string(
r#"hello world"#,
"value is surrounded by backtick quote"
)]
#[case(
r#"^foo `"hello world"`"#,
"\"hello world\"",
"value is surrounded by backtick quote, with inner double quote"
)]
#[case(
r#"^foo `'hello world'`"#,
"'hello world'",
"value is surrounded by backtick quote, with inner single quote"
)]
pub fn test_external_call_arg_glob(#[case] input: &str, #[case] expected: &str, #[case] tag: &str) {
test_external_call(input, tag, |name, args| {
match &name.expr {
@ -1120,16 +1130,6 @@ pub fn test_external_call_arg_raw_string(
r#"foo\external call"#,
"double quote with backslash"
)]
#[case(
r#"^foo `"hello world"`"#,
r#"hello world"#,
"value is surrounded by backtick quote, with inner double quote"
)]
#[case(
r#"^foo `'hello world'`"#,
r#"hello world"#,
"value is surrounded by backtick quote, with inner single quote"
)]
pub fn test_external_call_arg_string(
#[case] input: &str,
#[case] expected: &str,