1use crate::ast::*;
4use crate::error::{CompilerError, Result};
5use crate::lexer::{Token, Keyword};
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 let mut iterations = 0;
26 let max_iterations = self.tokens.len() * 2; let mut errors = Vec::new();
28
29 while self.position < self.tokens.len() && iterations < max_iterations {
30 let old_position = self.position;
31
32 match self.parse_statement() {
33 Ok(Some(statement)) => {
34 statements.push(statement);
35 }
36 Ok(None) => {
37 break;
38 }
39 Err(error) => {
40 errors.push(error);
42 self.advance();
44 }
45 }
46
47 if self.position == old_position {
49 self.position += 1;
51 }
52
53 if self.position < self.tokens.len() {
55 let current_token = &self.tokens[self.position];
56 if matches!(current_token, Token::EOF) {
57 break;
58 }
59 }
60
61 iterations += 1;
62 }
63
64 if iterations >= max_iterations {
65 return Err(CompilerError::parse_error(
66 self.position,
67 1,
68 "Parser stuck in infinite loop".to_string(),
69 ));
70 }
71
72 if !statements.is_empty() {
74 Ok(Program { statements })
75 } else if !errors.is_empty() {
76 Err(errors.into_iter().next().unwrap())
78 } else {
79 Ok(Program { statements })
80 }
81 }
82
83 fn parse_statement(&mut self) -> Result<Option<Statement>> {
85 if self.position >= self.tokens.len() {
86 return Ok(None);
87 }
88
89 if self.current_token() == &Token::EOF {
91 return Ok(None);
92 }
93
94 let token = &self.tokens[self.position];
95 let statement = match token {
96 Token::EOF => return Ok(None),
97 Token::Keyword(keyword) => match keyword {
98 crate::lexer::Keyword::Let
99 | crate::lexer::Keyword::Var => self.parse_variable_declaration()?,
100 crate::lexer::Keyword::Const => {
101 if self.position + 1 < self.tokens.len() {
103 if let Token::Keyword(crate::lexer::Keyword::Enum) = &self.tokens[self.position + 1] {
104 self.parse_const_enum_declaration()?
106 } else {
107 self.parse_variable_declaration()?
109 }
110 } else {
111 self.parse_variable_declaration()?
112 }
113 },
114 crate::lexer::Keyword::Function => self.parse_function_declaration()?,
115 crate::lexer::Keyword::Class => self.parse_class_declaration()?,
116 crate::lexer::Keyword::Interface => self.parse_interface_declaration()?,
117 crate::lexer::Keyword::Type => self.parse_type_alias()?,
118 crate::lexer::Keyword::Enum => self.parse_enum_declaration()?,
119 crate::lexer::Keyword::Import => self.parse_import_declaration()?,
120 crate::lexer::Keyword::Export => self.parse_export_declaration()?,
121 crate::lexer::Keyword::Namespace => self.parse_namespace_declaration()?,
122 crate::lexer::Keyword::Module => self.parse_module_declaration()?,
123 crate::lexer::Keyword::Declare => self.parse_declare_statement()?,
124 crate::lexer::Keyword::Return => self.parse_return_statement()?,
125 crate::lexer::Keyword::Throw => self.parse_throw_statement()?,
126 crate::lexer::Keyword::If => self.parse_if_statement()?,
127 crate::lexer::Keyword::Else => self.parse_expression_statement()?,
128 _ => self.parse_expression_statement()?,
129 },
130 Token::LeftBrace => self.parse_block_statement()?,
131 Token::Semicolon => {
132 self.advance();
133 return self.parse_statement();
134 }
135 _ => {
136 match self.parse_expression_statement() {
138 Ok(expr_stmt) => expr_stmt,
139 Err(_) => {
140 self.advance();
142 return Ok(None);
143 }
144 }
145 }
146 };
147
148 Ok(Some(statement))
149 }
150
151 fn parse_variable_declaration(&mut self) -> Result<Statement> {
153 let keyword = self.expect_keyword()?;
154 let name = self.expect_identifier()?;
155 let type_annotation = if self.current_token() == &Token::Colon {
156 self.advance();
157 Some(self.parse_type()?)
158 } else {
159 None
160 };
161
162 let initializer = if self.current_token() == &Token::Assign {
163 self.advance();
164 Some(self.parse_expression()?)
165 } else {
166 None
167 };
168
169 self.expect_semicolon()?;
170
171 Ok(Statement::VariableDeclaration(VariableDeclaration {
172 keyword,
173 name,
174 type_annotation,
175 initializer,
176 }))
177 }
178
179 fn parse_function_declaration(&mut self) -> Result<Statement> {
181 self.expect_keyword()?; let name = self.expect_identifier()?;
183 let type_parameters = self.parse_type_parameters()?;
184 let parameters = self.parse_parameters()?;
185 let return_type = if self.current_token() == &Token::Colon {
186 self.advance();
187 Some(self.parse_type()?)
188 } else {
189 None
190 };
191 let body = self.parse_block_statement()?;
192
193 Ok(Statement::FunctionDeclaration(FunctionDeclaration {
194 name,
195 type_parameters,
196 parameters,
197 return_type,
198 body: Box::new(body),
199 }))
200 }
201
202 fn parse_class_declaration(&mut self) -> Result<Statement> {
204 self.expect_keyword()?; let name = self.expect_identifier()?;
206 let type_parameters = self.parse_type_parameters()?;
207 let extends = if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Extends) {
208 self.advance();
209 Some(self.parse_type()?)
210 } else {
211 None
212 };
213 let implements = self.parse_implements()?;
214 let body = self.parse_class_body()?;
215
216 Ok(Statement::ClassDeclaration(ClassDeclaration {
217 name,
218 type_parameters,
219 extends,
220 implements,
221 body,
222 }))
223 }
224
225 fn parse_interface_declaration(&mut self) -> Result<Statement> {
227 self.expect_keyword()?; let name = self.expect_identifier()?;
229 let type_parameters = self.parse_type_parameters()?;
230 let extends = self.parse_extends()?;
231 let body = self.parse_interface_body()?;
232
233 Ok(Statement::InterfaceDeclaration(InterfaceDeclaration {
234 name,
235 type_parameters,
236 extends,
237 body,
238 }))
239 }
240
241 fn parse_type_alias(&mut self) -> Result<Statement> {
243 self.expect_keyword()?; let name = self.expect_identifier()?;
245 let type_parameters = self.parse_type_parameters()?;
246 self.expect_token(&Token::Assign)?;
247 let type_definition = self.parse_type()?;
248 self.expect_semicolon()?;
249
250 Ok(Statement::TypeAlias(TypeAlias {
251 name,
252 type_parameters,
253 type_definition,
254 }))
255 }
256
257 fn parse_enum_declaration(&mut self) -> Result<Statement> {
259 self.expect_keyword()?; let name = self.expect_identifier()?;
261 let members = self.parse_enum_members()?;
262
263 Ok(Statement::EnumDeclaration(EnumDeclaration {
264 name,
265 members,
266 }))
267 }
268
269 fn parse_const_enum_declaration(&mut self) -> Result<Statement> {
270 self.expect_keyword()?; self.expect_keyword()?; let name = self.expect_identifier()?;
273 let members = self.parse_enum_members()?;
274
275 Ok(Statement::EnumDeclaration(EnumDeclaration {
278 name,
279 members,
280 }))
281 }
282
283 fn parse_import_declaration(&mut self) -> Result<Statement> {
285 self.expect_keyword()?; let specifiers = self.parse_import_specifiers()?;
287 self.expect_keyword()?; let source = self.parse_string_literal()?;
289 self.expect_semicolon()?;
290
291 Ok(Statement::ImportDeclaration(ImportDeclaration {
292 specifiers,
293 source,
294 }))
295 }
296
297 fn parse_export_declaration(&mut self) -> Result<Statement> {
299 self.advance();
301 let token = self.current_token().clone();
303 let declaration = match token {
304 Token::Keyword(crate::lexer::Keyword::Class) => self.parse_class_declaration()?,
305 Token::Keyword(crate::lexer::Keyword::Interface) => {
306 self.parse_interface_declaration()?
307 }
308 Token::Keyword(crate::lexer::Keyword::Function) => self.parse_function_declaration()?,
309 Token::Keyword(crate::lexer::Keyword::Const) => self.parse_variable_declaration()?,
310 Token::Keyword(crate::lexer::Keyword::Let) => self.parse_variable_declaration()?,
311 Token::Keyword(crate::lexer::Keyword::Var) => self.parse_variable_declaration()?,
312 Token::Keyword(crate::lexer::Keyword::Enum) => self.parse_enum_declaration()?,
313 Token::Keyword(crate::lexer::Keyword::Type) => {
314 if self.position + 1 < self.tokens.len() {
316 if let Token::LeftBrace = &self.tokens[self.position + 1] {
317 self.parse_export_type_statement()?
319 } else {
320 self.parse_type_alias()?
322 }
323 } else {
324 self.parse_type_alias()?
325 }
326 },
327 Token::LeftBrace => {
328 self.parse_export_statement()?
330 },
331 _ => {
332 return Err(CompilerError::parse_error(
333 1,
334 1,
335 format!("Unexpected token in export declaration: {:?}", token),
336 ))
337 }
338 };
339 Ok(Statement::ExportDeclaration(Box::new(ExportDeclaration {
340 declaration: Box::new(declaration),
341 })))
342 }
343
344 fn parse_export_statement(&mut self) -> Result<Statement> {
345 self.expect_token(&Token::LeftBrace)?; let mut exports = Vec::new();
348 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
349 let name = self.expect_identifier()?;
350 exports.push(name);
351
352 if self.current_token() == &Token::Comma {
353 self.advance(); }
355 }
356
357 self.expect_token(&Token::RightBrace)?; self.expect_semicolon()?;
359
360 Ok(Statement::ExportDeclaration(Box::new(ExportDeclaration {
361 declaration: Box::new(Statement::ExpressionStatement(ExpressionStatement {
362 expression: Expression::Literal(Literal::String(format!("Export: {}", exports.join(", ")))),
363 })),
364 })))
365 }
366
367 fn parse_export_type_statement(&mut self) -> Result<Statement> {
368 self.expect_keyword()?; self.expect_token(&Token::LeftBrace)?; let mut type_names = Vec::new();
372 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
373 let name = self.expect_identifier()?;
374 type_names.push(name);
375
376 if self.current_token() == &Token::Comma {
377 self.advance();
378 }
379 }
380
381 self.expect_token(&Token::RightBrace)?; self.expect_semicolon()?;
383
384 Ok(Statement::ExportDeclaration(Box::new(ExportDeclaration {
387 declaration: Box::new(Statement::TypeAlias(TypeAlias {
388 name: "exported_types".to_string(),
389 type_parameters: Vec::new(),
390 type_definition: Type::Any,
391 })),
392 })))
393 }
394
395 fn parse_namespace_declaration(&mut self) -> Result<Statement> {
397 self.expect_keyword()?; let name = self.expect_identifier()?;
399 let body = self.parse_block_statement()?;
400
401 Ok(Statement::NamespaceDeclaration(NamespaceDeclaration {
402 name,
403 body: Box::new(body),
404 }))
405 }
406
407 fn parse_module_declaration(&mut self) -> Result<Statement> {
409 self.expect_keyword()?; let name = self.parse_string_literal()?;
411 let body = self.parse_block_statement()?;
412
413 Ok(Statement::ModuleDeclaration(ModuleDeclaration {
414 name,
415 body: Box::new(body),
416 }))
417 }
418
419 fn parse_declare_statement(&mut self) -> Result<Statement> {
421 self.expect_keyword()?; let declaration = self.parse_statement()?;
423 Ok(Statement::DeclareStatement(Box::new(DeclareStatement {
424 declaration: Box::new(declaration.unwrap()),
425 })))
426 }
427
428 fn parse_return_statement(&mut self) -> Result<Statement> {
430 self.expect_keyword()?; let argument = if self.current_token() == &Token::Semicolon {
433 None
434 } else {
435 Some(self.parse_expression()?)
436 };
437
438 if self.current_token() == &Token::Semicolon {
440 self.advance();
441 }
442
443 Ok(Statement::ReturnStatement(ReturnStatement { argument }))
444 }
445
446 fn parse_throw_statement(&mut self) -> Result<Statement> {
448 self.expect_keyword()?; let argument = self.parse_expression()?;
451
452 if self.current_token() == &Token::Semicolon {
454 self.advance();
455 }
456
457 Ok(Statement::ThrowStatement(ThrowStatement { argument }))
458 }
459
460 fn parse_expression_statement(&mut self) -> Result<Statement> {
462 let expression = self.parse_expression()?;
463 self.expect_semicolon()?;
464 Ok(Statement::ExpressionStatement(ExpressionStatement {
465 expression,
466 }))
467 }
468
469 fn parse_block_statement(&mut self) -> Result<Statement> {
471 self.expect_token(&Token::LeftBrace)?;
472 let mut statements = Vec::new();
473
474 while self.current_token() != &Token::RightBrace {
475 if let Some(statement) = self.parse_statement()? {
476 statements.push(statement);
477 } else {
478 break;
479 }
480 }
481
482 self.expect_token(&Token::RightBrace)?;
483 Ok(Statement::BlockStatement(BlockStatement { statements }))
484 }
485
486 fn parse_expression(&mut self) -> Result<Expression> {
488 self.parse_assignment_expression()
489 }
490
491 fn parse_assignment_expression(&mut self) -> Result<Expression> {
493 let left = self.parse_conditional_expression()?;
494
495 if self.is_assignment_operator() {
496 let operator = self.current_token().clone();
497 self.advance();
498 let right = self.parse_assignment_expression()?;
499 Ok(Expression::Assignment(AssignmentExpression {
500 left: Box::new(left),
501 operator,
502 right: Box::new(right),
503 }))
504 } else {
505 Ok(left)
506 }
507 }
508
509 fn parse_conditional_expression(&mut self) -> Result<Expression> {
511 let test = self.parse_logical_or_expression()?;
512
513 if self.current_token() == &Token::QuestionMark {
514 self.advance();
515 let consequent = self.parse_expression()?;
516 self.expect_token(&Token::Colon)?;
517 let alternate = self.parse_expression()?;
518 Ok(Expression::Conditional(ConditionalExpression {
519 test: Box::new(test),
520 consequent: Box::new(consequent),
521 alternate: Box::new(alternate),
522 }))
523 } else {
524 Ok(test)
525 }
526 }
527
528 fn parse_logical_or_expression(&mut self) -> Result<Expression> {
530 let mut left = self.parse_logical_and_expression()?;
531
532 while self.current_token() == &Token::Or {
533 self.advance();
534 let right = self.parse_logical_and_expression()?;
535 left = Expression::Logical(LogicalExpression {
536 left: Box::new(left),
537 operator: Token::Or,
538 right: Box::new(right),
539 });
540 }
541
542 Ok(left)
543 }
544
545 fn parse_logical_and_expression(&mut self) -> Result<Expression> {
547 let mut left = self.parse_equality_expression()?;
548
549 while self.current_token() == &Token::And {
550 self.advance();
551 let right = self.parse_equality_expression()?;
552 left = Expression::Logical(LogicalExpression {
553 left: Box::new(left),
554 operator: Token::And,
555 right: Box::new(right),
556 });
557 }
558
559 Ok(left)
560 }
561
562 fn parse_equality_expression(&mut self) -> Result<Expression> {
564 let mut left = self.parse_relational_expression()?;
565
566 while self.is_equality_operator() {
567 let operator = self.current_token().clone();
568 self.advance();
569 let right = self.parse_relational_expression()?;
570 left = Expression::Binary(BinaryExpression {
571 left: Box::new(left),
572 operator,
573 right: Box::new(right),
574 });
575 }
576
577 Ok(left)
578 }
579
580 fn parse_relational_expression(&mut self) -> Result<Expression> {
582 let mut left = self.parse_additive_expression()?;
583
584 while self.is_relational_operator() {
585 let operator = self.current_token().clone();
586 self.advance();
587 let right = self.parse_additive_expression()?;
588 left = Expression::Binary(BinaryExpression {
589 left: Box::new(left),
590 operator,
591 right: Box::new(right),
592 });
593 }
594
595 Ok(left)
596 }
597
598 fn parse_additive_expression(&mut self) -> Result<Expression> {
600 let mut left = self.parse_multiplicative_expression()?;
601
602 while self.is_additive_operator() {
603 let operator = self.current_token().clone();
604 self.advance();
605 let right = self.parse_multiplicative_expression()?;
606 left = Expression::Binary(BinaryExpression {
607 left: Box::new(left),
608 operator,
609 right: Box::new(right),
610 });
611 }
612
613 Ok(left)
614 }
615
616 fn parse_multiplicative_expression(&mut self) -> Result<Expression> {
618 let mut left = self.parse_unary_expression()?;
619
620 while self.is_multiplicative_operator() {
621 let operator = self.current_token().clone();
622 self.advance();
623 let right = self.parse_unary_expression()?;
624 left = Expression::Binary(BinaryExpression {
625 left: Box::new(left),
626 operator,
627 right: Box::new(right),
628 });
629 }
630
631 Ok(left)
632 }
633
634 fn parse_unary_expression(&mut self) -> Result<Expression> {
636 if self.is_unary_operator() {
637 let operator = self.current_token().clone();
638 self.advance();
639 let argument = self.parse_unary_expression()?;
640 Ok(Expression::Unary(UnaryExpression {
641 operator,
642 argument: Box::new(argument),
643 }))
644 } else {
645 self.parse_postfix_expression()
646 }
647 }
648
649 fn parse_postfix_expression(&mut self) -> Result<Expression> {
651 let mut left = self.parse_primary_expression()?;
652
653 while self.is_postfix_operator() {
654 match self.current_token() {
655 Token::LeftParen => {
656 self.advance();
657 let arguments = self.parse_arguments()?;
658 self.expect_token(&Token::RightParen)?;
659 left = Expression::Call(CallExpression {
660 callee: Box::new(left),
661 arguments,
662 });
663 }
664 Token::LeftBracket => {
665 self.advance();
666 let index = self.parse_expression()?;
667 self.expect_token(&Token::RightBracket)?;
668 left = Expression::Member(MemberExpression {
669 object: Box::new(left),
670 property: Box::new(index),
671 computed: true,
672 });
673 }
674 Token::Dot => {
675 self.advance();
676 let property = self.expect_identifier()?;
677 left = Expression::Member(MemberExpression {
678 object: Box::new(left),
679 property: Box::new(Expression::Identifier(property)),
680 computed: false,
681 });
682 }
683 _ => break,
684 }
685 }
686
687 Ok(left)
688 }
689
690 fn parse_primary_expression(&mut self) -> Result<Expression> {
692 let token = self.current_token().clone();
693 match token {
694 Token::Number(n) => {
695 self.advance();
696 Ok(Expression::Literal(Literal::Number(n)))
697 }
698 Token::String(s) => {
699 self.advance();
700 Ok(Expression::Literal(Literal::String(s)))
701 }
702 Token::TemplateLiteral(s) => {
703 self.advance();
704 let template = TemplateLiteral {
706 quasis: vec![TemplateElement {
707 value: s,
708 tail: true,
709 }],
710 expressions: vec![],
711 };
712 Ok(Expression::Template(template))
713 }
714 Token::Boolean(b) => {
715 self.advance();
716 Ok(Expression::Literal(Literal::Boolean(b)))
717 }
718 Token::Null => {
719 self.advance();
720 Ok(Expression::Literal(Literal::Null))
721 }
722 Token::Undefined => {
723 self.advance();
724 Ok(Expression::Literal(Literal::Undefined))
725 }
726 Token::Keyword(crate::lexer::Keyword::Null) => {
727 self.advance();
728 Ok(Expression::Literal(Literal::Null))
729 }
730 Token::Keyword(crate::lexer::Keyword::Undefined) => {
731 self.advance();
732 Ok(Expression::Literal(Literal::Undefined))
733 }
734 Token::Identifier(name) => {
735 self.advance();
736 Ok(Expression::Identifier(name))
737 }
738 Token::Keyword(crate::lexer::Keyword::This) => {
739 self.advance();
740 Ok(Expression::This(ThisExpression))
741 }
742 Token::Keyword(crate::lexer::Keyword::Super) => {
743 self.advance();
744 Ok(Expression::Super(SuperExpression))
745 }
746 Token::Keyword(crate::lexer::Keyword::New) => {
747 self.advance();
748 let callee = self.parse_primary_expression()?;
749 let arguments = if self.current_token() == &Token::LeftParen {
750 self.advance(); let args = self.parse_arguments()?;
752 self.expect_token(&Token::RightParen)?;
753 args
754 } else {
755 Vec::new()
756 };
757 Ok(Expression::New(NewExpression {
758 callee: Box::new(callee),
759 arguments,
760 }))
761 }
762 Token::LeftParen => {
763 let mut pos = self.position + 1;
765 let mut paren_count = 1;
766
767 while pos < self.tokens.len() && paren_count > 0 {
769 match &self.tokens[pos] {
770 Token::LeftParen => paren_count += 1,
771 Token::RightParen => paren_count -= 1,
772 _ => {}
773 }
774 pos += 1;
775 }
776
777 if pos < self.tokens.len() && self.tokens[pos] == Token::Arrow {
779 self.advance(); let parameters = self.parse_parameter_list()?;
782 self.expect_token(&Token::RightParen)?;
783 self.expect_token(&Token::Arrow)?;
784 let body = if self.current_token() == &Token::LeftBrace {
785 self.parse_block_statement()?
786 } else {
787 let expr = self.parse_expression()?;
788 Statement::ExpressionStatement(ExpressionStatement {
789 expression: expr,
790 })
791 };
792
793 Ok(Expression::Arrow(Box::new(ArrowFunctionExpression {
794 type_parameters: Vec::new(),
795 parameters,
796 return_type: None,
797 body: Box::new(body),
798 })))
799 } else {
800 self.advance();
802 let expression = self.parse_expression()?;
803 self.expect_token(&Token::RightParen)?;
804 Ok(Expression::Parenthesized(ParenthesizedExpression {
805 expression: Box::new(expression),
806 }))
807 }
808 }
809 Token::LeftBrace => self.parse_object_expression(),
810 Token::LeftBracket => self.parse_array_expression(),
811 _ => Err(CompilerError::parse_error(
812 self.position,
813 0,
814 format!("Unexpected token: {:?}", self.current_token()),
815 )),
816 }
817 }
818
819 fn parse_object_expression(&mut self) -> Result<Expression> {
821 self.expect_token(&Token::LeftBrace)?;
822 let mut properties = Vec::new();
823
824 while self.current_token() != &Token::RightBrace {
825 let key = self.parse_property_key()?;
826 let value = if self.current_token() == &Token::Colon {
827 self.advance();
828 self.parse_expression()?
829 } else {
830 key.clone()
831 };
832
833 properties.push(ObjectProperty {
834 key,
835 value,
836 shorthand: false,
837 computed: false,
838 method: false,
839 });
840
841 if self.current_token() == &Token::Comma {
842 self.advance();
843 }
844 }
845
846 self.expect_token(&Token::RightBrace)?;
847 Ok(Expression::Object(ObjectExpression { properties }))
848 }
849
850 fn parse_array_expression(&mut self) -> Result<Expression> {
852 self.expect_token(&Token::LeftBracket)?;
853 let mut elements = Vec::new();
854
855 while self.current_token() != &Token::RightBracket {
856 if self.current_token() == &Token::Comma {
857 self.advance();
858 elements.push(None);
859 } else {
860 elements.push(Some(self.parse_expression()?));
861 if self.current_token() == &Token::Comma {
862 self.advance();
863 }
864 }
865 }
866
867 self.expect_token(&Token::RightBracket)?;
868 Ok(Expression::Array(ArrayExpression { elements }))
869 }
870
871 fn parse_type(&mut self) -> Result<Type> {
873 let mut left_type = self.parse_primary_type()?;
874
875 while matches!(self.current_token(), Token::Union | Token::Intersection) {
877 let operator = self.current_token().clone();
878 self.advance();
879 let right_type = self.parse_primary_type()?;
880
881 left_type = match operator {
882 Token::Union => Type::Union {
883 left: Box::new(left_type),
884 right: Box::new(right_type),
885 },
886 Token::Intersection => Type::Intersection {
887 left: Box::new(left_type),
888 right: Box::new(right_type),
889 },
890 _ => return Err(CompilerError::parse_error(
891 1,
892 1,
893 "Expected union or intersection operator",
894 )),
895 };
896 }
897
898 while self.current_token() == &Token::LeftBracket {
900 self.advance(); self.expect_token(&Token::RightBracket)?; left_type = Type::Array(Box::new(left_type));
903 }
904
905 Ok(left_type)
906 }
907
908 fn parse_primary_type(&mut self) -> Result<Type> {
909 let token = self.current_token().clone();
910 match token {
911 Token::Keyword(crate::lexer::Keyword::String) => {
912 self.advance();
913 Ok(Type::String)
914 }
915 Token::Keyword(crate::lexer::Keyword::Number) => {
916 self.advance();
917 Ok(Type::Number)
918 }
919 Token::Keyword(crate::lexer::Keyword::Boolean) => {
920 self.advance();
921 Ok(Type::Boolean)
922 }
923 Token::Keyword(crate::lexer::Keyword::Any) => {
924 self.advance();
925 Ok(Type::Any)
926 }
927 Token::Keyword(crate::lexer::Keyword::Void) => {
928 self.advance();
929 Ok(Type::Void)
930 }
931 Token::Keyword(crate::lexer::Keyword::Never) => {
932 self.advance();
933 Ok(Type::Never)
934 }
935 Token::Keyword(crate::lexer::Keyword::Unknown) => {
936 self.advance();
937 Ok(Type::Unknown)
938 }
939 Token::Keyword(crate::lexer::Keyword::Array) => {
940 self.advance();
941 if self.current_token() == &Token::LessThan {
942 self.advance(); let element_type = self.parse_primary_type()?;
944 self.expect_token(&Token::GreaterThan)?;
945 Ok(Type::Array(Box::new(element_type)))
946 } else {
947 Ok(Type::Array(Box::new(Type::Any)))
948 }
949 }
950 Token::Keyword(crate::lexer::Keyword::Readonly) => {
951 self.advance();
952 let element_type = self.parse_primary_type()?;
954 Ok(element_type)
956 }
957 Token::Keyword(crate::lexer::Keyword::Keyof) => {
958 self.advance();
959 let _target_type = self.parse_type()?;
960 Ok(Type::String)
962 }
963 Token::Keyword(crate::lexer::Keyword::Key) => {
964 self.advance();
965 Ok(Type::String) }
967 Token::Keyword(crate::lexer::Keyword::Infer) => {
968 self.advance();
969 Ok(Type::Any) }
971 Token::Keyword(crate::lexer::Keyword::Null) => {
972 self.advance();
973 Ok(Type::Null) }
975 Token::Keyword(crate::lexer::Keyword::Undefined) => {
976 self.advance();
977 Ok(Type::Undefined) }
979 Token::Identifier(name) => {
980 self.advance();
981 if self.current_token() == &Token::LeftBracket {
983 self.advance(); let _index_type = self.parse_type()?;
985 self.expect_token(&Token::RightBracket)?;
986 Ok(Type::Named(name.to_string()))
988 } else if self.current_token() == &Token::LessThan {
989 let type_parameters = self.parse_type_parameters()?;
990 Ok(Type::GenericNamed {
991 name: name.to_string(),
992 type_parameters,
993 })
994 } else {
995 Ok(Type::Named(name.to_string()))
996 }
997 }
998 Token::String(s) => {
999 self.advance();
1000 Ok(Type::Named(format!("\"{}\"", s)))
1002 }
1003 Token::Number(n) => {
1004 self.advance();
1005 Ok(Type::Named(n.to_string()))
1007 }
1008 Token::LeftParen => {
1009 self.advance();
1010 let type_ = self.parse_type()?;
1011 self.expect_token(&Token::RightParen)?;
1012 Ok(type_)
1013 }
1014 Token::LeftBrace => {
1015 self.advance(); let mut members = Vec::new();
1018
1019 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
1020 if self.current_token() == &Token::LeftBracket {
1022 let mut pos = self.position + 1; let mut is_mapped_type = false;
1025
1026 while pos < self.tokens.len() && self.tokens[pos] != Token::RightBracket {
1028 if self.tokens[pos] == Token::Keyword(Keyword::In) {
1029 is_mapped_type = true;
1030 break;
1031 }
1032 pos += 1;
1033 }
1034
1035 if is_mapped_type {
1036 let mapped_type = self.parse_mapped_type()?;
1037 members.push(ObjectTypeMember::Property(PropertySignature {
1038 name: mapped_type.type_parameter.name.clone(),
1039 optional: false,
1040 type_: Some(*mapped_type.type_.clone()),
1041 readonly: mapped_type.readonly.unwrap_or(false),
1042 }));
1043 continue;
1045 } else {
1046 let index_sig = self.parse_index_signature()?;
1048 members.push(ObjectTypeMember::Index(index_sig));
1049 if self.current_token() == &Token::Semicolon {
1050 self.advance();
1051 }
1052 continue;
1053 }
1054 } else {
1055 let readonly = if self.current_token() == &Token::Keyword(Keyword::Readonly) {
1057 self.advance(); true
1059 } else {
1060 false
1061 };
1062
1063 let name = self.expect_identifier()?;
1064 let optional = if self.current_token() == &Token::QuestionMark {
1065 self.advance();
1066 true
1067 } else {
1068 false
1069 };
1070 self.expect_token(&Token::Colon)?;
1071 let type_ = self.parse_type()?;
1072
1073 members.push(ObjectTypeMember::Property(PropertySignature {
1074 name,
1075 optional,
1076 type_: Some(type_),
1077 readonly,
1078 }));
1079 }
1080
1081 if self.current_token() == &Token::Semicolon {
1082 self.advance();
1083 }
1084 }
1085
1086 self.expect_token(&Token::RightBrace)?;
1087 Ok(Type::ObjectType(ObjectType { members }))
1088 }
1089 _ => Err(CompilerError::parse_error(
1090 self.position,
1091 0,
1092 format!("Unexpected token in type: {:?}", self.current_token()),
1093 )),
1094 }
1095 }
1096
1097 fn current_token(&self) -> &Token {
1099 &self.tokens[self.position]
1100 }
1101
1102 fn advance(&mut self) {
1103 if self.position < self.tokens.len() {
1104 self.position += 1;
1105 }
1106 }
1107
1108 fn expect_token(&mut self, expected: &Token) -> Result<()> {
1109 if self.current_token() == expected {
1110 self.advance();
1111 Ok(())
1112 } else {
1113 Err(CompilerError::parse_error(
1114 self.position,
1115 0,
1116 format!("Expected {:?}, found {:?}", expected, self.current_token()),
1117 ))
1118 }
1119 }
1120
1121 fn expect_keyword(&mut self) -> Result<crate::lexer::Keyword> {
1122 if let Token::Keyword(keyword) = self.current_token() {
1123 let keyword = keyword.clone();
1124 self.advance();
1125 Ok(keyword)
1126 } else {
1127 Err(CompilerError::parse_error(
1128 self.position,
1129 0,
1130 format!("Expected keyword, found {:?}", self.current_token()),
1131 ))
1132 }
1133 }
1134
1135 fn expect_identifier(&mut self) -> Result<String> {
1136 if let Token::Identifier(name) = self.current_token() {
1137 let name = name.clone();
1138 self.advance();
1139 Ok(name)
1140 } else {
1141 Err(CompilerError::parse_error(
1142 self.position,
1143 0,
1144 format!("Expected identifier, found {:?}", self.current_token()),
1145 ))
1146 }
1147 }
1148
1149 fn expect_semicolon(&mut self) -> Result<()> {
1150 self.expect_token(&Token::Semicolon)
1151 }
1152
1153 fn parse_string_literal(&mut self) -> Result<String> {
1154 if let Token::String(s) = self.current_token() {
1155 let s = s.clone();
1156 self.advance();
1157 Ok(s)
1158 } else {
1159 Err(CompilerError::parse_error(
1160 self.position,
1161 0,
1162 format!("Expected string literal, found {:?}", self.current_token()),
1163 ))
1164 }
1165 }
1166
1167 fn is_assignment_operator(&self) -> bool {
1168 matches!(
1169 self.current_token(),
1170 Token::Assign
1171 | Token::PlusAssign
1172 | Token::MinusAssign
1173 | Token::MultiplyAssign
1174 | Token::DivideAssign
1175 )
1176 }
1177
1178 fn is_equality_operator(&self) -> bool {
1179 matches!(
1180 self.current_token(),
1181 Token::Equal | Token::NotEqual | Token::StrictEqual | Token::StrictNotEqual
1182 )
1183 }
1184
1185 fn is_relational_operator(&self) -> bool {
1186 matches!(
1187 self.current_token(),
1188 Token::LessThan | Token::GreaterThan | Token::LessEqual | Token::GreaterEqual
1189 )
1190 }
1191
1192 fn is_additive_operator(&self) -> bool {
1193 matches!(self.current_token(), Token::Plus | Token::Minus)
1194 }
1195
1196 fn is_multiplicative_operator(&self) -> bool {
1197 matches!(
1198 self.current_token(),
1199 Token::Multiply | Token::Divide | Token::Modulo
1200 )
1201 }
1202
1203 fn is_unary_operator(&self) -> bool {
1204 matches!(
1205 self.current_token(),
1206 Token::Plus | Token::Minus | Token::Not | Token::Keyword(crate::lexer::Keyword::Typeof)
1207 )
1208 }
1209
1210 fn is_postfix_operator(&self) -> bool {
1211 matches!(
1212 self.current_token(),
1213 Token::LeftParen | Token::LeftBracket | Token::Dot
1214 )
1215 }
1216
1217 fn parse_type_parameters(&mut self) -> Result<Vec<TypeParameter>> {
1219 if self.current_token() == &Token::LessThan {
1220 self.advance();
1221 let mut type_parameters = Vec::new();
1222
1223 while self.current_token() != &Token::GreaterThan {
1224 let name = self.expect_identifier()?;
1225 let constraint =
1226 if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Extends) {
1227 self.advance();
1228 Some(self.parse_type()?)
1229 } else {
1230 None
1231 };
1232
1233 let default_type = if self.current_token() == &Token::Assign {
1234 self.advance();
1235 Some(self.parse_type()?)
1236 } else {
1237 None
1238 };
1239
1240 type_parameters.push(TypeParameter {
1241 name,
1242 constraint: constraint.map(Box::new),
1243 default: default_type.map(Box::new),
1244 });
1245
1246 if self.current_token() == &Token::Comma {
1247 self.advance();
1248 }
1249 }
1250
1251 self.expect_token(&Token::GreaterThan)?;
1252 Ok(type_parameters)
1253 } else {
1254 Ok(Vec::new())
1255 }
1256 }
1257
1258 fn parse_parameters(&mut self) -> Result<Vec<Parameter>> {
1259 self.expect_token(&Token::LeftParen)?;
1260 let mut parameters = Vec::new();
1261
1262 while self.current_token() != &Token::RightParen {
1263 let mut _modifiers = Vec::new();
1265 while let Token::Keyword(keyword) = self.current_token() {
1266 match keyword {
1267 crate::lexer::Keyword::Public |
1268 crate::lexer::Keyword::Private |
1269 crate::lexer::Keyword::Protected |
1270 crate::lexer::Keyword::Readonly => {
1271 _modifiers.push(keyword.clone());
1272 self.advance();
1273 }
1274 _ => break,
1275 }
1276 }
1277
1278 let name = self.expect_identifier()?;
1279 let optional = if self.current_token() == &Token::QuestionMark {
1280 self.advance();
1281 true
1282 } else {
1283 false
1284 };
1285
1286 let type_annotation = if self.current_token() == &Token::Colon {
1287 self.advance();
1288 Some(self.parse_type()?)
1289 } else {
1290 None
1291 };
1292
1293 let initializer = if self.current_token() == &Token::Assign {
1294 self.advance();
1295 Some(self.parse_expression()?)
1296 } else {
1297 None
1298 };
1299
1300 parameters.push(Parameter {
1301 name,
1302 optional,
1303 type_: type_annotation.map(Box::new),
1304 initializer,
1305 rest: false,
1306 });
1307
1308 if self.current_token() == &Token::Comma {
1309 self.advance();
1310 }
1311 }
1312
1313 self.expect_token(&Token::RightParen)?;
1314 Ok(parameters)
1315 }
1316
1317 fn parse_parameter_list(&mut self) -> Result<Vec<Parameter>> {
1318 let mut parameters = Vec::new();
1319
1320 while self.current_token() != &Token::RightParen {
1321 let mut _modifiers = Vec::new();
1323 while let Token::Keyword(keyword) = self.current_token() {
1324 match keyword {
1325 crate::lexer::Keyword::Public |
1326 crate::lexer::Keyword::Private |
1327 crate::lexer::Keyword::Protected |
1328 crate::lexer::Keyword::Readonly => {
1329 _modifiers.push(keyword.clone());
1330 self.advance();
1331 }
1332 _ => break,
1333 }
1334 }
1335
1336 let name = self.expect_identifier()?;
1337 let optional = if self.current_token() == &Token::QuestionMark {
1338 self.advance();
1339 true
1340 } else {
1341 false
1342 };
1343
1344 let type_annotation = if self.current_token() == &Token::Colon {
1345 self.advance();
1346 Some(self.parse_type()?)
1347 } else {
1348 None
1349 };
1350
1351 let initializer = if self.current_token() == &Token::Assign {
1352 self.advance();
1353 Some(self.parse_expression()?)
1354 } else {
1355 None
1356 };
1357
1358 parameters.push(Parameter {
1359 name,
1360 optional,
1361 type_: type_annotation.map(Box::new),
1362 initializer,
1363 rest: false,
1364 });
1365
1366 if self.current_token() == &Token::Comma {
1367 self.advance();
1368 }
1369 }
1370
1371 Ok(parameters)
1372 }
1373
1374 fn parse_implements(&mut self) -> Result<Vec<Type>> {
1375 if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Implements) {
1376 self.advance();
1377 let mut types = Vec::new();
1378
1379 loop {
1380 let type_ = self.parse_type()?;
1381 types.push(type_);
1382
1383 if self.current_token() == &Token::Comma {
1384 self.advance();
1385 } else {
1386 break;
1387 }
1388 }
1389
1390 Ok(types)
1391 } else {
1392 Ok(Vec::new())
1393 }
1394 }
1395
1396 fn parse_extends(&mut self) -> Result<Vec<Type>> {
1397 let mut extends = Vec::new();
1398
1399 if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Extends) {
1400 self.advance(); let type_ = self.parse_type()?;
1404 extends.push(type_);
1405
1406 while self.current_token() == &Token::Comma {
1408 self.advance(); let type_ = self.parse_type()?;
1410 extends.push(type_);
1411 }
1412 }
1413
1414 Ok(extends)
1415 }
1416
1417 fn parse_class_body(&mut self) -> Result<ClassBody> {
1418 self.expect_token(&Token::LeftBrace)?;
1419 let mut members = Vec::new();
1420
1421 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
1422 let member = self.parse_class_member()?;
1423 members.push(member);
1424 }
1425
1426 self.expect_token(&Token::RightBrace)?;
1427 Ok(ClassBody { members })
1428 }
1429
1430 fn parse_interface_body(&mut self) -> Result<InterfaceBody> {
1431 self.expect_token(&Token::LeftBrace)?;
1432 let mut members = Vec::new();
1433
1434 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
1435 let member = self.parse_interface_member()?;
1436 members.push(member);
1437 }
1438 self.expect_token(&Token::RightBrace)?;
1439 Ok(InterfaceBody { members })
1440 }
1441
1442 fn parse_enum_members(&mut self) -> Result<Vec<EnumMember>> {
1443 self.expect_token(&Token::LeftBrace)?;
1444 let mut members = Vec::new();
1445
1446 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
1447 let member = self.parse_enum_member()?;
1448 members.push(member);
1449
1450 if self.current_token() == &Token::Comma {
1451 self.advance();
1452 }
1453 }
1454
1455 self.expect_token(&Token::RightBrace)?;
1456 Ok(members)
1457 }
1458
1459 fn parse_import_specifiers(&mut self) -> Result<Vec<ImportSpecifier>> {
1460 let mut specifiers = Vec::new();
1461
1462 if self.current_token() == &Token::LeftBrace {
1463 self.advance(); while self.current_token() != &Token::RightBrace {
1466 let name = self.expect_identifier()?;
1467 specifiers.push(ImportSpecifier::Named(NamedImportSpecifier {
1468 imported: name.clone(),
1469 name,
1470 }));
1471
1472 if self.current_token() == &Token::Comma {
1473 self.advance();
1474 }
1475 }
1476
1477 self.expect_token(&Token::RightBrace)?; } else {
1479 let name = self.expect_identifier()?;
1481 specifiers.push(ImportSpecifier::Default(DefaultImportSpecifier { name }));
1482 }
1483
1484 Ok(specifiers)
1485 }
1486
1487 fn parse_arguments(&mut self) -> Result<Vec<Expression>> {
1488 let mut arguments = Vec::new();
1489
1490 while self.current_token() != &Token::RightParen {
1491 let argument = self.parse_expression()?;
1492 arguments.push(argument);
1493
1494 if self.current_token() == &Token::Comma {
1495 self.advance();
1496 } else if self.current_token() != &Token::RightParen {
1497 return Err(CompilerError::parse_error(
1498 1,
1499 1,
1500 "Expected comma or closing parenthesis".to_string(),
1501 ));
1502 }
1503 }
1504
1505 Ok(arguments)
1506 }
1507
1508 fn parse_class_member(&mut self) -> Result<ClassMember> {
1509 let mut modifiers = Vec::new();
1510
1511 while let Token::Keyword(keyword) = self.current_token() {
1513 match keyword {
1514 crate::lexer::Keyword::Public => {
1515 modifiers.push(crate::ast::Modifier::Public);
1516 self.advance();
1517 }
1518 crate::lexer::Keyword::Private => {
1519 modifiers.push(crate::ast::Modifier::Private);
1520 self.advance();
1521 }
1522 crate::lexer::Keyword::Protected => {
1523 modifiers.push(crate::ast::Modifier::Protected);
1524 self.advance();
1525 }
1526 crate::lexer::Keyword::Readonly => {
1527 modifiers.push(crate::ast::Modifier::Readonly);
1528 self.advance();
1529 }
1530 crate::lexer::Keyword::Static => {
1531 modifiers.push(crate::ast::Modifier::Static);
1532 self.advance();
1533 }
1534 _ => break,
1535 }
1536 }
1537
1538 let token = self.current_token().clone();
1539
1540 match token {
1541 Token::Keyword(crate::lexer::Keyword::Get) => {
1542 self.advance();
1543 let name = if let Token::Identifier(name) = self.current_token() {
1544 let name = name.clone();
1545 self.advance();
1546 name
1547 } else {
1548 return Err(CompilerError::parse_error(
1549 1,
1550 1,
1551 "Expected getter name".to_string(),
1552 ));
1553 };
1554
1555 if self.current_token() == &Token::LeftParen {
1557 self.advance(); self.expect_token(&Token::RightParen)?; }
1560
1561 let return_type = if self.current_token() == &Token::Colon {
1562 self.advance();
1563 Some(self.parse_type()?)
1564 } else {
1565 None
1566 };
1567 let body = if self.current_token() == &Token::LeftBrace {
1568 self.parse_block_statement()?
1569 } else {
1570 return Err(CompilerError::parse_error(
1571 1,
1572 1,
1573 "Expected block statement for getter".to_string(),
1574 ));
1575 };
1576
1577 Ok(ClassMember::Getter(GetterDeclaration {
1578 name,
1579 type_: return_type,
1580 body: Some(body),
1581 modifiers,
1582 }))
1583 }
1584 Token::Keyword(crate::lexer::Keyword::Set) => {
1585 self.advance();
1586 let name = if let Token::Identifier(name) = self.current_token() {
1587 let name = name.clone();
1588 self.advance();
1589 name
1590 } else {
1591 return Err(CompilerError::parse_error(
1592 1,
1593 1,
1594 "Expected setter name".to_string(),
1595 ));
1596 };
1597
1598 let parameter = if self.current_token() == &Token::LeftParen {
1599 self.advance(); let name = self.expect_identifier()?;
1601 self.expect_token(&Token::Colon)?;
1602 let type_annotation = self.parse_type()?;
1603 self.expect_token(&Token::RightParen)?; Parameter {
1606 name,
1607 optional: false,
1608 type_: Some(Box::new(type_annotation)),
1609 initializer: None,
1610 rest: false,
1611 }
1612 } else {
1613 return Err(CompilerError::parse_error(
1614 1,
1615 1,
1616 "Expected setter parameter".to_string(),
1617 ));
1618 };
1619
1620 let body = if self.current_token() == &Token::LeftBrace {
1621 self.parse_block_statement()?
1622 } else {
1623 return Err(CompilerError::parse_error(
1624 1,
1625 1,
1626 "Expected block statement for setter".to_string(),
1627 ));
1628 };
1629
1630 Ok(ClassMember::Setter(SetterDeclaration {
1631 name,
1632 parameter,
1633 body: Some(body),
1634 modifiers,
1635 }))
1636 }
1637 Token::Identifier(name) => {
1638 self.advance();
1639
1640 if name == "constructor" {
1642 let parameters = self.parse_parameters()?;
1644 let body = self.parse_block_statement()?;
1645
1646 Ok(ClassMember::Constructor(ConstructorDeclaration {
1647 parameters,
1648 body: Some(body),
1649 modifiers,
1650 }))
1651 } else if self.current_token() == &Token::LeftParen {
1652 let parameters = self.parse_parameters()?;
1654 let return_type = if self.current_token() == &Token::Colon {
1655 self.advance();
1656 Some(self.parse_type()?)
1657 } else {
1658 None
1659 };
1660 let body = self.parse_block_statement()?;
1661
1662 Ok(ClassMember::Method(MethodDeclaration {
1663 name,
1664 optional: false,
1665 type_parameters: Vec::new(),
1666 parameters,
1667 return_type,
1668 body: Some(body),
1669 modifiers,
1670 }))
1671 } else if self.current_token() == &Token::Colon {
1672 self.advance();
1674 let type_annotation = self.parse_type()?;
1675
1676 let initializer = if self.current_token() == &Token::Assign {
1677 self.advance();
1678 Some(self.parse_expression()?)
1679 } else {
1680 None
1681 };
1682
1683 self.expect_token(&Token::Semicolon)?;
1684
1685 Ok(ClassMember::Property(PropertyDeclaration {
1686 name,
1687 optional: false,
1688 type_: Some(type_annotation),
1689 initializer,
1690 modifiers,
1691 }))
1692 } else {
1693 if name == "constructor" {
1695 let parameters = self.parse_parameters()?;
1696 let body = self.parse_block_statement()?;
1697
1698 Ok(ClassMember::Constructor(ConstructorDeclaration {
1699 parameters,
1700 body: Some(body),
1701 modifiers: Vec::new(),
1702 }))
1703 } else {
1704 self.advance();
1706 Err(CompilerError::parse_error(
1707 self.position - 1,
1708 1,
1709 "Unexpected class member, skipping token".to_string(),
1710 ))
1711 }
1712 }
1713 }
1714 _ => {
1715 self.advance();
1717 Err(CompilerError::parse_error(
1718 self.position - 1,
1719 1,
1720 "Expected class member, skipping token".to_string(),
1721 ))
1722 }
1723 }
1724 }
1725
1726 fn parse_interface_member(&mut self) -> Result<ObjectTypeMember> {
1727 let mut readonly = false;
1728
1729 if let Token::Keyword(crate::lexer::Keyword::Readonly) = self.current_token() {
1731 readonly = true;
1732 self.advance();
1733
1734 if let Token::Keyword(crate::lexer::Keyword::Readonly) = self.current_token() {
1736 let name = "readonly".to_string();
1738 self.advance(); if self.current_token() == &Token::Colon {
1741 self.advance();
1743 let type_annotation = self.parse_type()?;
1744 self.expect_token(&Token::Semicolon)?;
1745
1746 return Ok(ObjectTypeMember::Property(PropertySignature {
1747 name,
1748 optional: false,
1749 type_: Some(type_annotation),
1750 readonly,
1751 }));
1752 } else {
1753 return Err(CompilerError::parse_error(
1754 1, 1,
1755 "Expected colon after property name".to_string(),
1756 ));
1757 }
1758 }
1759 }
1760
1761 let token = self.current_token().clone();
1762
1763 match token {
1764 Token::LeftParen => {
1765 let parameters = self.parse_parameters()?;
1767 let return_type = if self.current_token() == &Token::Colon {
1768 self.advance();
1769 Some(self.parse_type()?)
1770 } else {
1771 None
1772 };
1773 self.expect_token(&Token::Semicolon)?;
1774
1775 Ok(ObjectTypeMember::Method(MethodSignature {
1776 name: "call".to_string(), optional: false,
1778 type_parameters: Vec::new(),
1779 parameters,
1780 return_type,
1781 }))
1782 }
1783 Token::Keyword(crate::lexer::Keyword::New) => {
1784 self.advance(); let parameters = self.parse_parameters()?;
1787 let return_type = if self.current_token() == &Token::Colon {
1788 self.advance();
1789 Some(self.parse_type()?)
1790 } else {
1791 None
1792 };
1793 self.expect_token(&Token::Semicolon)?;
1794
1795 Ok(ObjectTypeMember::Method(MethodSignature {
1796 name: "constructor".to_string(), optional: false,
1798 type_parameters: Vec::new(),
1799 parameters,
1800 return_type,
1801 }))
1802 }
1803 Token::Keyword(crate::lexer::Keyword::Readonly) => {
1804 let name = "readonly".to_string();
1806 self.advance();
1807
1808 if self.current_token() == &Token::Colon {
1809 self.advance();
1811 let type_annotation = self.parse_type()?;
1812 self.expect_token(&Token::Semicolon)?;
1813
1814 Ok(ObjectTypeMember::Property(PropertySignature {
1815 name,
1816 optional: false,
1817 type_: Some(type_annotation),
1818 readonly,
1819 }))
1820 } else {
1821 Err(CompilerError::parse_error(
1822 1, 1,
1823 "Expected colon after property name".to_string(),
1824 ))
1825 }
1826 }
1827 Token::Identifier(name) => {
1828 self.advance();
1829
1830 let optional = if self.current_token() == &Token::QuestionMark {
1832 self.advance();
1833 true
1834 } else {
1835 false
1836 };
1837
1838 if self.current_token() == &Token::LeftParen {
1839 let parameters = self.parse_parameters()?;
1841 let return_type = if self.current_token() == &Token::Colon {
1842 self.advance();
1843 Some(self.parse_type()?)
1844 } else {
1845 None
1846 };
1847 self.expect_token(&Token::Semicolon)?;
1848
1849 Ok(ObjectTypeMember::Method(MethodSignature {
1850 name,
1851 optional,
1852 type_parameters: Vec::new(),
1853 parameters,
1854 return_type,
1855 }))
1856 } else if self.current_token() == &Token::Colon {
1857 self.advance();
1859 let type_annotation = self.parse_type()?;
1860 self.expect_token(&Token::Semicolon)?;
1861
1862 Ok(ObjectTypeMember::Property(PropertySignature {
1863 name,
1864 optional,
1865 type_: Some(type_annotation),
1866 readonly,
1867 }))
1868 } else {
1869 Err(CompilerError::parse_error(
1870 1,
1871 1,
1872 "Expected method or property signature".to_string(),
1873 ))
1874 }
1875 }
1876 Token::LeftBracket => {
1877 self.advance(); let key_name = match self.current_token() {
1880 Token::Identifier(name) => {
1881 let name = name.clone();
1882 self.advance();
1883 name
1884 }
1885 Token::Keyword(crate::lexer::Keyword::Key) => {
1886 self.advance();
1887 "key".to_string()
1888 }
1889 _ => return Err(CompilerError::parse_error(
1890 1, 1,
1891 "Expected identifier or 'key' in index signature".to_string(),
1892 ))
1893 };
1894 self.expect_token(&Token::Colon)?;
1895 let key_type = self.parse_type()?;
1896 self.expect_token(&Token::RightBracket)?;
1897 self.expect_token(&Token::Colon)?;
1898 let value_type = self.parse_type()?;
1899 self.expect_token(&Token::Semicolon)?;
1900
1901 Ok(ObjectTypeMember::Index(IndexSignature {
1902 parameter: Box::new(Parameter {
1903 name: key_name,
1904 type_: Some(Box::new(key_type)),
1905 optional: false,
1906 initializer: None,
1907 rest: false,
1908 }),
1909 type_: value_type,
1910 readonly: false,
1911 }))
1912 }
1913 _ => Err(CompilerError::parse_error(
1914 1,
1915 1,
1916 "Expected interface member".to_string(),
1917 )),
1918 }
1919 }
1920
1921 fn parse_enum_member(&mut self) -> Result<EnumMember> {
1922 let name = self.expect_identifier()?;
1923
1924 let initializer = if self.current_token() == &Token::Assign {
1925 self.advance();
1926 Some(self.parse_expression()?)
1927 } else {
1928 None
1929 };
1930
1931 Ok(EnumMember { name, initializer })
1932 }
1933
1934 fn parse_if_statement(&mut self) -> Result<Statement> {
1935 self.expect_keyword()?; self.expect_token(&Token::LeftParen)?;
1938 let test = self.parse_expression()?;
1939 self.expect_token(&Token::RightParen)?;
1940
1941 let consequent = self.parse_statement()?.unwrap();
1942
1943 let alternate = if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Else) {
1944 self.advance();
1945 Some(self.parse_statement()?.unwrap())
1946 } else {
1947 None
1948 };
1949
1950 Ok(Statement::IfStatement(Box::new(IfStatement {
1951 condition: test,
1952 consequent: Box::new(consequent),
1953 alternate,
1954 })))
1955 }
1956
1957 fn parse_property_key(&mut self) -> Result<Expression> {
1958 self.parse_expression()
1960 }
1961
1962 fn parse_index_signature(&mut self) -> Result<IndexSignature> {
1964 self.expect_token(&Token::LeftBracket)?;
1965
1966 let key_name = match self.current_token() {
1967 Token::Identifier(name) => {
1968 let name = name.clone();
1969 self.advance();
1970 name
1971 }
1972 Token::Keyword(Keyword::Key) => {
1973 self.advance();
1974 "key".to_string()
1975 }
1976 _ => {
1977 return Err(CompilerError::parse_error(
1978 self.position,
1979 0,
1980 format!("Expected identifier or 'key', found {:?}", self.current_token()),
1981 ));
1982 }
1983 };
1984
1985 self.expect_token(&Token::Colon)?;
1986 let key_type = self.parse_type()?;
1987 self.expect_token(&Token::RightBracket)?;
1988 self.expect_token(&Token::Colon)?;
1989 let value_type = self.parse_type()?;
1990
1991 Ok(IndexSignature {
1992 parameter: Box::new(Parameter {
1993 name: key_name,
1994 type_: Some(Box::new(key_type)),
1995 optional: false,
1996 initializer: None,
1997 rest: false,
1998 }),
1999 type_: value_type,
2000 readonly: false,
2001 })
2002 }
2003
2004 fn parse_mapped_type(&mut self) -> Result<MappedType> {
2006 self.expect_token(&Token::LeftBracket)?;
2008
2009 let type_parameter_name = match self.current_token() {
2010 Token::Identifier(name) => {
2011 let name = name.clone();
2012 self.advance();
2013 name
2014 }
2015 Token::Keyword(Keyword::Key) => {
2016 self.advance();
2017 "Key".to_string()
2018 }
2019 _ => {
2020 return Err(CompilerError::parse_error(
2021 self.position,
2022 0,
2023 format!("Expected identifier or Key, found {:?}", self.current_token()),
2024 ));
2025 }
2026 };
2027 let type_parameter = TypeParameter {
2028 name: type_parameter_name.clone(),
2029 constraint: None,
2030 default: None,
2031 };
2032
2033 if self.current_token() == &Token::Keyword(Keyword::In) {
2035 self.advance();
2036 } else {
2037 return Err(CompilerError::parse_error(
2038 self.position,
2039 0,
2040 format!("Expected 'in', found {:?}", self.current_token()),
2041 ));
2042 }
2043
2044 let constraint_type = self.parse_type()?;
2045
2046 self.expect_token(&Token::RightBracket)?;
2047 self.expect_token(&Token::Colon)?;
2048
2049 let value_type = self.parse_type()?;
2050
2051 if self.current_token() == &Token::Semicolon {
2053 self.advance();
2054 }
2055
2056 Ok(MappedType {
2057 type_parameter: Box::new(type_parameter),
2058 constraint: Some(Box::new(constraint_type)),
2059 name_type: None,
2060 type_: Box::new(value_type),
2061 readonly: None,
2062 optional: None,
2063 })
2064 }
2065}