use super::*;
pub fn collect_imports(tokens: &[Token]) -> Vec<String> {
collect_imports_with_kind(tokens)
.into_iter()
.map(|(uri, _)| uri)
.collect()
}
pub(crate) fn collect_imports_with_kind(tokens: &[Token]) -> Vec<(String, bool)> {
let mut imports = Vec::new();
collect_imports_into(tokens, &mut imports);
imports
}
pub(super) fn collect_imports_into(tokens: &[Token], imports: &mut Vec<(String, bool)>) {
let mut i = 0;
while i < tokens.len() {
match &tokens[i].kind {
TokenKind::KwAmends
| TokenKind::KwExtends
| TokenKind::KwImport
| TokenKind::KwImportStar => {
let is_glob = matches!(tokens[i].kind, TokenKind::KwImportStar);
match tokens.get(i + 1).map(|t| &t.kind) {
Some(TokenKind::StringLit(uri)) => {
imports.push((uri.clone(), is_glob));
i += 2;
}
Some(TokenKind::LParen) => {
if let Some(TokenKind::StringLit(uri)) = tokens.get(i + 2).map(|t| &t.kind)
{
imports.push((uri.clone(), is_glob));
}
i += 2;
}
_ => i += 2,
}
}
TokenKind::InterpolatedString(parts) => {
for part in parts {
if let StringPart::Tokens(nested) = part {
collect_imports_into(nested, imports);
}
}
i += 1;
}
_ => i += 1,
}
}
}