diff options
| author | mejrs <59372212+mejrs@users.noreply.github.com> | 2025-05-24 18:12:18 +0200 |
|---|---|---|
| committer | mejrs <59372212+mejrs@users.noreply.github.com> | 2025-06-09 16:28:58 +0200 |
| commit | 03c846ee1d118d8a2a39085c7365655706aee0f8 (patch) | |
| tree | 67d587dbf80edb19f73f51bc905b1388b8962072 /compiler/rustc_parse_format | |
| parent | c7174a761b7f5b70a1abd1b2a122876ffe097c0f (diff) | |
| download | rust-03c846ee1d118d8a2a39085c7365655706aee0f8.tar.gz rust-03c846ee1d118d8a2a39085c7365655706aee0f8.zip | |
Introduce ParseMode::diagnostic and fix multiline spans
Diffstat (limited to 'compiler/rustc_parse_format')
| -rw-r--r-- | compiler/rustc_parse_format/src/lib.rs | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/compiler/rustc_parse_format/src/lib.rs b/compiler/rustc_parse_format/src/lib.rs index d17e0677f8a..42bd0f5d847 100644 --- a/compiler/rustc_parse_format/src/lib.rs +++ b/compiler/rustc_parse_format/src/lib.rs @@ -29,6 +29,11 @@ pub enum ParseMode { Format, /// An inline assembly template string for `asm!`. InlineAsm, + /// A format string for use in diagnostic attributes. + /// + /// Similar to `format_args!`, however only named ("captured") arguments + /// are allowed, and no format modifiers are permitted. + Diagnostic, } /// A piece is a portion of the format string which represents the next part @@ -506,6 +511,7 @@ impl<'input> Parser<'input> { let format = match self.mode { ParseMode::Format => self.format(), ParseMode::InlineAsm => self.inline_asm(), + ParseMode::Diagnostic => self.diagnostic(), }; // Resolve position after parsing format spec. @@ -715,6 +721,22 @@ impl<'input> Parser<'input> { spec } + /// Always returns an empty `FormatSpec` + fn diagnostic(&mut self) -> FormatSpec<'input> { + let mut spec = FormatSpec::default(); + + let Some((Range { start, .. }, start_idx)) = self.consume_pos(':') else { + return spec; + }; + + spec.ty = self.string(start_idx); + spec.ty_span = { + let end = self.input_vec_index2range(self.input_vec_index).start; + Some(start..end) + }; + spec + } + /// Parses a `Count` parameter at the current position. This does not check /// for 'CountIsNextParam' because that is only used in precision, not /// width. |
