Unnamed repository; edit this file 'description' to name the repository.
Add stub for cargo environment variables auto completion
btwotwo 2022-10-06
parent a415fb4 · commit 75f4c54
-rw-r--r--crates/ide-completion/src/completions.rs1
-rw-r--r--crates/ide-completion/src/completions/env_vars.rs60
-rw-r--r--crates/ide-completion/src/lib.rs1
3 files changed, 62 insertions, 0 deletions
diff --git a/crates/ide-completion/src/completions.rs b/crates/ide-completion/src/completions.rs
index 97b90c62dd..296dfc1425 100644
--- a/crates/ide-completion/src/completions.rs
+++ b/crates/ide-completion/src/completions.rs
@@ -19,6 +19,7 @@ pub(crate) mod snippet;
pub(crate) mod r#type;
pub(crate) mod use_;
pub(crate) mod vis;
+pub(crate) mod env_vars;
use std::iter;
diff --git a/crates/ide-completion/src/completions/env_vars.rs b/crates/ide-completion/src/completions/env_vars.rs
new file mode 100644
index 0000000000..6cfbd0f922
--- /dev/null
+++ b/crates/ide-completion/src/completions/env_vars.rs
@@ -0,0 +1,60 @@
+//! Completes environment variables defined by Cargo (https://doc.rust-lang.org/cargo/reference/environment-variables.html)
+
+use syntax::{ast, AstToken, AstNode, TextRange, TextSize};
+
+use crate::{context::CompletionContext, CompletionItem, CompletionItemKind};
+
+use super::Completions;
+
+pub(crate) fn complete_cargo_env_vars(
+ acc: &mut Completions,
+ ctx: &CompletionContext<'_>,
+ original: &ast::String
+) {
+ if !is_env_macro(original) {
+ return;
+ }
+
+ let start = ctx.original_token.text_range().start() + TextSize::from(1);
+ let cursor = ctx.position.offset;
+
+ CompletionItem::new(CompletionItemKind::Binding, TextRange::new(start, cursor), "CARGO").add_to(acc);
+}
+
+fn is_env_macro(string: &ast::String) -> bool {
+ //todo: replace copypaste from format_string with separate function
+ (|| {
+ let macro_call = string.syntax().parent_ancestors().find_map(ast::MacroCall::cast)?;
+ let name = macro_call.path()?.segment()?.name_ref()?;
+
+ if !matches!(name.text().as_str(),
+ "env" | "option_env") {
+ return None;
+ }
+
+
+ Some(())
+ })()
+ .is_some()
+}
+
+#[cfg(test)]
+mod tests {
+ use expect_test::{expect, Expect};
+ use crate::tests::{check_edit};
+
+ #[test]
+ fn completes_env_variables() {
+ check_edit("CARGO",
+ r#"
+ fn main() {
+ let foo = env!("CA$0);
+ }
+ "#
+ ,r#"
+ fn main() {
+ let foo = env!("CARGO);
+ }
+ "#)
+ }
+} \ No newline at end of file
diff --git a/crates/ide-completion/src/lib.rs b/crates/ide-completion/src/lib.rs
index 8d21f4fce0..cd9da0d3dc 100644
--- a/crates/ide-completion/src/lib.rs
+++ b/crates/ide-completion/src/lib.rs
@@ -183,6 +183,7 @@ pub fn completions(
CompletionAnalysis::String { original, expanded: Some(expanded) } => {
completions::extern_abi::complete_extern_abi(acc, ctx, expanded);
completions::format_string::format_string(acc, ctx, original, expanded);
+ completions::env_vars::complete_cargo_env_vars(acc, ctx, original)
}
CompletionAnalysis::UnexpandedAttrTT {
colon_prefix,