fix: allow multi-line function params, lambda params, tuples, and patterns
Added skip_newlines() calls throughout the parser so that newlines are properly handled in parameter lists, tuple expressions, and pattern matching constructs. Fixes Issue 5 and Issue 6 from ISSUES.md. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -846,6 +846,7 @@ impl Parser {
|
|||||||
/// Parse function parameters
|
/// Parse function parameters
|
||||||
fn parse_params(&mut self) -> Result<Vec<Parameter>, ParseError> {
|
fn parse_params(&mut self) -> Result<Vec<Parameter>, ParseError> {
|
||||||
let mut params = Vec::new();
|
let mut params = Vec::new();
|
||||||
|
self.skip_newlines();
|
||||||
|
|
||||||
while !self.check(TokenKind::RParen) {
|
while !self.check(TokenKind::RParen) {
|
||||||
let start = self.current_span();
|
let start = self.current_span();
|
||||||
@@ -855,9 +856,11 @@ impl Parser {
|
|||||||
let span = start.merge(self.previous_span());
|
let span = start.merge(self.previous_span());
|
||||||
|
|
||||||
params.push(Parameter { name, typ, span });
|
params.push(Parameter { name, typ, span });
|
||||||
|
self.skip_newlines();
|
||||||
|
|
||||||
if !self.check(TokenKind::RParen) {
|
if !self.check(TokenKind::RParen) {
|
||||||
self.expect(TokenKind::Comma)?;
|
self.expect(TokenKind::Comma)?;
|
||||||
|
self.skip_newlines();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1937,11 +1940,14 @@ impl Parser {
|
|||||||
|
|
||||||
if self.check(TokenKind::LParen) {
|
if self.check(TokenKind::LParen) {
|
||||||
self.advance();
|
self.advance();
|
||||||
|
self.skip_newlines();
|
||||||
let mut fields = Vec::new();
|
let mut fields = Vec::new();
|
||||||
while !self.check(TokenKind::RParen) {
|
while !self.check(TokenKind::RParen) {
|
||||||
fields.push(self.parse_pattern()?);
|
fields.push(self.parse_pattern()?);
|
||||||
|
self.skip_newlines();
|
||||||
if !self.check(TokenKind::RParen) {
|
if !self.check(TokenKind::RParen) {
|
||||||
self.expect(TokenKind::Comma)?;
|
self.expect(TokenKind::Comma)?;
|
||||||
|
self.skip_newlines();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.expect(TokenKind::RParen)?;
|
self.expect(TokenKind::RParen)?;
|
||||||
@@ -1960,12 +1966,15 @@ impl Parser {
|
|||||||
fn parse_tuple_pattern(&mut self) -> Result<Pattern, ParseError> {
|
fn parse_tuple_pattern(&mut self) -> Result<Pattern, ParseError> {
|
||||||
let start = self.current_span();
|
let start = self.current_span();
|
||||||
self.expect(TokenKind::LParen)?;
|
self.expect(TokenKind::LParen)?;
|
||||||
|
self.skip_newlines();
|
||||||
|
|
||||||
let mut elements = Vec::new();
|
let mut elements = Vec::new();
|
||||||
while !self.check(TokenKind::RParen) {
|
while !self.check(TokenKind::RParen) {
|
||||||
elements.push(self.parse_pattern()?);
|
elements.push(self.parse_pattern()?);
|
||||||
|
self.skip_newlines();
|
||||||
if !self.check(TokenKind::RParen) {
|
if !self.check(TokenKind::RParen) {
|
||||||
self.expect(TokenKind::Comma)?;
|
self.expect(TokenKind::Comma)?;
|
||||||
|
self.skip_newlines();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2095,6 +2104,7 @@ impl Parser {
|
|||||||
|
|
||||||
fn parse_lambda_params(&mut self) -> Result<Vec<Parameter>, ParseError> {
|
fn parse_lambda_params(&mut self) -> Result<Vec<Parameter>, ParseError> {
|
||||||
let mut params = Vec::new();
|
let mut params = Vec::new();
|
||||||
|
self.skip_newlines();
|
||||||
|
|
||||||
while !self.check(TokenKind::RParen) {
|
while !self.check(TokenKind::RParen) {
|
||||||
let start = self.current_span();
|
let start = self.current_span();
|
||||||
@@ -2110,9 +2120,11 @@ impl Parser {
|
|||||||
|
|
||||||
let span = start.merge(self.previous_span());
|
let span = start.merge(self.previous_span());
|
||||||
params.push(Parameter { name, typ, span });
|
params.push(Parameter { name, typ, span });
|
||||||
|
self.skip_newlines();
|
||||||
|
|
||||||
if !self.check(TokenKind::RParen) {
|
if !self.check(TokenKind::RParen) {
|
||||||
self.expect(TokenKind::Comma)?;
|
self.expect(TokenKind::Comma)?;
|
||||||
|
self.skip_newlines();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2200,6 +2212,7 @@ impl Parser {
|
|||||||
fn parse_tuple_or_paren_expr(&mut self) -> Result<Expr, ParseError> {
|
fn parse_tuple_or_paren_expr(&mut self) -> Result<Expr, ParseError> {
|
||||||
let start = self.current_span();
|
let start = self.current_span();
|
||||||
self.expect(TokenKind::LParen)?;
|
self.expect(TokenKind::LParen)?;
|
||||||
|
self.skip_newlines();
|
||||||
|
|
||||||
if self.check(TokenKind::RParen) {
|
if self.check(TokenKind::RParen) {
|
||||||
self.advance();
|
self.advance();
|
||||||
@@ -2210,16 +2223,19 @@ impl Parser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let first = self.parse_expr()?;
|
let first = self.parse_expr()?;
|
||||||
|
self.skip_newlines();
|
||||||
|
|
||||||
if self.check(TokenKind::Comma) {
|
if self.check(TokenKind::Comma) {
|
||||||
// Tuple
|
// Tuple
|
||||||
let mut elements = vec![first];
|
let mut elements = vec![first];
|
||||||
while self.check(TokenKind::Comma) {
|
while self.check(TokenKind::Comma) {
|
||||||
self.advance();
|
self.advance();
|
||||||
|
self.skip_newlines();
|
||||||
if self.check(TokenKind::RParen) {
|
if self.check(TokenKind::RParen) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
elements.push(self.parse_expr()?);
|
elements.push(self.parse_expr()?);
|
||||||
|
self.skip_newlines();
|
||||||
}
|
}
|
||||||
self.expect(TokenKind::RParen)?;
|
self.expect(TokenKind::RParen)?;
|
||||||
let span = start.merge(self.previous_span());
|
let span = start.merge(self.previous_span());
|
||||||
|
|||||||
Reference in New Issue
Block a user