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 /// 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());