From a15dda48c696cb14d490ee91f40949d5cd538aba Mon Sep 17 00:00:00 2001 From: Roland Ruckerbauer Date: Sun, 15 Nov 2020 17:43:14 +0100 Subject: format string highlighting: handle hex + debug type specifier --- .../test_data/highlight_strings.html | 2 ++ crates/ide/src/syntax_highlighting/tests.rs | 2 ++ crates/syntax/src/ast/token_ext.rs | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html b/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html index 43f1b32fd..d398e1ec8 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html @@ -93,4 +93,6 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd println!("{\x41}", A = 92); println!("{ничоси}", ничоси = 92); + + println!("{:x?} {} ", thingy, n2); } \ No newline at end of file diff --git a/crates/ide/src/syntax_highlighting/tests.rs b/crates/ide/src/syntax_highlighting/tests.rs index 5c22e2fce..1dc018a16 100644 --- a/crates/ide/src/syntax_highlighting/tests.rs +++ b/crates/ide/src/syntax_highlighting/tests.rs @@ -340,6 +340,8 @@ fn main() { println!("{\x41}", A = 92); println!("{ничоси}", ничоси = 92); + + println!("{:x?} {} ", thingy, n2); }"# .trim(), expect_file!["./test_data/highlight_strings.html"], diff --git a/crates/syntax/src/ast/token_ext.rs b/crates/syntax/src/ast/token_ext.rs index 2661c753e..ac0326420 100644 --- a/crates/syntax/src/ast/token_ext.rs +++ b/crates/syntax/src/ast/token_ext.rs @@ -331,10 +331,22 @@ pub trait HasFormatSpecifier: AstToken { } c if c == '_' || c.is_alphabetic() => { read_identifier(&mut chars, &mut callback); + + if chars.peek().and_then(|next| next.1.as_ref().ok()).copied() + == Some('?') + { + skip_char_and_emit( + &mut chars, + FormatSpecifier::QuestionMark, + &mut callback, + ); + } + // can be either width (indicated by dollar sign, or type in which case // the next sign has to be `}`) let next = chars.peek().and_then(|next| next.1.as_ref().ok()).copied(); + match next { Some('$') => skip_char_and_emit( &mut chars, @@ -417,6 +429,16 @@ pub trait HasFormatSpecifier: AstToken { } c if c == '_' || c.is_alphabetic() => { read_identifier(&mut chars, &mut callback); + + if chars.peek().and_then(|next| next.1.as_ref().ok()).copied() + == Some('?') + { + skip_char_and_emit( + &mut chars, + FormatSpecifier::QuestionMark, + &mut callback, + ); + } } _ => {} } -- cgit v1.2.3