mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 12:54:58 +00:00
Validate byte string literals
This commit is contained in:
parent
c258b4fdb0
commit
30cd4d5acb
8 changed files with 305 additions and 24 deletions
|
@ -1,6 +1,55 @@
|
|||
use self::CharComponentKind::*;
|
||||
use rowan::{TextRange, TextUnit};
|
||||
|
||||
pub fn parse_byte_string_literal(src: &str) -> ByteStringComponentIterator {
|
||||
ByteStringComponentIterator {
|
||||
parser: Parser::new(src),
|
||||
has_closing_quote: false,
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ByteStringComponentIterator<'a> {
|
||||
parser: Parser<'a>,
|
||||
pub has_closing_quote: bool,
|
||||
}
|
||||
|
||||
impl<'a> Iterator for ByteStringComponentIterator<'a> {
|
||||
type Item = StringComponent;
|
||||
fn next(&mut self) -> Option<StringComponent> {
|
||||
if self.parser.pos == 0 {
|
||||
assert!(
|
||||
self.parser.advance() == 'b',
|
||||
"byte string literal should start with a `b`"
|
||||
);
|
||||
|
||||
assert!(
|
||||
self.parser.advance() == '"',
|
||||
"byte string literal should start with a `b`, followed by double quotes"
|
||||
);
|
||||
}
|
||||
|
||||
if let Some(component) = self.parser.parse_string_component() {
|
||||
return Some(component);
|
||||
}
|
||||
|
||||
// We get here when there are no char components left to parse
|
||||
if self.parser.peek() == Some('"') {
|
||||
self.parser.advance();
|
||||
self.has_closing_quote = true;
|
||||
}
|
||||
|
||||
assert!(
|
||||
self.parser.peek() == None,
|
||||
"byte string literal should leave no unparsed input: src = {}, pos = {}, length = {}",
|
||||
self.parser.src,
|
||||
self.parser.pos,
|
||||
self.parser.src.len()
|
||||
);
|
||||
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse_string_literal(src: &str) -> StringComponentIterator {
|
||||
StringComponentIterator {
|
||||
parser: Parser::new(src),
|
||||
|
@ -81,12 +130,12 @@ impl<'a> Iterator for ByteComponentIterator<'a> {
|
|||
if self.parser.pos == 0 {
|
||||
assert!(
|
||||
self.parser.advance() == 'b',
|
||||
"Byte literal should start with a b"
|
||||
"Byte literal should start with a `b`"
|
||||
);
|
||||
|
||||
assert!(
|
||||
self.parser.advance() == '\'',
|
||||
"Byte literal should start with a b, followed by a quote"
|
||||
"Byte literal should start with a `b`, followed by a quote"
|
||||
);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue