From bb006c1ba2cbf8798ce4d909984c8fdd3ae41ba8 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Wed, 8 Jul 2026 10:11:26 +0200 Subject: [PATCH] Added global include --- crates/codegen/src/lib.rs | 27 ++++++++++++++++++++++++++- crates/codegen/src/top_level.rs | 6 ++++++ crates/parser/src/ast/top_level.rs | 1 + crates/parser/src/grammar.pest | 6 +++++- crates/parser/src/parser/items/mod.rs | 2 ++ 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/crates/codegen/src/lib.rs b/crates/codegen/src/lib.rs index 6d9b007..75ae198 100644 --- a/crates/codegen/src/lib.rs +++ b/crates/codegen/src/lib.rs @@ -3,7 +3,7 @@ pub mod expr; pub mod statement; pub mod top_level; -use std::path::PathBuf; +use std::{collections::HashMap, path::PathBuf}; use mist_parser::{ ast::*, @@ -29,6 +29,7 @@ pub trait GetRust { pub struct RustCodegen { output: String, indent: usize, + pub crates: HashMap>, pub mapping: Mapping, position: RustMap, } @@ -38,6 +39,7 @@ impl RustCodegen { Self { output: String::new(), indent: 0, + crates: HashMap::new(), mapping: Mapping::new(mist_path), position: RustMap(1, 0), } @@ -84,6 +86,29 @@ impl RustCodegen { tl.gen_rust(&mut ctx, self); } + let mut crates = HashMap::new(); + std::mem::swap(&mut self.crates, &mut crates); + + for (c, items) in crates { + self.add("mod "); + c.gen_rust(&mut ctx, self); + self.addln(" {"); + self.indent += 1; + + self.add_indented("extern crate "); + c.gen_rust(&mut ctx, self); + self.addln(";"); + + for item in items { + self.add_indented("pub use "); + item.gen_rust(&mut ctx, self); + self.addln("::*;"); + } + + self.indent -= 1; + self.addln("}"); + } + self.output.clone() } diff --git a/crates/codegen/src/top_level.rs b/crates/codegen/src/top_level.rs index 004a42b..b65190c 100644 --- a/crates/codegen/src/top_level.rs +++ b/crates/codegen/src/top_level.rs @@ -326,6 +326,12 @@ impl GenRust for TopLevelKind { constructor, items, ), + Self::IncludeGlobal(incl) => { + cg.crates + .entry(incl.0[0].clone()) + .or_insert(Vec::new()) + .push(incl.clone()); + } } } } diff --git a/crates/parser/src/ast/top_level.rs b/crates/parser/src/ast/top_level.rs index 1762de9..a759d33 100644 --- a/crates/parser/src/ast/top_level.rs +++ b/crates/parser/src/ast/top_level.rs @@ -28,6 +28,7 @@ pub struct TopLevel(pub Spanned, pub Vec); pub enum TopLevelKind { ModAttribute, Import(Visibility, Path), + IncludeGlobal(Path), DeclareModule(Visibility, Identifier), ImplDecl(ImplDecl), StaticDecl(VarDeclStmt), diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index 8ed88cb..6eb3973 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -258,6 +258,10 @@ param_list = { // IMPORTS / MODULES // ====================================================== +include_global = { + "#" ~ "include" ~ "<" ~ identifier ~ ("/" ~ identifier)* ~ ">" +} + import = { visibility? ~ "use" ~ static_path ~ semicolon } @@ -384,7 +388,7 @@ type_alias = { "type" ~ identifier ~ generics_decl? ~ "=" ~ type_expr ~ ";" } top_level = { mod_attribute - | (attributes ~ (import | impl_for_decl | impl_decl | trait_decl | struct_decl | enum_decl | class_decl | declare_module | function_decl | const_decl | static_decl | type_alias)) + | (attributes ~ (include_global | import | impl_for_decl | impl_decl | trait_decl | struct_decl | enum_decl | class_decl | declare_module | function_decl | const_decl | static_decl | type_alias)) } // ====================================================== diff --git a/crates/parser/src/parser/items/mod.rs b/crates/parser/src/parser/items/mod.rs index 57e8bee..2b27e99 100644 --- a/crates/parser/src/parser/items/mod.rs +++ b/crates/parser/src/parser/items/mod.rs @@ -129,6 +129,8 @@ impl<'a> TryFrom> for TopLevelKind { ty: inner.next().unwrap().try_into()?, }), + Rule::include_global => Ok(TopLevelKind::IncludeGlobal(Path(collect_recovered(&mut inner)?))), + _ => AstError::bug_unimplemented(pair), } }