5 use syntax::SyntaxKind;
8 completions::Completions, context::CompletionContext, item::CompletionKind, CompletionItem,
12 pub(crate) fn complete_cfg(acc: &mut Completions, ctx: &CompletionContext) {
13 let add_completion = |item: &&str| {
15 CompletionItem::new(CompletionKind::Attribute, ctx.source_range(), *item);
16 completion.insert_text(format!(r#""{}""#, item));
17 completion.kind(CompletionItemKind::Attribute);
18 acc.add(completion.build());
21 let previous = iter::successors(ctx.original_token.prev_token(), |t| {
22 (matches!(t.kind(), SyntaxKind::EQ) || t.kind().is_trivia())
23 .then(|| t.prev_token())
26 .find(|t| matches!(t.kind(), SyntaxKind::IDENT));
28 match previous.as_ref().map(|p| p.text()) {
29 Some("target_arch") => KNOWN_ARCH.iter().for_each(add_completion),
30 Some("target_env") => KNOWN_ENV.iter().for_each(add_completion),
31 Some("target_os") => KNOWN_OS.iter().for_each(add_completion),
32 Some("target_vendor") => KNOWN_VENDOR.iter().for_each(add_completion),
33 Some("target_endian") => ["little", "big"].iter().for_each(add_completion),
35 ctx.krate.map(|krate| {
36 krate.potential_cfg(ctx.db).get_cfg_values(&name).iter().for_each(|s| {
37 let mut item = CompletionItem::new(
38 CompletionKind::Attribute,
42 item.insert_text(format!(r#""{}""#, s));
44 acc.add(item.build());
49 ctx.krate.map(|krate| {
50 krate.potential_cfg(ctx.db).get_cfg_keys().iter().for_each(|s| {
51 let item = CompletionItem::new(
52 CompletionKind::Attribute,
56 acc.add(item.build());
63 const KNOWN_ARCH: [&'static str; 19] = [
85 const KNOWN_ENV: [&'static str; 7] =
86 ["eabihf", "gnu", "gnueabihf", "msvc", "relibc", "sgx", "uclibc"];
88 const KNOWN_OS: [&'static str; 20] = [
111 const KNOWN_VENDOR: [&'static str; 8] =
112 ["apple", "fortanix", "nvidia", "pc", "sony", "unknown", "wrs", "uwp"];