perf: cheap compilation option

This commit is contained in:
Shunsuke Shibayama 2024-11-10 12:37:25 +09:00
parent fdbfaec19a
commit a7dbdb7c8d
3 changed files with 23 additions and 0 deletions

View file

@ -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,
}
}
}

View file

@ -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));

View file

@ -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<Type> {
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 {