Add abi string completions
This commit is contained in:
parent
d3f3b6a87f
commit
c83081879f
@ -2,6 +2,7 @@
|
||||
|
||||
pub(crate) mod attribute;
|
||||
pub(crate) mod dot;
|
||||
pub(crate) mod extern_abi;
|
||||
pub(crate) mod flyimport;
|
||||
pub(crate) mod fn_param;
|
||||
pub(crate) mod format_string;
|
||||
|
104
crates/ide_completion/src/completions/extern_abi.rs
Normal file
104
crates/ide_completion/src/completions/extern_abi.rs
Normal file
@ -0,0 +1,104 @@
|
||||
//! Completes function abi strings.
|
||||
use syntax::{
|
||||
ast::{self, IsString},
|
||||
AstNode, AstToken,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
completions::Completions, context::CompletionContext, CompletionItem, CompletionItemKind,
|
||||
};
|
||||
|
||||
// Most of these are feature gated, we should filter/add feature gate completions once we have them.
|
||||
const SUPPORTED_CALLING_CONVENTIONS: &[&str] = &[
|
||||
"Rust",
|
||||
"C",
|
||||
"C-unwind",
|
||||
"cdecl",
|
||||
"stdcall",
|
||||
"stdcall-unwind",
|
||||
"fastcall",
|
||||
"vectorcall",
|
||||
"thiscall",
|
||||
"thiscall-unwind",
|
||||
"aapcs",
|
||||
"win64",
|
||||
"sysv64",
|
||||
"ptx-kernel",
|
||||
"msp430-interrupt",
|
||||
"x86-interrupt",
|
||||
"amdgpu-kernel",
|
||||
"efiapi",
|
||||
"avr-interrupt",
|
||||
"avr-non-blocking-interrupt",
|
||||
"C-cmse-nonsecure-call",
|
||||
"wasm",
|
||||
"system",
|
||||
"system-unwind",
|
||||
"rust-intrinsic",
|
||||
"rust-call",
|
||||
"platform-intrinsic",
|
||||
"unadjusted",
|
||||
];
|
||||
|
||||
pub(crate) fn complete_extern_abi(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
|
||||
if ctx.token.parent().and_then(ast::Abi::cast).is_none() {
|
||||
return None;
|
||||
}
|
||||
let abi_str = ast::String::cast(ctx.token.clone())?;
|
||||
let source_range = abi_str.text_range_between_quotes()?;
|
||||
for &abi in SUPPORTED_CALLING_CONVENTIONS {
|
||||
CompletionItem::new(CompletionItemKind::Keyword, source_range, abi).add_to(acc);
|
||||
}
|
||||
Some(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use expect_test::{expect, Expect};
|
||||
|
||||
use crate::tests::{check_edit, completion_list_no_kw};
|
||||
|
||||
fn check(ra_fixture: &str, expect: Expect) {
|
||||
let actual = completion_list_no_kw(ra_fixture);
|
||||
expect.assert_eq(&actual);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn only_completes_in_string_literals() {
|
||||
check(
|
||||
r#"
|
||||
$0 fn foo {}
|
||||
"#,
|
||||
expect![[]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn requires_extern_prefix() {
|
||||
check(
|
||||
r#"
|
||||
"$0" fn foo {}
|
||||
"#,
|
||||
expect![[]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn works() {
|
||||
check(
|
||||
r#"
|
||||
extern "$0" fn foo {}
|
||||
"#,
|
||||
expect![[]],
|
||||
);
|
||||
check_edit(
|
||||
"Rust",
|
||||
r#"
|
||||
extern "$0" fn foo {}
|
||||
"#,
|
||||
r#"
|
||||
extern "Rust" fn foo {}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
}
|
@ -154,6 +154,7 @@ pub fn completions(
|
||||
completions::attribute::complete_attribute(&mut acc, &ctx);
|
||||
completions::attribute::complete_known_attribute_input(&mut acc, &ctx);
|
||||
completions::dot::complete_dot(&mut acc, &ctx);
|
||||
completions::extern_abi::complete_extern_abi(&mut acc, &ctx);
|
||||
completions::flyimport::import_on_the_fly(&mut acc, &ctx);
|
||||
completions::fn_param::complete_fn_param(&mut acc, &ctx);
|
||||
completions::format_string::format_string(&mut acc, &ctx);
|
||||
|
Loading…
x
Reference in New Issue
Block a user