slang_frontend/semantic_analysis/analyzer_modules/
core.rs1use slang_ir::ast::*;
2use slang_shared::CompilationContext;
3
4use super::super::{
5 traits::SemanticResult,
6 visitors::{expression_visitor::ExpressionVisitor, statement_visitor::StatementVisitor},
7};
8
9pub struct CoreAnalyzer<'a> {
15 context: &'a mut CompilationContext,
16}
17
18impl<'a> CoreAnalyzer<'a> {
19 pub fn new(context: &'a mut CompilationContext) -> Self {
24 Self { context }
25 }
26
27 pub fn context(&mut self) -> &mut CompilationContext {
29 self.context
30 }
31
32 pub fn analyze_statement(&mut self, stmt: &Statement) -> SemanticResult {
37 let mut stmt_visitor = StatementVisitor::new(self.context);
38
39 match stmt {
40 Statement::FunctionDeclaration(fn_decl) => {
41 stmt_visitor.visit_function_declaration(fn_decl)
42 }
43 Statement::Let(let_stmt) => stmt_visitor.visit_let_statement(let_stmt),
44 Statement::Assignment(assign_stmt) => {
45 stmt_visitor.visit_assignment_statement(assign_stmt)
46 }
47 Statement::Return(return_stmt) => stmt_visitor.visit_return_statement(return_stmt),
48 Statement::TypeDefinition(type_def) => {
49 stmt_visitor.visit_type_definition_statement(type_def)
50 }
51 Statement::Expression(expr) => stmt_visitor.visit_expression_statement(expr),
52 Statement::If(if_stmt) => stmt_visitor.visit_if_statement(if_stmt),
53 }
54 }
55
56 pub fn analyze_expression(&mut self, expr: &Expression) -> SemanticResult {
61 let mut expr_visitor = ExpressionVisitor::new(self.context);
62 expr_visitor.visit_expression(expr)
63 }
64
65 pub fn analyze_block(&mut self, block: &BlockExpr) -> SemanticResult {
70 let mut expr_visitor = ExpressionVisitor::new(self.context);
71 expr_visitor.visit_block_expression(block)
72 }
73}