From 441a2f592d810cb74864bc4ecd25d3375cda8448 Mon Sep 17 00:00:00 2001 From: He1pa <56333845+He1pa@users.noreply.github.com> Date: Mon, 13 Nov 2023 18:15:42 +0800 Subject: [PATCH] bugfix: fix postion of undefined lambda param (#873) Signed-off-by: he1pa <18012015693@163.com> --- kclvm/sema/src/resolver/node.rs | 6 ++- .../resolver/test_data/undef_lambda_param.k | 3 ++ kclvm/sema/src/resolver/tests.rs | 38 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 kclvm/sema/src/resolver/test_data/undef_lambda_param.k diff --git a/kclvm/sema/src/resolver/node.rs b/kclvm/sema/src/resolver/node.rs index 5d9f8a8ee..262f8a0c8 100644 --- a/kclvm/sema/src/resolver/node.rs +++ b/kclvm/sema/src/resolver/node.rs @@ -961,7 +961,11 @@ impl<'ctx> MutSelfTypedResultWalker<'ctx> for Resolver<'ctx> { for (i, arg) in args.node.args.iter().enumerate() { let name = arg.node.get_name(); let arg_ty = args.node.get_arg_type_node(i); - let ty = self.parse_ty_with_scope(arg_ty, arg.get_span_pos()); + let range = match arg_ty { + Some(arg_type_node) => arg_type_node.get_span_pos(), + None => arg.get_span_pos(), + }; + let ty = self.parse_ty_with_scope(arg_ty, range); // If the arguments type of a lambda is a schema type, // It should be marked as an schema instance type. diff --git a/kclvm/sema/src/resolver/test_data/undef_lambda_param.k b/kclvm/sema/src/resolver/test_data/undef_lambda_param.k new file mode 100644 index 000000000..dd2cd7f86 --- /dev/null +++ b/kclvm/sema/src/resolver/test_data/undef_lambda_param.k @@ -0,0 +1,3 @@ +lambda x: Undef { # 'Undef' is undefined + x +} \ No newline at end of file diff --git a/kclvm/sema/src/resolver/tests.rs b/kclvm/sema/src/resolver/tests.rs index e3126c17c..805fae547 100644 --- a/kclvm/sema/src/resolver/tests.rs +++ b/kclvm/sema/src/resolver/tests.rs @@ -681,3 +681,41 @@ fn test_pkg_not_found_suggestion() { "find more package on 'https://artifacthub.io'" ); } + +#[test] +fn undef_lambda_param() { + let sess = Arc::new(ParseSession::default()); + let mut program = load_program( + sess.clone(), + &["./src/resolver/test_data/undef_lambda_param.k"], + None, + None, + ) + .unwrap(); + let scope = resolve_program(&mut program); + assert_eq!(scope.handler.diagnostics.len(), 1); + + let root = &program.root.clone(); + let filename = Path::new(&root.clone()) + .join("undef_lambda_param.k") + .display() + .to_string(); + + let range = scope.handler.diagnostics[0].messages[0].range.clone(); + + assert_eq!( + range, + ( + Position { + filename: filename.clone(), + line: 1, + column: Some(10), + }, + Position { + filename: filename.clone(), + line: 1, + column: Some(15), + } + ) + ); +}