Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-db/src/syntax_helpers/format_string_exprs.rs')
| -rw-r--r-- | crates/ide-db/src/syntax_helpers/format_string_exprs.rs | 58 |
1 files changed, 20 insertions, 38 deletions
diff --git a/crates/ide-db/src/syntax_helpers/format_string_exprs.rs b/crates/ide-db/src/syntax_helpers/format_string_exprs.rs index 49594aee9f..8ab5a6ede3 100644 --- a/crates/ide-db/src/syntax_helpers/format_string_exprs.rs +++ b/crates/ide-db/src/syntax_helpers/format_string_exprs.rs @@ -11,15 +11,12 @@ pub enum Arg { Expr(String), } -/** - Add placeholders like `$1` and `$2` in place of [`Arg::Placeholder`], - and unwraps the [`Arg::Ident`] and [`Arg::Expr`] enums. - ```rust - # use ide_db::syntax_helpers::format_string_exprs::*; - assert_eq!(with_placeholders(vec![Arg::Ident("ident".to_owned()), Arg::Placeholder, Arg::Expr("expr + 2".to_owned())]), vec!["ident".to_owned(), "$1".to_owned(), "expr + 2".to_owned()]) - ``` -*/ - +/// Add placeholders like `$1` and `$2` in place of [`Arg::Placeholder`], +/// and unwraps the [`Arg::Ident`] and [`Arg::Expr`] enums. +/// ```rust +/// # use ide_db::syntax_helpers::format_string_exprs::*; +/// assert_eq!(with_placeholders(vec![Arg::Ident("ident".to_owned()), Arg::Placeholder, Arg::Expr("expr + 2".to_owned())]), vec!["ident".to_owned(), "$1".to_owned(), "expr + 2".to_owned()]) +/// ``` pub fn with_placeholders(args: Vec<Arg>) -> Vec<String> { let mut placeholder_id = 1; args.into_iter() @@ -34,18 +31,15 @@ pub fn with_placeholders(args: Vec<Arg>) -> Vec<String> { .collect() } -/** - Parser for a format-like string. It is more allowing in terms of string contents, - as we expect variable placeholders to be filled with expressions. - - Built for completions and assists, and escapes `\` and `$` in output. - (See the comments on `get_receiver_text()` for detail.) - Splits a format string that may contain expressions - like - ```rust - assert_eq!(parse("{ident} {} {expr + 42} ").unwrap(), ("{} {} {}", vec![Arg::Ident("ident"), Arg::Placeholder, Arg::Expr("expr + 42")])); - ``` -*/ +/// Parser for a format-like string. It is more allowing in terms of string contents, +/// as we expect variable placeholders to be filled with expressions. +/// +/// Splits a format string that may contain expressions +/// like +/// ```rust +/// # use ide_db::syntax_helpers::format_string_exprs::*; +/// assert_eq!(parse_format_exprs("{ident} {} {expr + 42} ").unwrap(), ("{ident} {} {} ".to_owned(), vec![Arg::Placeholder, Arg::Expr("expr + 42".to_owned())])); +/// ``` pub fn parse_format_exprs(input: &str) -> Result<(String, Vec<Arg>), ()> { #[derive(Debug, Clone, Copy, PartialEq)] enum State { @@ -79,9 +73,6 @@ pub fn parse_format_exprs(input: &str) -> Result<(String, Vec<Arg>), ()> { state = State::MaybeIncorrect; } (State::NotArg, _) => { - if matches!(chr, '\\' | '$') { - output.push('\\'); - } output.push(chr); } (State::MaybeIncorrect, '}') => { @@ -110,9 +101,6 @@ pub fn parse_format_exprs(input: &str) -> Result<(String, Vec<Arg>), ()> { state = State::FormatOpts; } (State::MaybeArg, _) => { - if matches!(chr, '\\' | '$') { - current_expr.push('\\'); - } current_expr.push(chr); // While Rust uses the unicode sets of XID_start and XID_continue for Identifiers @@ -172,9 +160,6 @@ pub fn parse_format_exprs(input: &str) -> Result<(String, Vec<Arg>), ()> { state = State::Expr; } - if matches!(chr, '\\' | '$') { - current_expr.push('\\'); - } current_expr.push(chr); } (State::FormatOpts, '}') => { @@ -182,9 +167,6 @@ pub fn parse_format_exprs(input: &str) -> Result<(String, Vec<Arg>), ()> { state = State::NotArg; } (State::FormatOpts, _) => { - if matches!(chr, '\\' | '$') { - output.push('\\'); - } output.push(chr); } } @@ -217,15 +199,15 @@ mod tests { fn format_str_parser() { let test_vector = &[ ("no expressions", expect![["no expressions"]]), - (r"no expressions with \$0$1", expect![r"no expressions with \\\$0\$1"]), + (r"no expressions with \$0$1", expect![r"no expressions with \$0$1"]), ("{expr} is {2 + 2}", expect![["{expr} is {}; 2 + 2"]]), ("{expr:?}", expect![["{expr:?}"]]), - ("{expr:1$}", expect![[r"{expr:1\$}"]]), - ("{:1$}", expect![[r"{:1\$}; $1"]]), - ("{:>padding$}", expect![[r"{:>padding\$}; $1"]]), + ("{expr:1$}", expect![[r"{expr:1$}"]]), + ("{:1$}", expect![[r"{:1$}; $1"]]), + ("{:>padding$}", expect![[r"{:>padding$}; $1"]]), ("{}, {}, {0}", expect![[r"{}, {}, {0}; $1, $2"]]), ("{}, {}, {0:b}", expect![[r"{}, {}, {0:b}; $1, $2"]]), - ("{$0}", expect![[r"{}; \$0"]]), + ("{$0}", expect![[r"{}; $0"]]), ("{malformed", expect![["-"]]), ("malformed}", expect![["-"]]), ("{{correct", expect![["{{correct"]]), |