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) -> Facts {
let tokens = Tokenizer::new(source, Language::Terraform)
.mode(Mode::Lite)
.collect::<Vec<_>>();
let mut state = Extractor {
source,
tokens: &tokens,
facts: Facts::default(),
block: Vec::new(),
depth: 0,
};
state.run();
state.facts
}
const DECLARING: &[(&str, DeclarationKind)] = &[
("resource", DeclarationKind::Resource),
("data", DeclarationKind::Resource),
("module", DeclarationKind::Module),
("variable", DeclarationKind::Variable),
("output", DeclarationKind::Resource),
("provider", DeclarationKind::Module),
("locals", DeclarationKind::Constant),
];
const REFERENCE_ROOTS: &[&str] = &["var", "module", "data", "local", "each"];
struct Extractor<'source, 'tokens> {
source: &'source str,
tokens: &'tokens [Token],
facts: Facts,
block: Vec<String>,
depth: i32,
}
mod extractor;
#[cfg(test)]
mod tests;