diff --git a/crates/prometeu-compiler/src/common/diagnostics.rs b/crates/prometeu-compiler/src/common/diagnostics.rs index e2515d8f..1dfed996 100644 --- a/crates/prometeu-compiler/src/common/diagnostics.rs +++ b/crates/prometeu-compiler/src/common/diagnostics.rs @@ -9,6 +9,7 @@ pub enum DiagnosticLevel { #[derive(Debug, Clone)] pub struct Diagnostic { pub level: DiagnosticLevel, + pub code: Option, pub message: String, pub span: Option, } @@ -33,6 +34,7 @@ impl DiagnosticBundle { let mut bundle = Self::new(); bundle.push(Diagnostic { level: DiagnosticLevel::Error, + code: None, message, span, }); diff --git a/crates/prometeu-compiler/src/frontends/pbs/mod.rs b/crates/prometeu-compiler/src/frontends/pbs/mod.rs index 41ec8a1b..8660092a 100644 --- a/crates/prometeu-compiler/src/frontends/pbs/mod.rs +++ b/crates/prometeu-compiler/src/frontends/pbs/mod.rs @@ -2,9 +2,15 @@ pub mod token; pub mod lexer; pub mod ast; pub mod parser; +pub mod symbols; +pub mod collector; +pub mod resolver; pub use lexer::Lexer; pub use token::{Token, TokenKind}; +pub use symbols::{Symbol, SymbolTable, ModuleSymbols, Visibility, SymbolKind, Namespace}; +pub use collector::SymbolCollector; +pub use resolver::{Resolver, ModuleProvider}; use crate::common::diagnostics::DiagnosticBundle; use crate::common::files::FileManager; @@ -30,9 +36,21 @@ impl Frontend for PbsFrontend { let file_id = file_manager.add(entry.to_path_buf(), source.clone()); let mut parser = parser::Parser::new(&source, file_id); - let _ast = parser.parse_file()?; + let ast = parser.parse_file()?; - // Parsing and full compilation will be implemented in future PRs. - Err(DiagnosticBundle::error("Frontend 'pbs' not yet fully implemented (Parser OK)".to_string(), None)) + let mut collector = SymbolCollector::new(); + let (type_symbols, value_symbols) = collector.collect(&ast)?; + let module_symbols = ModuleSymbols { type_symbols, value_symbols }; + + struct EmptyProvider; + impl ModuleProvider for EmptyProvider { + fn get_module_symbols(&self, _path: &str) -> Option<&ModuleSymbols> { None } + } + + let mut resolver = Resolver::new(&module_symbols, &EmptyProvider); + resolver.resolve(&ast)?; + + // Compilation to IR will be implemented in future PRs. + Err(DiagnosticBundle::error("Frontend 'pbs' not yet fully implemented (Resolver OK)".to_string(), None)) } } diff --git a/crates/prometeu-compiler/src/frontends/pbs/parser.rs b/crates/prometeu-compiler/src/frontends/pbs/parser.rs index 1798a459..e85615bc 100644 --- a/crates/prometeu-compiler/src/frontends/pbs/parser.rs +++ b/crates/prometeu-compiler/src/frontends/pbs/parser.rs @@ -630,6 +630,7 @@ impl Parser { fn error(&mut self, message: &str) -> DiagnosticBundle { let diag = Diagnostic { level: DiagnosticLevel::Error, + code: None, message: message.to_string(), span: Some(self.peek().span), };