diff options
Diffstat (limited to 'support/texlab/src/features/symbol/bibtex.rs')
-rw-r--r-- | support/texlab/src/features/symbol/bibtex.rs | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/support/texlab/src/features/symbol/bibtex.rs b/support/texlab/src/features/symbol/bibtex.rs index db555a7176..bbc9026b0b 100644 --- a/support/texlab/src/features/symbol/bibtex.rs +++ b/support/texlab/src/features/symbol/bibtex.rs @@ -1,30 +1,24 @@ -use cancellation::CancellationToken; +use lsp_types::DocumentSymbolParams; +use rowan::ast::AstNode; use crate::{ - syntax::{ - bibtex::{self, HasType}, - CstNode, - }, - BibtexEntryTypeCategory, LineIndexExt, WorkspaceSubset, LANGUAGE_DATA, + features::FeatureRequest, + syntax::bibtex::{self, HasName, HasType}, + BibtexEntryTypeCategory, LineIndexExt, LANGUAGE_DATA, }; use super::types::{InternalSymbol, InternalSymbolKind}; pub fn find_bibtex_symbols( - subset: &WorkspaceSubset, + request: &FeatureRequest<DocumentSymbolParams>, buf: &mut Vec<InternalSymbol>, - token: &CancellationToken, ) -> Option<()> { - let main_document = subset.documents.first()?; + let main_document = request.main_document(); let data = main_document.data.as_bibtex()?; - for node in data.root.children() { - if token.is_canceled() { - return None; - } - - if let Some(string) = bibtex::String::cast(node) { - if let Some(name) = string.name() { + for node in bibtex::SyntaxNode::new_root(data.green.clone()).children() { + if let Some(string) = bibtex::StringDef::cast(node.clone()) { + if let Some(name) = string.name_token() { buf.push(InternalSymbol { name: name.text().into(), label: None, @@ -32,7 +26,7 @@ pub fn find_bibtex_symbols( deprecated: false, full_range: main_document .line_index - .line_col_lsp_range(string.small_range()), + .line_col_lsp_range(string.syntax().text_range()), selection_range: main_document .line_index .line_col_lsp_range(name.text_range()), @@ -40,11 +34,11 @@ pub fn find_bibtex_symbols( }) } } else if let Some(entry) = bibtex::Entry::cast(node) { - if let Some(ty) = entry.ty() { - if let Some(key) = entry.key() { + if let Some(ty) = entry.type_token() { + if let Some(key) = entry.name_token() { let mut children = Vec::new(); for field in entry.fields() { - if let Some(name) = field.name() { + if let Some(name) = field.name_token() { let symbol = InternalSymbol { name: name.text().to_string(), label: None, @@ -52,7 +46,7 @@ pub fn find_bibtex_symbols( deprecated: false, full_range: main_document .line_index - .line_col_lsp_range(field.small_range()), + .line_col_lsp_range(field.syntax().text_range()), selection_range: main_document .line_index .line_col_lsp_range(name.text_range()), @@ -74,10 +68,10 @@ pub fn find_bibtex_symbols( deprecated: false, full_range: main_document .line_index - .line_col_lsp_range(entry.small_range()), + .line_col_lsp_range(entry.syntax().text_range()), selection_range: main_document .line_index - .line_col_lsp_range(key.small_range()), + .line_col_lsp_range(key.text_range()), children, }); } |