TypeScript_Rust_Compiler/
generator.rs

1//! Rust code generator for TypeScript AST
2
3use crate::ast::*;
4use crate::error::{CompilerError, Result};
5use crate::lexer::Token;
6use crate::types::TypeMapper;
7
8/// Rust code generator
9pub 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    /// Create a new code generator
22    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    /// Generate Rust code from TypeScript program
36    pub fn generate(&mut self, program: &Program) -> Result<String> {
37        let mut rust_code = String::new();
38
39        // Generate imports (will be updated after processing statements)
40        rust_code.push_str("use std::collections::HashMap;\n");
41        rust_code.push('\n');
42
43        // Generate runtime support if needed
44        if self.runtime_support {
45            rust_code.push_str(&self.generate_runtime_support());
46            rust_code.push('\n');
47        }
48
49        // Process all statements
50        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                    // Exports are handled by making items public
83                    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                            // Handle other export types
107                        }
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                    // Handle other statement types - log what we found
124                    println!("DEBUG: Unhandled statement type: {:?}", statement);
125                }
126            }
127        }
128
129        // Combine all generated code in proper order
130        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        // Add serde import if we have structs
141        if !self.structs.is_empty() {
142            rust_code.insert_str(0, "use serde::{Deserialize, Serialize};\n");
143        }
144
145        // Add main function if we have classes or functions
146        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    /// Generate imports
157    #[allow(dead_code)]
158    fn generate_imports(&self) -> String {
159        let mut imports = vec![
160            "use std::collections::HashMap;".to_string(),
161        ];
162        
163        // Only add serde if we have structs that need it
164        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    /// Generate runtime support code
180    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    /// Generate function declaration
240    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        // Handle generic parameters
252        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    /// Generate class declaration
266    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        // Process class body
273        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                    // Add initialization if there's an initializer
290                    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                    // For now, just add a comment about the decorator
317                    methods.push(format!("    // Decorator: {}", decorator));
318                }
319                _ => {
320                    // Handle other member types
321                }
322            }
323        }
324
325        // Add default constructor if none exists
326        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        // Handle generic parameters for class
341        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    /// Generate interface declaration as trait
360    fn generate_interface_declaration(&mut self, interface: &InterfaceDeclaration) -> Result<String> {
361        let name = &interface.name;
362        let mut methods = Vec::new();
363
364        // Handle generic parameters
365        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                    // Add getter and setter methods
382                    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    /// Generate type alias declaration
440    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    /// Generate intersection struct for object types
447    #[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        // Extract fields from left object type
452        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        // Extract fields from right object type
466        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    /// Generate constructor declaration
487    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 = &param.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        // Generate struct initialization based on constructor body
506        let mut field_assignments = Vec::new();
507        
508        // Check if constructor has assignment statements
509        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 no assignments found, use property initializers
529        if field_assignments.is_empty() {
530            // This will be handled by the default constructor generation
531            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    /// Generate getter declaration
550    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    /// Generate setter declaration
574    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    /// Generate block statement
598    #[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    /// Generate enum declaration
610    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        // Check if enum has string values
616        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            // Generate enum with string values - create both const and enum
626            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            // Generate regular enum
671            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    /// Generate variable declaration
685    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            // Try to infer type from initializer
691            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                        // Try to get the type from the constructor
700                        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                        // Try to infer return type from function name
708                        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    /// Generate import declaration
735    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            // Default import without named imports
759            Ok(format!("use {};", source))
760        } else {
761            Ok(format!("use {}::{{{}}};", source, import_parts.join(", ")))
762        }
763    }
764
765    /// Generate export
766    #[allow(dead_code)]
767    fn generate_export(&mut self, _export: &ExportDeclaration) -> Result<String> {
768        // In Rust, everything is public by default in the module
769        // Exports are handled by the module system
770        Ok(String::new())
771    }
772
773    /// Generate namespace declaration as module
774    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    /// Generate module declaration
781    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    /// Generate method declaration
788    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            // For owned types like String, return cloned values
794            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        // Build the method signature
816        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    /// Generate method signature
830    #[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    /// Generate parameters
844    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    /// Generate expression statement
869    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    /// Generate statement
875    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                // Clean up TODO expressions
887                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                    // Remove TODO comments and fix syntax
898                    let clean_expr = if expr.contains("TODO") {
899                        "unimplemented!()".to_string()
900                    } else {
901                        // For member expressions accessing fields, clone if needed
902                        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                // Handle other statement types
919                Ok("// TODO: Implement statement".to_string())
920            }
921        }
922    }
923
924    /// Generate expression
925    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                // Handle other expression types
943                Ok("// TODO: Implement expression".to_string())
944            }
945        }
946    }
947
948    /// Generate unary expression
949    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                // For typeof operator, we'll generate a runtime type check
954                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    /// Generate literal
964    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    /// Generate binary expression
976    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    /// Generate assignment expression
985    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            _ => "=", // Default to assignment
991        };
992        Ok(format!("{} {} {}", left, operator, right))
993    }
994
995    /// Generate call expression
996    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        // Special handling for console.log
1004        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    /// Generate member expression
1017    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            // Handle 'this' expressions
1025            if object == "this" {
1026                Ok(format!("self.{}", property))
1027            } else {
1028                Ok(format!("{}.{}", object, property))
1029            }
1030        }
1031    }
1032
1033    /// Generate array expression
1034    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                // Wrap complex expressions in Box::new
1040                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    /// Generate object expression
1056    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            // Wrap values in Box::new for dynamic typing
1063            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    /// Generate template literal
1074    fn generate_template_literal(&mut self, template: &TemplateLiteral) -> Result<String> {
1075        // For now, handle simple template literals without expressions
1076        if template.expressions.is_empty() && !template.quasis.is_empty() {
1077            let raw_string = &template.quasis[0].value;
1078            // Simple string replacement for common patterns
1079            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            // Generate format! macro for template literals with interpolation
1088            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                // Add expression if it exists
1095                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    /// Generate new expression
1112    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    /// Map operator
1122    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    /// Generate arrow function expression
1146    fn generate_arrow_function(&mut self, _arrow: &ArrowFunctionExpression) -> Result<String> {
1147        // For now, generate a simple closure
1148        // TODO: Implement proper arrow function generation
1149        Ok("|| { unimplemented!() }".to_string())
1150    }
1151}