From c17649847f944cc487295901da164981fdc9bf83 Mon Sep 17 00:00:00 2001 From: zongz Date: Mon, 25 Sep 2023 16:54:47 +0800 Subject: [PATCH] feat: add a suggestion for 'name not found' Signed-off-by: zongz --- kclvm/sema/src/resolver/scope.rs | 18 ++++++++++++++- .../test_fail_data/not_found_suggest/main.k | 3 +++ .../not_found_suggest/sub/main.k | 1 + kclvm/sema/src/resolver/tests.rs | 23 +++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 kclvm/sema/src/resolver/test_fail_data/not_found_suggest/main.k create mode 100644 kclvm/sema/src/resolver/test_fail_data/not_found_suggest/sub/main.k diff --git a/kclvm/sema/src/resolver/scope.rs b/kclvm/sema/src/resolver/scope.rs index 6ebef568b..8c25ccd20 100644 --- a/kclvm/sema/src/resolver/scope.rs +++ b/kclvm/sema/src/resolver/scope.rs @@ -407,8 +407,24 @@ impl<'ctx> Resolver<'ctx> { match self.find_type_in_scope(name) { Some(ty) => ty, None => { + let mut suggestion = String::new(); + let names = self + .scope + .borrow() + .all_usable_objects() + .keys() + .cloned() + .collect::>(); + let suggs = suggestions::provide_suggestions(name, &names); + if suggs.len() > 0 { + suggestion = format!(", did you mean '{:?}'?", suggs); + } self.handler.add_compile_error( - &format!("name '{}' is not defined", name.replace('@', "")), + &format!( + "name '{}' is not defined{}", + name.replace('@', ""), + suggestion + ), range, ); self.any_ty() diff --git a/kclvm/sema/src/resolver/test_fail_data/not_found_suggest/main.k b/kclvm/sema/src/resolver/test_fail_data/not_found_suggest/main.k new file mode 100644 index 000000000..46fc19516 --- /dev/null +++ b/kclvm/sema/src/resolver/test_fail_data/not_found_suggest/main.k @@ -0,0 +1,3 @@ +import sub as s1 + +main = s.sub \ No newline at end of file diff --git a/kclvm/sema/src/resolver/test_fail_data/not_found_suggest/sub/main.k b/kclvm/sema/src/resolver/test_fail_data/not_found_suggest/sub/main.k new file mode 100644 index 000000000..fd778d797 --- /dev/null +++ b/kclvm/sema/src/resolver/test_fail_data/not_found_suggest/sub/main.k @@ -0,0 +1 @@ +sub = "sub" \ No newline at end of file diff --git a/kclvm/sema/src/resolver/tests.rs b/kclvm/sema/src/resolver/tests.rs index 9f7c6267a..2d1a777e8 100644 --- a/kclvm/sema/src/resolver/tests.rs +++ b/kclvm/sema/src/resolver/tests.rs @@ -498,3 +498,26 @@ fn test_system_package() { .ty .is_func()); } + +#[test] +fn test_resolve_program_import_suggest() { + let sess = Arc::new(ParseSession::default()); + let mut program = load_program( + sess.clone(), + &["./src/resolver/test_fail_data/not_found_suggest/main.k"], + None, + ) + .unwrap(); + let scope = resolve_program(&mut program); + assert_eq!(scope.handler.diagnostics.len(), 2); + let diag = &scope.handler.diagnostics[0]; + assert_eq!( + diag.code, + Some(DiagnosticId::Error(ErrorKind::CompileError)) + ); + assert_eq!(diag.messages.len(), 1); + assert_eq!( + diag.messages[0].message, + "name 's' is not defined, did you mean '[\"s1\"]'?" + ); +}