chore: fix minor bugs

This commit is contained in:
Shunsuke Shibayama 2023-05-17 19:56:28 +09:00
parent c8f71d78f9
commit 0b0badfef4
4 changed files with 30 additions and 21 deletions

View file

@ -7,7 +7,7 @@ use std::time::SystemTime;
use erg_common::config::ErgMode; use erg_common::config::ErgMode;
use erg_common::consts::PYTHON_MODE; use erg_common::consts::PYTHON_MODE;
use erg_common::env::erg_pystd_path; use erg_common::env::is_pystd_main_module;
use erg_common::erg_util::BUILTIN_ERG_MODS; use erg_common::erg_util::BUILTIN_ERG_MODS;
use erg_common::levenshtein::get_similar_name; use erg_common::levenshtein::get_similar_name;
use erg_common::python_util::BUILTIN_PYTHON_MODS; use erg_common::python_util::BUILTIN_PYTHON_MODS;
@ -1854,18 +1854,6 @@ impl Context {
get_similar_name(BUILTIN_ERG_MODS.into_iter(), name).map(Str::rc) get_similar_name(BUILTIN_ERG_MODS.into_iter(), name).map(Str::rc)
} }
fn is_pystd_main_module(&self, path: &Path) -> bool {
let mut path = PathBuf::from(path);
if path.ends_with("__init__.d.er") {
path.pop();
path.pop();
} else {
path.pop();
}
let pystd_path = erg_pystd_path();
path == pystd_path
}
/// e.g. http.d/client.d.er -> http.client /// e.g. http.d/client.d.er -> http.client
/// math.d.er -> math /// math.d.er -> math
fn mod_name(&self, path: &Path) -> Str { fn mod_name(&self, path: &Path) -> Str {
@ -1907,7 +1895,7 @@ impl Context {
if Self::can_reuse(&path).is_none() { if Self::can_reuse(&path).is_none() {
let _ = self.try_gen_py_decl_file(__name__); let _ = self.try_gen_py_decl_file(__name__);
} }
if self.is_pystd_main_module(path.as_path()) if is_pystd_main_module(path.as_path())
&& !BUILTIN_PYTHON_MODS.contains(&&__name__[..]) && !BUILTIN_PYTHON_MODS.contains(&&__name__[..])
{ {
let err = TyCheckError::module_env_error( let err = TyCheckError::module_env_error(

View file

@ -2575,6 +2575,13 @@ impl Expr {
self.call_expr(Args::single(PosArg::new(expr))) self.call_expr(Args::single(PosArg::new(expr)))
} }
pub fn call2(self, expr1: Expr, expr2: Expr) -> Self {
self.call_expr(Args::pos_only(
vec![PosArg::new(expr1), PosArg::new(expr2)],
None,
))
}
pub fn attr(self, ident: Identifier) -> Accessor { pub fn attr(self, ident: Identifier) -> Accessor {
Accessor::attr(self, ident) Accessor::attr(self, ident)
} }

View file

@ -2800,7 +2800,7 @@ impl Type {
) )
} }
// TODO: consider variances // TODO: consider variances
_ => self.clone().replace(&Type::Failure, &Type::Never), _ => self.clone().replace(&Self::Failure, &Self::Never),
} }
} }
@ -2811,17 +2811,20 @@ impl Type {
match self { match self {
Self::FreeVar(fv) if fv.is_linked() => fv.crack().clone()._replace(target, to), Self::FreeVar(fv) if fv.is_linked() => fv.crack().clone()._replace(target, to),
Self::FreeVar(fv) => { Self::FreeVar(fv) => {
let fv = fv.deep_clone(); let fv_clone = fv.deep_clone();
if let Some((sub, sup)) = fv.get_subsup() { if let Some((sub, sup)) = fv_clone.get_subsup() {
fv.dummy_link(); fv.dummy_link();
fv_clone.dummy_link();
let sub = sub._replace(target, to); let sub = sub._replace(target, to);
let sup = sup._replace(target, to); let sup = sup._replace(target, to);
fv.undo(); fv.undo();
fv.update_constraint(Constraint::new_sandwiched(sub, sup), true); fv_clone.undo();
} else if let Some(ty) = fv.get_type() { fv_clone.update_constraint(Constraint::new_sandwiched(sub, sup), true);
fv.update_constraint(Constraint::new_type_of(ty._replace(target, to)), true); } else if let Some(ty) = fv_clone.get_type() {
fv_clone
.update_constraint(Constraint::new_type_of(ty._replace(target, to)), true);
} }
Self::FreeVar(fv) Self::FreeVar(fv_clone)
} }
Self::Refinement(mut refine) => { Self::Refinement(mut refine) => {
refine.t = Box::new(refine.t._replace(target, to)); refine.t = Box::new(refine.t._replace(target, to));

View file

@ -4424,6 +4424,17 @@ impl Expr {
Self::Call(self.call(args)) Self::Call(self.call(args))
} }
pub fn call1(self, expr: Expr) -> Self {
self.call_expr(Args::pos_only(vec![PosArg::new(expr)], None))
}
pub fn call2(self, expr1: Expr, expr2: Expr) -> Self {
self.call_expr(Args::pos_only(
vec![PosArg::new(expr1), PosArg::new(expr2)],
None,
))
}
pub fn type_asc(self, t_spec: TypeSpecWithOp) -> TypeAscription { pub fn type_asc(self, t_spec: TypeSpecWithOp) -> TypeAscription {
TypeAscription::new(self, t_spec) TypeAscription::new(self, t_spec)
} }