deimos-lang/dmc-lib/src/semantic_analysis/mod.rs
2026-07-16 18:33:15 -05:00

74 lines
2.4 KiB
Rust

use crate::ast::compilation_unit::CompilationUnit;
use crate::ast::statement::Statement;
use crate::diagnostic::Diagnostics;
use crate::semantic_analysis::collect_scopes::{
collect_scopes_compilation_unit, collect_scopes_statement,
};
use crate::semantic_analysis::collect_symbols::{
SymbolCollectionResult, collect_symbols_compilation_unit,
};
use crate::semantic_analysis::collect_types::collect_types;
use crate::semantic_analysis::resolve_names::{
NameResolutionResult, resolve_names_in_compilation_unit, resolve_names_in_statement,
};
use crate::semantic_analysis::resolve_types::{
ResolveTypesResult, resolve_types_in_compilation_unit, resolve_types_in_statement,
};
use analysis_context::AnalysisContext;
pub mod analysis_context;
mod collect_scopes;
mod collect_symbols;
mod collect_types;
mod diagnostic_helpers;
mod resolve_names;
mod resolve_types;
pub mod scope;
pub mod symbol;
pub mod type_info;
pub fn analyze_compilation_unit(
compilation_unit: &CompilationUnit,
ctx: &mut AnalysisContext,
) -> Diagnostics {
let mut diagnostics = Diagnostics::new();
collect_scopes_compilation_unit(compilation_unit, ctx);
let SymbolCollectionResult(mut collect_symbols_diagnostics) =
collect_symbols_compilation_unit(compilation_unit, ctx);
diagnostics.append(&mut collect_symbols_diagnostics);
let NameResolutionResult(mut resolve_names_diagnostics) =
resolve_names_in_compilation_unit(compilation_unit, ctx);
diagnostics.append(&mut resolve_names_diagnostics);
collect_types(compilation_unit, ctx);
let ResolveTypesResult(mut resolve_types_diagnostics) =
resolve_types_in_compilation_unit(compilation_unit, ctx);
diagnostics.append(&mut resolve_types_diagnostics);
diagnostics
}
pub fn analyze_statement(statement: &Statement, ctx: &mut AnalysisContext) -> Diagnostics {
let mut diagnostics = Diagnostics::new();
collect_scopes_statement(statement, ctx);
// collect symbols for a statement is currently a no-op, so not needed here
let NameResolutionResult(mut resolve_names_diagnostics) =
resolve_names_in_statement(statement, ctx);
diagnostics.append(&mut resolve_names_diagnostics);
// collect types for a statement is currently a no-op, so not needed here
let ResolveTypesResult(mut resolve_types_diagnostics) =
resolve_types_in_statement(statement, ctx);
diagnostics.append(&mut resolve_types_diagnostics);
diagnostics
}