diff options
Diffstat (limited to 'support/texlab/src/symbol/latex_section/enumeration.rs')
-rw-r--r-- | support/texlab/src/symbol/latex_section/enumeration.rs | 84 |
1 files changed, 39 insertions, 45 deletions
diff --git a/support/texlab/src/symbol/latex_section/enumeration.rs b/support/texlab/src/symbol/latex_section/enumeration.rs index 34f4dff72f..e96a856eac 100644 --- a/support/texlab/src/symbol/latex_section/enumeration.rs +++ b/support/texlab/src/symbol/latex_section/enumeration.rs @@ -1,59 +1,58 @@ use super::{label_name, selection_range}; -use crate::range::RangeExt; -use crate::symbol::{LatexSymbol, LatexSymbolKind}; -use crate::syntax::*; -use crate::workspace::*; -use lsp_types::Range; +use crate::{ + feature::DocumentView, + outline::OutlineContext, + protocol::{Range, RangeExt}, + symbol::types::{LatexSymbol, LatexSymbolKind}, + syntax::{latex, SyntaxNode}, +}; +use titlecase::titlecase; -pub fn symbols(view: &DocumentView, tree: &LatexSyntaxTree) -> Vec<LatexSymbol> { - let mut symbols = Vec::new(); - for environment in &tree.env.environments { - if environment.left.is_enum() { - symbols.push(make_symbol(view, tree, environment)); - } - } - symbols +pub fn symbols(view: &DocumentView, table: &latex::SymbolTable) -> Vec<LatexSymbol> { + table + .environments + .iter() + .filter(|env| env.left.is_enum(&table)) + .map(|enumeration| make_symbol(view, table, *enumeration)) + .collect() } fn make_symbol( view: &DocumentView, - tree: &LatexSyntaxTree, - enumeration: &LatexEnvironment, + table: &latex::SymbolTable, + enumeration: latex::Environment, ) -> LatexSymbol { - let name = titlelize(enumeration.left.name().unwrap().text()); + let name = titlecase(enumeration.left.name(&table).unwrap().text()); - let items: Vec<_> = tree - .structure + let items: Vec<_> = table .items .iter() - .filter(|item| tree.is_enumeration_item(enumeration, item)) + .filter(|item| table.is_enum_item(enumeration, **item)) .collect(); let mut children = Vec::new(); for i in 0..items.len() { - let start = items[i].start(); + let start = table[items[i].parent].start(); let end = items .get(i + 1) - .map(|item| item.start()) - .unwrap_or_else(|| enumeration.right.start()); + .map(|item| table[item.parent].start()) + .unwrap_or_else(|| table[enumeration.right.parent].start()); let range = Range::new(start, end); - let label = find_item_label(tree, range); + let label = find_item_label(table, range); - let number = items[i].name().or_else(|| { - label - .as_ref() - .and_then(|label| OutlineContext::find_number(view, label)) - }); + let number = items[i] + .name(&table) + .or_else(|| label.and_then(|label| OutlineContext::find_number(view, table, *label))); let name = number.unwrap_or_else(|| "Item".into()); children.push(LatexSymbol { name, - label: label_name(label), + label: label_name(table, label), kind: LatexSymbolKind::EnumerationItem, deprecated: false, full_range: range, - selection_range: selection_range(items[i].range(), label), + selection_range: selection_range(table, table[items[i].parent].range(), label), children: Vec::new(), }); } @@ -63,23 +62,18 @@ fn make_symbol( label: None, kind: LatexSymbolKind::Enumeration, deprecated: false, - full_range: enumeration.range(), - selection_range: enumeration.range(), + full_range: enumeration.range(&table), + selection_range: enumeration.range(&table), children, } } -fn find_item_label(tree: &LatexSyntaxTree, item_range: Range) -> Option<&LatexLabel> { - let label = tree.find_label_by_range(item_range)?; - if tree - .env - .environments - .iter() - .filter(|env| item_range.contains(env.start())) - .all(|env| !env.range().contains(label.start())) - { - Some(label) - } else { - None - } +fn find_item_label(table: &latex::SymbolTable, item_range: Range) -> Option<&latex::Label> { + table.find_label_by_range(item_range).filter(|label| { + table + .environments + .iter() + .filter(|env| item_range.contains(env.range(&table).start)) + .all(|env| !env.range(&table).contains(table[label.parent].start())) + }) } |