diff --git a/kclvm/Cargo.lock b/kclvm/Cargo.lock index 8ac7beda4..14dbfb7a2 100644 --- a/kclvm/Cargo.lock +++ b/kclvm/Cargo.lock @@ -1447,6 +1447,7 @@ dependencies = [ "env_logger", "im-rc", "indexmap 1.9.3", + "insta", "kclvm-ast", "kclvm-config", "kclvm-driver", diff --git a/kclvm/sema/src/advanced_resolver/node.rs b/kclvm/sema/src/advanced_resolver/node.rs index 7cf09ad0e..afc771145 100644 --- a/kclvm/sema/src/advanced_resolver/node.rs +++ b/kclvm/sema/src/advanced_resolver/node.rs @@ -93,6 +93,20 @@ impl<'ctx> MutSelfTypedResultWalker<'ctx> for AdvancedResolver<'ctx> { } self.ctx.maybe_def = true; self.walk_identifier_expr(target)?; + + if let Some(target_ty) = self.ctx.node_ty_map.get(&self.ctx.get_node_key(&target.id)) { + match &target_ty.kind { + TypeKind::Schema(_) => { + let schema_symbol = self + .gs + .get_symbols() + .get_type_symbol(&target_ty, self.get_current_module_info()) + .ok_or(anyhow!("schema_symbol not found"))?; + self.ctx.current_schema_symbol = Some(schema_symbol); + } + _ => {} + } + } self.ctx.maybe_def = false; } self.walk_type_expr(assign_stmt.ty.as_ref().map(|ty| ty.as_ref()))?; @@ -861,7 +875,7 @@ impl<'ctx> AdvancedResolver<'ctx> { } None => Ok(None), }, - some => some, + res => res, } } diff --git a/kclvm/tools/src/LSP/Cargo.toml b/kclvm/tools/src/LSP/Cargo.toml index 2bbb021bd..168bb8afc 100644 --- a/kclvm/tools/src/LSP/Cargo.toml +++ b/kclvm/tools/src/LSP/Cargo.toml @@ -47,3 +47,6 @@ proc_macro_crate = { path = "../../benches/proc_macro_crate" } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] tokio = { version = "1.37.0", features = ["full"] } + +[dev-dependencies] +insta = "1.8.0" diff --git a/kclvm/tools/src/LSP/src/hover.rs b/kclvm/tools/src/LSP/src/hover.rs index 537b59b09..aff8456d8 100644 --- a/kclvm/tools/src/LSP/src/hover.rs +++ b/kclvm/tools/src/LSP/src/hover.rs @@ -610,4 +610,34 @@ mod tests { _ => unreachable!("test error"), } } + + #[test] + #[bench_test] + fn dict_key_in_schema() { + let (file, program, _, gs) = + compile_test_file("src/test_data/hover_test/dict_key_in_schema/dict_key_in_schema.k"); + let pos = KCLPos { + filename: file.clone(), + line: 5, + column: Some(5), + }; + let got = hover(&program, &pos, &gs).unwrap(); + insta::assert_snapshot!(format!("{:?}", got)); + + let pos = KCLPos { + filename: file.clone(), + line: 9, + column: Some(5), + }; + let got = hover(&program, &pos, &gs).unwrap(); + insta::assert_snapshot!(format!("{:?}", got)); + + let pos = KCLPos { + filename: file.clone(), + line: 13, + column: Some(5), + }; + let got = hover(&program, &pos, &gs).unwrap(); + insta::assert_snapshot!(format!("{:?}", got)); + } } diff --git a/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__hover__tests__dict_key_in_schema-2.snap b/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__hover__tests__dict_key_in_schema-2.snap new file mode 100644 index 000000000..ffbe0c87c --- /dev/null +++ b/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__hover__tests__dict_key_in_schema-2.snap @@ -0,0 +1,5 @@ +--- +source: tools/src/LSP/src/hover.rs +expression: "format!(\"{:?}\", got)" +--- +Hover { contents: Scalar(String("name: int")), range: None } diff --git a/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__hover__tests__dict_key_in_schema-3.snap b/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__hover__tests__dict_key_in_schema-3.snap new file mode 100644 index 000000000..ffbe0c87c --- /dev/null +++ b/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__hover__tests__dict_key_in_schema-3.snap @@ -0,0 +1,5 @@ +--- +source: tools/src/LSP/src/hover.rs +expression: "format!(\"{:?}\", got)" +--- +Hover { contents: Scalar(String("name: int")), range: None } diff --git a/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__hover__tests__dict_key_in_schema.snap b/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__hover__tests__dict_key_in_schema.snap new file mode 100644 index 000000000..ffbe0c87c --- /dev/null +++ b/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__hover__tests__dict_key_in_schema.snap @@ -0,0 +1,5 @@ +--- +source: tools/src/LSP/src/hover.rs +expression: "format!(\"{:?}\", got)" +--- +Hover { contents: Scalar(String("name: int")), range: None } diff --git a/kclvm/tools/src/LSP/src/test_data/hover_test/dict_key_in_schema/dict_key_in_schema.k b/kclvm/tools/src/LSP/src/test_data/hover_test/dict_key_in_schema/dict_key_in_schema.k new file mode 100644 index 000000000..2abb1da0f --- /dev/null +++ b/kclvm/tools/src/LSP/src/test_data/hover_test/dict_key_in_schema/dict_key_in_schema.k @@ -0,0 +1,14 @@ +schema Name: + name: int + +n1: Name = { + name = 1 +} + +n2 = Name{ + name: 1 +} + +n3: Name = Name{ + name: 1 +} \ No newline at end of file