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); }