Add stub for cargo environment variables auto completion

This commit is contained in:
btwotwo 2022-10-05 00:02:03 +02:00
parent a415fb4c4e
commit 75f4c54d8c
No known key found for this signature in database
GPG Key ID: D456A0349D73A0A3
3 changed files with 62 additions and 0 deletions

View File

@ -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;

View 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);
}
"#)
}
}

View File

@ -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,