diff options
| author | Lukas Wirth <lukastw97@gmail.com> | 2025-01-16 10:21:22 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-16 10:21:22 +0000 |
| commit | fa71da9ff02be5df6df81fb357399bc6c28d1cdf (patch) | |
| tree | df042b3e8622021e61b58b039edc4180d791ebf5 | |
| parent | 56059f8c7a92f230868e10a7d6f12f0c2f0cd570 (diff) | |
| parent | 664cdd293606a4617239ab17eb19e7d26444d83b (diff) | |
| download | rust-fa71da9ff02be5df6df81fb357399bc6c28d1cdf.tar.gz rust-fa71da9ff02be5df6df81fb357399bc6c28d1cdf.zip | |
Merge pull request #18951 from Veykril/push-zpvunsvlpuxt
Add missing `#[rust_analyzer::rust_fixture]` annotations
12 files changed, 149 insertions, 51 deletions
diff --git a/src/tools/rust-analyzer/crates/hir/src/lib.rs b/src/tools/rust-analyzer/crates/hir/src/lib.rs index 930f47e8cc2..efa88d7c83e 100644 --- a/src/tools/rust-analyzer/crates/hir/src/lib.rs +++ b/src/tools/rust-analyzer/crates/hir/src/lib.rs @@ -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()?; diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/destructure_tuple_binding.rs b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/destructure_tuple_binding.rs index 7df6ca1565f..39142d60620 100644 --- a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/destructure_tuple_binding.rs +++ b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/destructure_tuple_binding.rs @@ -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, diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/remove_dbg.rs b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/remove_dbg.rs index ae14075c26a..1f57f7d3d37 100644 --- a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/remove_dbg.rs +++ b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/remove_dbg.rs @@ -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}}"), diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/tests.rs b/src/tools/rust-analyzer/crates/ide-assists/src/tests.rs index 85f1099ea52..48d2af6d3ff 100644 --- a/src/tools/rust-analyzer/crates/ide-assists/src/tests.rs +++ b/src/tools/rust-analyzer/crates/ide-assists/src/tests.rs @@ -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); diff --git a/src/tools/rust-analyzer/crates/ide-completion/src/completions/dot.rs b/src/tools/rust-analyzer/crates/ide-completion/src/completions/dot.rs index 3a991e007af..7679d9076de 100644 --- a/src/tools/rust-analyzer/crates/ide-completion/src/completions/dot.rs +++ b/src/tools/rust-analyzer/crates/ide-completion/src/completions/dot.rs @@ -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 +} +"#, + ); } } diff --git a/src/tools/rust-analyzer/crates/ide-completion/src/tests.rs b/src/tools/rust-analyzer/crates/ide-completion/src/tests.rs index a37cf594855..b7dbf0a6306 100644 --- a/src/tools/rust-analyzer/crates/ide-completion/src/tests.rs +++ b/src/tools/rust-analyzer/crates/ide-completion/src/tests.rs @@ -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) } diff --git a/src/tools/rust-analyzer/crates/ide-db/src/imports/insert_use/tests.rs b/src/tools/rust-analyzer/crates/ide-db/src/imports/insert_use/tests.rs index 3e3aa266f7d..decb0ea9d8a 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/imports/insert_use/tests.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/imports/insert_use/tests.rs @@ -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) } diff --git a/src/tools/rust-analyzer/crates/ide-diagnostics/src/tests.rs b/src/tools/rust-analyzer/crates/ide-diagnostics/src/tests.rs index 605a6f69fc7..fc2a7db7174 100644 --- a/src/tools/rust-analyzer/crates/ide-diagnostics/src/tests.rs +++ b/src/tools/rust-analyzer/crates/ide-diagnostics/src/tests.rs @@ -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); diff --git a/src/tools/rust-analyzer/crates/ide/src/join_lines.rs b/src/tools/rust-analyzer/crates/ide/src/join_lines.rs index 5192f91a4a6..e4670177ecf 100644 --- a/src/tools/rust-analyzer/crates/ide/src/join_lines.rs +++ b/src/tools/rust-analyzer/crates/ide/src/join_lines.rs @@ -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, diff --git a/src/tools/rust-analyzer/crates/ide/src/rename.rs b/src/tools/rust-analyzer/crates/ide/src/rename.rs index fdf8fe452ba..ba739df3092 100644 --- a/src/tools/rust-analyzer/crates/ide/src/rename.rs +++ b/src/tools/rust-analyzer/crates/ide/src/rename.rs @@ -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: ") { diff --git a/src/tools/rust-analyzer/crates/ide/src/typing.rs b/src/tools/rust-analyzer/crates/ide/src/typing.rs index 0ef9c4185bc..47d75f1c957 100644 --- a/src/tools/rust-analyzer/crates/ide/src/typing.rs +++ b/src/tools/rust-analyzer/crates/ide/src/typing.rs @@ -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) } diff --git a/src/tools/rust-analyzer/crates/ide/src/typing/on_enter.rs b/src/tools/rust-analyzer/crates/ide/src/typing/on_enter.rs index 773e352220e..e249c38c73d 100644 --- a/src/tools/rust-analyzer/crates/ide/src/typing/on_enter.rs +++ b/src/tools/rust-analyzer/crates/ide/src/typing/on_enter.rs @@ -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); |
