use crate::facts::{Declaration, DeclarationKind, Facts, Import, Reference, ReferenceKind, Span};
use crate::syntax::Language;
use crate::token::{Mode, Token, TokenKind, Tokenizer};
#[must_use]
pub fn extract(source: &str, language: Language) -> Facts {
let tokens = Tokenizer::new(source, language)
.mode(Mode::Lite)
.collect::<Vec<_>>();
let mut state = Extractor {
source,
tokens: &tokens,
facts: Facts::default(),
nesting: Vec::new(),
};
state.run();
state.facts
}
const AT_IMPORTS: &[&str] = &["import", "use", "forward"];
struct Extractor<'source, 'tokens> {
source: &'source str,
tokens: &'tokens [Token],
facts: Facts,
nesting: Vec<String>,
}
pub(crate) fn selector_use(facts: &mut Facts, name: String, span: Span) {
facts.references.push(Reference {
name,
kind: ReferenceKind::Uses,
receiver: None,
span,
owner: None,
string_arguments: Vec::new(),
name_arguments: Vec::new(),
});
}
mod extractor;
#[cfg(test)]
mod tests;