deimos-lang/dmc-lib/src/intrinsics.rs
2026-08-27 05:45:44 -05:00

52 lines
1.8 KiB
Rust

use crate::semantic_analysis::analysis_context::AnalysisContext;
use crate::semantic_analysis::scope::ScopeId;
use crate::semantic_analysis::symbol::{ClassSymbol, FunctionSymbol, Symbol};
use crate::semantic_analysis::type_info::{FunctionTypeInfo, InstanceTypeInfo, TypeInfo};
use std::collections::HashMap;
pub fn add_primitive_symbols_and_type_infos(ctx: &mut AnalysisContext, global_scope_id: ScopeId) {
let string_len_symbol = Symbol::Function(FunctionSymbol::new(
"len".into(),
None,
"core::String::len".into(),
true,
true,
));
let string_len_symbol_id = ctx
.try_insert_symbol_in_scope(string_len_symbol, global_scope_id)
.unwrap();
let mut string_class_methods = HashMap::new();
string_class_methods.insert("len".into(), string_len_symbol_id);
let string_class_symbol = Symbol::Class(ClassSymbol::new(
"String".into(),
None,
"core::String".into(),
true,
HashMap::new(),
string_class_methods,
));
let string_class_symbol_id = ctx
.try_insert_symbol_in_scope(string_class_symbol, global_scope_id)
.unwrap();
let string_instance_type_info_id = ctx.insert_type_info(TypeInfo::Instance(
InstanceTypeInfo::new(string_class_symbol_id),
));
ctx.associate_symbol_to_type(string_class_symbol_id, string_instance_type_info_id);
let string_len_return_type_info_id = ctx.insert_type_info(TypeInfo::Int);
let string_len_type_info = TypeInfo::Function(FunctionTypeInfo::new(
vec![],
string_len_return_type_info_id,
Some(string_instance_type_info_id),
));
let string_len_type_info_id = ctx.insert_type_info(string_len_type_info);
ctx.associate_symbol_to_type(string_len_symbol_id, string_len_type_info_id);
}