More flexible types

This commit is contained in:
2026-04-22 09:27:29 +02:00
parent 797eed173c
commit 53b87eb02e
2 changed files with 28 additions and 48 deletions
+16 -33
View File
@@ -15,7 +15,7 @@ pub enum TypeRef {
Struct(StructRef), Struct(StructRef),
Function(FunctionRef), Function(FunctionRef),
Package(PackageRef), Package(PackageRef),
Int, Name(String),
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@@ -162,23 +162,15 @@ impl TopLevelHirScope {
if let Some(tlss_rf) = tlss.structs.get(&symbol.0) { if let Some(tlss_rf) = tlss.structs.get(&symbol.0) {
self.struct_ref(tlss, tlss_rf) self.struct_ref(tlss, tlss_rf)
} else { } else {
match symbol.0.as_str() { let var_ref = Arc::new(VarRef {
"int" => { export: false,
let var_ref = Arc::new(VarRef { name: symbol.0.clone(),
export: false, var_type: Arc::new(TypeRef::Name(symbol.0.clone())),
name: symbol.0.clone(), });
var_type: Arc::new(TypeRef::Int),
});
self.variables.insert(symbol.0.clone(), var_ref.clone()); self.variables.insert(symbol.0.clone(), var_ref.clone());
var_ref.var_type.clone() var_ref.var_type.clone()
}
_ => {
unimplemented!("{:?}", symbol)
}
}
} }
} }
} }
@@ -202,7 +194,7 @@ impl TypeRef {
TypeRef::Function(f) => f.name.clone(), TypeRef::Function(f) => f.name.clone(),
TypeRef::Struct(s) => s.name.clone(), TypeRef::Struct(s) => s.name.clone(),
TypeRef::Package(p) => p.name.clone(), TypeRef::Package(p) => p.name.clone(),
TypeRef::Int => "int".to_string(), TypeRef::Name(n) => n.clone(),
} }
} }
} }
@@ -302,24 +294,15 @@ impl PackageRef {
if let Some(json_scope_rf) = json_scope.structs.get(&symbol.0) { if let Some(json_scope_rf) = json_scope.structs.get(&symbol.0) {
self.struct_ref(json_scope, json_scope_rf) self.struct_ref(json_scope, json_scope_rf)
} else { } else {
match symbol.0.as_str() { let var_ref = Arc::new(VarRef {
// TODO: This is a hack, we should have a better way to handle built-in types export: false,
"int" | "[]any" => { name: symbol.0.clone(),
let var_ref = Arc::new(VarRef { var_type: Arc::new(TypeRef::Name(symbol.0.clone())),
export: false, });
name: symbol.0.clone(),
var_type: Arc::new(TypeRef::Int),
});
self.variables.insert(symbol.0.clone(), var_ref.clone()); self.variables.insert(symbol.0.clone(), var_ref.clone());
var_ref.var_type.clone() var_ref.var_type.clone()
}
_ => {
unimplemented!("{:?}", symbol)
}
}
} }
} }
} }
+12 -15
View File
@@ -65,23 +65,20 @@ impl LocalScope {
match rf { match rf {
Some(v) => Some(v), Some(v) => Some(v),
None => match name.as_str() { None => {
"int" => { let var_ref = Arc::new(VarRef {
let var_ref = Arc::new(VarRef { export: false,
export: false, name: name.clone(),
name: name.clone(), var_type: Arc::new(TypeRef::Name(name.clone())),
var_type: Arc::new(TypeRef::Int), });
});
self.variables self.variables
.lock() .lock()
.unwrap() .unwrap()
.insert(name.clone(), var_ref.clone()); .insert(name.clone(), var_ref.clone());
Some(var_ref) Some(var_ref)
} }
_ => None,
},
} }
} }