Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add missing #[rust_analyzer::rust_fixture] annotations #18951

Merged
merged 3 commits into from
Jan 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions crates/hir/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()?;
Expand Down
10 changes: 8 additions & 2 deletions crates/ide-assists/src/handlers/destructure_tuple_binding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down
5 changes: 4 additions & 1 deletion crates/ide-assists/src/handlers/remove_dbg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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}}"),
Expand Down
18 changes: 11 additions & 7 deletions crates/ide-assists/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,16 +77,20 @@ 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);
}

#[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(
Expand All @@ -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(
Expand All @@ -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);
Expand Down
60 changes: 44 additions & 16 deletions crates/ide-completion/src/completions/dot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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)
});
}

Expand All @@ -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: _ } => {
Expand Down Expand Up @@ -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
}
"#,
);
}
}
6 changes: 5 additions & 1 deletion crates/ide-completion/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down
32 changes: 24 additions & 8 deletions crates/ide-db/src/imports/insert_use/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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(
Expand All @@ -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)
}

Expand Down
39 changes: 29 additions & 10 deletions crates/ide-diagnostics/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,31 +18,41 @@ 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,
/// and checks that:
/// * 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)
}

#[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();
Expand All @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
10 changes: 8 additions & 2 deletions crates/ide/src/join_lines.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down
6 changes: 5 additions & 1 deletion crates/ide/src/rename.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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: ") {
Expand Down
Loading
Loading