diff --git a/kclvm/sema/src/resolver/node.rs b/kclvm/sema/src/resolver/node.rs index cd257871c..ea2293585 100644 --- a/kclvm/sema/src/resolver/node.rs +++ b/kclvm/sema/src/resolver/node.rs @@ -158,14 +158,6 @@ impl<'ctx> MutSelfTypedResultWalker<'ctx> for Resolver<'ctx> { value_ty = self.expr(&assign_stmt.value); self.clear_config_expr_context(init_stack_depth as usize, false) } - TypeKind::Dict(_) => { - value_ty = self.expr(&assign_stmt.value); - if !assign_stmt.type_annotation.is_none() { - // Check type annotation if exists. - self.check_assignment_type_annotation(assign_stmt, value_ty.clone()); - } - self.set_type_to_scope(name, value_ty.clone(), &target.node.names[0]); - } _ => { value_ty = self.expr(&assign_stmt.value); // Check type annotation if exists. diff --git a/kclvm/sema/src/resolver/test_data/ty_in_lambda.k b/kclvm/sema/src/resolver/test_data/ty_in_lambda.k new file mode 100644 index 000000000..4b9a1929c --- /dev/null +++ b/kclvm/sema/src/resolver/test_data/ty_in_lambda.k @@ -0,0 +1,9 @@ +_b = True +a = lambda item: {str:}, c: {str:} -> {str:str} { + result = {"aaa": "bbb"} + if _b : + result = {} + result +} + +result = {"ccc": "ddd"} diff --git a/kclvm/sema/src/resolver/tests.rs b/kclvm/sema/src/resolver/tests.rs index b7c78100c..19fae70b5 100644 --- a/kclvm/sema/src/resolver/tests.rs +++ b/kclvm/sema/src/resolver/tests.rs @@ -775,3 +775,28 @@ fn test_schema_params_count() { "expected 1 positional argument, found 0" ); } + +#[test] +fn test_set_ty_in_lambda() { + let sess = Arc::new(ParseSession::default()); + let mut program = load_program( + sess.clone(), + &["./src/resolver/test_data/ty_in_lambda.k"], + None, + None, + ) + .unwrap(); + assert_eq!( + resolve_program(&mut program) + .main_scope() + .unwrap() + .borrow() + .lookup("result") + .unwrap() + .borrow() + .ty + .clone() + .ty_str(), + "{str:str}" + ); +} diff --git a/kclvm/tools/src/LSP/src/hover.rs b/kclvm/tools/src/LSP/src/hover.rs index dd87e4db7..31ce61c22 100644 --- a/kclvm/tools/src/LSP/src/hover.rs +++ b/kclvm/tools/src/LSP/src/hover.rs @@ -384,6 +384,27 @@ mod tests { } } + #[test] + #[bench_test] + fn assignment_ty_in_lambda_hover() { + let (file, program, prog_scope, _, gs) = + compile_test_file("src/test_data/hover_test/ty_in_lambda.k"); + let pos = KCLPos { + filename: file.clone(), + line: 3, + column: Some(8), + }; + let got = hover(&program, &pos, &prog_scope, &gs).unwrap(); + match got.contents { + lsp_types::HoverContents::Scalar(marked_string) => { + if let MarkedString::String(s) = marked_string { + assert_eq!(s, "result: {str:str}"); + } + } + _ => unreachable!("test error"), + } + } + #[test] #[bench_test] fn str_var_func_hover() { diff --git a/kclvm/tools/src/LSP/src/test_data/hover_test/ty_in_lambda.k b/kclvm/tools/src/LSP/src/test_data/hover_test/ty_in_lambda.k new file mode 100644 index 000000000..4b9a1929c --- /dev/null +++ b/kclvm/tools/src/LSP/src/test_data/hover_test/ty_in_lambda.k @@ -0,0 +1,9 @@ +_b = True +a = lambda item: {str:}, c: {str:} -> {str:str} { + result = {"aaa": "bbb"} + if _b : + result = {} + result +} + +result = {"ccc": "ddd"}