52 lines
1.8 KiB
Rust
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);
|
|
}
|