diff --git a/Cargo.lock b/Cargo.lock index 1768589..012da77 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/src/analyze.rs b/src/analyze.rs index 77c5fa7..b8ac87e 100644 --- a/src/analyze.rs +++ b/src/analyze.rs @@ -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)) } } diff --git a/src/handle_err.rs b/src/handle_err.rs index 479a6d1..0806f28 100644 --- a/src/handle_err.rs +++ b/src/handle_err.rs @@ -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 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 { + 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), + } +}