From a7b59d013d1c60f0b016ac69d2d803af18ecf3b3 Mon Sep 17 00:00:00 2001 From: Felix Andreas Date: Wed, 8 Oct 2025 01:08:30 +0200 Subject: [PATCH] initial work --- .gitignore | 1 + crates/roughly/src/completion.rs | 36 ++++++++++++++++++++++++++++++++ scripts/generate-base-symbols.R | 11 ++++++++++ 3 files changed, 48 insertions(+) create mode 100644 scripts/generate-base-symbols.R diff --git a/.gitignore b/.gitignore index 06220555..a776a83a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ node_modules r-examples R*/ roughly.toml +base-symbols.txt diff --git a/crates/roughly/src/completion.rs b/crates/roughly/src/completion.rs index 362bee64..9fe7c508 100644 --- a/crates/roughly/src/completion.rs +++ b/crates/roughly/src/completion.rs @@ -9,6 +9,7 @@ use { utils, }, ropey::Rope, + std::sync::OnceLock, tree_sitter::{Node, Point, Query, StreamingIterator}, }; @@ -193,9 +194,44 @@ pub fn get( .unwrap_or_default() }; + let base_symbols = { + static BASE_SYMBOLS: OnceLock)>> = OnceLock::new(); + BASE_SYMBOLS + .get_or_init(|| { + #[cfg(debug_assertions)] + let content = "base\nlapply\nlength\n"; + #[cfg(not(debug_assertions))] + let content = include_str!("../../../base-symbols.txt"); + + content + .split("---") + .flat_map(|section| { + let mut lines = section.lines().map(str::trim).filter(|l| !l.is_empty()); + ( + lines.next().unwrap().to_string(), + lines.map(str::to_string).collect::>(), + ) + }) + .collect::>() + }) + .iter() + .filter(|(item, _)| utils::starts_with_lowercase(item, &query)) + .map(|(package, items)| CompletionItem { + label: item.clone(), + label_details: Some(CompletionItemLabelDetails { + detail: None, + description: Some(package.clone()), + }), + kind: Some(CompletionItemKind::FUNCTION), + sort_text: Some("1".into()), + ..Default::default() + }) + }; + Some(CompletionResponse::Array( keyword_symbols .chain(local_symbols) + // .chain(base_symbols) .chain(workspace_symbols) .collect(), )) diff --git a/scripts/generate-base-symbols.R b/scripts/generate-base-symbols.R new file mode 100644 index 00000000..8484141d --- /dev/null +++ b/scripts/generate-base-symbols.R @@ -0,0 +1,11 @@ +packages <- c("base", getOption("defaultPackages")) + +symbols <- sapply( + packages, + \(package) { + items <- c(package, ls(paste0("package:", package))) + items[grepl("^[._0-9a-zA-Z]+$", items)] |> paste0(collapse = "\n") + } +) |> paste0(collapse = "\n---\n") + +write(symbols, "base-symbols.txt")