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:
2026-02-19 23:49:47 -05:00
parent 4e43d3d50d
commit caabaeeb9c

View File

@@ -846,6 +846,7 @@ impl Parser {
/// Parse function parameters
fn parse_params(&mut self) -> Result<Vec<Parameter>, ParseError> {
let mut params = Vec::new();
self.skip_newlines();
while !self.check(TokenKind::RParen) {
let start = self.current_span();
@@ -855,9 +856,11 @@ impl Parser {
let span = start.merge(self.previous_span());
params.push(Parameter { name, typ, span });
self.skip_newlines();
if !self.check(TokenKind::RParen) {
self.expect(TokenKind::Comma)?;
self.skip_newlines();
}
}
@@ -1937,11 +1940,14 @@ impl Parser {
if self.check(TokenKind::LParen) {
self.advance();
self.skip_newlines();
let mut fields = Vec::new();
while !self.check(TokenKind::RParen) {
fields.push(self.parse_pattern()?);
self.skip_newlines();
if !self.check(TokenKind::RParen) {
self.expect(TokenKind::Comma)?;
self.skip_newlines();
}
}
self.expect(TokenKind::RParen)?;
@@ -1960,12 +1966,15 @@ impl Parser {
fn parse_tuple_pattern(&mut self) -> Result<Pattern, ParseError> {
let start = self.current_span();
self.expect(TokenKind::LParen)?;
self.skip_newlines();
let mut elements = Vec::new();
while !self.check(TokenKind::RParen) {
elements.push(self.parse_pattern()?);
self.skip_newlines();
if !self.check(TokenKind::RParen) {
self.expect(TokenKind::Comma)?;
self.skip_newlines();
}
}
@@ -2095,6 +2104,7 @@ impl Parser {
fn parse_lambda_params(&mut self) -> Result<Vec<Parameter>, ParseError> {
let mut params = Vec::new();
self.skip_newlines();
while !self.check(TokenKind::RParen) {
let start = self.current_span();
@@ -2110,9 +2120,11 @@ impl Parser {
let span = start.merge(self.previous_span());
params.push(Parameter { name, typ, span });
self.skip_newlines();
if !self.check(TokenKind::RParen) {
self.expect(TokenKind::Comma)?;
self.skip_newlines();
}
}
@@ -2200,6 +2212,7 @@ impl Parser {
fn parse_tuple_or_paren_expr(&mut self) -> Result<Expr, ParseError> {
let start = self.current_span();
self.expect(TokenKind::LParen)?;
self.skip_newlines();
if self.check(TokenKind::RParen) {
self.advance();
@@ -2210,16 +2223,19 @@ impl Parser {
}
let first = self.parse_expr()?;
self.skip_newlines();
if self.check(TokenKind::Comma) {
// Tuple
let mut elements = vec![first];
while self.check(TokenKind::Comma) {
self.advance();
self.skip_newlines();
if self.check(TokenKind::RParen) {
break;
}
elements.push(self.parse_expr()?);
self.skip_newlines();
}
self.expect(TokenKind::RParen)?;
let span = start.merge(self.previous_span());