1use crate::ast::*;
4use crate::error::{CompilerError, Result};
5use crate::lexer::Token;
6
7pub struct Parser {
9 tokens: Vec<Token>,
10 position: usize,
11}
12
13impl Parser {
14 pub fn new(tokens: Vec<Token>) -> Self {
16 Self {
17 tokens,
18 position: 0,
19 }
20 }
21
22 pub fn parse(&mut self) -> Result<Program> {
24 let mut statements = Vec::new();
25
26 while self.position < self.tokens.len() {
27 if let Some(statement) = self.parse_statement()? {
28 statements.push(statement);
29 } else {
30 break;
31 }
32 }
33
34 Ok(Program { statements })
35 }
36
37 fn parse_statement(&mut self) -> Result<Option<Statement>> {
39 if self.position >= self.tokens.len() {
40 return Ok(None);
41 }
42
43 let token = &self.tokens[self.position];
44 let statement = match token {
45 Token::EOF => return Ok(None),
46 Token::Keyword(keyword) => match keyword {
47 crate::lexer::Keyword::Let
48 | crate::lexer::Keyword::Const
49 | crate::lexer::Keyword::Var => self.parse_variable_declaration()?,
50 crate::lexer::Keyword::Function => self.parse_function_declaration()?,
51 crate::lexer::Keyword::Class => self.parse_class_declaration()?,
52 crate::lexer::Keyword::Interface => self.parse_interface_declaration()?,
53 crate::lexer::Keyword::Type => self.parse_type_alias()?,
54 crate::lexer::Keyword::Enum => self.parse_enum_declaration()?,
55 crate::lexer::Keyword::Import => self.parse_import_declaration()?,
56 crate::lexer::Keyword::Export => self.parse_export_declaration()?,
57 crate::lexer::Keyword::Namespace => self.parse_namespace_declaration()?,
58 crate::lexer::Keyword::Module => self.parse_module_declaration()?,
59 crate::lexer::Keyword::Declare => self.parse_declare_statement()?,
60 crate::lexer::Keyword::Return => self.parse_return_statement()?,
61 crate::lexer::Keyword::If => self.parse_if_statement()?,
62 crate::lexer::Keyword::Else => self.parse_expression_statement()?,
63 _ => self.parse_expression_statement()?,
64 },
65 Token::LeftBrace => self.parse_block_statement()?,
66 Token::Semicolon => {
67 self.advance();
68 return self.parse_statement();
69 }
70 _ => self.parse_expression_statement()?,
71 };
72
73 Ok(Some(statement))
74 }
75
76 fn parse_variable_declaration(&mut self) -> Result<Statement> {
78 let keyword = self.expect_keyword()?;
79 let name = self.expect_identifier()?;
80 let type_annotation = if self.current_token() == &Token::Colon {
81 self.advance();
82 Some(self.parse_type()?)
83 } else {
84 None
85 };
86
87 let initializer = if self.current_token() == &Token::Assign {
88 self.advance();
89 Some(self.parse_expression()?)
90 } else {
91 None
92 };
93
94 self.expect_semicolon()?;
95
96 Ok(Statement::VariableDeclaration(VariableDeclaration {
97 keyword,
98 name,
99 type_annotation,
100 initializer,
101 }))
102 }
103
104 fn parse_function_declaration(&mut self) -> Result<Statement> {
106 self.expect_keyword()?; let name = self.expect_identifier()?;
108 let type_parameters = self.parse_type_parameters()?;
109 let parameters = self.parse_parameters()?;
110 let return_type = if self.current_token() == &Token::Colon {
111 self.advance();
112 Some(self.parse_type()?)
113 } else {
114 None
115 };
116 let body = self.parse_block_statement()?;
117
118 Ok(Statement::FunctionDeclaration(FunctionDeclaration {
119 name,
120 type_parameters,
121 parameters,
122 return_type,
123 body: Box::new(body),
124 }))
125 }
126
127 fn parse_class_declaration(&mut self) -> Result<Statement> {
129 self.expect_keyword()?; let name = self.expect_identifier()?;
131 let type_parameters = self.parse_type_parameters()?;
132 let extends = if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Extends) {
133 self.advance();
134 Some(self.parse_type()?)
135 } else {
136 None
137 };
138 let implements = self.parse_implements()?;
139 let body = self.parse_class_body()?;
140
141 Ok(Statement::ClassDeclaration(ClassDeclaration {
142 name,
143 type_parameters,
144 extends,
145 implements,
146 body,
147 }))
148 }
149
150 fn parse_interface_declaration(&mut self) -> Result<Statement> {
152 self.expect_keyword()?; let name = self.expect_identifier()?;
154 let type_parameters = self.parse_type_parameters()?;
155 let extends = self.parse_extends()?;
156 let body = self.parse_interface_body()?;
157
158 Ok(Statement::InterfaceDeclaration(InterfaceDeclaration {
159 name,
160 type_parameters,
161 extends,
162 body,
163 }))
164 }
165
166 fn parse_type_alias(&mut self) -> Result<Statement> {
168 self.expect_keyword()?; let name = self.expect_identifier()?;
170 let type_parameters = self.parse_type_parameters()?;
171 self.expect_token(&Token::Assign)?;
172 let type_definition = self.parse_type()?;
173 self.expect_semicolon()?;
174
175 Ok(Statement::TypeAlias(TypeAlias {
176 name,
177 type_parameters,
178 type_definition,
179 }))
180 }
181
182 fn parse_enum_declaration(&mut self) -> Result<Statement> {
184 self.expect_keyword()?; let name = self.expect_identifier()?;
186 let members = self.parse_enum_members()?;
187
188 Ok(Statement::EnumDeclaration(EnumDeclaration {
189 name,
190 members,
191 }))
192 }
193
194 fn parse_import_declaration(&mut self) -> Result<Statement> {
196 self.expect_keyword()?; let specifiers = self.parse_import_specifiers()?;
198 self.expect_keyword()?; let source = self.parse_string_literal()?;
200 self.expect_semicolon()?;
201
202 Ok(Statement::ImportDeclaration(ImportDeclaration {
203 specifiers,
204 source,
205 }))
206 }
207
208 fn parse_export_declaration(&mut self) -> Result<Statement> {
210 self.advance();
212 let token = self.current_token().clone();
214 let declaration = match token {
215 Token::Keyword(crate::lexer::Keyword::Class) => self.parse_class_declaration()?,
216 Token::Keyword(crate::lexer::Keyword::Interface) => {
217 self.parse_interface_declaration()?
218 }
219 Token::Keyword(crate::lexer::Keyword::Function) => self.parse_function_declaration()?,
220 Token::Keyword(crate::lexer::Keyword::Const) => self.parse_variable_declaration()?,
221 Token::Keyword(crate::lexer::Keyword::Let) => self.parse_variable_declaration()?,
222 Token::Keyword(crate::lexer::Keyword::Var) => self.parse_variable_declaration()?,
223 Token::Keyword(crate::lexer::Keyword::Enum) => self.parse_enum_declaration()?,
224 Token::Keyword(crate::lexer::Keyword::Type) => self.parse_type_alias()?,
225 _ => {
226 return Err(CompilerError::parse_error(
227 1,
228 1,
229 format!("Unexpected token in export declaration: {:?}", token),
230 ))
231 }
232 };
233 Ok(Statement::ExportDeclaration(Box::new(ExportDeclaration {
234 declaration: Box::new(declaration),
235 })))
236 }
237
238 fn parse_namespace_declaration(&mut self) -> Result<Statement> {
240 self.expect_keyword()?; let name = self.expect_identifier()?;
242 let body = self.parse_block_statement()?;
243
244 Ok(Statement::NamespaceDeclaration(NamespaceDeclaration {
245 name,
246 body: Box::new(body),
247 }))
248 }
249
250 fn parse_module_declaration(&mut self) -> Result<Statement> {
252 self.expect_keyword()?; let name = self.parse_string_literal()?;
254 let body = self.parse_block_statement()?;
255
256 Ok(Statement::ModuleDeclaration(ModuleDeclaration {
257 name,
258 body: Box::new(body),
259 }))
260 }
261
262 fn parse_declare_statement(&mut self) -> Result<Statement> {
264 self.expect_keyword()?; let declaration = self.parse_statement()?;
266 Ok(Statement::DeclareStatement(Box::new(DeclareStatement {
267 declaration: Box::new(declaration.unwrap()),
268 })))
269 }
270
271 fn parse_return_statement(&mut self) -> Result<Statement> {
273 self.expect_keyword()?; let argument = if self.current_token() == &Token::Semicolon {
276 None
277 } else {
278 Some(self.parse_expression()?)
279 };
280
281 if self.current_token() == &Token::Semicolon {
283 self.advance();
284 }
285
286 Ok(Statement::ReturnStatement(ReturnStatement { argument }))
287 }
288
289 fn parse_expression_statement(&mut self) -> Result<Statement> {
291 let expression = self.parse_expression()?;
292 self.expect_semicolon()?;
293 Ok(Statement::ExpressionStatement(ExpressionStatement {
294 expression,
295 }))
296 }
297
298 fn parse_block_statement(&mut self) -> Result<Statement> {
300 self.expect_token(&Token::LeftBrace)?;
301 let mut statements = Vec::new();
302
303 while self.current_token() != &Token::RightBrace {
304 if let Some(statement) = self.parse_statement()? {
305 statements.push(statement);
306 } else {
307 break;
308 }
309 }
310
311 self.expect_token(&Token::RightBrace)?;
312 Ok(Statement::BlockStatement(BlockStatement { statements }))
313 }
314
315 fn parse_expression(&mut self) -> Result<Expression> {
317 self.parse_assignment_expression()
318 }
319
320 fn parse_assignment_expression(&mut self) -> Result<Expression> {
322 let left = self.parse_conditional_expression()?;
323
324 if self.is_assignment_operator() {
325 let operator = self.current_token().clone();
326 self.advance();
327 let right = self.parse_assignment_expression()?;
328 Ok(Expression::Assignment(AssignmentExpression {
329 left: Box::new(left),
330 operator,
331 right: Box::new(right),
332 }))
333 } else {
334 Ok(left)
335 }
336 }
337
338 fn parse_conditional_expression(&mut self) -> Result<Expression> {
340 let test = self.parse_logical_or_expression()?;
341
342 if self.current_token() == &Token::QuestionMark {
343 self.advance();
344 let consequent = self.parse_expression()?;
345 self.expect_token(&Token::Colon)?;
346 let alternate = self.parse_expression()?;
347 Ok(Expression::Conditional(ConditionalExpression {
348 test: Box::new(test),
349 consequent: Box::new(consequent),
350 alternate: Box::new(alternate),
351 }))
352 } else {
353 Ok(test)
354 }
355 }
356
357 fn parse_logical_or_expression(&mut self) -> Result<Expression> {
359 let mut left = self.parse_logical_and_expression()?;
360
361 while self.current_token() == &Token::Or {
362 self.advance();
363 let right = self.parse_logical_and_expression()?;
364 left = Expression::Logical(LogicalExpression {
365 left: Box::new(left),
366 operator: Token::Or,
367 right: Box::new(right),
368 });
369 }
370
371 Ok(left)
372 }
373
374 fn parse_logical_and_expression(&mut self) -> Result<Expression> {
376 let mut left = self.parse_equality_expression()?;
377
378 while self.current_token() == &Token::And {
379 self.advance();
380 let right = self.parse_equality_expression()?;
381 left = Expression::Logical(LogicalExpression {
382 left: Box::new(left),
383 operator: Token::And,
384 right: Box::new(right),
385 });
386 }
387
388 Ok(left)
389 }
390
391 fn parse_equality_expression(&mut self) -> Result<Expression> {
393 let mut left = self.parse_relational_expression()?;
394
395 while self.is_equality_operator() {
396 let operator = self.current_token().clone();
397 self.advance();
398 let right = self.parse_relational_expression()?;
399 left = Expression::Binary(BinaryExpression {
400 left: Box::new(left),
401 operator,
402 right: Box::new(right),
403 });
404 }
405
406 Ok(left)
407 }
408
409 fn parse_relational_expression(&mut self) -> Result<Expression> {
411 let mut left = self.parse_additive_expression()?;
412
413 while self.is_relational_operator() {
414 let operator = self.current_token().clone();
415 self.advance();
416 let right = self.parse_additive_expression()?;
417 left = Expression::Binary(BinaryExpression {
418 left: Box::new(left),
419 operator,
420 right: Box::new(right),
421 });
422 }
423
424 Ok(left)
425 }
426
427 fn parse_additive_expression(&mut self) -> Result<Expression> {
429 let mut left = self.parse_multiplicative_expression()?;
430
431 while self.is_additive_operator() {
432 let operator = self.current_token().clone();
433 self.advance();
434 let right = self.parse_multiplicative_expression()?;
435 left = Expression::Binary(BinaryExpression {
436 left: Box::new(left),
437 operator,
438 right: Box::new(right),
439 });
440 }
441
442 Ok(left)
443 }
444
445 fn parse_multiplicative_expression(&mut self) -> Result<Expression> {
447 let mut left = self.parse_unary_expression()?;
448
449 while self.is_multiplicative_operator() {
450 let operator = self.current_token().clone();
451 self.advance();
452 let right = self.parse_unary_expression()?;
453 left = Expression::Binary(BinaryExpression {
454 left: Box::new(left),
455 operator,
456 right: Box::new(right),
457 });
458 }
459
460 Ok(left)
461 }
462
463 fn parse_unary_expression(&mut self) -> Result<Expression> {
465 if self.is_unary_operator() {
466 let operator = self.current_token().clone();
467 self.advance();
468 let argument = self.parse_unary_expression()?;
469 Ok(Expression::Unary(UnaryExpression {
470 operator,
471 argument: Box::new(argument),
472 }))
473 } else {
474 self.parse_postfix_expression()
475 }
476 }
477
478 fn parse_postfix_expression(&mut self) -> Result<Expression> {
480 let mut left = self.parse_primary_expression()?;
481
482 while self.is_postfix_operator() {
483 match self.current_token() {
484 Token::LeftParen => {
485 self.advance();
486 let arguments = self.parse_arguments()?;
487 self.expect_token(&Token::RightParen)?;
488 left = Expression::Call(CallExpression {
489 callee: Box::new(left),
490 arguments,
491 });
492 }
493 Token::LeftBracket => {
494 self.advance();
495 let index = self.parse_expression()?;
496 self.expect_token(&Token::RightBracket)?;
497 left = Expression::Member(MemberExpression {
498 object: Box::new(left),
499 property: Box::new(index),
500 computed: true,
501 });
502 }
503 Token::Dot => {
504 self.advance();
505 let property = self.expect_identifier()?;
506 left = Expression::Member(MemberExpression {
507 object: Box::new(left),
508 property: Box::new(Expression::Identifier(property)),
509 computed: false,
510 });
511 }
512 _ => break,
513 }
514 }
515
516 Ok(left)
517 }
518
519 fn parse_primary_expression(&mut self) -> Result<Expression> {
521 let token = self.current_token().clone();
522 match token {
523 Token::Number(n) => {
524 self.advance();
525 Ok(Expression::Literal(Literal::Number(n)))
526 }
527 Token::String(s) => {
528 self.advance();
529 Ok(Expression::Literal(Literal::String(s)))
530 }
531 Token::TemplateLiteral(s) => {
532 self.advance();
533 Ok(Expression::Literal(Literal::String(s)))
534 }
535 Token::Boolean(b) => {
536 self.advance();
537 Ok(Expression::Literal(Literal::Boolean(b)))
538 }
539 Token::Null => {
540 self.advance();
541 Ok(Expression::Literal(Literal::Null))
542 }
543 Token::Undefined => {
544 self.advance();
545 Ok(Expression::Literal(Literal::Undefined))
546 }
547 Token::Identifier(name) => {
548 self.advance();
549 Ok(Expression::Identifier(name))
550 }
551 Token::Keyword(crate::lexer::Keyword::This) => {
552 self.advance();
553 Ok(Expression::This(ThisExpression))
554 }
555 Token::Keyword(crate::lexer::Keyword::New) => {
556 self.advance();
557 let callee = self.parse_primary_expression()?;
558 let arguments = if self.current_token() == &Token::LeftParen {
559 self.advance(); let args = self.parse_arguments()?;
561 self.expect_token(&Token::RightParen)?;
562 args
563 } else {
564 Vec::new()
565 };
566 Ok(Expression::New(NewExpression {
567 callee: Box::new(callee),
568 arguments,
569 }))
570 }
571 Token::LeftParen => {
572 self.advance();
573 let expression = self.parse_expression()?;
574 self.expect_token(&Token::RightParen)?;
575 Ok(Expression::Parenthesized(ParenthesizedExpression {
576 expression: Box::new(expression),
577 }))
578 }
579 Token::LeftBrace => self.parse_object_expression(),
580 Token::LeftBracket => self.parse_array_expression(),
581 _ => Err(CompilerError::parse_error(
582 self.position,
583 0,
584 format!("Unexpected token: {:?}", self.current_token()),
585 )),
586 }
587 }
588
589 fn parse_object_expression(&mut self) -> Result<Expression> {
591 self.expect_token(&Token::LeftBrace)?;
592 let mut properties = Vec::new();
593
594 while self.current_token() != &Token::RightBrace {
595 let key = self.parse_property_key()?;
596 let value = if self.current_token() == &Token::Colon {
597 self.advance();
598 self.parse_expression()?
599 } else {
600 key.clone()
601 };
602
603 properties.push(ObjectProperty {
604 key,
605 value,
606 shorthand: false,
607 computed: false,
608 method: false,
609 });
610
611 if self.current_token() == &Token::Comma {
612 self.advance();
613 }
614 }
615
616 self.expect_token(&Token::RightBrace)?;
617 Ok(Expression::Object(ObjectExpression { properties }))
618 }
619
620 fn parse_array_expression(&mut self) -> Result<Expression> {
622 self.expect_token(&Token::LeftBracket)?;
623 let mut elements = Vec::new();
624
625 while self.current_token() != &Token::RightBracket {
626 if self.current_token() == &Token::Comma {
627 self.advance();
628 elements.push(None);
629 } else {
630 elements.push(Some(self.parse_expression()?));
631 if self.current_token() == &Token::Comma {
632 self.advance();
633 }
634 }
635 }
636
637 self.expect_token(&Token::RightBracket)?;
638 Ok(Expression::Array(ArrayExpression { elements }))
639 }
640
641 fn parse_type(&mut self) -> Result<Type> {
643 let token = self.current_token().clone();
644 match token {
645 Token::Keyword(crate::lexer::Keyword::String) => {
646 self.advance();
647 Ok(Type::String)
648 }
649 Token::Keyword(crate::lexer::Keyword::Number) => {
650 self.advance();
651 Ok(Type::Number)
652 }
653 Token::Keyword(crate::lexer::Keyword::Boolean) => {
654 self.advance();
655 Ok(Type::Boolean)
656 }
657 Token::Keyword(crate::lexer::Keyword::Any) => {
658 self.advance();
659 Ok(Type::Any)
660 }
661 Token::Keyword(crate::lexer::Keyword::Void) => {
662 self.advance();
663 Ok(Type::Void)
664 }
665 Token::Keyword(crate::lexer::Keyword::Never) => {
666 self.advance();
667 Ok(Type::Never)
668 }
669 Token::Keyword(crate::lexer::Keyword::Unknown) => {
670 self.advance();
671 Ok(Type::Unknown)
672 }
673 Token::Identifier(name) => {
674 self.advance();
675 if self.current_token() == &Token::LessThan {
677 let type_parameters = self.parse_type_parameters()?;
678 Ok(Type::GenericNamed {
679 name: name.to_string(),
680 type_parameters,
681 })
682 } else {
683 Ok(Type::Named(name.to_string()))
684 }
685 }
686 Token::LeftParen => {
687 self.advance();
688 let type_ = self.parse_type()?;
689 self.expect_token(&Token::RightParen)?;
690 Ok(Type::Parenthesized(Box::new(type_)))
691 }
692 _ => Err(CompilerError::parse_error(
693 self.position,
694 0,
695 format!("Unexpected token in type: {:?}", self.current_token()),
696 )),
697 }
698 }
699
700 fn current_token(&self) -> &Token {
702 &self.tokens[self.position]
703 }
704
705 fn advance(&mut self) {
706 if self.position < self.tokens.len() {
707 self.position += 1;
708 }
709 }
710
711 fn expect_token(&mut self, expected: &Token) -> Result<()> {
712 if self.current_token() == expected {
713 self.advance();
714 Ok(())
715 } else {
716 Err(CompilerError::parse_error(
717 self.position,
718 0,
719 format!("Expected {:?}, found {:?}", expected, self.current_token()),
720 ))
721 }
722 }
723
724 fn expect_keyword(&mut self) -> Result<crate::lexer::Keyword> {
725 if let Token::Keyword(keyword) = self.current_token() {
726 let keyword = keyword.clone();
727 self.advance();
728 Ok(keyword)
729 } else {
730 Err(CompilerError::parse_error(
731 self.position,
732 0,
733 format!("Expected keyword, found {:?}", self.current_token()),
734 ))
735 }
736 }
737
738 fn expect_identifier(&mut self) -> Result<String> {
739 if let Token::Identifier(name) = self.current_token() {
740 let name = name.clone();
741 self.advance();
742 Ok(name)
743 } else {
744 Err(CompilerError::parse_error(
745 self.position,
746 0,
747 format!("Expected identifier, found {:?}", self.current_token()),
748 ))
749 }
750 }
751
752 fn expect_semicolon(&mut self) -> Result<()> {
753 self.expect_token(&Token::Semicolon)
754 }
755
756 fn parse_string_literal(&mut self) -> Result<String> {
757 if let Token::String(s) = self.current_token() {
758 let s = s.clone();
759 self.advance();
760 Ok(s)
761 } else {
762 Err(CompilerError::parse_error(
763 self.position,
764 0,
765 format!("Expected string literal, found {:?}", self.current_token()),
766 ))
767 }
768 }
769
770 fn is_assignment_operator(&self) -> bool {
771 matches!(
772 self.current_token(),
773 Token::Assign
774 | Token::PlusAssign
775 | Token::MinusAssign
776 | Token::MultiplyAssign
777 | Token::DivideAssign
778 )
779 }
780
781 fn is_equality_operator(&self) -> bool {
782 matches!(
783 self.current_token(),
784 Token::Equal | Token::NotEqual | Token::StrictEqual | Token::StrictNotEqual
785 )
786 }
787
788 fn is_relational_operator(&self) -> bool {
789 matches!(
790 self.current_token(),
791 Token::LessThan | Token::GreaterThan | Token::LessEqual | Token::GreaterEqual
792 )
793 }
794
795 fn is_additive_operator(&self) -> bool {
796 matches!(self.current_token(), Token::Plus | Token::Minus)
797 }
798
799 fn is_multiplicative_operator(&self) -> bool {
800 matches!(
801 self.current_token(),
802 Token::Multiply | Token::Divide | Token::Modulo
803 )
804 }
805
806 fn is_unary_operator(&self) -> bool {
807 matches!(
808 self.current_token(),
809 Token::Plus | Token::Minus | Token::Not | Token::Keyword(crate::lexer::Keyword::Typeof)
810 )
811 }
812
813 fn is_postfix_operator(&self) -> bool {
814 matches!(
815 self.current_token(),
816 Token::LeftParen | Token::LeftBracket | Token::Dot
817 )
818 }
819
820 fn parse_type_parameters(&mut self) -> Result<Vec<TypeParameter>> {
822 if self.current_token() == &Token::LessThan {
823 self.advance();
824 let mut type_parameters = Vec::new();
825
826 while self.current_token() != &Token::GreaterThan {
827 let name = self.expect_identifier()?;
828 let constraint =
829 if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Extends) {
830 self.advance();
831 Some(self.parse_type()?)
832 } else {
833 None
834 };
835
836 let default_type = if self.current_token() == &Token::Assign {
837 self.advance();
838 Some(self.parse_type()?)
839 } else {
840 None
841 };
842
843 type_parameters.push(TypeParameter {
844 name,
845 constraint: constraint.map(Box::new),
846 default: default_type.map(Box::new),
847 });
848
849 if self.current_token() == &Token::Comma {
850 self.advance();
851 }
852 }
853
854 self.expect_token(&Token::GreaterThan)?;
855 Ok(type_parameters)
856 } else {
857 Ok(Vec::new())
858 }
859 }
860
861 fn parse_parameters(&mut self) -> Result<Vec<Parameter>> {
862 println!("Current token: {:?}", self.current_token());
863 self.expect_token(&Token::LeftParen)?;
864 let mut parameters = Vec::new();
865
866 while self.current_token() != &Token::RightParen {
867 let name = self.expect_identifier()?;
868 let optional = if self.current_token() == &Token::QuestionMark {
869 self.advance();
870 true
871 } else {
872 false
873 };
874
875 let type_annotation = if self.current_token() == &Token::Colon {
876 self.advance();
877 Some(self.parse_type()?)
878 } else {
879 None
880 };
881
882 let initializer = if self.current_token() == &Token::Assign {
883 self.advance();
884 Some(self.parse_expression()?)
885 } else {
886 None
887 };
888
889 parameters.push(Parameter {
890 name,
891 optional,
892 type_: type_annotation.map(Box::new),
893 initializer,
894 rest: false,
895 });
896
897 if self.current_token() == &Token::Comma {
898 self.advance();
899 }
900 }
901
902 self.expect_token(&Token::RightParen)?;
903 Ok(parameters)
904 }
905
906 fn parse_implements(&mut self) -> Result<Vec<Type>> {
907 if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Implements) {
908 self.advance();
909 let mut types = Vec::new();
910
911 loop {
912 let type_ = self.parse_type()?;
913 types.push(type_);
914
915 if self.current_token() == &Token::Comma {
916 self.advance();
917 } else {
918 break;
919 }
920 }
921
922 Ok(types)
923 } else {
924 Ok(Vec::new())
925 }
926 }
927
928 fn parse_extends(&mut self) -> Result<Vec<Type>> {
929 Ok(Vec::new())
931 }
932
933 fn parse_class_body(&mut self) -> Result<ClassBody> {
934 self.expect_token(&Token::LeftBrace)?;
935 let mut members = Vec::new();
936
937 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
938 let member = self.parse_class_member()?;
939 members.push(member);
940 }
941
942 self.expect_token(&Token::RightBrace)?;
943 Ok(ClassBody { members })
944 }
945
946 fn parse_interface_body(&mut self) -> Result<InterfaceBody> {
947 self.expect_token(&Token::LeftBrace)?;
948 let mut members = Vec::new();
949
950 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
951 let member = self.parse_interface_member()?;
952 members.push(member);
953 }
954
955 self.expect_token(&Token::RightBrace)?;
956 Ok(InterfaceBody { members })
957 }
958
959 fn parse_enum_members(&mut self) -> Result<Vec<EnumMember>> {
960 self.expect_token(&Token::LeftBrace)?;
961 let mut members = Vec::new();
962
963 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
964 let member = self.parse_enum_member()?;
965 members.push(member);
966
967 if self.current_token() == &Token::Comma {
968 self.advance();
969 }
970 }
971
972 self.expect_token(&Token::RightBrace)?;
973 Ok(members)
974 }
975
976 fn parse_import_specifiers(&mut self) -> Result<Vec<ImportSpecifier>> {
977 let mut specifiers = Vec::new();
978
979 if self.current_token() == &Token::LeftBrace {
980 self.advance(); while self.current_token() != &Token::RightBrace {
983 let name = self.expect_identifier()?;
984 specifiers.push(ImportSpecifier::Named(NamedImportSpecifier {
985 imported: name.clone(),
986 name,
987 }));
988
989 if self.current_token() == &Token::Comma {
990 self.advance();
991 }
992 }
993
994 self.expect_token(&Token::RightBrace)?; } else {
996 let name = self.expect_identifier()?;
998 specifiers.push(ImportSpecifier::Default(DefaultImportSpecifier { name }));
999 }
1000
1001 Ok(specifiers)
1002 }
1003
1004 fn parse_arguments(&mut self) -> Result<Vec<Expression>> {
1005 let mut arguments = Vec::new();
1006
1007 while self.current_token() != &Token::RightParen {
1008 let argument = self.parse_expression()?;
1009 arguments.push(argument);
1010
1011 if self.current_token() == &Token::Comma {
1012 self.advance();
1013 } else if self.current_token() != &Token::RightParen {
1014 return Err(CompilerError::parse_error(
1015 1,
1016 1,
1017 "Expected comma or closing parenthesis".to_string(),
1018 ));
1019 }
1020 }
1021
1022 Ok(arguments)
1023 }
1024
1025 fn parse_class_member(&mut self) -> Result<ClassMember> {
1026 let token = self.current_token().clone();
1027
1028 match token {
1029 Token::Identifier(name) => {
1030 self.advance();
1031
1032 if self.current_token() == &Token::LeftParen {
1034 let parameters = self.parse_parameters()?;
1036 let return_type = if self.current_token() == &Token::Colon {
1037 self.advance();
1038 Some(self.parse_type()?)
1039 } else {
1040 None
1041 };
1042 let body = self.parse_block_statement()?;
1043
1044 Ok(ClassMember::Method(MethodDeclaration {
1045 name,
1046 optional: false,
1047 type_parameters: Vec::new(),
1048 parameters,
1049 return_type,
1050 body: Some(body),
1051 modifiers: Vec::new(),
1052 }))
1053 } else if self.current_token() == &Token::Colon {
1054 self.advance();
1056 let type_annotation = self.parse_type()?;
1057 self.expect_token(&Token::Semicolon)?;
1058
1059 Ok(ClassMember::Property(PropertyDeclaration {
1060 name,
1061 optional: false,
1062 type_: Some(type_annotation),
1063 initializer: None,
1064 modifiers: Vec::new(),
1065 }))
1066 } else {
1067 if name == "constructor" {
1069 let parameters = self.parse_parameters()?;
1070 let body = self.parse_block_statement()?;
1071
1072 Ok(ClassMember::Constructor(ConstructorDeclaration {
1073 parameters,
1074 body: Some(body),
1075 modifiers: Vec::new(),
1076 }))
1077 } else {
1078 Err(CompilerError::parse_error(
1079 1,
1080 1,
1081 "Unexpected class member".to_string(),
1082 ))
1083 }
1084 }
1085 }
1086 _ => Err(CompilerError::parse_error(
1087 1,
1088 1,
1089 "Expected class member".to_string(),
1090 )),
1091 }
1092 }
1093
1094 fn parse_interface_member(&mut self) -> Result<ObjectTypeMember> {
1095 let token = self.current_token().clone();
1096
1097 match token {
1098 Token::Identifier(name) => {
1099 self.advance();
1100
1101 if self.current_token() == &Token::LeftParen {
1102 let parameters = self.parse_parameters()?;
1104 let return_type = if self.current_token() == &Token::Colon {
1105 self.advance();
1106 Some(self.parse_type()?)
1107 } else {
1108 None
1109 };
1110 self.expect_token(&Token::Semicolon)?;
1111
1112 Ok(ObjectTypeMember::Method(MethodSignature {
1113 name,
1114 optional: false,
1115 type_parameters: Vec::new(),
1116 parameters,
1117 return_type,
1118 }))
1119 } else if self.current_token() == &Token::Colon {
1120 self.advance();
1122 let type_annotation = self.parse_type()?;
1123 self.expect_token(&Token::Semicolon)?;
1124
1125 Ok(ObjectTypeMember::Property(PropertySignature {
1126 name,
1127 optional: false,
1128 type_: Some(type_annotation),
1129 readonly: false,
1130 }))
1131 } else {
1132 Err(CompilerError::parse_error(
1133 1,
1134 1,
1135 "Expected method or property signature".to_string(),
1136 ))
1137 }
1138 }
1139 _ => Err(CompilerError::parse_error(
1140 1,
1141 1,
1142 "Expected interface member".to_string(),
1143 )),
1144 }
1145 }
1146
1147 fn parse_enum_member(&mut self) -> Result<EnumMember> {
1148 let name = self.expect_identifier()?;
1149
1150 let initializer = if self.current_token() == &Token::Assign {
1151 self.advance();
1152 Some(self.parse_expression()?)
1153 } else {
1154 None
1155 };
1156
1157 Ok(EnumMember { name, initializer })
1158 }
1159
1160 fn parse_if_statement(&mut self) -> Result<Statement> {
1161 self.expect_keyword()?; self.expect_token(&Token::LeftParen)?;
1164 let test = self.parse_expression()?;
1165 self.expect_token(&Token::RightParen)?;
1166
1167 let consequent = self.parse_statement()?.unwrap();
1168
1169 let alternate = if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Else) {
1170 self.advance();
1171 Some(self.parse_statement()?.unwrap())
1172 } else {
1173 None
1174 };
1175
1176 Ok(Statement::IfStatement(Box::new(IfStatement {
1177 condition: test,
1178 consequent: Box::new(consequent),
1179 alternate,
1180 })))
1181 }
1182
1183 fn parse_property_key(&mut self) -> Result<Expression> {
1184 self.parse_expression()
1186 }
1187}