deimos-lang/dmc-lib/src/ast/expression.rs
2026-03-02 20:15:36 -06:00

59 lines
2.0 KiB
Rust

use crate::ast::call::Call;
use crate::ast::identifier::Identifier;
use crate::ast::integer_literal::IntegerLiteral;
use crate::ast::string_literal::StringLiteral;
use crate::diagnostic::Diagnostic;
use crate::source_range::SourceRange;
use crate::symbol_table::SymbolTable;
use crate::type_info::TypeInfo;
pub enum Expression {
Call(Call),
IntegerLiteral(IntegerLiteral),
String(StringLiteral),
Identifier(Identifier),
}
impl Expression {
pub fn gather_declared_names(&mut self, symbol_table: &mut SymbolTable) -> Vec<Diagnostic> {
match self {
Expression::Call(call) => call.gather_declared_names(symbol_table),
Expression::Identifier(identifier) => identifier.gather_declared_names(symbol_table),
_ => vec![],
}
}
pub fn check_name_usages(&mut self, symbol_table: &SymbolTable) -> Vec<Diagnostic> {
match self {
Expression::Call(call) => call.check_name_usages(symbol_table),
Expression::Identifier(identifier) => identifier.check_name_usages(symbol_table),
_ => vec![],
}
}
pub fn type_check(&mut self, symbol_table: &SymbolTable) -> Vec<Diagnostic> {
match self {
Expression::Call(call) => call.type_check(symbol_table),
_ => vec![],
}
}
pub fn type_info(&self) -> TypeInfo {
match self {
Expression::Call(call) => call.type_info(),
Expression::IntegerLiteral(_) => TypeInfo::Integer,
Expression::String(_) => TypeInfo::String,
Expression::Identifier(identifier) => identifier.type_info(),
}
}
pub fn source_range(&self) -> &SourceRange {
match self {
Expression::Call(call) => call.source_range(),
Expression::IntegerLiteral(integer_literal) => integer_literal.source_range(),
Expression::String(string_literal) => string_literal.source_range(),
Expression::Identifier(identifier) => identifier.source_range(),
}
}
}