Skip to content

Commit 4d66fbb

Browse files
committed
fix: Recognize raw string literals without any #
Fixes #885
1 parent c313ab8 commit 4d66fbb

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

parser/src/token.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -581,12 +581,7 @@ impl<'input> Tokenizer<'input> {
581581
match self.bump() {
582582
Some((_, b'"')) => {
583583
let mut found_delimiters = 0;
584-
while let Some((_, ch)) = self.bump() {
585-
match ch {
586-
b'#' => found_delimiters += 1,
587-
b'"' => found_delimiters = 0,
588-
_ => break,
589-
}
584+
loop {
590585
if found_delimiters == delimiters {
591586
let end = self.next_loc();
592587
let mut content_end = end;
@@ -596,6 +591,15 @@ impl<'input> Tokenizer<'input> {
596591
let token = Token::StringLiteral(StringLiteral::Raw(string));
597592
return Ok(pos::spanned2(start, end, token));
598593
}
594+
if let Some((_, ch)) = self.bump() {
595+
match ch {
596+
b'#' => found_delimiters += 1,
597+
b'"' => found_delimiters = 0,
598+
_ => break,
599+
}
600+
} else {
601+
break;
602+
}
599603
}
600604
}
601605
_ => break,
@@ -1053,7 +1057,7 @@ mod test {
10531057
#[test]
10541058
fn raw_string_literals() {
10551059
test(
1056-
r#########"foo r#"bar" "# baz r##""## "#########,
1060+
r#########"foo r#"bar" "# baz r##""## r#"""# "#########,
10571061
vec![
10581062
(r####"~~~ "####, Identifier("foo")),
10591063
(
@@ -1065,6 +1069,10 @@ mod test {
10651069
r#" ~~~~~~~ "#,
10661070
Token::StringLiteral(StringLiteral::Raw("")),
10671071
),
1072+
(
1073+
r#" ~~~~~~ "#,
1074+
Token::StringLiteral(StringLiteral::Raw("\"")),
1075+
),
10681076
],
10691077
);
10701078
}

parser/tests/basic.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,14 @@ test_parse! {
360360
}
361361
}
362362

363+
test_parse! {
364+
raw_string_literal,
365+
r##" r"asdf" "##,
366+
|_arena| {
367+
string("asdf")
368+
}
369+
}
370+
363371
#[test]
364372
fn span_identifier() {
365373
let _ = ::env_logger::try_init();

parser/tests/support/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use crate::base::{
66
ast::{
77
self, walk_mut_alias, walk_mut_ast_type, walk_mut_expr, walk_mut_pattern, Alternative,
88
Argument, Array, AstType, DisplayEnv, Do, Expr, ExprField, IdentEnv, Lambda, Literal,
9-
MutVisitor, Pattern, RootExpr, SpannedAlias, SpannedAstType, SpannedExpr, SpannedIdent,
10-
SpannedPattern, TypeBinding, TypedIdent, ValueBinding,Sp,
9+
MutVisitor, Pattern, RootExpr, Sp, SpannedAlias, SpannedAstType, SpannedExpr, SpannedIdent,
10+
SpannedPattern, TypeBinding, TypedIdent, ValueBinding,
1111
},
1212
error::Errors,
1313
kind::Kind,
@@ -548,6 +548,7 @@ macro_rules! test_parse {
548548
let text = $text;
549549
let e = parse_clear_span!(text);
550550
mk_ast_arena!(arena);
551+
let _: &Arena<String> = &*arena;
551552
fn call<A, R>(a: A, f: impl FnOnce(A) -> R) -> R {
552553
f(a)
553554
}

0 commit comments

Comments
 (0)