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