diff --git a/crates/erg_common/config.rs b/crates/erg_common/config.rs index 8fa97f4f..229aaa44 100644 --- a/crates/erg_common/config.rs +++ b/crates/erg_common/config.rs @@ -180,6 +180,8 @@ pub struct ErgConfig { pub effect_check: bool, pub ownership_check: bool, pub use_pylyzer: bool, + pub no_infer_fn_type: bool, + pub fast_error_report: bool, } impl Default for ErgConfig { @@ -208,6 +210,8 @@ impl Default for ErgConfig { effect_check: true, ownership_check: true, use_pylyzer: false, + no_infer_fn_type: false, + fast_error_report: false, } } } diff --git a/crates/erg_compiler/context/inquire.rs b/crates/erg_compiler/context/inquire.rs index 9796801e..bc2cc4eb 100644 --- a/crates/erg_compiler/context/inquire.rs +++ b/crates/erg_compiler/context/inquire.rs @@ -2913,6 +2913,9 @@ impl Context { } pub(crate) fn get_similar_name(&self, name: &str) -> Option<&str> { + if self.cfg.fast_error_report { + return None; + } levenshtein::get_similar_name( self.dir().into_iter().map(|(vn, _)| &vn.inspect()[..]), name, @@ -2924,6 +2927,9 @@ impl Context { } pub(crate) fn get_similar_name_and_info(&self, name: &str) -> Option<(&VarInfo, &str)> { + if self.cfg.fast_error_report { + return None; + } levenshtein::get_similar_name_and_some( self.dir() .into_iter() @@ -2948,6 +2954,9 @@ impl Context { } pub(crate) fn get_similar_attr<'a>(&'a self, self_t: &'a Type, name: &str) -> Option<&'a str> { + if self.cfg.fast_error_report { + return None; + } for ctx in self.get_nominal_super_type_ctxs(self_t)? { if let Some(name) = ctx.get_similar_name(name) { return Some(name); @@ -2973,6 +2982,9 @@ impl Context { self_t: &'a Type, name: &str, ) -> Option<(&'a VarInfo, &'a str)> { + if self.cfg.fast_error_report { + return None; + } for ctx in self.get_nominal_super_type_ctxs(self_t)? { if let Some((vi, name)) = ctx.get_similar_name_and_info(name) { return Some((vi, name)); diff --git a/crates/erg_compiler/context/instantiate_spec.rs b/crates/erg_compiler/context/instantiate_spec.rs index 22e0f297..cc750581 100644 --- a/crates/erg_compiler/context/instantiate_spec.rs +++ b/crates/erg_compiler/context/instantiate_spec.rs @@ -256,6 +256,8 @@ impl Context { let mut tmp_tv_cache = TyVarCache::new(self.level, self); let spec_t = if let Some(t_spec) = t_spec { self.instantiate_typespec_full(t_spec, None, &mut tmp_tv_cache, mode, false)? + } else if self.cfg.no_infer_fn_type { + Type::Failure } else { free_var(self.level, Constraint::new_type_of(Type)) }; @@ -405,6 +407,8 @@ impl Context { ty } } + } else if self.cfg.no_infer_fn_type { + Type::Failure } else { // preregisterならouter scopeで型宣言(see inference.md) let level = if mode.is_preregister() { @@ -451,6 +455,9 @@ impl Context { ) -> Failable { let mut errs = TyCheckErrors::empty(); let gen_free_t = || { + if self.cfg.no_infer_fn_type { + return Type::Failure; + } let level = if mode.is_preregister() { self.level } else {