forked from M-Labs/nac3
nac3core/typecheck: no type variable for monomorphic functions
This commit is contained in:
parent
a508baae20
commit
5ed2b450d3
|
@ -238,8 +238,32 @@ impl<'a> Inferencer<'a> {
|
||||||
method: String,
|
method: String,
|
||||||
obj: Type,
|
obj: Type,
|
||||||
params: Vec<Type>,
|
params: Vec<Type>,
|
||||||
ret: Type,
|
ret: Option<Type>,
|
||||||
) -> InferenceResult {
|
) -> InferenceResult {
|
||||||
|
if let TypeEnum::TObj { params: class_params, fields, .. } = &*self.unifier.get_ty(obj) {
|
||||||
|
if class_params.borrow().is_empty() {
|
||||||
|
if let Some(ty) = fields.borrow().get(&method) {
|
||||||
|
if let TypeEnum::TFunc(sign) = &*self.unifier.get_ty(*ty) {
|
||||||
|
let sign = sign.borrow();
|
||||||
|
if sign.vars.is_empty() {
|
||||||
|
let call = self.unifier.add_call(Call {
|
||||||
|
posargs: params,
|
||||||
|
kwargs: HashMap::new(),
|
||||||
|
fun: RefCell::new(Some(*ty)),
|
||||||
|
ret: sign.ret,
|
||||||
|
});
|
||||||
|
if let Some(ret) = ret {
|
||||||
|
self.unifier.unify(sign.ret, ret).unwrap();
|
||||||
|
}
|
||||||
|
self.calls.insert(location.into(), call);
|
||||||
|
return Ok(sign.ret)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let ret = ret.unwrap_or_else(|| self.unifier.get_fresh_var().0);
|
||||||
|
|
||||||
let call = self.unifier.add_call(Call {
|
let call = self.unifier.add_call(Call {
|
||||||
posargs: params,
|
posargs: params,
|
||||||
kwargs: HashMap::new(),
|
kwargs: HashMap::new(),
|
||||||
|
@ -460,6 +484,24 @@ impl<'a> Inferencer<'a> {
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|v| fold::fold_keyword(self, v))
|
.map(|v| fold::fold_keyword(self, v))
|
||||||
.collect::<Result<Vec<_>, _>>()?;
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
|
|
||||||
|
if let TypeEnum::TFunc(sign) = &*self.unifier.get_ty(func.custom.unwrap()) {
|
||||||
|
let sign = sign.borrow();
|
||||||
|
if sign.vars.is_empty() {
|
||||||
|
let call = self.unifier.add_call(Call {
|
||||||
|
posargs: args.iter().map(|v| v.custom.unwrap()).collect(),
|
||||||
|
kwargs: keywords
|
||||||
|
.iter()
|
||||||
|
.map(|v| (v.node.arg.as_ref().unwrap().clone(), v.custom.unwrap()))
|
||||||
|
.collect(),
|
||||||
|
fun: RefCell::new(func.custom),
|
||||||
|
ret: sign.ret,
|
||||||
|
});
|
||||||
|
self.calls.insert(location.into(), call);
|
||||||
|
return Ok(Located { location, custom: Some(sign.ret), node: ExprKind::Call { func, args, keywords } })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let ret = self.unifier.get_fresh_var().0;
|
let ret = self.unifier.get_fresh_var().0;
|
||||||
let call = self.unifier.add_call(Call {
|
let call = self.unifier.add_call(Call {
|
||||||
posargs: args.iter().map(|v| v.custom.unwrap()).collect(),
|
posargs: args.iter().map(|v| v.custom.unwrap()).collect(),
|
||||||
|
@ -553,13 +595,12 @@ impl<'a> Inferencer<'a> {
|
||||||
right: &ast::Expr<Option<Type>>,
|
right: &ast::Expr<Option<Type>>,
|
||||||
) -> InferenceResult {
|
) -> InferenceResult {
|
||||||
let method = binop_name(op);
|
let method = binop_name(op);
|
||||||
let ret = self.unifier.get_fresh_var().0;
|
|
||||||
self.build_method_call(
|
self.build_method_call(
|
||||||
location,
|
location,
|
||||||
method.to_string(),
|
method.to_string(),
|
||||||
left.custom.unwrap(),
|
left.custom.unwrap(),
|
||||||
vec![right.custom.unwrap()],
|
vec![right.custom.unwrap()],
|
||||||
ret,
|
None,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -569,13 +610,12 @@ impl<'a> Inferencer<'a> {
|
||||||
operand: &ast::Expr<Option<Type>>,
|
operand: &ast::Expr<Option<Type>>,
|
||||||
) -> InferenceResult {
|
) -> InferenceResult {
|
||||||
let method = unaryop_name(op);
|
let method = unaryop_name(op);
|
||||||
let ret = self.unifier.get_fresh_var().0;
|
|
||||||
self.build_method_call(
|
self.build_method_call(
|
||||||
operand.location,
|
operand.location,
|
||||||
method.to_string(),
|
method.to_string(),
|
||||||
operand.custom.unwrap(),
|
operand.custom.unwrap(),
|
||||||
vec![],
|
vec![],
|
||||||
ret,
|
None,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -594,7 +634,7 @@ impl<'a> Inferencer<'a> {
|
||||||
method,
|
method,
|
||||||
a.custom.unwrap(),
|
a.custom.unwrap(),
|
||||||
vec![b.custom.unwrap()],
|
vec![b.custom.unwrap()],
|
||||||
boolean,
|
Some(boolean),
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
Ok(boolean)
|
Ok(boolean)
|
||||||
|
|
Loading…
Reference in New Issue