@@ -4070,6 +4070,44 @@ impl<'a> Parser<'a> {
40704070 )
40714071 }
40724072
4073+ /// Look backwards in the token stream and expect that there was only whitespace tokens until the previous newline
4074+ pub fn expect_previously_only_whitespace_until_newline(&mut self) -> Result<(), ParserError> {
4075+ let mut look_back_count = 2;
4076+ loop {
4077+ let prev_index = self.index.saturating_sub(look_back_count);
4078+ if prev_index == 0 {
4079+ break;
4080+ }
4081+ let prev_token = self.token_at(prev_index);
4082+ match prev_token.token {
4083+ Token::Whitespace(ref w) => match w {
4084+ Whitespace::Newline => break,
4085+ // special consideration required for single line comments since that string includes the newline
4086+ Whitespace::SingleLineComment { comment, prefix: _ } => {
4087+ if comment.ends_with('\n') {
4088+ break;
4089+ }
4090+ look_back_count += 1;
4091+ }
4092+ _ => look_back_count += 1,
4093+ },
4094+ _ => {
4095+ let current_token = self.get_current_token();
4096+ if prev_token == current_token {
4097+ // if we are at the start of the statement, we can skip this check
4098+ break;
4099+ }
4100+
4101+ self.expected(
4102+ &format!("newline before current token ({})", current_token),
4103+ prev_token.clone(),
4104+ )?
4105+ }
4106+ };
4107+ }
4108+ Ok(())
4109+ }
4110+
40734111 /// If the current token is the `expected` keyword, consume it and returns
40744112 /// true. Otherwise, no tokens are consumed and returns false.
40754113 #[must_use]
@@ -15081,36 +15119,7 @@ impl<'a> Parser<'a> {
1508115119
1508215120 /// Parse [Statement::Go]
1508315121 fn parse_go(&mut self) -> Result<Statement, ParserError> {
15084- // previous token should be a newline (skipping non-newline whitespace)
15085- // see also, `previous_token`
15086- let mut look_back_count = 2;
15087- loop {
15088- let prev_index = self.index.saturating_sub(look_back_count);
15089- if prev_index == 0 {
15090- break;
15091- }
15092- let prev_token = self.token_at(prev_index);
15093- match prev_token.token {
15094- Token::Whitespace(ref w) => match w {
15095- Whitespace::Newline => break,
15096- Whitespace::SingleLineComment { comment, prefix: _ } => {
15097- if comment.ends_with('\n') {
15098- break;
15099- }
15100- look_back_count += 1;
15101- }
15102- _ => look_back_count += 1,
15103- },
15104- _ => {
15105- if prev_token == self.get_current_token() {
15106- // if we are at the start of the statement, we can skip this check
15107- break;
15108- }
15109-
15110- self.expected("newline before GO", prev_token.clone())?
15111- }
15112- };
15113- }
15122+ self.expect_previously_only_whitespace_until_newline()?;
1511415123
1511515124 let count = loop {
1511615125 // using this peek function because we want to halt this statement parsing upon newline
0 commit comments