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 let template = TemplateLiteral {
535 quasis: vec![TemplateElement {
536 value: s,
537 tail: true,
538 }],
539 expressions: vec![],
540 };
541 Ok(Expression::Template(template))
542 }
543 Token::Boolean(b) => {
544 self.advance();
545 Ok(Expression::Literal(Literal::Boolean(b)))
546 }
547 Token::Null => {
548 self.advance();
549 Ok(Expression::Literal(Literal::Null))
550 }
551 Token::Undefined => {
552 self.advance();
553 Ok(Expression::Literal(Literal::Undefined))
554 }
555 Token::Identifier(name) => {
556 self.advance();
557 Ok(Expression::Identifier(name))
558 }
559 Token::Keyword(crate::lexer::Keyword::This) => {
560 self.advance();
561 Ok(Expression::This(ThisExpression))
562 }
563 Token::Keyword(crate::lexer::Keyword::New) => {
564 self.advance();
565 let callee = self.parse_primary_expression()?;
566 let arguments = if self.current_token() == &Token::LeftParen {
567 self.advance(); let args = self.parse_arguments()?;
569 self.expect_token(&Token::RightParen)?;
570 args
571 } else {
572 Vec::new()
573 };
574 Ok(Expression::New(NewExpression {
575 callee: Box::new(callee),
576 arguments,
577 }))
578 }
579 Token::LeftParen => {
580 self.advance();
581 let expression = self.parse_expression()?;
582 self.expect_token(&Token::RightParen)?;
583 Ok(Expression::Parenthesized(ParenthesizedExpression {
584 expression: Box::new(expression),
585 }))
586 }
587 Token::LeftBrace => self.parse_object_expression(),
588 Token::LeftBracket => self.parse_array_expression(),
589 _ => Err(CompilerError::parse_error(
590 self.position,
591 0,
592 format!("Unexpected token: {:?}", self.current_token()),
593 )),
594 }
595 }
596
597 fn parse_object_expression(&mut self) -> Result<Expression> {
599 self.expect_token(&Token::LeftBrace)?;
600 let mut properties = Vec::new();
601
602 while self.current_token() != &Token::RightBrace {
603 let key = self.parse_property_key()?;
604 let value = if self.current_token() == &Token::Colon {
605 self.advance();
606 self.parse_expression()?
607 } else {
608 key.clone()
609 };
610
611 properties.push(ObjectProperty {
612 key,
613 value,
614 shorthand: false,
615 computed: false,
616 method: false,
617 });
618
619 if self.current_token() == &Token::Comma {
620 self.advance();
621 }
622 }
623
624 self.expect_token(&Token::RightBrace)?;
625 Ok(Expression::Object(ObjectExpression { properties }))
626 }
627
628 fn parse_array_expression(&mut self) -> Result<Expression> {
630 self.expect_token(&Token::LeftBracket)?;
631 let mut elements = Vec::new();
632
633 while self.current_token() != &Token::RightBracket {
634 if self.current_token() == &Token::Comma {
635 self.advance();
636 elements.push(None);
637 } else {
638 elements.push(Some(self.parse_expression()?));
639 if self.current_token() == &Token::Comma {
640 self.advance();
641 }
642 }
643 }
644
645 self.expect_token(&Token::RightBracket)?;
646 Ok(Expression::Array(ArrayExpression { elements }))
647 }
648
649 fn parse_type(&mut self) -> Result<Type> {
651 let token = self.current_token().clone();
652 match token {
653 Token::Keyword(crate::lexer::Keyword::String) => {
654 self.advance();
655 Ok(Type::String)
656 }
657 Token::Keyword(crate::lexer::Keyword::Number) => {
658 self.advance();
659 Ok(Type::Number)
660 }
661 Token::Keyword(crate::lexer::Keyword::Boolean) => {
662 self.advance();
663 Ok(Type::Boolean)
664 }
665 Token::Keyword(crate::lexer::Keyword::Any) => {
666 self.advance();
667 Ok(Type::Any)
668 }
669 Token::Keyword(crate::lexer::Keyword::Void) => {
670 self.advance();
671 Ok(Type::Void)
672 }
673 Token::Keyword(crate::lexer::Keyword::Never) => {
674 self.advance();
675 Ok(Type::Never)
676 }
677 Token::Keyword(crate::lexer::Keyword::Unknown) => {
678 self.advance();
679 Ok(Type::Unknown)
680 }
681 Token::Identifier(name) => {
682 self.advance();
683 if self.current_token() == &Token::LessThan {
685 let type_parameters = self.parse_type_parameters()?;
686 Ok(Type::GenericNamed {
687 name: name.to_string(),
688 type_parameters,
689 })
690 } else {
691 Ok(Type::Named(name.to_string()))
692 }
693 }
694 Token::LeftParen => {
695 self.advance();
696 let type_ = self.parse_type()?;
697 self.expect_token(&Token::RightParen)?;
698 Ok(Type::Parenthesized(Box::new(type_)))
699 }
700 _ => Err(CompilerError::parse_error(
701 self.position,
702 0,
703 format!("Unexpected token in type: {:?}", self.current_token()),
704 )),
705 }
706 }
707
708 fn current_token(&self) -> &Token {
710 &self.tokens[self.position]
711 }
712
713 fn advance(&mut self) {
714 if self.position < self.tokens.len() {
715 self.position += 1;
716 }
717 }
718
719 fn expect_token(&mut self, expected: &Token) -> Result<()> {
720 if self.current_token() == expected {
721 self.advance();
722 Ok(())
723 } else {
724 Err(CompilerError::parse_error(
725 self.position,
726 0,
727 format!("Expected {:?}, found {:?}", expected, self.current_token()),
728 ))
729 }
730 }
731
732 fn expect_keyword(&mut self) -> Result<crate::lexer::Keyword> {
733 if let Token::Keyword(keyword) = self.current_token() {
734 let keyword = keyword.clone();
735 self.advance();
736 Ok(keyword)
737 } else {
738 Err(CompilerError::parse_error(
739 self.position,
740 0,
741 format!("Expected keyword, found {:?}", self.current_token()),
742 ))
743 }
744 }
745
746 fn expect_identifier(&mut self) -> Result<String> {
747 if let Token::Identifier(name) = self.current_token() {
748 let name = name.clone();
749 self.advance();
750 Ok(name)
751 } else {
752 Err(CompilerError::parse_error(
753 self.position,
754 0,
755 format!("Expected identifier, found {:?}", self.current_token()),
756 ))
757 }
758 }
759
760 fn expect_semicolon(&mut self) -> Result<()> {
761 self.expect_token(&Token::Semicolon)
762 }
763
764 fn parse_string_literal(&mut self) -> Result<String> {
765 if let Token::String(s) = self.current_token() {
766 let s = s.clone();
767 self.advance();
768 Ok(s)
769 } else {
770 Err(CompilerError::parse_error(
771 self.position,
772 0,
773 format!("Expected string literal, found {:?}", self.current_token()),
774 ))
775 }
776 }
777
778 fn is_assignment_operator(&self) -> bool {
779 matches!(
780 self.current_token(),
781 Token::Assign
782 | Token::PlusAssign
783 | Token::MinusAssign
784 | Token::MultiplyAssign
785 | Token::DivideAssign
786 )
787 }
788
789 fn is_equality_operator(&self) -> bool {
790 matches!(
791 self.current_token(),
792 Token::Equal | Token::NotEqual | Token::StrictEqual | Token::StrictNotEqual
793 )
794 }
795
796 fn is_relational_operator(&self) -> bool {
797 matches!(
798 self.current_token(),
799 Token::LessThan | Token::GreaterThan | Token::LessEqual | Token::GreaterEqual
800 )
801 }
802
803 fn is_additive_operator(&self) -> bool {
804 matches!(self.current_token(), Token::Plus | Token::Minus)
805 }
806
807 fn is_multiplicative_operator(&self) -> bool {
808 matches!(
809 self.current_token(),
810 Token::Multiply | Token::Divide | Token::Modulo
811 )
812 }
813
814 fn is_unary_operator(&self) -> bool {
815 matches!(
816 self.current_token(),
817 Token::Plus | Token::Minus | Token::Not | Token::Keyword(crate::lexer::Keyword::Typeof)
818 )
819 }
820
821 fn is_postfix_operator(&self) -> bool {
822 matches!(
823 self.current_token(),
824 Token::LeftParen | Token::LeftBracket | Token::Dot
825 )
826 }
827
828 fn parse_type_parameters(&mut self) -> Result<Vec<TypeParameter>> {
830 if self.current_token() == &Token::LessThan {
831 self.advance();
832 let mut type_parameters = Vec::new();
833
834 while self.current_token() != &Token::GreaterThan {
835 let name = self.expect_identifier()?;
836 let constraint =
837 if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Extends) {
838 self.advance();
839 Some(self.parse_type()?)
840 } else {
841 None
842 };
843
844 let default_type = if self.current_token() == &Token::Assign {
845 self.advance();
846 Some(self.parse_type()?)
847 } else {
848 None
849 };
850
851 type_parameters.push(TypeParameter {
852 name,
853 constraint: constraint.map(Box::new),
854 default: default_type.map(Box::new),
855 });
856
857 if self.current_token() == &Token::Comma {
858 self.advance();
859 }
860 }
861
862 self.expect_token(&Token::GreaterThan)?;
863 Ok(type_parameters)
864 } else {
865 Ok(Vec::new())
866 }
867 }
868
869 fn parse_parameters(&mut self) -> Result<Vec<Parameter>> {
870 println!("Current token: {:?}", self.current_token());
871 self.expect_token(&Token::LeftParen)?;
872 let mut parameters = Vec::new();
873
874 while self.current_token() != &Token::RightParen {
875 let name = self.expect_identifier()?;
876 let optional = if self.current_token() == &Token::QuestionMark {
877 self.advance();
878 true
879 } else {
880 false
881 };
882
883 let type_annotation = if self.current_token() == &Token::Colon {
884 self.advance();
885 Some(self.parse_type()?)
886 } else {
887 None
888 };
889
890 let initializer = if self.current_token() == &Token::Assign {
891 self.advance();
892 Some(self.parse_expression()?)
893 } else {
894 None
895 };
896
897 parameters.push(Parameter {
898 name,
899 optional,
900 type_: type_annotation.map(Box::new),
901 initializer,
902 rest: false,
903 });
904
905 if self.current_token() == &Token::Comma {
906 self.advance();
907 }
908 }
909
910 self.expect_token(&Token::RightParen)?;
911 Ok(parameters)
912 }
913
914 fn parse_implements(&mut self) -> Result<Vec<Type>> {
915 if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Implements) {
916 self.advance();
917 let mut types = Vec::new();
918
919 loop {
920 let type_ = self.parse_type()?;
921 types.push(type_);
922
923 if self.current_token() == &Token::Comma {
924 self.advance();
925 } else {
926 break;
927 }
928 }
929
930 Ok(types)
931 } else {
932 Ok(Vec::new())
933 }
934 }
935
936 fn parse_extends(&mut self) -> Result<Vec<Type>> {
937 Ok(Vec::new())
939 }
940
941 fn parse_class_body(&mut self) -> Result<ClassBody> {
942 self.expect_token(&Token::LeftBrace)?;
943 let mut members = Vec::new();
944
945 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
946 let member = self.parse_class_member()?;
947 members.push(member);
948 }
949
950 self.expect_token(&Token::RightBrace)?;
951 Ok(ClassBody { members })
952 }
953
954 fn parse_interface_body(&mut self) -> Result<InterfaceBody> {
955 self.expect_token(&Token::LeftBrace)?;
956 let mut members = Vec::new();
957
958 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
959 let member = self.parse_interface_member()?;
960 members.push(member);
961 }
962
963 self.expect_token(&Token::RightBrace)?;
964 Ok(InterfaceBody { members })
965 }
966
967 fn parse_enum_members(&mut self) -> Result<Vec<EnumMember>> {
968 self.expect_token(&Token::LeftBrace)?;
969 let mut members = Vec::new();
970
971 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
972 let member = self.parse_enum_member()?;
973 members.push(member);
974
975 if self.current_token() == &Token::Comma {
976 self.advance();
977 }
978 }
979
980 self.expect_token(&Token::RightBrace)?;
981 Ok(members)
982 }
983
984 fn parse_import_specifiers(&mut self) -> Result<Vec<ImportSpecifier>> {
985 let mut specifiers = Vec::new();
986
987 if self.current_token() == &Token::LeftBrace {
988 self.advance(); while self.current_token() != &Token::RightBrace {
991 let name = self.expect_identifier()?;
992 specifiers.push(ImportSpecifier::Named(NamedImportSpecifier {
993 imported: name.clone(),
994 name,
995 }));
996
997 if self.current_token() == &Token::Comma {
998 self.advance();
999 }
1000 }
1001
1002 self.expect_token(&Token::RightBrace)?; } else {
1004 let name = self.expect_identifier()?;
1006 specifiers.push(ImportSpecifier::Default(DefaultImportSpecifier { name }));
1007 }
1008
1009 Ok(specifiers)
1010 }
1011
1012 fn parse_arguments(&mut self) -> Result<Vec<Expression>> {
1013 let mut arguments = Vec::new();
1014
1015 while self.current_token() != &Token::RightParen {
1016 let argument = self.parse_expression()?;
1017 arguments.push(argument);
1018
1019 if self.current_token() == &Token::Comma {
1020 self.advance();
1021 } else if self.current_token() != &Token::RightParen {
1022 return Err(CompilerError::parse_error(
1023 1,
1024 1,
1025 "Expected comma or closing parenthesis".to_string(),
1026 ));
1027 }
1028 }
1029
1030 Ok(arguments)
1031 }
1032
1033 fn parse_class_member(&mut self) -> Result<ClassMember> {
1034 let token = self.current_token().clone();
1035
1036 match token {
1037 Token::Identifier(name) => {
1038 self.advance();
1039
1040 if self.current_token() == &Token::LeftParen {
1042 let parameters = self.parse_parameters()?;
1044 let return_type = if self.current_token() == &Token::Colon {
1045 self.advance();
1046 Some(self.parse_type()?)
1047 } else {
1048 None
1049 };
1050 let body = self.parse_block_statement()?;
1051
1052 Ok(ClassMember::Method(MethodDeclaration {
1053 name,
1054 optional: false,
1055 type_parameters: Vec::new(),
1056 parameters,
1057 return_type,
1058 body: Some(body),
1059 modifiers: Vec::new(),
1060 }))
1061 } else if self.current_token() == &Token::Colon {
1062 self.advance();
1064 let type_annotation = self.parse_type()?;
1065 self.expect_token(&Token::Semicolon)?;
1066
1067 Ok(ClassMember::Property(PropertyDeclaration {
1068 name,
1069 optional: false,
1070 type_: Some(type_annotation),
1071 initializer: None,
1072 modifiers: Vec::new(),
1073 }))
1074 } else {
1075 if name == "constructor" {
1077 let parameters = self.parse_parameters()?;
1078 let body = self.parse_block_statement()?;
1079
1080 Ok(ClassMember::Constructor(ConstructorDeclaration {
1081 parameters,
1082 body: Some(body),
1083 modifiers: Vec::new(),
1084 }))
1085 } else {
1086 Err(CompilerError::parse_error(
1087 1,
1088 1,
1089 "Unexpected class member".to_string(),
1090 ))
1091 }
1092 }
1093 }
1094 _ => Err(CompilerError::parse_error(
1095 1,
1096 1,
1097 "Expected class member".to_string(),
1098 )),
1099 }
1100 }
1101
1102 fn parse_interface_member(&mut self) -> Result<ObjectTypeMember> {
1103 let token = self.current_token().clone();
1104
1105 match token {
1106 Token::Identifier(name) => {
1107 self.advance();
1108
1109 if self.current_token() == &Token::LeftParen {
1110 let parameters = self.parse_parameters()?;
1112 let return_type = if self.current_token() == &Token::Colon {
1113 self.advance();
1114 Some(self.parse_type()?)
1115 } else {
1116 None
1117 };
1118 self.expect_token(&Token::Semicolon)?;
1119
1120 Ok(ObjectTypeMember::Method(MethodSignature {
1121 name,
1122 optional: false,
1123 type_parameters: Vec::new(),
1124 parameters,
1125 return_type,
1126 }))
1127 } else if self.current_token() == &Token::Colon {
1128 self.advance();
1130 let type_annotation = self.parse_type()?;
1131 self.expect_token(&Token::Semicolon)?;
1132
1133 Ok(ObjectTypeMember::Property(PropertySignature {
1134 name,
1135 optional: false,
1136 type_: Some(type_annotation),
1137 readonly: false,
1138 }))
1139 } else {
1140 Err(CompilerError::parse_error(
1141 1,
1142 1,
1143 "Expected method or property signature".to_string(),
1144 ))
1145 }
1146 }
1147 _ => Err(CompilerError::parse_error(
1148 1,
1149 1,
1150 "Expected interface member".to_string(),
1151 )),
1152 }
1153 }
1154
1155 fn parse_enum_member(&mut self) -> Result<EnumMember> {
1156 let name = self.expect_identifier()?;
1157
1158 let initializer = if self.current_token() == &Token::Assign {
1159 self.advance();
1160 Some(self.parse_expression()?)
1161 } else {
1162 None
1163 };
1164
1165 Ok(EnumMember { name, initializer })
1166 }
1167
1168 fn parse_if_statement(&mut self) -> Result<Statement> {
1169 self.expect_keyword()?; self.expect_token(&Token::LeftParen)?;
1172 let test = self.parse_expression()?;
1173 self.expect_token(&Token::RightParen)?;
1174
1175 let consequent = self.parse_statement()?.unwrap();
1176
1177 let alternate = if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Else) {
1178 self.advance();
1179 Some(self.parse_statement()?.unwrap())
1180 } else {
1181 None
1182 };
1183
1184 Ok(Statement::IfStatement(Box::new(IfStatement {
1185 condition: test,
1186 consequent: Box::new(consequent),
1187 alternate,
1188 })))
1189 }
1190
1191 fn parse_property_key(&mut self) -> Result<Expression> {
1192 self.parse_expression()
1194 }
1195}