From 0e6c73e85c8bdcb65fc079fcf616f2226061f972 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Fri, 8 May 2026 16:54:11 +0200 Subject: [PATCH] generics codege --- src/codegen.rs | 40 ++++++++++++++++++++++++++++++++++++---- test/src/main.mist | 2 ++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/codegen.rs b/src/codegen.rs index 96e5bd7..c4ebdc3 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -1,6 +1,6 @@ use parser::ast::{ - Attribute, BinaryOp, Block, EnumItem, Expression, FunctionDecl, Identifier, Literal, Path, - Pattern, Postfix, Prefix, Statement, StatementBranch, TopLevel, TopLevelKind, TypeExpr, + Attribute, BinaryOp, Block, EnumItem, Expression, FunctionDecl, Generics, Identifier, Literal, + Path, Pattern, Postfix, Prefix, Statement, StatementBranch, TopLevel, TopLevelKind, TypeExpr, TypeExprKind, TypePostfix, VarAssignStmt, VarDecl, VarDeclStmt, Visibility, }; @@ -316,12 +316,14 @@ impl ToRust for TopLevelKind { Self::StructDecl { visibility, name, + generics, fields, } => { cg.addln(&format!( - "{}struct {} {{", + "{}struct {}{} {{", visibility.get_rust(), - name.get_rust() + name.get_rust(), + generics.get_rust() )); cg.indent += 1; @@ -703,6 +705,36 @@ impl GetRust for Pattern { } } +impl GetRust for Generics { + fn get_rust(&self) -> String { + if self.0.len() == 0 { + String::new() + } else { + format!( + "<{}>", + self.0 + .iter() + .map(|generic| generic.0.get_rust() + + &(if generic.1.len() == 0 { + String::new() + } else { + format!( + ": {}", + generic + .1 + .iter() + .map(Path::get_rust) + .collect::>() + .join("+") + ) + })) + .collect::>() + .join(", ") + ) + } + } +} + pub fn get_static_type_path(path: &Path) -> String { let rust_path = path.get_rust(); diff --git a/test/src/main.mist b/test/src/main.mist index 602dd59..6996a76 100644 --- a/test/src/main.mist +++ b/test/src/main.mist @@ -2,6 +2,8 @@ mod my_class; use ; use ; +struct Test {} + void main() { var my_class = new MyClass("World"); my_class.greet();