Compare commits
2 Commits
0ca2797428
...
35ac5cb6f6
Author | SHA1 | Date |
---|---|---|
pca006132 | 35ac5cb6f6 | |
pca006132 | 93af337ed3 |
|
@ -116,9 +116,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-channel"
|
name = "crossbeam-channel"
|
||||||
version = "0.5.3"
|
version = "0.5.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fdbfe11fe19ff083c48923cf179540e8cd0535903dc35e178a1fdeeb59aef51f"
|
checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"crossbeam-utils",
|
"crossbeam-utils",
|
||||||
|
@ -137,11 +137,10 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-epoch"
|
name = "crossbeam-epoch"
|
||||||
version = "0.9.8"
|
version = "0.9.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c"
|
checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg",
|
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"crossbeam-utils",
|
"crossbeam-utils",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
|
@ -151,9 +150,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-queue"
|
name = "crossbeam-queue"
|
||||||
version = "0.3.5"
|
version = "0.3.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2"
|
checksum = "4dd435b205a4842da59efd07628f921c096bc1cc0a156835b4fa0bcb9a19bcce"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"crossbeam-utils",
|
"crossbeam-utils",
|
||||||
|
@ -161,9 +160,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-utils"
|
name = "crossbeam-utils"
|
||||||
version = "0.8.8"
|
version = "0.8.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38"
|
checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
|
@ -422,9 +421,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.120"
|
version = "0.2.119"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ad5c14e80759d0939d013e6ca49930e59fc53dd8e5009132f76240c179380c09"
|
checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libloading"
|
name = "libloading"
|
||||||
|
@ -1010,9 +1009,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.89"
|
version = "1.0.86"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54"
|
checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
|
@ -2,11 +2,11 @@
|
||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1647282937,
|
"lastModified": 1646588256,
|
||||||
"narHash": "sha256-K8Oo6QyFCfiEWTRpQVfzcwI3YNMKlz6Tu8rr+o3rzRQ=",
|
"narHash": "sha256-ZHljmNlt19nSm0Mz8fx6QEhddKUkU4hhwFmfNmGn+EY=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "64fc73bd74f04d3e10cb4e70e1c65b92337e76db",
|
"rev": "2ebb6c1e5ae402ba35cca5eec58385e5f1adea04",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
|
@ -503,7 +503,7 @@ impl InnerResolver {
|
||||||
Ok(s) => s,
|
Ok(s) => s,
|
||||||
Err(e) => return Ok(Err(e)),
|
Err(e) => return Ok(Err(e)),
|
||||||
};
|
};
|
||||||
return match (&*unifier.get_ty(extracted_ty), inst_check) {
|
match (&*unifier.get_ty(extracted_ty), inst_check) {
|
||||||
// do the instantiation for these three types
|
// do the instantiation for these three types
|
||||||
(TypeEnum::TList { ty }, false) => {
|
(TypeEnum::TList { ty }, false) => {
|
||||||
let len: usize = self.helper.len_fn.call1(py, (obj,))?.extract(py)?;
|
let len: usize = self.helper.len_fn.call1(py, (obj,))?.extract(py)?;
|
||||||
|
@ -538,22 +538,9 @@ impl InnerResolver {
|
||||||
let types = types?;
|
let types = types?;
|
||||||
Ok(types.map(|types| unifier.add_ty(TypeEnum::TTuple { ty: types })))
|
Ok(types.map(|types| unifier.add_ty(TypeEnum::TTuple { ty: types })))
|
||||||
}
|
}
|
||||||
(TypeEnum::TObj { params, fields, .. }, false) => {
|
(TypeEnum::TObj { params: var_map, fields, .. }, false) => {
|
||||||
self.pyid_to_type.write().insert(ty_id, extracted_ty);
|
self.pyid_to_type.write().insert(ty_id, extracted_ty);
|
||||||
let mut instantiate_obj = || {
|
let mut instantiate_obj = || {
|
||||||
let var_map = params
|
|
||||||
.iter()
|
|
||||||
.map(|(id_var, ty)| {
|
|
||||||
if let TypeEnum::TVar { id, range, name, loc, .. } =
|
|
||||||
&*unifier.get_ty(*ty)
|
|
||||||
{
|
|
||||||
assert_eq!(*id, *id_var);
|
|
||||||
(*id, unifier.get_fresh_var_with_range(range, *name, *loc).0)
|
|
||||||
} else {
|
|
||||||
unreachable!()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect::<HashMap<_, _>>();
|
|
||||||
// loop through non-function fields of the class to get the instantiated value
|
// loop through non-function fields of the class to get the instantiated value
|
||||||
for field in fields.iter() {
|
for field in fields.iter() {
|
||||||
let name: String = (*field.0).into();
|
let name: String = (*field.0).into();
|
||||||
|
@ -590,7 +577,7 @@ impl InnerResolver {
|
||||||
return Ok(Err("object is not of concrete type".into()));
|
return Ok(Err("object is not of concrete type".into()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(Ok(unifier.subst(extracted_ty, &var_map).unwrap_or(extracted_ty)))
|
Ok(Ok(extracted_ty))
|
||||||
};
|
};
|
||||||
let result = instantiate_obj();
|
let result = instantiate_obj();
|
||||||
// do not cache the type if there are errors
|
// do not cache the type if there are errors
|
||||||
|
@ -600,7 +587,7 @@ impl InnerResolver {
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
_ => Ok(Ok(extracted_ty)),
|
_ => Ok(Ok(extracted_ty)),
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_obj_value<'ctx, 'a>(
|
fn get_obj_value<'ctx, 'a>(
|
||||||
|
@ -919,6 +906,7 @@ impl SymbolResolver for Resolver {
|
||||||
})
|
})
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
};
|
};
|
||||||
|
println!("{:?}", result);
|
||||||
if let Ok(t) = &result {
|
if let Ok(t) = &result {
|
||||||
self.0.id_to_type.write().insert(str, *t);
|
self.0.id_to_type.write().insert(str, *t);
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,10 +229,10 @@ pub fn parse_type_annotation<T>(
|
||||||
Err(format!("Cannot use function name as type at {}", loc))
|
Err(format!("Cannot use function name as type at {}", loc))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(_) => {
|
||||||
let ty = resolver
|
let ty = resolver
|
||||||
.get_symbol_type(unifier, top_level_defs, primitives, *id)
|
.get_symbol_type(unifier, top_level_defs, primitives, *id)
|
||||||
.map_err(|_| format!("Unknown type annotation at {}: {}", loc, e))?;
|
.map_err(|e| format!("Unknown type annotation at {}: {}", loc, e))?;
|
||||||
if let TypeEnum::TVar { .. } = &*unifier.get_ty(ty) {
|
if let TypeEnum::TVar { .. } = &*unifier.get_ty(ty) {
|
||||||
Ok(ty)
|
Ok(ty)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use nac3parser::ast::fold::Fold;
|
use nac3parser::ast::fold::Fold;
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
codegen::{expr::get_subst_key, stmt::exn_constructor},
|
codegen::{expr::get_subst_key, stmt::exn_constructor},
|
||||||
|
@ -1192,18 +1193,9 @@ impl TopLevelComposer {
|
||||||
unreachable!("must be type var annotation");
|
unreachable!("must be type var annotation");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let dummy_return_type = unifier.get_dummy_var().0;
|
get_type_from_type_annotation_kinds(temp_def_list, unifier, primitives, &annotation)?
|
||||||
type_var_to_concrete_def.insert(dummy_return_type, annotation.clone());
|
|
||||||
dummy_return_type
|
|
||||||
} else {
|
} else {
|
||||||
// if do not have return annotation, return none
|
primitives.none
|
||||||
// for uniform handling, still use type annoatation
|
|
||||||
let dummy_return_type = unifier.get_dummy_var().0;
|
|
||||||
type_var_to_concrete_def.insert(
|
|
||||||
dummy_return_type,
|
|
||||||
TypeAnnotation::Primitive(primitives.none),
|
|
||||||
);
|
|
||||||
dummy_return_type
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1449,6 +1441,34 @@ impl TopLevelComposer {
|
||||||
let primitives_ty = &self.primitives_ty;
|
let primitives_ty = &self.primitives_ty;
|
||||||
let definition_ast_list = &self.definition_ast_list;
|
let definition_ast_list = &self.definition_ast_list;
|
||||||
let unifier = &mut self.unifier;
|
let unifier = &mut self.unifier;
|
||||||
|
|
||||||
|
// first, fix function typevar ids
|
||||||
|
// they may be changed with our use of placeholders
|
||||||
|
for (def, _) in definition_ast_list.iter().skip(self.builtin_num) {
|
||||||
|
if let TopLevelDef::Function {
|
||||||
|
signature,
|
||||||
|
var_id,
|
||||||
|
..
|
||||||
|
} = &mut *def.write() {
|
||||||
|
if let TypeEnum::TFunc(FunSignature { args, ret, vars }) =
|
||||||
|
unifier.get_ty(*signature).as_ref() {
|
||||||
|
let new_var_ids = vars.values().map(|v| match &*unifier.get_ty(*v) {
|
||||||
|
TypeEnum::TVar{id, ..} => *id,
|
||||||
|
_ => unreachable!(),
|
||||||
|
}).collect_vec();
|
||||||
|
if new_var_ids != *var_id {
|
||||||
|
let new_signature = FunSignature {
|
||||||
|
args: args.clone(),
|
||||||
|
ret: ret.clone(),
|
||||||
|
vars: new_var_ids.iter().zip(vars.values()).map(|(id, v)| (*id, v.clone())).collect(),
|
||||||
|
};
|
||||||
|
unifier.unification_table.set_value(*signature, Rc::new(TypeEnum::TFunc(new_signature)));
|
||||||
|
*var_id = new_var_ids;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let mut errors = HashSet::new();
|
let mut errors = HashSet::new();
|
||||||
let mut analyze = |i, def: &Arc<RwLock<TopLevelDef>>, ast: &Option<Stmt>| {
|
let mut analyze = |i, def: &Arc<RwLock<TopLevelDef>>, ast: &Option<Stmt>| {
|
||||||
let class_def = def.read();
|
let class_def = def.read();
|
||||||
|
@ -1650,7 +1670,6 @@ impl TopLevelComposer {
|
||||||
// if class methods, `vars` also contains all class typevars here
|
// if class methods, `vars` also contains all class typevars here
|
||||||
let (type_var_subst_comb, no_range_vars) = {
|
let (type_var_subst_comb, no_range_vars) = {
|
||||||
let mut no_ranges: Vec<Type> = Vec::new();
|
let mut no_ranges: Vec<Type> = Vec::new();
|
||||||
let var_ids = vars.keys().copied().collect_vec();
|
|
||||||
let var_combs = vars
|
let var_combs = vars
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(_, ty)| {
|
.map(|(_, ty)| {
|
||||||
|
@ -1669,7 +1688,7 @@ impl TopLevelComposer {
|
||||||
.collect_vec();
|
.collect_vec();
|
||||||
let mut result: Vec<HashMap<u32, Type>> = Default::default();
|
let mut result: Vec<HashMap<u32, Type>> = Default::default();
|
||||||
for comb in var_combs {
|
for comb in var_combs {
|
||||||
result.push(var_ids.clone().into_iter().zip(comb).collect());
|
result.push(insted_vars.clone().into_iter().zip(comb).collect());
|
||||||
}
|
}
|
||||||
// NOTE: if is empty, means no type var, append a empty subst, ok to do this?
|
// NOTE: if is empty, means no type var, append a empty subst, ok to do this?
|
||||||
if result.is_empty() {
|
if result.is_empty() {
|
||||||
|
|
|
@ -105,8 +105,6 @@ pub fn parse_ast_to_type_annotation_kinds<T>(
|
||||||
Ok(TypeAnnotation::CustomClass { id: obj_id, params: vec![] })
|
Ok(TypeAnnotation::CustomClass { id: obj_id, params: vec![] })
|
||||||
} else if let Ok(ty) = resolver.get_symbol_type(unifier, top_level_defs, primitives, *id) {
|
} else if let Ok(ty) = resolver.get_symbol_type(unifier, top_level_defs, primitives, *id) {
|
||||||
if let TypeEnum::TVar { .. } = unifier.get_ty(ty).as_ref() {
|
if let TypeEnum::TVar { .. } = unifier.get_ty(ty).as_ref() {
|
||||||
let var = unifier.get_fresh_var(Some(*id), Some(expr.location)).0;
|
|
||||||
unifier.unify(var, ty).unwrap();
|
|
||||||
Ok(TypeAnnotation::TypeVar(ty))
|
Ok(TypeAnnotation::TypeVar(ty))
|
||||||
} else {
|
} else {
|
||||||
Err(format!("`{}` is not a valid type annotation (at {})", id, expr.location))
|
Err(format!("`{}` is not a valid type annotation (at {})", id, expr.location))
|
||||||
|
|
|
@ -156,9 +156,9 @@ pub type SharedUnifier = Arc<Mutex<(UnificationTable<TypeEnum>, u32, Vec<Call>)>
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Unifier {
|
pub struct Unifier {
|
||||||
pub top_level: Option<Arc<TopLevelContext>>,
|
pub(crate) top_level: Option<Arc<TopLevelContext>>,
|
||||||
unification_table: UnificationTable<Rc<TypeEnum>>,
|
pub(crate) unification_table: UnificationTable<Rc<TypeEnum>>,
|
||||||
pub(super) calls: Vec<Rc<Call>>,
|
pub(crate) calls: Vec<Rc<Call>>,
|
||||||
var_id: u32,
|
var_id: u32,
|
||||||
unify_cache: HashSet<(Type, Type)>,
|
unify_cache: HashSet<(Type, Type)>,
|
||||||
snapshot: Option<(usize, u32)>
|
snapshot: Option<(usize, u32)>
|
||||||
|
|
Loading…
Reference in New Issue