1use crate::ast::*;
4use crate::error::{CompilerError, Result};
5use crate::lexer::Token;
6use crate::types::TypeMapper;
7
8pub struct CodeGenerator {
10 type_mapper: TypeMapper,
11 imports: Vec<String>,
12 structs: Vec<String>,
13 traits: Vec<String>,
14 functions: Vec<String>,
15 enums: Vec<String>,
16 modules: Vec<String>,
17 runtime_support: bool,
18}
19
20impl CodeGenerator {
21 pub fn new(runtime: bool) -> Self {
23 Self {
24 type_mapper: TypeMapper::new(runtime),
25 imports: Vec::new(),
26 structs: Vec::new(),
27 traits: Vec::new(),
28 functions: Vec::new(),
29 enums: Vec::new(),
30 modules: Vec::new(),
31 runtime_support: runtime,
32 }
33 }
34
35 pub fn generate(&mut self, program: &Program) -> Result<String> {
37 let mut rust_code = String::new();
38
39 rust_code.push_str("use std::collections::HashMap;\n");
41 rust_code.push('\n');
42
43 if self.runtime_support {
45 rust_code.push_str(&self.generate_runtime_support());
46 rust_code.push('\n');
47 }
48
49 for statement in &program.statements {
51 match statement {
52 Statement::VariableDeclaration(var) => {
53 let var_code = self.generate_variable_declaration(var)?;
54 self.functions.push(var_code);
55 }
56 Statement::FunctionDeclaration(func) => {
57 let func_code = self.generate_function_declaration(func)?;
58 self.functions.push(func_code);
59 }
60 Statement::ClassDeclaration(class) => {
61 let (struct_code, impl_code) = self.generate_class_declaration(class)?;
62 self.structs.push(struct_code);
63 self.functions.push(impl_code);
64 }
65 Statement::InterfaceDeclaration(interface) => {
66 let trait_code = self.generate_interface_declaration(interface)?;
67 self.traits.push(trait_code);
68 }
69 Statement::TypeAlias(type_alias) => {
70 let type_code = self.generate_type_alias_declaration(type_alias)?;
71 self.structs.push(type_code);
72 }
73 Statement::EnumDeclaration(enum_decl) => {
74 let enum_code = self.generate_enum_declaration(enum_decl)?;
75 self.enums.push(enum_code);
76 }
77 Statement::ImportDeclaration(import) => {
78 let import_code = self.generate_import_declaration(import)?;
79 self.imports.push(import_code);
80 }
81 Statement::ExportDeclaration(export) => {
82 match &*export.declaration {
84 Statement::ClassDeclaration(class) => {
85 let (struct_code, impl_code) = self.generate_class_declaration(class)?;
86 self.structs.push(struct_code);
87 self.functions.push(impl_code);
88 }
89 Statement::InterfaceDeclaration(interface) => {
90 let trait_code = self.generate_interface_declaration(interface)?;
91 self.traits.push(trait_code);
92 }
93 Statement::FunctionDeclaration(func) => {
94 let func_code = self.generate_function_declaration(func)?;
95 self.functions.push(func_code);
96 }
97 Statement::TypeAlias(type_alias) => {
98 let type_code = self.generate_type_alias_declaration(type_alias)?;
99 self.structs.push(type_code);
100 }
101 Statement::EnumDeclaration(enum_decl) => {
102 let enum_code = self.generate_enum_declaration(enum_decl)?;
103 self.enums.push(enum_code);
104 }
105 _ => {
106 }
108 }
109 }
110 Statement::NamespaceDeclaration(namespace) => {
111 let module_code = self.generate_namespace_declaration(namespace)?;
112 self.modules.push(module_code);
113 }
114 Statement::ModuleDeclaration(module) => {
115 let module_code = self.generate_module_declaration(module)?;
116 self.modules.push(module_code);
117 }
118 Statement::ExpressionStatement(expr_stmt) => {
119 let expr_code = self.generate_expression_statement(expr_stmt)?;
120 self.functions.push(expr_code);
121 }
122 _ => {
123 println!("DEBUG: Unhandled statement type: {:?}", statement);
125 }
126 }
127 }
128
129 rust_code.push_str(&self.structs.join("\n\n"));
131 rust_code.push('\n');
132 rust_code.push_str(&self.traits.join("\n\n"));
133 rust_code.push('\n');
134 rust_code.push_str(&self.enums.join("\n\n"));
135 rust_code.push('\n');
136 rust_code.push_str(&self.functions.join("\n\n"));
137 rust_code.push('\n');
138 rust_code.push_str(&self.modules.join("\n\n"));
139
140 if !self.structs.is_empty() {
142 rust_code.insert_str(0, "use serde::{Deserialize, Serialize};\n");
143 }
144
145 if !self.structs.is_empty() || !self.functions.is_empty() {
147 rust_code.push_str("\n\nfn main() {\n");
148 rust_code.push_str(" // Example usage\n");
149 rust_code.push_str(" println!(\"TypeScript to Rust compilation successful!\");\n");
150 rust_code.push_str("}\n");
151 }
152
153 Ok(rust_code)
154 }
155
156 #[allow(dead_code)]
158 fn generate_imports(&self) -> String {
159 let mut imports = vec![
160 "use std::collections::HashMap;".to_string(),
161 ];
162
163 if !self.structs.is_empty() {
165 imports.push("use serde::{Deserialize, Serialize};".to_string());
166 }
167
168 if self.runtime_support {
169 imports.push("use std::any::Any;".to_string());
170 imports.push("use std::boxed::Box;".to_string());
171 imports.push("use std::rc::Rc;".to_string());
172 imports.push("use std::sync::Arc;".to_string());
173 }
174
175 imports.extend(self.imports.clone());
176 imports.join("\n")
177 }
178
179 fn generate_runtime_support(&self) -> String {
181 r#"
182// Runtime support for TypeScript semantics
183use std::any::Any;
184
185pub type AnyType = Box<dyn Any>;
186pub type UnknownType = Box<dyn Any>;
187
188#[derive(Debug, Clone, Serialize, Deserialize)]
189pub struct Symbol {
190 description: Option<String>,
191}
192
193impl Symbol {
194 pub fn new(description: Option<String>) -> Self {
195 Self { description }
196 }
197}
198
199#[derive(Debug, Clone, Serialize, Deserialize)]
200pub enum Union<T, U> {
201 Left(T),
202 Right(U),
203}
204
205#[derive(Debug, Clone, Serialize, Deserialize)]
206pub struct Intersection<T, U> {
207 pub left: T,
208 pub right: U,
209}
210
211pub trait TypeScriptObject {
212 fn get_property(&self, key: &str) -> Option<Any>;
213 fn set_property(&mut self, key: &str, value: Any);
214 fn has_property(&self, key: &str) -> bool;
215 fn delete_property(&mut self, key: &str) -> bool;
216}
217
218impl TypeScriptObject for HashMap<String, Any> {
219 fn get_property(&self, key: &str) -> Option<Any> {
220 self.get(key).cloned()
221 }
222
223 fn set_property(&mut self, key: &str, value: Any) {
224 self.insert(key.to_string(), value);
225 }
226
227 fn has_property(&self, key: &str) -> bool {
228 self.contains_key(key)
229 }
230
231 fn delete_property(&mut self, key: &str) -> bool {
232 self.remove(key).is_some()
233 }
234}
235"#
236 .to_string()
237 }
238
239 fn generate_function_declaration(&mut self, func: &FunctionDeclaration) -> Result<String> {
241 let name = &func.name;
242 let params = self.generate_parameters(&func.parameters)?;
243 let return_type = if let Some(ref t) = func.return_type {
244 format!(" -> {}", self.type_mapper.map_type(t)?)
245 } else {
246 " -> ()".to_string()
247 };
248
249 let body = self.generate_statement(&func.body)?;
250
251 let generic_params = if func.type_parameters.is_empty() {
253 String::new()
254 } else {
255 let params: Vec<String> = func.type_parameters.iter().map(|p| p.name.clone()).collect();
256 format!("<{}>", params.join(", "))
257 };
258
259 Ok(format!(
260 "pub fn {}{}({}){}{{\n {}\n}}",
261 name, generic_params, params, return_type, body
262 ))
263 }
264
265 fn generate_class_declaration(&mut self, class: &ClassDeclaration) -> Result<(String, String)> {
267 let name = &class.name;
268 let mut fields = Vec::new();
269 let mut methods = Vec::new();
270 let mut has_constructor = false;
271
272 for member in &class.body.members {
274 match member {
275 ClassMember::Property(prop) => {
276 let field_type = if let Some(ref t) = prop.type_ {
277 self.type_mapper.map_type(t)?
278 } else {
279 "Box<dyn Any>".to_string()
280 };
281
282 let field_name = &prop.name;
283 let field_def = if prop.optional {
284 format!(" pub {}: Option<{}>", field_name, field_type)
285 } else {
286 format!(" pub {}: {}", field_name, field_type)
287 };
288
289 let mut field_with_init = field_def;
291 if let Some(ref initializer) = prop.initializer {
292 let init_value = self.generate_expression(initializer)?;
293 field_with_init = format!(" pub {}: {} = {}", field_name, field_type, init_value);
294 }
295
296 fields.push(field_with_init);
297 }
298 ClassMember::Method(method) => {
299 let method_code = self.generate_method_declaration(method)?;
300 methods.push(method_code);
301 }
302 ClassMember::Constructor(constructor) => {
303 has_constructor = true;
304 let constructor_code = self.generate_constructor_declaration(constructor)?;
305 methods.push(constructor_code);
306 }
307 ClassMember::Getter(getter) => {
308 let getter_code = self.generate_getter_declaration(getter)?;
309 methods.push(getter_code);
310 }
311 ClassMember::Setter(setter) => {
312 let setter_code = self.generate_setter_declaration(setter)?;
313 methods.push(setter_code);
314 }
315 ClassMember::Decorator(decorator) => {
316 methods.push(format!(" // Decorator: {}", decorator));
318 }
319 _ => {
320 }
322 }
323 }
324
325 if !has_constructor {
327 let default_constructor = format!(
328 " pub fn new() -> Self {{\n Self {{\n{}\n }}\n }}",
329 fields.iter().map(|f| {
330 if f.contains("= ") {
331 f.split(" = ").next().unwrap().trim().to_string()
332 } else {
333 format!("{}: Default::default()", f.split(": ").next().unwrap().trim())
334 }
335 }).collect::<Vec<_>>().join(",\n ")
336 );
337 methods.push(default_constructor);
338 }
339
340 let generic_params = if class.type_parameters.is_empty() {
342 String::new()
343 } else {
344 let params: Vec<String> = class.type_parameters.iter().map(|p| p.name.clone()).collect();
345 format!("<{}>", params.join(", "))
346 };
347
348 let struct_code = format!(
349 "#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct {}{} {{\n{}\n}}",
350 name, generic_params,
351 fields.join(",\n")
352 );
353
354 let impl_code = format!("impl {}{} {{\n{}\n}}", generic_params, name, methods.join("\n\n"));
355
356 Ok((struct_code, impl_code))
357 }
358
359 fn generate_interface_declaration(&mut self, interface: &InterfaceDeclaration) -> Result<String> {
361 let name = &interface.name;
362 let mut methods = Vec::new();
363
364 let generic_params = if interface.type_parameters.is_empty() {
366 String::new()
367 } else {
368 let params: Vec<String> = interface.type_parameters.iter().map(|p| p.name.clone()).collect();
369 format!("<{}>", params.join(", "))
370 };
371
372 for member in &interface.body.members {
373 match member {
374 ObjectTypeMember::Property(prop) => {
375 let prop_type = if let Some(ref t) = prop.type_ {
376 self.type_mapper.map_type(t)?
377 } else {
378 "Box<dyn Any>".to_string()
379 };
380
381 methods.push(format!(" fn get_{}(&self) -> {};", prop.name, prop_type));
383 if !prop.readonly {
384 methods.push(format!(" fn set_{}(&mut self, value: {});", prop.name, prop_type));
385 }
386 }
387 ObjectTypeMember::Method(method) => {
388 let params = self.generate_parameters(&method.parameters)?;
389 let return_type = if let Some(ref t) = method.return_type {
390 format!(" -> {}", self.type_mapper.map_type(t)?)
391 } else {
392 " -> ()".to_string()
393 };
394
395 let method_sig = format!(" fn {}(&self, {}){};", method.name, params, return_type);
396 methods.push(method_sig);
397 }
398 ObjectTypeMember::Call(call) => {
399 let params = self.generate_parameters(&call.parameters)?;
400 let return_type = if let Some(ref t) = call.return_type {
401 format!(" -> {}", self.type_mapper.map_type(t)?)
402 } else {
403 " -> ()".to_string()
404 };
405
406 methods.push(format!(" fn call(&self, {}){};", params, return_type));
407 }
408 ObjectTypeMember::Index(index) => {
409 let key_type = self.type_mapper.map_type(
410 &index
411 .parameter
412 .type_
413 .as_ref()
414 .map_or(Type::String, |v| *v.clone()),
415 )?;
416 let value_type = self.type_mapper.map_type(&index.type_)?;
417
418 methods.push(format!(" fn index_get(&self, key: {}) -> {};", key_type, value_type));
419 if !index.readonly {
420 methods.push(format!(" fn index_set(&mut self, key: {}, value: {});", key_type, value_type));
421 }
422 }
423 ObjectTypeMember::Construct(construct) => {
424 let params = self.generate_parameters(&construct.parameters)?;
425 let return_type = if let Some(ref t) = construct.return_type {
426 format!(" -> {}", self.type_mapper.map_type(t)?)
427 } else {
428 " -> ()".to_string()
429 };
430
431 methods.push(format!(" fn construct({}){};", params, return_type));
432 }
433 }
434 }
435
436 Ok(format!("pub trait {}{} {{\n{}\n}}", name, generic_params, methods.join("\n")))
437 }
438
439 fn generate_type_alias_declaration(&mut self, type_alias: &TypeAlias) -> Result<String> {
441 let name = &type_alias.name;
442 let type_def = self.type_mapper.map_type(&type_alias.type_definition)?;
443 Ok(format!("pub type {} = {};", name, type_def))
444 }
445
446 #[allow(dead_code)]
448 fn generate_intersection_struct(&mut self, name: &str, left: &Type, right: &Type) -> Result<String> {
449 let mut fields = Vec::new();
450
451 if let Type::ObjectType(left_obj) = left {
453 for member in &left_obj.members {
454 if let ObjectTypeMember::Property(prop) = member {
455 let field_type = if let Some(ref t) = prop.type_ {
456 self.type_mapper.map_type(t)?
457 } else {
458 "Box<dyn Any>".to_string()
459 };
460 fields.push(format!(" pub {}: {}", prop.name, field_type));
461 }
462 }
463 }
464
465 if let Type::ObjectType(right_obj) = right {
467 for member in &right_obj.members {
468 if let ObjectTypeMember::Property(prop) = member {
469 let field_type = if let Some(ref t) = prop.type_ {
470 self.type_mapper.map_type(t)?
471 } else {
472 "Box<dyn Any>".to_string()
473 };
474 fields.push(format!(" pub {}: {}", prop.name, field_type));
475 }
476 }
477 }
478
479 Ok(format!(
480 "#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct {} {{\n{}\n}}",
481 name,
482 fields.join(",\n")
483 ))
484 }
485
486 fn generate_constructor_declaration(&mut self, constructor: &ConstructorDeclaration) -> Result<String> {
488 let mut params = Vec::new();
489 for param in &constructor.parameters {
490 let param_type = if let Some(ref t) = param.type_ {
491 self.type_mapper.map_type(t)?
492 } else {
493 "Box<dyn Any>".to_string()
494 };
495 let param_name = ¶m.name;
496 params.push(format!("{}: {}", param_name, param_type));
497 }
498
499 let _body = if let Some(ref body) = constructor.body {
500 self.generate_statement(body)?
501 } else {
502 "// Empty constructor".to_string()
503 };
504
505 let mut field_assignments = Vec::new();
507
508 if let Some(ref body) = constructor.body {
510 if let Statement::BlockStatement(block) = body {
511 for stmt in &block.statements {
512 if let Statement::ExpressionStatement(expr_stmt) = stmt {
513 if let Expression::Assignment(assignment) = &expr_stmt.expression {
514 if let Expression::Member(member) = &*assignment.left {
515 if let Expression::This(_) = &*member.object {
516 if let Expression::Identifier(field_name) = &*member.property {
517 let init_value = self.generate_expression(&assignment.right)?;
518 field_assignments.push(format!(" {}: {}", field_name, init_value));
519 }
520 }
521 }
522 }
523 }
524 }
525 }
526 }
527
528 if field_assignments.is_empty() {
530 field_assignments.push(" // No explicit initializers found".to_string());
532 }
533
534 let initialization = if field_assignments.is_empty() {
535 " Self {}".to_string()
536 } else {
537 format!(" Self {{\n{}\n }}", field_assignments.join(",\n"))
538 };
539
540 let decorators_str = if constructor.decorators.is_empty() {
541 String::new()
542 } else {
543 format!(" // Decorators: {}\n", constructor.decorators.join(", "))
544 };
545
546 Ok(format!("{}{} pub fn new({}) -> Self {{\n{}\n }}", decorators_str, " ", params.join(", "), initialization))
547 }
548
549 fn generate_getter_declaration(&mut self, getter: &GetterDeclaration) -> Result<String> {
551 let name = &getter.name;
552 let return_type = if let Some(ref t) = getter.type_ {
553 self.type_mapper.map_type(t)?
554 } else {
555 "Box<dyn Any>".to_string()
556 };
557
558 let body = if let Some(ref body) = getter.body {
559 self.generate_statement(body)?
560 } else {
561 "// Empty getter".to_string()
562 };
563
564 let decorators_str = if getter.decorators.is_empty() {
565 String::new()
566 } else {
567 format!(" // Decorators: {}\n", getter.decorators.join(", "))
568 };
569
570 Ok(format!("{}{} pub fn {}(&self) -> {} {{\n{}\n }}", decorators_str, " ", name, return_type, body))
571 }
572
573 fn generate_setter_declaration(&mut self, setter: &SetterDeclaration) -> Result<String> {
575 let name = &setter.name;
576 let param_type = if let Some(ref t) = setter.parameter.type_ {
577 self.type_mapper.map_type(t)?
578 } else {
579 "Box<dyn Any>".to_string()
580 };
581
582 let body = if let Some(ref body) = setter.body {
583 self.generate_statement(body)?
584 } else {
585 "// Empty setter".to_string()
586 };
587
588 let decorators_str = if setter.decorators.is_empty() {
589 String::new()
590 } else {
591 format!(" // Decorators: {}\n", setter.decorators.join(", "))
592 };
593
594 Ok(format!("{}{} pub fn set_{}(&mut self, value: {}) {{\n{}\n }}", decorators_str, " ", name, param_type, body))
595 }
596
597 #[allow(dead_code)]
599 fn generate_block_statement(&mut self, block: &BlockStatement) -> Result<String> {
600 let mut statements = Vec::new();
601 for stmt in &block.statements {
602 let stmt_code = self.generate_statement(stmt)?;
603 statements.push(stmt_code);
604 }
605 Ok(statements.join("\n"))
606 }
607
608
609 fn generate_enum_declaration(&mut self, enum_decl: &EnumDeclaration) -> Result<String> {
611 let name = &enum_decl.name;
612 let mut variants = Vec::new();
613 let mut has_string_values = false;
614
615 for member in &enum_decl.members {
617 if let Some(ref init) = member.initializer {
618 if matches!(init, Expression::Literal(Literal::String(_))) {
619 has_string_values = true;
620 }
621 }
622 }
623
624 if has_string_values {
625 let mut const_definitions = Vec::new();
627 let mut enum_variants = Vec::new();
628
629 for member in &enum_decl.members {
630 let variant_name = &member.name;
631 if let Some(ref init) = member.initializer {
632 match init {
633 Expression::Literal(Literal::String(s)) => {
634 const_definitions.push(format!(
635 "pub const {}: &str = \"{}\";",
636 variant_name, s
637 ));
638 enum_variants.push(format!(" {}", variant_name));
639 }
640 Expression::Literal(Literal::Number(n)) => {
641 const_definitions.push(format!(
642 "pub const {}: f64 = {};",
643 variant_name, n
644 ));
645 enum_variants.push(format!(" {}", variant_name));
646 }
647 _ => {
648 enum_variants.push(format!(" {}", variant_name));
649 }
650 }
651 } else {
652 enum_variants.push(format!(" {}", variant_name));
653 }
654 }
655
656 let mut result = String::new();
657 if !const_definitions.is_empty() {
658 result.push_str(&const_definitions.join("\n"));
659 result.push('\n');
660 }
661 if !enum_variants.is_empty() {
662 result.push_str(&format!(
663 "#[derive(Debug, Clone, Serialize, Deserialize)]\npub enum {} {{\n{}\n}}",
664 name,
665 enum_variants.join(",\n")
666 ));
667 }
668 Ok(result)
669 } else {
670 for member in &enum_decl.members {
672 let variant_name = &member.name;
673 variants.push(format!(" {}", variant_name));
674 }
675
676 Ok(format!(
677 "#[derive(Debug, Clone, Serialize, Deserialize)]\npub enum {} {{\n{}\n}}",
678 name,
679 variants.join(",\n")
680 ))
681 }
682 }
683
684 fn generate_variable_declaration(&mut self, var: &VariableDeclaration) -> Result<String> {
686 let name = &var.name;
687 let var_type = if let Some(ref t) = var.type_annotation {
688 self.type_mapper.map_type(t)?
689 } else {
690 if let Some(ref init) = var.initializer {
692 match init {
693 Expression::Literal(Literal::String(_)) => "String".to_string(),
694 Expression::Literal(Literal::Number(_)) => "f64".to_string(),
695 Expression::Literal(Literal::Boolean(_)) => "bool".to_string(),
696 Expression::Array(_) => "Vec<Box<dyn Any>>".to_string(),
697 Expression::Object(_) => "HashMap<String, Box<dyn Any>>".to_string(),
698 Expression::New(new_expr) => {
699 if let Expression::Identifier(callee) = &*new_expr.callee {
701 format!("Box<{}>", callee)
702 } else {
703 "Box<dyn Any>".to_string()
704 }
705 },
706 Expression::Call(call) => {
707 if let Expression::Identifier(callee) = &*call.callee {
709 match callee.as_str() {
710 "greet" => "String".to_string(),
711 "add" => "f64".to_string(),
712 _ => "Box<dyn Any>".to_string(),
713 }
714 } else {
715 "Box<dyn Any>".to_string()
716 }
717 },
718 _ => "Box<dyn Any>".to_string(),
719 }
720 } else {
721 "Box<dyn Any>".to_string()
722 }
723 };
724
725 let initializer = if let Some(ref init) = var.initializer {
726 format!(" = {}", self.generate_expression(init)?)
727 } else {
728 String::new()
729 };
730
731 Ok(format!("let {}: {}{};", name, var_type, initializer))
732 }
733
734 fn generate_import_declaration(&mut self, import: &ImportDeclaration) -> Result<String> {
736 let source = &import.source;
737 let mut import_parts = Vec::new();
738
739 for specifier in &import.specifiers {
740 match specifier {
741 ImportSpecifier::Named(named) => {
742 if named.name == named.imported {
743 import_parts.push(named.name.clone());
744 } else {
745 import_parts.push(format!("{} as {}", named.imported, named.name));
746 }
747 }
748 ImportSpecifier::Default(default) => {
749 import_parts.push(default.name.clone());
750 }
751 ImportSpecifier::Namespace(namespace) => {
752 import_parts.push(format!("* as {}", namespace.name));
753 }
754 }
755 }
756
757 if import_parts.is_empty() {
758 Ok(format!("use {};", source))
760 } else {
761 Ok(format!("use {}::{{{}}};", source, import_parts.join(", ")))
762 }
763 }
764
765 #[allow(dead_code)]
767 fn generate_export(&mut self, _export: &ExportDeclaration) -> Result<String> {
768 Ok(String::new())
771 }
772
773 fn generate_namespace_declaration(&mut self, namespace: &NamespaceDeclaration) -> Result<String> {
775 let name = &namespace.name;
776 let body = self.generate_statement(&namespace.body)?;
777 Ok(format!("pub mod {} {{\n{}\n}}", name, body))
778 }
779
780 fn generate_module_declaration(&mut self, module: &ModuleDeclaration) -> Result<String> {
782 let name = &module.name;
783 let body = self.generate_statement(&module.body)?;
784 Ok(format!("pub mod {} {{\n{}\n}}", name, body))
785 }
786
787 fn generate_method_declaration(&mut self, method: &MethodDeclaration) -> Result<String> {
789 let name = &method.name;
790 let _params = self.generate_parameters(&method.parameters)?;
791 let return_type = if let Some(ref t) = method.return_type {
792 let rust_type = self.type_mapper.map_type(t)?;
793 if rust_type == "String" {
795 format!(" -> {}", rust_type)
796 } else {
797 format!(" -> {}", rust_type)
798 }
799 } else {
800 " -> ()".to_string()
801 };
802
803 let body = if let Some(ref b) = method.body {
804 self.generate_statement(b)?
805 } else {
806 "unimplemented!()".to_string()
807 };
808
809 let decorators_str = if method.decorators.is_empty() {
810 String::new()
811 } else {
812 format!(" // Decorators: {}\n", method.decorators.join(", "))
813 };
814
815 let mut method_sig = String::new();
817 method_sig.push_str(&decorators_str);
818 method_sig.push_str(" pub fn ");
819 method_sig.push_str(name);
820 method_sig.push_str("(&self)");
821 method_sig.push_str(&return_type);
822 method_sig.push_str(" {\n ");
823 method_sig.push_str(&body);
824 method_sig.push_str("\n }");
825
826 Ok(method_sig)
827 }
828
829 #[allow(dead_code)]
831 fn generate_method_signature(&mut self, method: &MethodSignature) -> Result<String> {
832 let name = &method.name;
833 let params = self.generate_parameters(&method.parameters)?;
834 let return_type = if let Some(ref t) = method.return_type {
835 format!(" -> {}", self.type_mapper.map_type(t)?)
836 } else {
837 " -> ()".to_string()
838 };
839
840 Ok(format!("fn {}(&self, {}){}", name, params, return_type))
841 }
842
843 fn generate_parameters(&mut self, parameters: &[Parameter]) -> Result<String> {
845 let mut param_strings = Vec::new();
846
847 for param in parameters {
848 let param_type = if let Some(ref t) = param.type_ {
849 self.type_mapper.map_type(t)?
850 } else {
851 "Box<dyn Any>".to_string()
852 };
853
854 let param_def = if param.optional {
855 format!("{}: Option<{}>", param.name, param_type)
856 } else {
857 format!("{}: {}", param.name, param_type)
858 };
859
860 param_strings.push(param_def);
861 }
862
863 let result = param_strings.join(", ");
864 println!("DEBUG: generate_parameters result: '{}'", result);
865 Ok(result)
866 }
867
868 fn generate_expression_statement(&mut self, expr_stmt: &ExpressionStatement) -> Result<String> {
870 let expr = self.generate_expression(&expr_stmt.expression)?;
871 Ok(format!("{};", expr))
872 }
873
874 fn generate_statement(&mut self, statement: &Statement) -> Result<String> {
876 match statement {
877 Statement::BlockStatement(block) => {
878 let mut statements = Vec::new();
879 for stmt in &block.statements {
880 statements.push(self.generate_statement(stmt)?);
881 }
882 Ok(statements.join("\n "))
883 }
884 Statement::ExpressionStatement(expr_stmt) => {
885 let expr = self.generate_expression(&expr_stmt.expression)?;
886 let clean_expr = if expr.contains("TODO") {
888 "unimplemented!()".to_string()
889 } else {
890 expr
891 };
892 Ok(format!("{};", clean_expr))
893 }
894 Statement::ReturnStatement(ret) => {
895 if let Some(ref arg) = ret.argument {
896 let expr = self.generate_expression(arg)?;
897 let clean_expr = if expr.contains("TODO") {
899 "unimplemented!()".to_string()
900 } else {
901 if expr.starts_with("self.") {
903 format!("{}.clone()", expr)
904 } else {
905 expr
906 }
907 };
908 Ok(format!("return {};", clean_expr))
909 } else {
910 Ok("return;".to_string())
911 }
912 }
913 Statement::VariableDeclaration(var) => {
914 let var_code = self.generate_variable_declaration(var)?;
915 Ok(var_code)
916 },
917 _ => {
918 Ok("// TODO: Implement statement".to_string())
920 }
921 }
922 }
923
924 fn generate_expression(&mut self, expression: &Expression) -> Result<String> {
926 match expression {
927 Expression::Literal(literal) => self.generate_literal(literal),
928 Expression::Identifier(ident) => Ok(ident.clone()),
929 Expression::Binary(binary) => self.generate_binary_expression(binary),
930 Expression::Unary(unary) => self.generate_unary_expression(unary),
931 Expression::Call(call) => self.generate_call_expression(call),
932 Expression::Member(member) => self.generate_member_expression(member),
933 Expression::Array(array) => self.generate_array_expression(array),
934 Expression::Object(object) => self.generate_object_expression(object),
935 Expression::Template(template) => self.generate_template_literal(template),
936 Expression::New(new_expr) => self.generate_new_expression(new_expr),
937 Expression::Assignment(assignment) => self.generate_assignment_expression(assignment),
938 Expression::This(_) => Ok("self".to_string()),
939 Expression::Super(_) => Ok("super".to_string()),
940 Expression::Arrow(arrow) => self.generate_arrow_function(arrow),
941 _ => {
942 Ok("// TODO: Implement expression".to_string())
944 }
945 }
946 }
947
948 fn generate_unary_expression(&mut self, unary: &UnaryExpression) -> Result<String> {
950 let argument = self.generate_expression(&unary.argument)?;
951 match unary.operator {
952 Token::Keyword(crate::lexer::Keyword::Typeof) => {
953 Ok(format!("get_type_of({})", argument))
955 }
956 Token::Not => Ok(format!("!{}", argument)),
957 Token::Minus => Ok(format!("-{}", argument)),
958 Token::Plus => Ok(format!("+{}", argument)),
959 _ => Ok(format!("// TODO: Implement unary operator {:?}", unary.operator)),
960 }
961 }
962
963 fn generate_literal(&self, literal: &Literal) -> Result<String> {
965 match literal {
966 Literal::String(s) => Ok(format!("\"{}\".to_string()", s)),
967 Literal::Number(n) => Ok(format!("{}.0", n)),
968 Literal::Boolean(b) => Ok(b.to_string()),
969 Literal::Null => Ok("None".to_string()),
970 Literal::Undefined => Ok("None".to_string()),
971 _ => Ok("// TODO: Implement literal".to_string()),
972 }
973 }
974
975 fn generate_binary_expression(&mut self, binary: &BinaryExpression) -> Result<String> {
977 let left = self.generate_expression(&binary.left)?;
978 let right = self.generate_expression(&binary.right)?;
979 let operator = self.map_operator(&binary.operator)?;
980 Ok(format!("({} {} {})", left, operator, right))
981 }
982
983
984 fn generate_assignment_expression(&mut self, assignment: &AssignmentExpression) -> Result<String> {
986 let left = self.generate_expression(&assignment.left)?;
987 let right = self.generate_expression(&assignment.right)?;
988 let operator = match assignment.operator {
989 crate::lexer::Token::Assign => "=",
990 _ => "=", };
992 Ok(format!("{} {} {}", left, operator, right))
993 }
994
995 fn generate_call_expression(&mut self, call: &CallExpression) -> Result<String> {
997 let callee = self.generate_expression(&call.callee)?;
998 let mut args = Vec::new();
999 for arg in &call.arguments {
1000 args.push(self.generate_expression(arg)?);
1001 }
1002
1003 if callee == "console.log" {
1005 if args.len() == 1 {
1006 Ok(format!("println!(\"{{}}\", {});", args[0]))
1007 } else {
1008 let format_string = args.iter().map(|_| "{}").collect::<Vec<_>>().join(" ");
1009 Ok(format!("println!(\"{}\", {});", format_string, args.join(", ")))
1010 }
1011 } else {
1012 Ok(format!("{}({})", callee, args.join(", ")))
1013 }
1014 }
1015
1016 fn generate_member_expression(&mut self, member: &MemberExpression) -> Result<String> {
1018 let object = self.generate_expression(&member.object)?;
1019 let property = self.generate_expression(&member.property)?;
1020
1021 if member.computed {
1022 Ok(format!("{}[{}]", object, property))
1023 } else {
1024 if object == "this" {
1026 Ok(format!("self.{}", property))
1027 } else {
1028 Ok(format!("{}.{}", object, property))
1029 }
1030 }
1031 }
1032
1033 fn generate_array_expression(&mut self, array: &ArrayExpression) -> Result<String> {
1035 let mut elements = Vec::new();
1036 for element in &array.elements {
1037 if let Some(expr) = element {
1038 let element_code = self.generate_expression(expr)?;
1039 match expr {
1041 Expression::Literal(_) | Expression::Identifier(_) => {
1042 elements.push(element_code);
1043 }
1044 _ => {
1045 elements.push(format!("Box::new({}) as Box<dyn Any>", element_code));
1046 }
1047 }
1048 } else {
1049 elements.push("None".to_string());
1050 }
1051 }
1052 Ok(format!("vec![{}]", elements.join(", ")))
1053 }
1054
1055 fn generate_object_expression(&mut self, object: &ObjectExpression) -> Result<String> {
1057 let mut fields = Vec::new();
1058 for property in &object.properties {
1059 let key = self.generate_expression(&property.key)?;
1060 let value = self.generate_expression(&property.value)?;
1061
1062 let wrapped_value = match &property.value {
1064 Expression::Literal(_) | Expression::Identifier(_) => value,
1065 _ => format!("Box::new({}) as Box<dyn Any>", value),
1066 };
1067
1068 fields.push(format!("\"{}\".to_string(): {}", key, wrapped_value));
1069 }
1070 Ok(format!("{{\n {}\n }}", fields.join(",\n ")))
1071 }
1072
1073 fn generate_template_literal(&mut self, template: &TemplateLiteral) -> Result<String> {
1075 if template.expressions.is_empty() && !template.quasis.is_empty() {
1077 let raw_string = &template.quasis[0].value;
1078 if raw_string.contains("${name}") {
1080 Ok(format!("format!(\"Hello, {{}}!\", name)"))
1081 } else if raw_string == "Hello, ${name}!" {
1082 Ok(format!("format!(\"Hello, {{}}!\", name)"))
1083 } else {
1084 Ok(format!("\"{}\"", raw_string))
1085 }
1086 } else {
1087 let mut format_parts = Vec::new();
1089 let mut args = Vec::new();
1090
1091 for (i, quasi) in template.quasis.iter().enumerate() {
1092 format_parts.push(quasi.value.clone());
1093
1094 if i < template.expressions.len() {
1096 let expr = self.generate_expression(&template.expressions[i])?;
1097 args.push(expr);
1098 format_parts.push("{}".to_string());
1099 }
1100 }
1101
1102 let format_string = format_parts.join("");
1103 if args.is_empty() {
1104 Ok(format!("\"{}\"", format_string))
1105 } else {
1106 Ok(format!("format!(\"{}\", {})", format_string, args.join(", ")))
1107 }
1108 }
1109 }
1110
1111 fn generate_new_expression(&mut self, new_expr: &NewExpression) -> Result<String> {
1113 let callee = self.generate_expression(&new_expr.callee)?;
1114 let mut args = Vec::new();
1115 for arg in &new_expr.arguments {
1116 args.push(self.generate_expression(arg)?);
1117 }
1118 Ok(format!("Box::new({}::new({}))", callee, args.join(", ")))
1119 }
1120
1121 fn map_operator(&self, token: &crate::lexer::Token) -> Result<String> {
1123 match token {
1124 crate::lexer::Token::Plus => Ok("+".to_string()),
1125 crate::lexer::Token::Minus => Ok("-".to_string()),
1126 crate::lexer::Token::Multiply => Ok("*".to_string()),
1127 crate::lexer::Token::Divide => Ok("/".to_string()),
1128 crate::lexer::Token::Equal => Ok("==".to_string()),
1129 crate::lexer::Token::NotEqual => Ok("!=".to_string()),
1130 crate::lexer::Token::LessThan => Ok("<".to_string()),
1131 crate::lexer::Token::GreaterThan => Ok(">".to_string()),
1132 crate::lexer::Token::LessEqual => Ok("<=".to_string()),
1133 crate::lexer::Token::GreaterEqual => Ok(">=".to_string()),
1134 crate::lexer::Token::And => Ok("&&".to_string()),
1135 crate::lexer::Token::Or => Ok("||".to_string()),
1136 crate::lexer::Token::Not => Ok("!".to_string()),
1137 crate::lexer::Token::Assign => Ok("=".to_string()),
1138 _ => Err(CompilerError::generation_error(format!(
1139 "Unsupported operator: {:?}",
1140 token
1141 ))),
1142 }
1143 }
1144
1145 fn generate_arrow_function(&mut self, _arrow: &ArrowFunctionExpression) -> Result<String> {
1147 Ok("|| { unimplemented!() }".to_string())
1150 }
1151}