From 6385e307290343ffd2b482021220b51f0f75e019 Mon Sep 17 00:00:00 2001 From: He1pa <56333845+He1pa@users.noreply.github.com> Date: Mon, 22 Jul 2024 16:27:35 +0800 Subject: [PATCH] fix: fix unexpected complete item in schema doc. (#1514) * fix: fix error complete item in schema doc. Add CommentOrDocSymbol in advanced resolver to represent scehma doc Signed-off-by: he1pa <18012015693@163.com> * fmt Signed-off-by: he1pa <18012015693@163.com> --------- Signed-off-by: he1pa <18012015693@163.com> --- kclvm/sema/src/advanced_resolver/node.rs | 17 ++++++++++++++--- kclvm/sema/src/core/symbol.rs | 10 +++++----- kclvm/tools/src/LSP/src/completion.rs | 8 ++++++++ ..._completion__tests__func_doc_completion.snap | 5 +++++ .../completion_test/schema_doc/schema_doc.k | 14 ++++++++++++++ 5 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 kclvm/tools/src/LSP/src/snapshots/kcl_language_server__completion__tests__func_doc_completion.snap create mode 100644 kclvm/tools/src/LSP/src/test_data/completion_test/schema_doc/schema_doc.k diff --git a/kclvm/sema/src/advanced_resolver/node.rs b/kclvm/sema/src/advanced_resolver/node.rs index e58aa43fd..ce8bb7eda 100644 --- a/kclvm/sema/src/advanced_resolver/node.rs +++ b/kclvm/sema/src/advanced_resolver/node.rs @@ -11,8 +11,8 @@ use crate::{ core::{ scope::LocalSymbolScopeKind, symbol::{ - CommentSymbol, DecoratorSymbol, ExpressionSymbol, Symbol, SymbolHint, SymbolHintKind, - SymbolRef, SymbolSemanticInfo, UnresolvedSymbol, ValueSymbol, + CommentOrDocSymbol, DecoratorSymbol, ExpressionSymbol, Symbol, SymbolHint, + SymbolHintKind, SymbolRef, SymbolSemanticInfo, UnresolvedSymbol, ValueSymbol, }, }, ty::{self, Type, TypeKind, SCHEMA_MEMBER_FUNCTIONS}, @@ -308,6 +308,17 @@ impl<'ctx> MutSelfTypedResultWalker<'ctx> for AdvancedResolver<'ctx> { } last_end_pos = index_signature.get_end_pos(); } + + if let Some(doc) = &schema_stmt.doc { + let (start, end) = doc.get_span_pos(); + let comment_symbol = CommentOrDocSymbol::new(start, end, doc.node.clone()); + self.gs.get_symbols_mut().alloc_comment_symbol( + comment_symbol, + self.ctx.get_node_key(&self.ctx.cur_node), + self.ctx.current_pkgpath.clone().unwrap(), + ); + } + for stmt in schema_stmt.body.iter() { if let Some(attribute_symbol) = self.stmt(&stmt)? { let name = self @@ -860,7 +871,7 @@ impl<'ctx> MutSelfTypedResultWalker<'ctx> for AdvancedResolver<'ctx> { fn walk_comment(&mut self, comment: &'ctx ast::Comment) -> Self::Result { let (start, end) = (self.ctx.start_pos.clone(), self.ctx.end_pos.clone()); - let comment_symbol = CommentSymbol::new(start, end, comment.text.clone()); + let comment_symbol = CommentOrDocSymbol::new(start, end, comment.text.clone()); Ok(self.gs.get_symbols_mut().alloc_comment_symbol( comment_symbol, self.ctx.get_node_key(&self.ctx.cur_node), diff --git a/kclvm/sema/src/core/symbol.rs b/kclvm/sema/src/core/symbol.rs index 16704f7e8..2c8583d69 100644 --- a/kclvm/sema/src/core/symbol.rs +++ b/kclvm/sema/src/core/symbol.rs @@ -71,7 +71,7 @@ pub struct SymbolData { pub(crate) unresolved: Arena, pub(crate) rules: Arena, pub(crate) exprs: Arena, - pub(crate) comments: Arena, + pub(crate) comments: Arena, pub(crate) decorators: Arena, pub(crate) functions: Arena, @@ -792,7 +792,7 @@ impl SymbolData { pub fn alloc_comment_symbol( &mut self, - comment: CommentSymbol, + comment: CommentOrDocSymbol, node_key: NodeKey, pkg_name: String, ) -> Option { @@ -2087,7 +2087,7 @@ impl ExpressionSymbol { } #[derive(Debug, Clone)] -pub struct CommentSymbol { +pub struct CommentOrDocSymbol { pub(crate) id: Option, pub(crate) start: Position, pub(crate) end: Position, @@ -2095,7 +2095,7 @@ pub struct CommentSymbol { pub(crate) sema_info: SymbolSemanticInfo, } -impl Symbol for CommentSymbol { +impl Symbol for CommentOrDocSymbol { type SymbolData = SymbolData; type SemanticInfo = SymbolSemanticInfo; type SymbolHint = SymbolHint; @@ -2183,7 +2183,7 @@ impl Symbol for CommentSymbol { } } -impl CommentSymbol { +impl CommentOrDocSymbol { pub fn new(start: Position, end: Position, content: String) -> Self { Self { id: None, diff --git a/kclvm/tools/src/LSP/src/completion.rs b/kclvm/tools/src/LSP/src/completion.rs index 288d15e18..512de3ccd 100644 --- a/kclvm/tools/src/LSP/src/completion.rs +++ b/kclvm/tools/src/LSP/src/completion.rs @@ -2048,4 +2048,12 @@ mod tests { 2, Some('.') ); + + completion_label_test_snapshot!( + func_doc_completion, + "src/test_data/completion_test/schema_doc/schema_doc.k", + 7, + 14, + Some('.') + ); } diff --git a/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__completion__tests__func_doc_completion.snap b/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__completion__tests__func_doc_completion.snap new file mode 100644 index 000000000..f9d531ae0 --- /dev/null +++ b/kclvm/tools/src/LSP/src/snapshots/kcl_language_server__completion__tests__func_doc_completion.snap @@ -0,0 +1,5 @@ +--- +source: tools/src/LSP/src/completion.rs +expression: "format!(\"{:?}\", got_labels)" +--- +[] diff --git a/kclvm/tools/src/LSP/src/test_data/completion_test/schema_doc/schema_doc.k b/kclvm/tools/src/LSP/src/test_data/completion_test/schema_doc/schema_doc.k new file mode 100644 index 000000000..810a02ec6 --- /dev/null +++ b/kclvm/tools/src/LSP/src/test_data/completion_test/schema_doc/schema_doc.k @@ -0,0 +1,14 @@ +schema Name: + """ + + + Attributes + ---------- + name: str + + Examples + -------- + """ + name: str + +# aaax \ No newline at end of file