1
Fork 0

Merge pull request #18951 from Veykril/push-zpvunsvlpuxt

Add missing `#[rust_analyzer::rust_fixture]` annotations
This commit is contained in:
Lukas Wirth 2025-01-16 10:21:22 +00:00 committed by GitHub
commit fa71da9ff0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 149 additions and 51 deletions

View file

@ -4855,6 +4855,7 @@ impl Type {
self.normalize_trait_assoc_type(db, &[], iterator_item.into())
}
/// Resolves the projection `<Self as IntoIterator>::IntoIter` and returns the resulting type
pub fn into_iterator_iter(self, db: &dyn HirDatabase) -> Option<Type> {
let trait_ = db.lang_item(self.env.krate, LangItem::IntoIterIntoIter).and_then(|it| {
let into_iter_fn = it.as_function()?;

View file

@ -1128,7 +1128,10 @@ fn main {
destructure_tuple_binding_impl(acc, ctx, false)
}
pub(crate) fn check_in_place_assist(ra_fixture_before: &str, ra_fixture_after: &str) {
pub(crate) fn check_in_place_assist(
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
check_assist_by_label(
in_place_assist,
ra_fixture_before,
@ -1138,7 +1141,10 @@ fn main {
);
}
pub(crate) fn check_sub_pattern_assist(ra_fixture_before: &str, ra_fixture_after: &str) {
pub(crate) fn check_sub_pattern_assist(
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
check_assist_by_label(
assist,
ra_fixture_before,

View file

@ -209,7 +209,10 @@ mod tests {
use super::*;
fn check(ra_fixture_before: &str, ra_fixture_after: &str) {
fn check(
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
check_assist(
remove_dbg,
&format!("fn main() {{\n{ra_fixture_before}\n}}"),

View file

@ -77,7 +77,11 @@ pub(crate) fn with_single_file(text: &str) -> (RootDatabase, EditionedFileId) {
}
#[track_caller]
pub(crate) fn check_assist(assist: Handler, ra_fixture_before: &str, ra_fixture_after: &str) {
pub(crate) fn check_assist(
assist: Handler,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let ra_fixture_after = trim_indent(ra_fixture_after);
check(assist, ra_fixture_before, ExpectedResult::After(&ra_fixture_after), None);
}
@ -85,8 +89,8 @@ pub(crate) fn check_assist(assist: Handler, ra_fixture_before: &str, ra_fixture_
#[track_caller]
pub(crate) fn check_assist_no_snippet_cap(
assist: Handler,
ra_fixture_before: &str,
ra_fixture_after: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let ra_fixture_after = trim_indent(ra_fixture_after);
check_with_config(
@ -101,8 +105,8 @@ pub(crate) fn check_assist_no_snippet_cap(
#[track_caller]
pub(crate) fn check_assist_import_one(
assist: Handler,
ra_fixture_before: &str,
ra_fixture_after: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let ra_fixture_after = trim_indent(ra_fixture_after);
check_with_config(
@ -118,8 +122,8 @@ pub(crate) fn check_assist_import_one(
// so this is here to allow you choose.
pub(crate) fn check_assist_by_label(
assist: Handler,
ra_fixture_before: &str,
ra_fixture_after: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
label: &str,
) {
let ra_fixture_after = trim_indent(ra_fixture_after);

View file

@ -32,10 +32,11 @@ pub(crate) fn complete_dot(
// Suggest .await syntax for types that implement Future trait
if let Some(future_output) = receiver_ty.into_future_output(ctx.db) {
let await_str = SmolStr::new_static("await");
let mut item = CompletionItem::new(
CompletionItemKind::Keyword,
ctx.source_range(),
SmolStr::new_static("await"),
await_str.clone(),
ctx.edition,
);
item.detail("expr.await");
@ -58,17 +59,13 @@ pub(crate) fn complete_dot(
acc,
ctx,
&future_output,
|acc, field, ty| {
acc.add_field(ctx, &dot_access, Some(SmolStr::new_static("await")), field, &ty)
},
|acc, field, ty| {
acc.add_tuple_field(ctx, Some(SmolStr::new_static("await")), field, &ty)
},
|acc, field, ty| acc.add_field(ctx, &dot_access, Some(await_str.clone()), field, &ty),
|acc, field, ty| acc.add_tuple_field(ctx, Some(await_str.clone()), field, &ty),
is_field_access,
is_method_access_with_parens,
);
complete_methods(ctx, &future_output, &traits_in_scope, |func| {
acc.add_method(ctx, &dot_access, func, Some(SmolStr::new_static("await")), None)
acc.add_method(ctx, &dot_access, func, Some(await_str.clone()), None)
});
}
@ -85,20 +82,23 @@ pub(crate) fn complete_dot(
acc.add_method(ctx, dot_access, func, None, None)
});
// FIXME:
// Checking for the existence of `iter()` is complicated in our setup, because we need to substitute
// its return type, so we instead check for `<&Self as IntoIterator>::IntoIter`.
// Does <&receiver_ty as IntoIterator>::IntoIter` exist? Assume `iter` is valid
let iter = receiver_ty
.strip_references()
.add_reference(hir::Mutability::Shared)
.into_iterator_iter(ctx.db)
.map(|ty| (ty, SmolStr::new_static("iter()")))
.or_else(|| {
receiver_ty
.clone()
.into_iterator_iter(ctx.db)
.map(|ty| (ty, SmolStr::new_static("into_iter()")))
});
if let Some((iter, iter_sym)) = iter {
.map(|ty| (ty, SmolStr::new_static("iter()")));
// Does <receiver_ty as IntoIterator>::IntoIter` exist?
let into_iter = || {
receiver_ty
.clone()
.into_iterator_iter(ctx.db)
.map(|ty| (ty, SmolStr::new_static("into_iter()")))
};
if let Some((iter, iter_sym)) = iter.or_else(into_iter) {
// Skip iterators, e.g. complete `.iter().filter_map()`.
let dot_access_kind = match &dot_access.kind {
DotAccessKind::Field { receiver_is_ambiguous_float_literal: _ } => {
@ -1437,5 +1437,33 @@ async fn bar() {
me into_future() (use core::future::IntoFuture) fn(self) -> <Self as IntoFuture>::IntoFuture
"#]],
);
check_edit(
"foo",
r#"
//- minicore: future
struct Foo;
impl Foo {
fn foo(self) {}
}
async fn foo() -> Foo { Foo }
async fn bar() {
foo().$0
}
"#,
r#"
struct Foo;
impl Foo {
fn foo(self) {}
}
async fn foo() -> Foo { Foo }
async fn bar() {
foo().await.foo();$0
}
"#,
);
}
}

View file

@ -220,7 +220,11 @@ fn render_completion_list(completions: Vec<CompletionItem>) -> String {
}
#[track_caller]
pub(crate) fn check_edit(what: &str, ra_fixture_before: &str, ra_fixture_after: &str) {
pub(crate) fn check_edit(
what: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
check_edit_with_config(TEST_CONFIG, what, ra_fixture_before, ra_fixture_after)
}

View file

@ -1244,8 +1244,8 @@ use ::ext::foo::Foo;
fn check_with_config(
path: &str,
ra_fixture_before: &str,
ra_fixture_after: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
config: &InsertUseConfig,
) {
let (db, file_id, pos) = if ra_fixture_before.contains(CURSOR_MARKER) {
@ -1277,8 +1277,8 @@ fn check_with_config(
fn check(
path: &str,
ra_fixture_before: &str,
ra_fixture_after: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
granularity: ImportGranularity,
) {
check_with_config(
@ -1295,19 +1295,35 @@ fn check(
)
}
fn check_crate(path: &str, ra_fixture_before: &str, ra_fixture_after: &str) {
fn check_crate(
path: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
check(path, ra_fixture_before, ra_fixture_after, ImportGranularity::Crate)
}
fn check_module(path: &str, ra_fixture_before: &str, ra_fixture_after: &str) {
fn check_module(
path: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
check(path, ra_fixture_before, ra_fixture_after, ImportGranularity::Module)
}
fn check_none(path: &str, ra_fixture_before: &str, ra_fixture_after: &str) {
fn check_none(
path: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
check(path, ra_fixture_before, ra_fixture_after, ImportGranularity::Item)
}
fn check_one(path: &str, ra_fixture_before: &str, ra_fixture_after: &str) {
fn check_one(
path: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
check(path, ra_fixture_before, ra_fixture_after, ImportGranularity::One)
}

View file

@ -18,7 +18,10 @@ use crate::{DiagnosticsConfig, ExprFillDefaultMode, Severity};
/// * the first diagnostic fix trigger range touches the input cursor position
/// * that the contents of the file containing the cursor match `after` after the diagnostic fix is applied
#[track_caller]
pub(crate) fn check_fix(ra_fixture_before: &str, ra_fixture_after: &str) {
pub(crate) fn check_fix(
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
check_nth_fix(0, ra_fixture_before, ra_fixture_after);
}
/// Takes a multi-file input fixture with annotated cursor positions,
@ -26,14 +29,21 @@ pub(crate) fn check_fix(ra_fixture_before: &str, ra_fixture_after: &str) {
/// * a diagnostic is produced
/// * every diagnostic fixes trigger range touches the input cursor position
/// * that the contents of the file containing the cursor match `after` after each diagnostic fix is applied
pub(crate) fn check_fixes(ra_fixture_before: &str, ra_fixtures_after: Vec<&str>) {
pub(crate) fn check_fixes(
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
ra_fixtures_after: Vec<&str>,
) {
for (i, ra_fixture_after) in ra_fixtures_after.iter().enumerate() {
check_nth_fix(i, ra_fixture_before, ra_fixture_after)
}
}
#[track_caller]
fn check_nth_fix(nth: usize, ra_fixture_before: &str, ra_fixture_after: &str) {
fn check_nth_fix(
nth: usize,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let mut config = DiagnosticsConfig::test_sample();
config.expr_fill_default = ExprFillDefaultMode::Default;
check_nth_fix_with_config(config, nth, ra_fixture_before, ra_fixture_after)
@ -41,8 +51,8 @@ fn check_nth_fix(nth: usize, ra_fixture_before: &str, ra_fixture_after: &str) {
#[track_caller]
pub(crate) fn check_fix_with_disabled(
ra_fixture_before: &str,
ra_fixture_after: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
disabled: impl Iterator<Item = String>,
) {
let mut config = DiagnosticsConfig::test_sample();
@ -55,8 +65,8 @@ pub(crate) fn check_fix_with_disabled(
fn check_nth_fix_with_config(
config: DiagnosticsConfig,
nth: usize,
ra_fixture_before: &str,
ra_fixture_after: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let after = trim_indent(ra_fixture_after);
@ -95,14 +105,20 @@ fn check_nth_fix_with_config(
assert_eq_text!(&after, &actual);
}
pub(crate) fn check_fixes_unordered(ra_fixture_before: &str, ra_fixtures_after: Vec<&str>) {
pub(crate) fn check_fixes_unordered(
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
ra_fixtures_after: Vec<&str>,
) {
for ra_fixture_after in ra_fixtures_after.iter() {
check_has_fix(ra_fixture_before, ra_fixture_after)
}
}
#[track_caller]
pub(crate) fn check_has_fix(ra_fixture_before: &str, ra_fixture_after: &str) {
pub(crate) fn check_has_fix(
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let after = trim_indent(ra_fixture_after);
let (db, file_position) = RootDatabase::with_position(ra_fixture_before);
@ -145,7 +161,10 @@ pub(crate) fn check_has_fix(ra_fixture_before: &str, ra_fixture_after: &str) {
}
#[track_caller]
pub(crate) fn check_has_single_fix(ra_fixture_before: &str, ra_fixture_after: &str) {
pub(crate) fn check_has_single_fix(
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let after = trim_indent(ra_fixture_after);
let (db, file_position) = RootDatabase::with_position(ra_fixture_before);

View file

@ -307,7 +307,10 @@ mod tests {
use super::*;
fn check_join_lines(ra_fixture_before: &str, ra_fixture_after: &str) {
fn check_join_lines(
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let config = JoinLinesConfig {
join_else_if: true,
remove_trailing_comma: true,
@ -333,7 +336,10 @@ mod tests {
assert_eq_text!(ra_fixture_after, &actual);
}
fn check_join_lines_sel(ra_fixture_before: &str, ra_fixture_after: &str) {
fn check_join_lines_sel(
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let config = JoinLinesConfig {
join_else_if: true,
remove_trailing_comma: true,

View file

@ -456,7 +456,11 @@ mod tests {
use super::{RangeInfo, RenameError};
#[track_caller]
fn check(new_name: &str, ra_fixture_before: &str, ra_fixture_after: &str) {
fn check(
new_name: &str,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let ra_fixture_after = &trim_indent(ra_fixture_after);
let (analysis, position) = fixture::position(ra_fixture_before);
if !ra_fixture_after.starts_with("error: ") {

View file

@ -436,14 +436,18 @@ mod tests {
})
}
fn type_char(char_typed: char, ra_fixture_before: &str, ra_fixture_after: &str) {
fn type_char(
char_typed: char,
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let actual = do_type_char(char_typed, ra_fixture_before)
.unwrap_or_else(|| panic!("typing `{char_typed}` did nothing"));
assert_eq_text!(ra_fixture_after, &actual);
}
fn type_char_noop(char_typed: char, ra_fixture_before: &str) {
fn type_char_noop(char_typed: char, #[rust_analyzer::rust_fixture] ra_fixture_before: &str) {
let file_change = do_type_char(char_typed, ra_fixture_before);
assert_eq!(file_change, None)
}

View file

@ -208,7 +208,10 @@ mod tests {
Some(actual)
}
fn do_check(ra_fixture_before: &str, ra_fixture_after: &str) {
fn do_check(
#[rust_analyzer::rust_fixture] ra_fixture_before: &str,
#[rust_analyzer::rust_fixture] ra_fixture_after: &str,
) {
let ra_fixture_after = &trim_indent(ra_fixture_after);
let actual = apply_on_enter(ra_fixture_before).unwrap();
assert_eq_text!(ra_fixture_after, &actual);