From fe8ab3601c28e9d4c8a3e197a80532d844a1be00 Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Tue, 31 Mar 2026 12:15:38 -0500 Subject: [PATCH] Add FileId to CompilationUnit. --- dm/src/run.rs | 2 +- dmc-lib/src/ast/assign_statement.rs | 3 +++ dmc-lib/src/ast/compilation_unit.rs | 4 ++++ dmc-lib/src/ast/type_use.rs | 1 + dmc-lib/src/compile_pipeline.rs | 13 +++++++------ dmc-lib/src/ir/ir_block.rs | 3 ++- dmc-lib/src/parser.rs | 23 +++++++++++++++-------- e2e-tests/src/lib.rs | 2 +- 8 files changed, 34 insertions(+), 17 deletions(-) diff --git a/dm/src/run.rs b/dm/src/run.rs index 32b2e38..06644f4 100644 --- a/dm/src/run.rs +++ b/dm/src/run.rs @@ -41,7 +41,7 @@ fn run( show_asm: bool, register_count: usize, ) -> Result<(), Vec> { - let mut compilation_unit = get_compilation_unit(&input)?; + let mut compilation_unit = get_compilation_unit(&input, None)?; let mut symbol_table = SymbolTable::new(); symbol_table.push_module_scope("global scope"); diff --git a/dmc-lib/src/ast/assign_statement.rs b/dmc-lib/src/ast/assign_statement.rs index 0750989..e00d76c 100644 --- a/dmc-lib/src/ast/assign_statement.rs +++ b/dmc-lib/src/ast/assign_statement.rs @@ -279,6 +279,7 @@ mod tests { x = \"Hello\" end ", + None, )?; let mut symbol_table = SymbolTable::new(); let mut types_table = TypesTable::new(); @@ -302,6 +303,7 @@ mod tests { 42 = 42 end ", + None, )?; let mut symbol_table = SymbolTable::new(); let mut types_table = TypesTable::new(); @@ -323,6 +325,7 @@ mod tests { x = 43 end ", + None, )?; let mut symbol_table = SymbolTable::new(); let mut types_table = TypesTable::new(); diff --git a/dmc-lib/src/ast/compilation_unit.rs b/dmc-lib/src/ast/compilation_unit.rs index 895b9ec..9955d2d 100644 --- a/dmc-lib/src/ast/compilation_unit.rs +++ b/dmc-lib/src/ast/compilation_unit.rs @@ -3,6 +3,7 @@ use crate::ast::extern_function::ExternFunction; use crate::ast::fqn_context::FqnContext; use crate::ast::function::Function; use crate::ast::helpers::collect_diagnostics_into_mut; +use crate::compile_pipeline::FileId; use crate::diagnostic::Diagnostic; use crate::ir::ir_class::IrClass; use crate::ir::ir_function::IrFunction; @@ -13,6 +14,7 @@ use crate::types_table::TypesTable; use crate::{diagnostics_result, handle_diagnostics}; pub struct CompilationUnit { + file_id: Option, functions: Vec, extern_functions: Vec, classes: Vec, @@ -20,11 +22,13 @@ pub struct CompilationUnit { impl CompilationUnit { pub fn new( + file_id: Option, functions: Vec, extern_functions: Vec, classes: Vec, ) -> Self { Self { + file_id, functions, extern_functions, classes, diff --git a/dmc-lib/src/ast/type_use.rs b/dmc-lib/src/ast/type_use.rs index 7adee34..e40c645 100644 --- a/dmc-lib/src/ast/type_use.rs +++ b/dmc-lib/src/ast/type_use.rs @@ -190,6 +190,7 @@ mod tests { fn useFoo(foo: Foo) end ", + None, )?; let mut symbol_table = SymbolTable::new(); diff --git a/dmc-lib/src/compile_pipeline.rs b/dmc-lib/src/compile_pipeline.rs index 92d4961..365e30d 100644 --- a/dmc-lib/src/compile_pipeline.rs +++ b/dmc-lib/src/compile_pipeline.rs @@ -7,16 +7,17 @@ use std::collections::HashMap; use std::rc::Rc; pub type Filename = Rc; +pub type FileId = usize; fn parse_compilation_units( - inputs: &HashMap, -) -> Result, Diagnostics> { + inputs: &HashMap, +) -> Result, Diagnostics> { let mut parse_diagnostics = Vec::new(); let mut compilation_units = HashMap::new(); - for (file_name, source) in inputs { - let (compilation_unit, mut ds) = parse_compilation_unit(source); + for (file_id, source) in inputs { + let (compilation_unit, mut ds) = parse_compilation_unit(source, Some(*file_id)); parse_diagnostics.append(&mut ds); - compilation_units.insert(file_name.clone(), compilation_unit); + compilation_units.insert(*file_id, compilation_unit); } if parse_diagnostics.is_empty() { Ok(compilation_units) @@ -25,7 +26,7 @@ fn parse_compilation_units( } } -pub fn compile_compilation_units(inputs: &HashMap) -> Result<(), Diagnostics> { +pub fn compile_compilation_units(inputs: &HashMap) -> Result<(), Diagnostics> { let mut compilation_units = parse_compilation_units(inputs)?; let mut symbol_table = SymbolTable::new(); diff --git a/dmc-lib/src/ir/ir_block.rs b/dmc-lib/src/ir/ir_block.rs index 684a5bc..d120390 100644 --- a/dmc-lib/src/ir/ir_block.rs +++ b/dmc-lib/src/ir/ir_block.rs @@ -138,7 +138,8 @@ mod tests { let c = 3 let x = a + b + c end - ", + ", + None, )?; let mut symbol_table = SymbolTable::new(); diff --git a/dmc-lib/src/parser.rs b/dmc-lib/src/parser.rs index 5463c4a..3993639 100644 --- a/dmc-lib/src/parser.rs +++ b/dmc-lib/src/parser.rs @@ -19,6 +19,7 @@ use crate::ast::parameter::Parameter; use crate::ast::statement::Statement; use crate::ast::string_literal::StringLiteral; use crate::ast::type_use::TypeUse; +use crate::compile_pipeline::FileId; use crate::diagnostic::{Diagnostic, Diagnostics}; use crate::error_codes::{LEXER_ERROR, PARSE_ERROR}; use crate::lexer::{Lexer, LexerErrorKind}; @@ -28,8 +29,11 @@ use std::str::FromStr; pub type ParseResult = (T, Diagnostics); -pub fn get_compilation_unit(input: &str) -> Result { - let (compilation_unit, diagnostics) = parse_compilation_unit(input); +pub fn get_compilation_unit( + input: &str, + file_id: Option, +) -> Result { + let (compilation_unit, diagnostics) = parse_compilation_unit(input, file_id); if diagnostics.is_empty() { Ok(compilation_unit) } else { @@ -37,11 +41,14 @@ pub fn get_compilation_unit(input: &str) -> Result } } -pub fn parse_compilation_unit(input: &str) -> ParseResult { +pub fn parse_compilation_unit( + input: &str, + file_id: Option, +) -> ParseResult { let mut parser = Parser::new(input); let mut diagnostics = Vec::new(); diagnostics.append(&mut parser.advance()); - let (compilation_unit, mut ds) = parser.compilation_unit(); + let (compilation_unit, mut ds) = parser.compilation_unit(file_id); diagnostics.append(&mut ds); (compilation_unit, diagnostics) } @@ -297,7 +304,7 @@ impl<'a> Parser<'a> { node_id } - fn compilation_unit(&mut self) -> ParseResult { + fn compilation_unit(&mut self, file_id: Option) -> ParseResult { let mut functions: Vec = vec![]; let mut extern_functions: Vec = vec![]; let mut classes: Vec = vec![]; @@ -330,7 +337,7 @@ impl<'a> Parser<'a> { } ( - CompilationUnit::new(functions, extern_functions, classes), + CompilationUnit::new(file_id, functions, extern_functions, classes), diagnostics, ) } @@ -1364,7 +1371,7 @@ mod smoke_tests { use super::*; fn smoke_test(input: &str) { - let (_, diagnostics) = parse_compilation_unit(input); + let (_, diagnostics) = parse_compilation_unit(input, None); if !diagnostics.is_empty() { eprintln!("{:#?}", diagnostics); panic!("There were diagnostics during parsing"); @@ -1583,7 +1590,7 @@ mod concrete_tests { } fn assert_compilation_unit(input: &str) -> CompilationUnit { - let (compilation_unit, diagnostics) = parse_compilation_unit(input); + let (compilation_unit, diagnostics) = parse_compilation_unit(input, None); if !diagnostics.is_empty() { report_diagnostics(&diagnostics); } diff --git a/e2e-tests/src/lib.rs b/e2e-tests/src/lib.rs index 6b28d35..e755890 100644 --- a/e2e-tests/src/lib.rs +++ b/e2e-tests/src/lib.rs @@ -29,7 +29,7 @@ mod e2e_tests { } fn prepare_context(input: &str) -> Result> { - let (mut compilation_unit, diagnostics) = parse_compilation_unit(input); + let (mut compilation_unit, diagnostics) = parse_compilation_unit(input, None); if !diagnostics.is_empty() { return Err(diagnostics); }