mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 14:21:44 +00:00
Merge #11395
11395: fix: Fix and re-enable format string completions r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
commit
d20ff92747
2 changed files with 75 additions and 56 deletions
|
@ -62,6 +62,7 @@ pub(crate) fn complete_attribute(acc: &mut Completions, ctx: &CompletionContext)
|
||||||
Some(())
|
Some(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME?: Move this functionality to (un)qualified_path, make this module work solely for builtin/known attributes for their inputs?
|
||||||
fn complete_new_attribute(acc: &mut Completions, ctx: &CompletionContext, attribute: &ast::Attr) {
|
fn complete_new_attribute(acc: &mut Completions, ctx: &CompletionContext, attribute: &ast::Attr) {
|
||||||
let is_inner = attribute.kind() == ast::AttrKind::Inner;
|
let is_inner = attribute.kind() == ast::AttrKind::Inner;
|
||||||
let attribute_annotated_item_kind =
|
let attribute_annotated_item_kind =
|
||||||
|
|
|
@ -8,15 +8,14 @@ use crate::{context::CompletionContext, CompletionItem, CompletionItemKind, Comp
|
||||||
|
|
||||||
/// Complete identifiers in format strings.
|
/// Complete identifiers in format strings.
|
||||||
pub(crate) fn format_string(acc: &mut Completions, ctx: &CompletionContext) {
|
pub(crate) fn format_string(acc: &mut Completions, ctx: &CompletionContext) {
|
||||||
if true {
|
let string = match ast::String::cast(ctx.token.clone())
|
||||||
return;
|
.zip(ast::String::cast(ctx.original_token.clone()))
|
||||||
}
|
{
|
||||||
let string = match ast::String::cast(ctx.token.clone()) {
|
Some((expanded, original)) if is_format_string(&expanded) => original,
|
||||||
Some(it) if is_format_string(&it) => it,
|
|
||||||
_ => return,
|
_ => return,
|
||||||
};
|
};
|
||||||
let cursor = ctx.position.offset;
|
let cursor = ctx.position.offset;
|
||||||
let lit_start = ctx.token.text_range().start();
|
let lit_start = ctx.original_token.text_range().start();
|
||||||
let cursor_in_lit = cursor - lit_start;
|
let cursor_in_lit = cursor - lit_start;
|
||||||
|
|
||||||
let prefix = &string.text()[..cursor_in_lit.into()];
|
let prefix = &string.text()[..cursor_in_lit.into()];
|
||||||
|
@ -39,7 +38,7 @@ pub(crate) fn format_string(acc: &mut Completions, ctx: &CompletionContext) {
|
||||||
mod tests {
|
mod tests {
|
||||||
use expect_test::{expect, Expect};
|
use expect_test::{expect, Expect};
|
||||||
|
|
||||||
use crate::tests::completion_list_no_kw;
|
use crate::tests::{check_edit, completion_list_no_kw};
|
||||||
|
|
||||||
fn check(ra_fixture: &str, expect: Expect) {
|
fn check(ra_fixture: &str, expect: Expect) {
|
||||||
let actual = completion_list_no_kw(ra_fixture);
|
let actual = completion_list_no_kw(ra_fixture);
|
||||||
|
@ -47,64 +46,83 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn no_completion_without_brace() {
|
fn works_when_wrapped() {
|
||||||
check(
|
check(
|
||||||
r#"
|
r#"
|
||||||
macro_rules! format_args {
|
macro_rules! format_args {
|
||||||
($lit:literal $(tt:tt)*) => { 0 },
|
($lit:literal $(tt:tt)*) => { 0 },
|
||||||
|
}
|
||||||
|
macro_rules! print {
|
||||||
|
($($arg:tt)*) => (std::io::_print(format_args!($($arg)*)));
|
||||||
}
|
}
|
||||||
fn main() {
|
fn main() {
|
||||||
let foobar = 1;
|
let foobar = 1;
|
||||||
format_args!("f$0");
|
print!("f$0");
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
expect![[]],
|
expect![[]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// #[test]
|
#[test]
|
||||||
// fn completes_locals() {
|
fn no_completion_without_brace() {
|
||||||
// check_edit(
|
check(
|
||||||
// "foobar",
|
r#"
|
||||||
// r#"
|
macro_rules! format_args {
|
||||||
// macro_rules! format_args {
|
($lit:literal $(tt:tt)*) => { 0 },
|
||||||
// ($lit:literal $(tt:tt)*) => { 0 },
|
}
|
||||||
// }
|
fn main() {
|
||||||
// fn main() {
|
let foobar = 1;
|
||||||
// let foobar = 1;
|
format_args!("f$0");
|
||||||
// format_args!("{f$0");
|
}
|
||||||
// }
|
"#,
|
||||||
// "#,
|
expect![[]],
|
||||||
// r#"
|
);
|
||||||
// macro_rules! format_args {
|
}
|
||||||
// ($lit:literal $(tt:tt)*) => { 0 },
|
|
||||||
// }
|
#[test]
|
||||||
// fn main() {
|
fn completes_locals() {
|
||||||
// let foobar = 1;
|
check_edit(
|
||||||
// format_args!("{foobar");
|
"foobar",
|
||||||
// }
|
r#"
|
||||||
// "#,
|
macro_rules! format_args {
|
||||||
// );
|
($lit:literal $(tt:tt)*) => { 0 },
|
||||||
// check_edit(
|
}
|
||||||
// "foobar",
|
fn main() {
|
||||||
// r#"
|
let foobar = 1;
|
||||||
// macro_rules! format_args {
|
format_args!("{f$0");
|
||||||
// ($lit:literal $(tt:tt)*) => { 0 },
|
}
|
||||||
// }
|
"#,
|
||||||
// fn main() {
|
r#"
|
||||||
// let foobar = 1;
|
macro_rules! format_args {
|
||||||
// format_args!("{$0");
|
($lit:literal $(tt:tt)*) => { 0 },
|
||||||
// }
|
}
|
||||||
// "#,
|
fn main() {
|
||||||
// r#"
|
let foobar = 1;
|
||||||
// macro_rules! format_args {
|
format_args!("{foobar");
|
||||||
// ($lit:literal $(tt:tt)*) => { 0 },
|
}
|
||||||
// }
|
"#,
|
||||||
// fn main() {
|
);
|
||||||
// let foobar = 1;
|
check_edit(
|
||||||
// format_args!("{foobar");
|
"foobar",
|
||||||
// }
|
r#"
|
||||||
// "#,
|
macro_rules! format_args {
|
||||||
// );
|
($lit:literal $(tt:tt)*) => { 0 },
|
||||||
// }
|
}
|
||||||
|
fn main() {
|
||||||
|
let foobar = 1;
|
||||||
|
format_args!("{$0");
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
r#"
|
||||||
|
macro_rules! format_args {
|
||||||
|
($lit:literal $(tt:tt)*) => { 0 },
|
||||||
|
}
|
||||||
|
fn main() {
|
||||||
|
let foobar = 1;
|
||||||
|
format_args!("{foobar");
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue