Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-completion/src/completions/env_vars.rs51
1 files changed, 22 insertions, 29 deletions
diff --git a/crates/ide-completion/src/completions/env_vars.rs b/crates/ide-completion/src/completions/env_vars.rs
index 43d67f093e..e2e0bc142c 100644
--- a/crates/ide-completion/src/completions/env_vars.rs
+++ b/crates/ide-completion/src/completions/env_vars.rs
@@ -1,8 +1,8 @@
//! Completes environment variables defined by Cargo (https://doc.rust-lang.org/cargo/reference/environment-variables.html)
+use ide_db::syntax_helpers::node_ext::get_outer_macro_name;
+use syntax::ast::{self, IsString};
-use syntax::{ast, AstToken, AstNode, TextRange, TextSize};
-
-use crate::{context::CompletionContext, CompletionItem, CompletionItemKind};
+use crate::{CompletionItem, CompletionItemKind};
use super::Completions;
const CARGO_DEFINED_VARS: &[(&str, &str)] = &[
@@ -29,34 +29,27 @@ const CARGO_DEFINED_VARS: &[(&str, &str)] = &[
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);
+ expanded: &ast::String,
+) -> Option<()> {
+ guard_env_macro(expanded)?;
+ let range = expanded.text_range_between_quotes()?;
+
+ CARGO_DEFINED_VARS.iter().for_each(|(var, detail)| {
+ let mut item = CompletionItem::new(CompletionItemKind::Keyword, range, *var);
+ item.detail(*detail);
+ item.add_to(acc);
+ });
+
+ Some(())
}
-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;
- }
-
+fn guard_env_macro(string: &ast::String) -> Option<()> {
+ let name = get_outer_macro_name(string)?;
+ if !matches!(name.text().as_str(), "env" | "option_env") {
+ return None;
+ }
- Some(())
- })()
- .is_some()
+ Some(())
}
#[cfg(test)]
@@ -112,4 +105,4 @@ mod tests {
let completions = completion_list(fixture);
assert!(completions.is_empty(), "Completions weren't empty: {}", completions);
}
-} \ No newline at end of file
+}