crates/references/src/string_def.rs
use base_db::DocumentLocation;
use rowan::ast::AstNode;
use syntax::bibtex;
use crate::{Reference, ReferenceContext, ReferenceKind};
pub(super) fn find_all(context: &mut ReferenceContext) -> Option<()> {
let document = context.params.feature.document;
let data = document.data.as_bib()?;
let root = data.root_node();
let name = root
.token_at_offset(context.params.offset)
.filter(|token| token.kind() == bibtex::NAME)
.find(|token| {
let parent = token.parent().unwrap();
bibtex::Value::can_cast(parent.kind()) || bibtex::StringDef::can_cast(parent.kind())
})?;
for string in &data.semantics.strings {
if string.name.text == name.text() {
context.results.push(Reference {
location: DocumentLocation::new(document, string.name.range),
kind: ReferenceKind::Definition,
});
}
}
for token in root
.descendants()
.filter_map(bibtex::Value::cast)
.filter_map(|token| token.syntax().first_token())
.filter(|token| token.text() == name.text())
{
context.results.push(Reference {
location: DocumentLocation::new(document, token.text_range()),
kind: ReferenceKind::Reference,
});
}
Some(())
}