Downgrade to a warn for cmp objs with no `__eq__`

This commit is contained in:
Shunsuke Shibayama 2023-02-24 17:17:44 +09:00
parent 30d1e32aea
commit da8ebcaf43
3 changed files with 64 additions and 6 deletions

8
Cargo.lock generated
View File

@ -253,7 +253,7 @@ checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
[[package]]
name = "els"
version = "0.1.18"
source = "git+https://github.com/erg-lang/erg?branch=main#f604338d996fdee827c51386e23b26b6c0159389"
source = "git+https://github.com/erg-lang/erg?branch=main#f86a4498465aa8a5a0068dfb4a235596f9da462b"
dependencies = [
"erg_common",
"erg_compiler",
@ -274,7 +274,7 @@ dependencies = [
[[package]]
name = "erg_common"
version = "0.6.6"
source = "git+https://github.com/erg-lang/erg?branch=main#f604338d996fdee827c51386e23b26b6c0159389"
source = "git+https://github.com/erg-lang/erg?branch=main#f86a4498465aa8a5a0068dfb4a235596f9da462b"
dependencies = [
"backtrace-on-stack-overflow",
"hermit-abi",
@ -285,7 +285,7 @@ dependencies = [
[[package]]
name = "erg_compiler"
version = "0.6.6"
source = "git+https://github.com/erg-lang/erg?branch=main#f604338d996fdee827c51386e23b26b6c0159389"
source = "git+https://github.com/erg-lang/erg?branch=main#f86a4498465aa8a5a0068dfb4a235596f9da462b"
dependencies = [
"erg_common",
"erg_parser",
@ -294,7 +294,7 @@ dependencies = [
[[package]]
name = "erg_parser"
version = "0.6.6"
source = "git+https://github.com/erg-lang/erg?branch=main#f604338d996fdee827c51386e23b26b6c0159389"
source = "git+https://github.com/erg-lang/erg?branch=main#f86a4498465aa8a5a0068dfb4a235596f9da462b"
dependencies = [
"erg_common",
"unicode-xid 0.2.4",

View File

@ -125,8 +125,11 @@ impl PythonAnalyzer {
Err(iart) => {
errors.extend(iart.errors);
let errors = handle_err::filter_errors(self.checker.get_mod_ctx(), errors);
let (errors, _warns) =
handle_err::downgrade_errors(self.checker.get_mod_ctx(), errors);
warns.extend(iart.warns);
let warns = handle_err::filter_errors(self.checker.get_mod_ctx(), warns);
let mut warns = handle_err::filter_errors(self.checker.get_mod_ctx(), warns);
warns.extend(_warns);
Err(IncompleteArtifact::new(iart.object, errors, warns))
}
}

View File

@ -1,8 +1,18 @@
use erg_common::error::ErrorKind;
use erg_common::log;
use erg_common::traits::Stream;
use erg_common::Str;
// use erg_common::style::{remove_style, StyledString, Color};
use erg_compiler::context::ModuleContext;
use erg_compiler::error::{CompileError, CompileErrors};
use erg_compiler::error::{CompileError, CompileErrors, CompileWarning, CompileWarnings};
pub fn default_implementations(op: &str) -> Option<&str> {
match op {
"`==`" => Some("__eq__"),
"`!=`" => Some("__ne__"),
_ => None,
}
}
pub(crate) fn filter_errors(ctx: &ModuleContext, errors: CompileErrors) -> CompileErrors {
errors
@ -35,3 +45,48 @@ fn filter_error(_ctx: &ModuleContext, error: CompileError) -> Option<CompileErro
_ => Some(error),
}
}
pub(crate) fn downgrade_errors(
ctx: &ModuleContext,
errors: CompileErrors,
) -> (CompileErrors, CompileWarnings) {
let mut errs = CompileErrors::empty();
let mut warns = CompileWarnings::empty();
for error in errors {
match downgrade_error(ctx, error) {
Ok(err) => errs.push(err),
Err(warn) => warns.push(warn),
}
}
(errs, warns)
}
#[allow(clippy::result_large_err)]
fn downgrade_error(
_ctx: &ModuleContext,
mut error: CompileError,
) -> Result<CompileError, CompileWarning> {
match error.core.kind {
ErrorKind::TypeError => {
// TODO: trim escape sequences
let callee = Str::rc(
error
.core
.main_message
.trim_start_matches("the type of ")
.trim_end_matches(" is mismatched"),
);
if let Some(op) = callee.find_sub(&["`==`", "`!=`"]) {
error.core.main_message = format!(
"this object does not implement `{}`",
default_implementations(op).unwrap()
);
error.core.kind = ErrorKind::TypeWarning;
Err(error)
} else {
Ok(error)
}
}
_ => Ok(error),
}
}