diff --git a/crates/tinymist-query/src/document_symbol.rs b/crates/tinymist-query/src/document_symbol.rs index 8f014f56..c103cfcf 100644 --- a/crates/tinymist-query/src/document_symbol.rs +++ b/crates/tinymist-query/src/document_symbol.rs @@ -1,5 +1,3 @@ -use lsp_types::SymbolKind; - use crate::{ prelude::*, syntax::{get_lexical_hierarchy, LexicalHierarchy, LexicalScopeKind}, @@ -46,14 +44,14 @@ fn symbols_in_hierarchy( ) -> Vec { hierarchy .iter() - .filter(|hierarchy| TryInto::::try_into(hierarchy.info.kind.clone()).is_ok()) + .filter(|hierarchy| hierarchy.info.kind.is_valid_lsp_symbol()) .map(|hierarchy| { let range = to_lsp_range(hierarchy.info.range.clone(), source, position_encoding); DocumentSymbol { name: hierarchy.info.name.to_string(), detail: None, - kind: hierarchy.info.kind.clone().try_into().unwrap(), + kind: hierarchy.info.kind.clone().into(), tags: None, deprecated: None, range, diff --git a/crates/tinymist-query/src/symbol.rs b/crates/tinymist-query/src/symbol.rs index 0c628115..8efd05bd 100644 --- a/crates/tinymist-query/src/symbol.rs +++ b/crates/tinymist-query/src/symbol.rs @@ -32,8 +32,6 @@ impl SemanticRequest for SymbolRequest { type Response = Vec; fn request(self, ctx: &mut LocalContext) -> Option { - // todo: let typst.ts expose source - let mut symbols = vec![]; for id in ctx.depended_files() { @@ -75,6 +73,7 @@ fn filter_document_symbols( .into_iter() .chain(hierarchy.children.as_deref().into_iter().flatten()) }) + .filter(|hierarchy| hierarchy.info.kind.is_valid_lsp_symbol()) .flat_map(|hierarchy| { if query_string.is_some_and(|s| !hierarchy.info.name.contains(s)) { return None; @@ -84,7 +83,7 @@ fn filter_document_symbols( Some(SymbolInformation { name: hierarchy.info.name.to_string(), - kind: hierarchy.info.kind.clone().try_into().unwrap(), + kind: hierarchy.info.kind.clone().into(), tags: None, deprecated: None, location: LspLocation { diff --git a/crates/tinymist-query/src/syntax/lexical_hierarchy.rs b/crates/tinymist-query/src/syntax/lexical_hierarchy.rs index 6430a7f1..9be05cfd 100644 --- a/crates/tinymist-query/src/syntax/lexical_hierarchy.rs +++ b/crates/tinymist-query/src/syntax/lexical_hierarchy.rs @@ -89,18 +89,21 @@ impl LexicalKind { const fn variable() -> LexicalKind { LexicalKind::Var(LexicalVarKind::Variable) } + + pub fn is_valid_lsp_symbol(&self) -> bool { + !matches!(self, LexicalKind::Block | LexicalKind::CommentGroup) + } } -impl TryFrom for SymbolKind { - type Error = (); - - fn try_from(value: LexicalKind) -> Result { +impl From for SymbolKind { + fn from(value: LexicalKind) -> Self { + use LexicalVarKind::*; match value { - LexicalKind::Heading(..) => Ok(SymbolKind::NAMESPACE), - LexicalKind::Var(LexicalVarKind::Variable) => Ok(SymbolKind::VARIABLE), - LexicalKind::Var(LexicalVarKind::Function) => Ok(SymbolKind::FUNCTION), - LexicalKind::Var(LexicalVarKind::Label) => Ok(SymbolKind::CONSTANT), - LexicalKind::Var(..) | LexicalKind::Block | LexicalKind::CommentGroup => Err(()), + LexicalKind::Heading(..) => SymbolKind::NAMESPACE, + LexicalKind::Var(ValRef | Variable) => SymbolKind::VARIABLE, + LexicalKind::Var(Function) => SymbolKind::FUNCTION, + LexicalKind::Var(LabelRef | Label | BibKey) => SymbolKind::CONSTANT, + LexicalKind::Block | LexicalKind::CommentGroup => SymbolKind::CONSTANT, } } } diff --git a/crates/tinymist-query/src/workspace_label.rs b/crates/tinymist-query/src/workspace_label.rs index 5c51acab..601a275a 100644 --- a/crates/tinymist-query/src/workspace_label.rs +++ b/crates/tinymist-query/src/workspace_label.rs @@ -64,7 +64,7 @@ fn filter_document_labels( Some(SymbolInformation { name: hierarchy.info.name.to_string(), - kind: hierarchy.info.kind.clone().try_into().unwrap(), + kind: hierarchy.info.kind.clone().into(), tags: None, deprecated: None, location: LspLocation {