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::Sql)
.mode(Mode::Lite)
.collect::<Vec<_>>();
let mut state = Extractor {
source,
tokens: &tokens,
facts: Facts::default(),
object: None,
};
state.run();
state.facts
}
const OBJECTS: &[(&str, DeclarationKind)] = &[
("table", DeclarationKind::Table),
("view", DeclarationKind::View),
("function", DeclarationKind::Function),
("procedure", DeclarationKind::Procedure),
("trigger", DeclarationKind::Procedure),
("schema", DeclarationKind::Module),
("type", DeclarationKind::TypeAlias),
];
const CREATE_MODIFIERS: &[&str] = &[
"or",
"replace",
"temp",
"temporary",
"unique",
"materialized",
"global",
"local",
"if",
"not",
"exists",
];
const REFERENCES: &[&str] = &["from", "join", "into", "update", "references", "on"];
const NOT_A_NAME: &[&str] = &[
"select",
"lateral",
"only",
"delete",
"conflict",
"duplicate",
"set",
"values",
"all",
"distinct",
];
struct Extractor<'source, 'tokens> {
source: &'source str,
tokens: &'tokens [Token],
facts: Facts,
object: Option<String>,
}
mod extractor;
#[cfg(test)]
mod tests;