diff options
| author | Esteban Küber <esteban@commure.com> | 2018-07-22 22:40:24 -0700 |
|---|---|---|
| committer | Esteban Küber <esteban@commure.com> | 2018-07-22 23:09:00 -0700 |
| commit | 38abca8c2d7de08861cd61bc439efdb7cf4de398 (patch) | |
| tree | 0e252e1fa78c65e3977e8328f5d0ae687c3cb1ac /src/libfmt_macros | |
| parent | d3b3bc57670ab91a53b2100cf3dfe78947bfe077 (diff) | |
| download | rust-38abca8c2d7de08861cd61bc439efdb7cf4de398.tar.gz rust-38abca8c2d7de08861cd61bc439efdb7cf4de398.zip | |
Point at internal span in format string
Diffstat (limited to 'src/libfmt_macros')
| -rw-r--r-- | src/libfmt_macros/lib.rs | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/libfmt_macros/lib.rs b/src/libfmt_macros/lib.rs index 9952e5f64d6..f6dcebf8c50 100644 --- a/src/libfmt_macros/lib.rs +++ b/src/libfmt_macros/lib.rs @@ -154,6 +154,7 @@ pub struct Parser<'a> { style: Option<usize>, /// How many newlines have been seen in the string so far, to adjust the error spans seen_newlines: usize, + pub arg_places: Vec<(usize, usize)>, } impl<'a> Iterator for Parser<'a> { @@ -168,9 +169,13 @@ impl<'a> Iterator for Parser<'a> { if self.consume('{') { Some(String(self.string(pos + 1))) } else { - let ret = Some(NextArgument(self.argument())); - self.must_consume('}'); - ret + let mut arg = self.argument(); + if let Some(arg_pos) = self.must_consume('}').map(|end| { + (pos + raw + 1, end + raw + 2) + }) { + self.arg_places.push(arg_pos); + } + Some(NextArgument(arg)) } } '}' => { @@ -211,6 +216,7 @@ impl<'a> Parser<'a> { curarg: 0, style, seen_newlines: 0, + arg_places: vec![], } } @@ -271,7 +277,7 @@ impl<'a> Parser<'a> { /// Forces consumption of the specified character. If the character is not /// found, an error is emitted. - fn must_consume(&mut self, c: char) { + fn must_consume(&mut self, c: char) -> Option<usize> { self.ws(); let raw = self.style.unwrap_or(0); @@ -279,12 +285,14 @@ impl<'a> Parser<'a> { if let Some(&(pos, maybe)) = self.cur.peek() { if c == maybe { self.cur.next(); + Some(pos) } else { let pos = pos + padding + 1; self.err(format!("expected `{:?}`, found `{:?}`", c, maybe), format!("expected `{}`", c), pos, pos); + None } } else { let msg = format!("expected `{:?}` but string was terminated", c); @@ -302,6 +310,7 @@ impl<'a> Parser<'a> { } else { self.err(msg, format!("expected `{:?}`", c), pos, pos); } + None } } |
