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::New) => {
655 self.advance();
656 let callee = self.parse_primary_expression()?;
657 let arguments = if self.current_token() == &Token::LeftParen {
658 self.advance(); let args = self.parse_arguments()?;
660 self.expect_token(&Token::RightParen)?;
661 args
662 } else {
663 Vec::new()
664 };
665 Ok(Expression::New(NewExpression {
666 callee: Box::new(callee),
667 arguments,
668 }))
669 }
670 Token::LeftParen => {
671 let mut pos = self.position + 1;
673 let mut paren_count = 1;
674
675 while pos < self.tokens.len() && paren_count > 0 {
677 match &self.tokens[pos] {
678 Token::LeftParen => paren_count += 1,
679 Token::RightParen => paren_count -= 1,
680 _ => {}
681 }
682 pos += 1;
683 }
684
685 if pos < self.tokens.len() && self.tokens[pos] == Token::Arrow {
687 self.advance(); let parameters = self.parse_parameter_list()?;
690 self.expect_token(&Token::RightParen)?;
691 self.expect_token(&Token::Arrow)?;
692 let body = if self.current_token() == &Token::LeftBrace {
693 self.parse_block_statement()?
694 } else {
695 let expr = self.parse_expression()?;
696 Statement::ExpressionStatement(ExpressionStatement {
697 expression: expr,
698 })
699 };
700
701 Ok(Expression::Arrow(Box::new(ArrowFunctionExpression {
702 type_parameters: Vec::new(),
703 parameters,
704 return_type: None,
705 body: Box::new(body),
706 })))
707 } else {
708 self.advance();
710 let expression = self.parse_expression()?;
711 self.expect_token(&Token::RightParen)?;
712 Ok(Expression::Parenthesized(ParenthesizedExpression {
713 expression: Box::new(expression),
714 }))
715 }
716 }
717 Token::LeftBrace => self.parse_object_expression(),
718 Token::LeftBracket => self.parse_array_expression(),
719 _ => Err(CompilerError::parse_error(
720 self.position,
721 0,
722 format!("Unexpected token: {:?}", self.current_token()),
723 )),
724 }
725 }
726
727 fn parse_object_expression(&mut self) -> Result<Expression> {
729 self.expect_token(&Token::LeftBrace)?;
730 let mut properties = Vec::new();
731
732 while self.current_token() != &Token::RightBrace {
733 let key = self.parse_property_key()?;
734 let value = if self.current_token() == &Token::Colon {
735 self.advance();
736 self.parse_expression()?
737 } else {
738 key.clone()
739 };
740
741 properties.push(ObjectProperty {
742 key,
743 value,
744 shorthand: false,
745 computed: false,
746 method: false,
747 });
748
749 if self.current_token() == &Token::Comma {
750 self.advance();
751 }
752 }
753
754 self.expect_token(&Token::RightBrace)?;
755 Ok(Expression::Object(ObjectExpression { properties }))
756 }
757
758 fn parse_array_expression(&mut self) -> Result<Expression> {
760 self.expect_token(&Token::LeftBracket)?;
761 let mut elements = Vec::new();
762
763 while self.current_token() != &Token::RightBracket {
764 if self.current_token() == &Token::Comma {
765 self.advance();
766 elements.push(None);
767 } else {
768 elements.push(Some(self.parse_expression()?));
769 if self.current_token() == &Token::Comma {
770 self.advance();
771 }
772 }
773 }
774
775 self.expect_token(&Token::RightBracket)?;
776 Ok(Expression::Array(ArrayExpression { elements }))
777 }
778
779 fn parse_type(&mut self) -> Result<Type> {
781 let mut left_type = self.parse_primary_type()?;
782
783 while matches!(self.current_token(), Token::Union | Token::Intersection) {
785 let operator = self.current_token().clone();
786 self.advance();
787 let right_type = self.parse_primary_type()?;
788
789 left_type = match operator {
790 Token::Union => Type::Union {
791 left: Box::new(left_type),
792 right: Box::new(right_type),
793 },
794 Token::Intersection => Type::Intersection {
795 left: Box::new(left_type),
796 right: Box::new(right_type),
797 },
798 _ => return Err(CompilerError::parse_error(
799 1,
800 1,
801 "Expected union or intersection operator",
802 )),
803 };
804 }
805
806 while self.current_token() == &Token::LeftBracket {
808 self.advance(); self.expect_token(&Token::RightBracket)?; left_type = Type::Array(Box::new(left_type));
811 }
812
813 Ok(left_type)
814 }
815
816 fn parse_primary_type(&mut self) -> Result<Type> {
817 let token = self.current_token().clone();
818 match token {
819 Token::Keyword(crate::lexer::Keyword::String) => {
820 self.advance();
821 Ok(Type::String)
822 }
823 Token::Keyword(crate::lexer::Keyword::Number) => {
824 self.advance();
825 Ok(Type::Number)
826 }
827 Token::Keyword(crate::lexer::Keyword::Boolean) => {
828 self.advance();
829 Ok(Type::Boolean)
830 }
831 Token::Keyword(crate::lexer::Keyword::Any) => {
832 self.advance();
833 Ok(Type::Any)
834 }
835 Token::Keyword(crate::lexer::Keyword::Void) => {
836 self.advance();
837 Ok(Type::Void)
838 }
839 Token::Keyword(crate::lexer::Keyword::Never) => {
840 self.advance();
841 Ok(Type::Never)
842 }
843 Token::Keyword(crate::lexer::Keyword::Unknown) => {
844 self.advance();
845 Ok(Type::Unknown)
846 }
847 Token::Keyword(crate::lexer::Keyword::Array) => {
848 self.advance();
849 if self.current_token() == &Token::LessThan {
850 self.advance(); let element_type = self.parse_primary_type()?;
852 self.expect_token(&Token::GreaterThan)?;
853 Ok(Type::Array(Box::new(element_type)))
854 } else {
855 Ok(Type::Array(Box::new(Type::Any)))
856 }
857 }
858 Token::Keyword(crate::lexer::Keyword::Readonly) => {
859 self.advance();
860 let element_type = self.parse_primary_type()?;
862 Ok(element_type)
864 }
865 Token::Keyword(crate::lexer::Keyword::Keyof) => {
866 self.advance();
867 let _target_type = self.parse_type()?;
868 Ok(Type::String)
870 }
871 Token::Keyword(crate::lexer::Keyword::Key) => {
872 self.advance();
873 Ok(Type::String) }
875 Token::Keyword(crate::lexer::Keyword::Infer) => {
876 self.advance();
877 Ok(Type::Any) }
879 Token::Keyword(crate::lexer::Keyword::Null) => {
880 self.advance();
881 Ok(Type::Null) }
883 Token::Keyword(crate::lexer::Keyword::Undefined) => {
884 self.advance();
885 Ok(Type::Undefined) }
887 Token::Identifier(name) => {
888 self.advance();
889 if self.current_token() == &Token::LeftBracket {
891 self.advance(); let _index_type = self.parse_type()?;
893 self.expect_token(&Token::RightBracket)?;
894 Ok(Type::Named(name.to_string()))
896 } else if self.current_token() == &Token::LessThan {
897 let type_parameters = self.parse_type_parameters()?;
898 Ok(Type::GenericNamed {
899 name: name.to_string(),
900 type_parameters,
901 })
902 } else {
903 Ok(Type::Named(name.to_string()))
904 }
905 }
906 Token::String(s) => {
907 self.advance();
908 Ok(Type::Named(format!("\"{}\"", s)))
910 }
911 Token::Number(n) => {
912 self.advance();
913 Ok(Type::Named(n.to_string()))
915 }
916 Token::LeftParen => {
917 self.advance();
918 let type_ = self.parse_type()?;
919 self.expect_token(&Token::RightParen)?;
920 Ok(type_)
921 }
922 Token::LeftBrace => {
923 self.advance(); let mut members = Vec::new();
926
927 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
928 if self.current_token() == &Token::LeftBracket {
930 let mut pos = self.position + 1; let mut is_mapped_type = false;
933
934 while pos < self.tokens.len() && self.tokens[pos] != Token::RightBracket {
936 if self.tokens[pos] == Token::Keyword(Keyword::In) {
937 is_mapped_type = true;
938 break;
939 }
940 pos += 1;
941 }
942
943 if is_mapped_type {
944 let mapped_type = self.parse_mapped_type()?;
945 members.push(ObjectTypeMember::Property(PropertySignature {
946 name: mapped_type.type_parameter.name.clone(),
947 optional: false,
948 type_: Some(*mapped_type.type_.clone()),
949 readonly: mapped_type.readonly.unwrap_or(false),
950 }));
951 continue;
953 } else {
954 let index_sig = self.parse_index_signature()?;
956 members.push(ObjectTypeMember::Index(index_sig));
957 if self.current_token() == &Token::Semicolon {
958 self.advance();
959 }
960 continue;
961 }
962 } else {
963 let readonly = if self.current_token() == &Token::Keyword(Keyword::Readonly) {
965 self.advance(); true
967 } else {
968 false
969 };
970
971 let name = self.expect_identifier()?;
972 let optional = if self.current_token() == &Token::QuestionMark {
973 self.advance();
974 true
975 } else {
976 false
977 };
978 self.expect_token(&Token::Colon)?;
979 let type_ = self.parse_type()?;
980
981 members.push(ObjectTypeMember::Property(PropertySignature {
982 name,
983 optional,
984 type_: Some(type_),
985 readonly,
986 }));
987 }
988
989 if self.current_token() == &Token::Semicolon {
990 self.advance();
991 }
992 }
993
994 self.expect_token(&Token::RightBrace)?;
995 Ok(Type::ObjectType(ObjectType { members }))
996 }
997 _ => Err(CompilerError::parse_error(
998 self.position,
999 0,
1000 format!("Unexpected token in type: {:?}", self.current_token()),
1001 )),
1002 }
1003 }
1004
1005 fn current_token(&self) -> &Token {
1007 &self.tokens[self.position]
1008 }
1009
1010 fn advance(&mut self) {
1011 if self.position < self.tokens.len() {
1012 self.position += 1;
1013 }
1014 }
1015
1016 fn expect_token(&mut self, expected: &Token) -> Result<()> {
1017 if self.current_token() == expected {
1018 self.advance();
1019 Ok(())
1020 } else {
1021 Err(CompilerError::parse_error(
1022 self.position,
1023 0,
1024 format!("Expected {:?}, found {:?}", expected, self.current_token()),
1025 ))
1026 }
1027 }
1028
1029 fn expect_keyword(&mut self) -> Result<crate::lexer::Keyword> {
1030 if let Token::Keyword(keyword) = self.current_token() {
1031 let keyword = keyword.clone();
1032 self.advance();
1033 Ok(keyword)
1034 } else {
1035 Err(CompilerError::parse_error(
1036 self.position,
1037 0,
1038 format!("Expected keyword, found {:?}", self.current_token()),
1039 ))
1040 }
1041 }
1042
1043 fn expect_identifier(&mut self) -> Result<String> {
1044 if let Token::Identifier(name) = self.current_token() {
1045 let name = name.clone();
1046 self.advance();
1047 Ok(name)
1048 } else {
1049 Err(CompilerError::parse_error(
1050 self.position,
1051 0,
1052 format!("Expected identifier, found {:?}", self.current_token()),
1053 ))
1054 }
1055 }
1056
1057 fn expect_semicolon(&mut self) -> Result<()> {
1058 self.expect_token(&Token::Semicolon)
1059 }
1060
1061 fn parse_string_literal(&mut self) -> Result<String> {
1062 if let Token::String(s) = self.current_token() {
1063 let s = s.clone();
1064 self.advance();
1065 Ok(s)
1066 } else {
1067 Err(CompilerError::parse_error(
1068 self.position,
1069 0,
1070 format!("Expected string literal, found {:?}", self.current_token()),
1071 ))
1072 }
1073 }
1074
1075 fn is_assignment_operator(&self) -> bool {
1076 matches!(
1077 self.current_token(),
1078 Token::Assign
1079 | Token::PlusAssign
1080 | Token::MinusAssign
1081 | Token::MultiplyAssign
1082 | Token::DivideAssign
1083 )
1084 }
1085
1086 fn is_equality_operator(&self) -> bool {
1087 matches!(
1088 self.current_token(),
1089 Token::Equal | Token::NotEqual | Token::StrictEqual | Token::StrictNotEqual
1090 )
1091 }
1092
1093 fn is_relational_operator(&self) -> bool {
1094 matches!(
1095 self.current_token(),
1096 Token::LessThan | Token::GreaterThan | Token::LessEqual | Token::GreaterEqual
1097 )
1098 }
1099
1100 fn is_additive_operator(&self) -> bool {
1101 matches!(self.current_token(), Token::Plus | Token::Minus)
1102 }
1103
1104 fn is_multiplicative_operator(&self) -> bool {
1105 matches!(
1106 self.current_token(),
1107 Token::Multiply | Token::Divide | Token::Modulo
1108 )
1109 }
1110
1111 fn is_unary_operator(&self) -> bool {
1112 matches!(
1113 self.current_token(),
1114 Token::Plus | Token::Minus | Token::Not | Token::Keyword(crate::lexer::Keyword::Typeof)
1115 )
1116 }
1117
1118 fn is_postfix_operator(&self) -> bool {
1119 matches!(
1120 self.current_token(),
1121 Token::LeftParen | Token::LeftBracket | Token::Dot
1122 )
1123 }
1124
1125 fn parse_type_parameters(&mut self) -> Result<Vec<TypeParameter>> {
1127 if self.current_token() == &Token::LessThan {
1128 self.advance();
1129 let mut type_parameters = Vec::new();
1130
1131 while self.current_token() != &Token::GreaterThan {
1132 let name = self.expect_identifier()?;
1133 let constraint =
1134 if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Extends) {
1135 self.advance();
1136 Some(self.parse_type()?)
1137 } else {
1138 None
1139 };
1140
1141 let default_type = if self.current_token() == &Token::Assign {
1142 self.advance();
1143 Some(self.parse_type()?)
1144 } else {
1145 None
1146 };
1147
1148 type_parameters.push(TypeParameter {
1149 name,
1150 constraint: constraint.map(Box::new),
1151 default: default_type.map(Box::new),
1152 });
1153
1154 if self.current_token() == &Token::Comma {
1155 self.advance();
1156 }
1157 }
1158
1159 self.expect_token(&Token::GreaterThan)?;
1160 Ok(type_parameters)
1161 } else {
1162 Ok(Vec::new())
1163 }
1164 }
1165
1166 fn parse_parameters(&mut self) -> Result<Vec<Parameter>> {
1167 self.expect_token(&Token::LeftParen)?;
1168 let mut parameters = Vec::new();
1169
1170 while self.current_token() != &Token::RightParen {
1171 let mut _modifiers = Vec::new();
1173 while let Token::Keyword(keyword) = self.current_token() {
1174 match keyword {
1175 crate::lexer::Keyword::Public |
1176 crate::lexer::Keyword::Private |
1177 crate::lexer::Keyword::Protected |
1178 crate::lexer::Keyword::Readonly => {
1179 _modifiers.push(keyword.clone());
1180 self.advance();
1181 }
1182 _ => break,
1183 }
1184 }
1185
1186 let name = self.expect_identifier()?;
1187 let optional = if self.current_token() == &Token::QuestionMark {
1188 self.advance();
1189 true
1190 } else {
1191 false
1192 };
1193
1194 let type_annotation = if self.current_token() == &Token::Colon {
1195 self.advance();
1196 Some(self.parse_type()?)
1197 } else {
1198 None
1199 };
1200
1201 let initializer = if self.current_token() == &Token::Assign {
1202 self.advance();
1203 Some(self.parse_expression()?)
1204 } else {
1205 None
1206 };
1207
1208 parameters.push(Parameter {
1209 name,
1210 optional,
1211 type_: type_annotation.map(Box::new),
1212 initializer,
1213 rest: false,
1214 });
1215
1216 if self.current_token() == &Token::Comma {
1217 self.advance();
1218 }
1219 }
1220
1221 self.expect_token(&Token::RightParen)?;
1222 Ok(parameters)
1223 }
1224
1225 fn parse_parameter_list(&mut self) -> Result<Vec<Parameter>> {
1226 let mut parameters = Vec::new();
1227
1228 while self.current_token() != &Token::RightParen {
1229 let mut _modifiers = Vec::new();
1231 while let Token::Keyword(keyword) = self.current_token() {
1232 match keyword {
1233 crate::lexer::Keyword::Public |
1234 crate::lexer::Keyword::Private |
1235 crate::lexer::Keyword::Protected |
1236 crate::lexer::Keyword::Readonly => {
1237 _modifiers.push(keyword.clone());
1238 self.advance();
1239 }
1240 _ => break,
1241 }
1242 }
1243
1244 let name = self.expect_identifier()?;
1245 let optional = if self.current_token() == &Token::QuestionMark {
1246 self.advance();
1247 true
1248 } else {
1249 false
1250 };
1251
1252 let type_annotation = if self.current_token() == &Token::Colon {
1253 self.advance();
1254 Some(self.parse_type()?)
1255 } else {
1256 None
1257 };
1258
1259 let initializer = if self.current_token() == &Token::Assign {
1260 self.advance();
1261 Some(self.parse_expression()?)
1262 } else {
1263 None
1264 };
1265
1266 parameters.push(Parameter {
1267 name,
1268 optional,
1269 type_: type_annotation.map(Box::new),
1270 initializer,
1271 rest: false,
1272 });
1273
1274 if self.current_token() == &Token::Comma {
1275 self.advance();
1276 }
1277 }
1278
1279 Ok(parameters)
1280 }
1281
1282 fn parse_implements(&mut self) -> Result<Vec<Type>> {
1283 if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Implements) {
1284 self.advance();
1285 let mut types = Vec::new();
1286
1287 loop {
1288 let type_ = self.parse_type()?;
1289 types.push(type_);
1290
1291 if self.current_token() == &Token::Comma {
1292 self.advance();
1293 } else {
1294 break;
1295 }
1296 }
1297
1298 Ok(types)
1299 } else {
1300 Ok(Vec::new())
1301 }
1302 }
1303
1304 fn parse_extends(&mut self) -> Result<Vec<Type>> {
1305 let mut extends = Vec::new();
1306
1307 if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Extends) {
1308 self.advance(); let type_ = self.parse_type()?;
1312 extends.push(type_);
1313
1314 while self.current_token() == &Token::Comma {
1316 self.advance(); let type_ = self.parse_type()?;
1318 extends.push(type_);
1319 }
1320 }
1321
1322 Ok(extends)
1323 }
1324
1325 fn parse_class_body(&mut self) -> Result<ClassBody> {
1326 self.expect_token(&Token::LeftBrace)?;
1327 let mut members = Vec::new();
1328
1329 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
1330 let member = self.parse_class_member()?;
1331 members.push(member);
1332 }
1333
1334 self.expect_token(&Token::RightBrace)?;
1335 Ok(ClassBody { members })
1336 }
1337
1338 fn parse_interface_body(&mut self) -> Result<InterfaceBody> {
1339 self.expect_token(&Token::LeftBrace)?;
1340 let mut members = Vec::new();
1341
1342 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
1343 let member = self.parse_interface_member()?;
1344 members.push(member);
1345 }
1346 self.expect_token(&Token::RightBrace)?;
1347 Ok(InterfaceBody { members })
1348 }
1349
1350 fn parse_enum_members(&mut self) -> Result<Vec<EnumMember>> {
1351 self.expect_token(&Token::LeftBrace)?;
1352 let mut members = Vec::new();
1353
1354 while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
1355 let member = self.parse_enum_member()?;
1356 members.push(member);
1357
1358 if self.current_token() == &Token::Comma {
1359 self.advance();
1360 }
1361 }
1362
1363 self.expect_token(&Token::RightBrace)?;
1364 Ok(members)
1365 }
1366
1367 fn parse_import_specifiers(&mut self) -> Result<Vec<ImportSpecifier>> {
1368 let mut specifiers = Vec::new();
1369
1370 if self.current_token() == &Token::LeftBrace {
1371 self.advance(); while self.current_token() != &Token::RightBrace {
1374 let name = self.expect_identifier()?;
1375 specifiers.push(ImportSpecifier::Named(NamedImportSpecifier {
1376 imported: name.clone(),
1377 name,
1378 }));
1379
1380 if self.current_token() == &Token::Comma {
1381 self.advance();
1382 }
1383 }
1384
1385 self.expect_token(&Token::RightBrace)?; } else {
1387 let name = self.expect_identifier()?;
1389 specifiers.push(ImportSpecifier::Default(DefaultImportSpecifier { name }));
1390 }
1391
1392 Ok(specifiers)
1393 }
1394
1395 fn parse_arguments(&mut self) -> Result<Vec<Expression>> {
1396 let mut arguments = Vec::new();
1397
1398 while self.current_token() != &Token::RightParen {
1399 let argument = self.parse_expression()?;
1400 arguments.push(argument);
1401
1402 if self.current_token() == &Token::Comma {
1403 self.advance();
1404 } else if self.current_token() != &Token::RightParen {
1405 return Err(CompilerError::parse_error(
1406 1,
1407 1,
1408 "Expected comma or closing parenthesis".to_string(),
1409 ));
1410 }
1411 }
1412
1413 Ok(arguments)
1414 }
1415
1416 fn parse_class_member(&mut self) -> Result<ClassMember> {
1417 let mut modifiers = Vec::new();
1418
1419 while let Token::Keyword(keyword) = self.current_token() {
1421 match keyword {
1422 crate::lexer::Keyword::Public => {
1423 modifiers.push(crate::ast::Modifier::Public);
1424 self.advance();
1425 }
1426 crate::lexer::Keyword::Private => {
1427 modifiers.push(crate::ast::Modifier::Private);
1428 self.advance();
1429 }
1430 crate::lexer::Keyword::Protected => {
1431 modifiers.push(crate::ast::Modifier::Protected);
1432 self.advance();
1433 }
1434 crate::lexer::Keyword::Readonly => {
1435 modifiers.push(crate::ast::Modifier::Readonly);
1436 self.advance();
1437 }
1438 crate::lexer::Keyword::Static => {
1439 modifiers.push(crate::ast::Modifier::Static);
1440 self.advance();
1441 }
1442 _ => break,
1443 }
1444 }
1445
1446 let token = self.current_token().clone();
1447
1448 match token {
1449 Token::Keyword(crate::lexer::Keyword::Get) => {
1450 self.advance();
1451 let name = if let Token::Identifier(name) = self.current_token() {
1452 let name = name.clone();
1453 self.advance();
1454 name
1455 } else {
1456 return Err(CompilerError::parse_error(
1457 1,
1458 1,
1459 "Expected getter name".to_string(),
1460 ));
1461 };
1462
1463 let return_type = if self.current_token() == &Token::Colon {
1464 self.advance();
1465 Some(self.parse_type()?)
1466 } else {
1467 None
1468 };
1469
1470 let body = if self.current_token() == &Token::LeftBrace {
1471 self.parse_block_statement()?
1472 } else {
1473 return Err(CompilerError::parse_error(
1474 1,
1475 1,
1476 "Expected block statement for getter".to_string(),
1477 ));
1478 };
1479
1480 Ok(ClassMember::Getter(GetterDeclaration {
1481 name,
1482 type_: return_type,
1483 body: Some(body),
1484 modifiers,
1485 }))
1486 }
1487 Token::Keyword(crate::lexer::Keyword::Set) => {
1488 self.advance();
1489 let name = if let Token::Identifier(name) = self.current_token() {
1490 let name = name.clone();
1491 self.advance();
1492 name
1493 } else {
1494 return Err(CompilerError::parse_error(
1495 1,
1496 1,
1497 "Expected setter name".to_string(),
1498 ));
1499 };
1500
1501 let parameter = if self.current_token() == &Token::LeftParen {
1502 self.advance();
1503 let parameters = self.parse_parameters()?;
1504 if parameters.len() != 1 {
1505 return Err(CompilerError::parse_error(
1506 1,
1507 1,
1508 "Setter must have exactly one parameter".to_string(),
1509 ));
1510 }
1511 parameters[0].clone()
1512 } else {
1513 return Err(CompilerError::parse_error(
1514 1,
1515 1,
1516 "Expected setter parameter".to_string(),
1517 ));
1518 };
1519
1520 let body = if self.current_token() == &Token::LeftBrace {
1521 self.parse_block_statement()?
1522 } else {
1523 return Err(CompilerError::parse_error(
1524 1,
1525 1,
1526 "Expected block statement for setter".to_string(),
1527 ));
1528 };
1529
1530 Ok(ClassMember::Setter(SetterDeclaration {
1531 name,
1532 parameter,
1533 body: Some(body),
1534 modifiers,
1535 }))
1536 }
1537 Token::Identifier(name) => {
1538 self.advance();
1539
1540 if self.current_token() == &Token::LeftParen {
1542 let parameters = self.parse_parameters()?;
1544 let return_type = if self.current_token() == &Token::Colon {
1545 self.advance();
1546 Some(self.parse_type()?)
1547 } else {
1548 None
1549 };
1550 let body = self.parse_block_statement()?;
1551
1552 Ok(ClassMember::Method(MethodDeclaration {
1553 name,
1554 optional: false,
1555 type_parameters: Vec::new(),
1556 parameters,
1557 return_type,
1558 body: Some(body),
1559 modifiers,
1560 }))
1561 } else if self.current_token() == &Token::Colon {
1562 self.advance();
1564 let type_annotation = self.parse_type()?;
1565
1566 let initializer = if self.current_token() == &Token::Assign {
1567 self.advance();
1568 Some(self.parse_expression()?)
1569 } else {
1570 None
1571 };
1572
1573 self.expect_token(&Token::Semicolon)?;
1574
1575 Ok(ClassMember::Property(PropertyDeclaration {
1576 name,
1577 optional: false,
1578 type_: Some(type_annotation),
1579 initializer,
1580 modifiers,
1581 }))
1582 } else {
1583 if name == "constructor" {
1585 let parameters = self.parse_parameters()?;
1586 let body = self.parse_block_statement()?;
1587
1588 Ok(ClassMember::Constructor(ConstructorDeclaration {
1589 parameters,
1590 body: Some(body),
1591 modifiers: Vec::new(),
1592 }))
1593 } else {
1594 Err(CompilerError::parse_error(
1595 1,
1596 1,
1597 "Unexpected class member".to_string(),
1598 ))
1599 }
1600 }
1601 }
1602 _ => Err(CompilerError::parse_error(
1603 1,
1604 1,
1605 "Expected class member".to_string(),
1606 )),
1607 }
1608 }
1609
1610 fn parse_interface_member(&mut self) -> Result<ObjectTypeMember> {
1611 let mut readonly = false;
1612
1613 if let Token::Keyword(crate::lexer::Keyword::Readonly) = self.current_token() {
1615 readonly = true;
1616 self.advance();
1617
1618 if let Token::Keyword(crate::lexer::Keyword::Readonly) = self.current_token() {
1620 let name = "readonly".to_string();
1622 self.advance(); if self.current_token() == &Token::Colon {
1625 self.advance();
1627 let type_annotation = self.parse_type()?;
1628 self.expect_token(&Token::Semicolon)?;
1629
1630 return Ok(ObjectTypeMember::Property(PropertySignature {
1631 name,
1632 optional: false,
1633 type_: Some(type_annotation),
1634 readonly,
1635 }));
1636 } else {
1637 return Err(CompilerError::parse_error(
1638 1, 1,
1639 "Expected colon after property name".to_string(),
1640 ));
1641 }
1642 }
1643 }
1644
1645 let token = self.current_token().clone();
1646
1647 match token {
1648 Token::LeftParen => {
1649 let parameters = self.parse_parameters()?;
1651 let return_type = if self.current_token() == &Token::Colon {
1652 self.advance();
1653 Some(self.parse_type()?)
1654 } else {
1655 None
1656 };
1657 self.expect_token(&Token::Semicolon)?;
1658
1659 Ok(ObjectTypeMember::Method(MethodSignature {
1660 name: "call".to_string(), optional: false,
1662 type_parameters: Vec::new(),
1663 parameters,
1664 return_type,
1665 }))
1666 }
1667 Token::Keyword(crate::lexer::Keyword::New) => {
1668 self.advance(); let parameters = self.parse_parameters()?;
1671 let return_type = if self.current_token() == &Token::Colon {
1672 self.advance();
1673 Some(self.parse_type()?)
1674 } else {
1675 None
1676 };
1677 self.expect_token(&Token::Semicolon)?;
1678
1679 Ok(ObjectTypeMember::Method(MethodSignature {
1680 name: "constructor".to_string(), optional: false,
1682 type_parameters: Vec::new(),
1683 parameters,
1684 return_type,
1685 }))
1686 }
1687 Token::Keyword(crate::lexer::Keyword::Readonly) => {
1688 let name = "readonly".to_string();
1690 self.advance();
1691
1692 if self.current_token() == &Token::Colon {
1693 self.advance();
1695 let type_annotation = self.parse_type()?;
1696 self.expect_token(&Token::Semicolon)?;
1697
1698 Ok(ObjectTypeMember::Property(PropertySignature {
1699 name,
1700 optional: false,
1701 type_: Some(type_annotation),
1702 readonly,
1703 }))
1704 } else {
1705 Err(CompilerError::parse_error(
1706 1, 1,
1707 "Expected colon after property name".to_string(),
1708 ))
1709 }
1710 }
1711 Token::Identifier(name) => {
1712 self.advance();
1713
1714 let optional = if self.current_token() == &Token::QuestionMark {
1716 self.advance();
1717 true
1718 } else {
1719 false
1720 };
1721
1722 if self.current_token() == &Token::LeftParen {
1723 let parameters = self.parse_parameters()?;
1725 let return_type = if self.current_token() == &Token::Colon {
1726 self.advance();
1727 Some(self.parse_type()?)
1728 } else {
1729 None
1730 };
1731 self.expect_token(&Token::Semicolon)?;
1732
1733 Ok(ObjectTypeMember::Method(MethodSignature {
1734 name,
1735 optional,
1736 type_parameters: Vec::new(),
1737 parameters,
1738 return_type,
1739 }))
1740 } else if self.current_token() == &Token::Colon {
1741 self.advance();
1743 let type_annotation = self.parse_type()?;
1744 self.expect_token(&Token::Semicolon)?;
1745
1746 Ok(ObjectTypeMember::Property(PropertySignature {
1747 name,
1748 optional,
1749 type_: Some(type_annotation),
1750 readonly,
1751 }))
1752 } else {
1753 Err(CompilerError::parse_error(
1754 1,
1755 1,
1756 "Expected method or property signature".to_string(),
1757 ))
1758 }
1759 }
1760 Token::LeftBracket => {
1761 self.advance(); let key_name = match self.current_token() {
1764 Token::Identifier(name) => {
1765 let name = name.clone();
1766 self.advance();
1767 name
1768 }
1769 Token::Keyword(crate::lexer::Keyword::Key) => {
1770 self.advance();
1771 "key".to_string()
1772 }
1773 _ => return Err(CompilerError::parse_error(
1774 1, 1,
1775 "Expected identifier or 'key' in index signature".to_string(),
1776 ))
1777 };
1778 self.expect_token(&Token::Colon)?;
1779 let key_type = self.parse_type()?;
1780 self.expect_token(&Token::RightBracket)?;
1781 self.expect_token(&Token::Colon)?;
1782 let value_type = self.parse_type()?;
1783 self.expect_token(&Token::Semicolon)?;
1784
1785 Ok(ObjectTypeMember::Index(IndexSignature {
1786 parameter: Box::new(Parameter {
1787 name: key_name,
1788 type_: Some(Box::new(key_type)),
1789 optional: false,
1790 initializer: None,
1791 rest: false,
1792 }),
1793 type_: value_type,
1794 readonly: false,
1795 }))
1796 }
1797 _ => Err(CompilerError::parse_error(
1798 1,
1799 1,
1800 "Expected interface member".to_string(),
1801 )),
1802 }
1803 }
1804
1805 fn parse_enum_member(&mut self) -> Result<EnumMember> {
1806 let name = self.expect_identifier()?;
1807
1808 let initializer = if self.current_token() == &Token::Assign {
1809 self.advance();
1810 Some(self.parse_expression()?)
1811 } else {
1812 None
1813 };
1814
1815 Ok(EnumMember { name, initializer })
1816 }
1817
1818 fn parse_if_statement(&mut self) -> Result<Statement> {
1819 self.expect_keyword()?; self.expect_token(&Token::LeftParen)?;
1822 let test = self.parse_expression()?;
1823 self.expect_token(&Token::RightParen)?;
1824
1825 let consequent = self.parse_statement()?.unwrap();
1826
1827 let alternate = if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Else) {
1828 self.advance();
1829 Some(self.parse_statement()?.unwrap())
1830 } else {
1831 None
1832 };
1833
1834 Ok(Statement::IfStatement(Box::new(IfStatement {
1835 condition: test,
1836 consequent: Box::new(consequent),
1837 alternate,
1838 })))
1839 }
1840
1841 fn parse_property_key(&mut self) -> Result<Expression> {
1842 self.parse_expression()
1844 }
1845
1846 fn parse_index_signature(&mut self) -> Result<IndexSignature> {
1848 self.expect_token(&Token::LeftBracket)?;
1849
1850 let key_name = match self.current_token() {
1851 Token::Identifier(name) => {
1852 let name = name.clone();
1853 self.advance();
1854 name
1855 }
1856 Token::Keyword(Keyword::Key) => {
1857 self.advance();
1858 "key".to_string()
1859 }
1860 _ => {
1861 return Err(CompilerError::parse_error(
1862 self.position,
1863 0,
1864 format!("Expected identifier or 'key', found {:?}", self.current_token()),
1865 ));
1866 }
1867 };
1868
1869 self.expect_token(&Token::Colon)?;
1870 let key_type = self.parse_type()?;
1871 self.expect_token(&Token::RightBracket)?;
1872 self.expect_token(&Token::Colon)?;
1873 let value_type = self.parse_type()?;
1874
1875 Ok(IndexSignature {
1876 parameter: Box::new(Parameter {
1877 name: key_name,
1878 type_: Some(Box::new(key_type)),
1879 optional: false,
1880 initializer: None,
1881 rest: false,
1882 }),
1883 type_: value_type,
1884 readonly: false,
1885 })
1886 }
1887
1888 fn parse_mapped_type(&mut self) -> Result<MappedType> {
1890 self.expect_token(&Token::LeftBracket)?;
1892
1893 let type_parameter_name = match self.current_token() {
1894 Token::Identifier(name) => {
1895 let name = name.clone();
1896 self.advance();
1897 name
1898 }
1899 Token::Keyword(Keyword::Key) => {
1900 self.advance();
1901 "Key".to_string()
1902 }
1903 _ => {
1904 return Err(CompilerError::parse_error(
1905 self.position,
1906 0,
1907 format!("Expected identifier or Key, found {:?}", self.current_token()),
1908 ));
1909 }
1910 };
1911 let type_parameter = TypeParameter {
1912 name: type_parameter_name.clone(),
1913 constraint: None,
1914 default: None,
1915 };
1916
1917 if self.current_token() == &Token::Keyword(Keyword::In) {
1919 self.advance();
1920 } else {
1921 return Err(CompilerError::parse_error(
1922 self.position,
1923 0,
1924 format!("Expected 'in', found {:?}", self.current_token()),
1925 ));
1926 }
1927
1928 let constraint_type = self.parse_type()?;
1929
1930 self.expect_token(&Token::RightBracket)?;
1931 self.expect_token(&Token::Colon)?;
1932
1933 let value_type = self.parse_type()?;
1934
1935 if self.current_token() == &Token::Semicolon {
1937 self.advance();
1938 }
1939
1940 Ok(MappedType {
1941 type_parameter: Box::new(type_parameter),
1942 constraint: Some(Box::new(constraint_type)),
1943 name_type: None,
1944 type_: Box::new(value_type),
1945 readonly: None,
1946 optional: None,
1947 })
1948 }
1949}