Add stub for cargo environment variables auto completion
This commit is contained in:
parent
a415fb4c4e
commit
75f4c54d8c
@ -19,6 +19,7 @@
|
||||
pub(crate) mod r#type;
|
||||
pub(crate) mod use_;
|
||||
pub(crate) mod vis;
|
||||
pub(crate) mod env_vars;
|
||||
|
||||
use std::iter;
|
||||
|
||||
|
60
crates/ide-completion/src/completions/env_vars.rs
Normal file
60
crates/ide-completion/src/completions/env_vars.rs
Normal file
@ -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);
|
||||
}
|
||||
"#)
|
||||
}
|
||||
}
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user