Repository: rust-analyzer/rust-analyzer
Pull request #10691 (2021-11-04 05:51:50)

minor: Use array `into_iter` in more places
bors r+


Patch:
diff --git a/crates/base_db/src/fixture.rs b/crates/base_db/src/fixture.rs
index 2b091f37a0..84e295e014 100644
--- a/crates/base_db/src/fixture.rs
+++ b/crates/base_db/src/fixture.rs
@@ -136,7 +136,6 @@ impl ChangeFixture {
                     file_id,
                     meta.edition,
                     Some(crate_name.clone().into()),
-                    None,
                     meta.cfg.clone(),
                     meta.cfg,
                     meta.env,
@@ -169,7 +168,6 @@ impl ChangeFixture {
                 crate_root,
                 Edition::CURRENT,
                 Some(CrateName::new("test").unwrap().into()),
-                None,
                 default_cfg.clone(),
                 default_cfg,
                 Env::default(),
@@ -204,7 +202,6 @@ impl ChangeFixture {
                 core_file,
                 Edition::Edition2021,
                 Some(CrateDisplayName::from_canonical_name("core".to_string())),
-                None,
                 CfgOptions::default(),
                 CfgOptions::default(),
                 Env::default(),
@@ -238,7 +235,6 @@ impl ChangeFixture {
                 proc_lib_file,
                 Edition::Edition2021,
                 Some(CrateDisplayName::from_canonical_name("proc_macros".to_string())),
-                None,
                 CfgOptions::default(),
                 CfgOptions::default(),
                 Env::default(),
diff --git a/crates/base_db/src/input.rs b/crates/base_db/src/input.rs
index 98533ca0a7..63b2691154 100644
--- a/crates/base_db/src/input.rs
+++ b/crates/base_db/src/input.rs
@@ -192,7 +192,6 @@ pub struct ProcMacro {
 pub struct CrateData {
     pub root_file_id: FileId,
     pub edition: Edition,
-    pub version: Option<String>,
     /// A name used in the package's project declaration: for Cargo projects,
     /// its `[package].name` can be different for other project types or even
     /// absent (a dummy crate for the code snippet, for example).
@@ -251,7 +250,6 @@ impl CrateGraph {
         file_id: FileId,
         edition: Edition,
         display_name: Option<CrateDisplayName>,
-        version: Option<String>,
         cfg_options: CfgOptions,
         potential_cfg_options: CfgOptions,
         env: Env,
@@ -260,7 +258,6 @@ impl CrateGraph {
         let data = CrateData {
             root_file_id: file_id,
             edition,
-            version,
             display_name,
             cfg_options,
             potential_cfg_options,
@@ -566,7 +563,6 @@ mod tests {
             FileId(1u32),
             Edition2018,
             None,
-            None,
             CfgOptions::default(),
             CfgOptions::default(),
             Env::default(),
@@ -576,7 +572,6 @@ mod tests {
             FileId(2u32),
             Edition2018,
             None,
-            None,
             CfgOptions::default(),
             CfgOptions::default(),
             Env::default(),
@@ -586,7 +581,6 @@ mod tests {
             FileId(3u32),
             Edition2018,
             None,
-            None,
             CfgOptions::default(),
             CfgOptions::default(),
             Env::default(),
@@ -610,7 +604,6 @@ mod tests {
             FileId(1u32),
             Edition2018,
             None,
-            None,
             CfgOptions::default(),
             CfgOptions::default(),
             Env::default(),
@@ -620,7 +613,6 @@ mod tests {
             FileId(2u32),
             Edition2018,
             None,
-            None,
             CfgOptions::default(),
             CfgOptions::default(),
             Env::default(),
@@ -641,7 +633,6 @@ mod tests {
             FileId(1u32),
             Edition2018,
             None,
-            None,
             CfgOptions::default(),
             CfgOptions::default(),
             Env::default(),
@@ -651,7 +642,6 @@ mod tests {
             FileId(2u32),
             Edition2018,
             None,
-            None,
             CfgOptions::default(),
             CfgOptions::default(),
             Env::default(),
@@ -661,7 +651,6 @@ mod tests {
             FileId(3u32),
             Edition2018,
             None,
-            None,
             CfgOptions::default(),
             CfgOptions::default(),
             Env::default(),
@@ -682,7 +671,6 @@ mod tests {
             FileId(1u32),
             Edition2018,
             None,
-            None,
             CfgOptions::default(),
             CfgOptions::default(),
             Env::default(),
@@ -692,7 +680,6 @@ mod tests {
             FileId(2u32),
             Edition2018,
             None,
-            None,
             CfgOptions::default(),
             CfgOptions::default(),
             Env::default(),
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index a221c4d57e..9c6531da20 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -183,10 +183,6 @@ impl Crate {
         db.crate_graph()[self.id].edition
     }
 
-    pub fn version(self, db: &dyn HirDatabase) -> Option<String> {
-        db.crate_graph()[self.id].version.clone()
-    }
-
     pub fn display_name(self, db: &dyn HirDatabase) -> Option<CrateDisplayName> {
         db.crate_graph()[self.id].display_name.clone()
     }
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index 4f481613dd..ca23d85cb2 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -208,10 +208,6 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> {
         self.imp.original_range_opt(node)
     }
 
-    pub fn original_ast_node<N: AstNode>(&self, node: N) -> Option<N> {
-        self.imp.original_ast_node(node)
-    }
-
     pub fn diagnostics_display_range(&self, diagnostics: InFile<SyntaxNodePtr>) -> FileRange {
         self.imp.diagnostics_display_range(diagnostics)
     }
@@ -664,11 +660,6 @@ impl<'db> SemanticsImpl<'db> {
         node.as_ref().original_file_range_opt(self.db.upcast())
     }
 
-    fn original_ast_node<N: AstNode>(&self, node: N) -> Option<N> {
-        let file = self.find_file(node.syntax().clone());
-        file.with_value(node).original_ast_node(self.db.upcast()).map(|it| it.value)
-    }
-
     fn diagnostics_display_range(&self, src: InFile<SyntaxNodePtr>) -> FileRange {
         let root = self.db.parse_or_expand(src.file_id).unwrap();
         let node = src.value.to_node(&root);
diff --git a/crates/hir_expand/src/lib.rs b/crates/hir_expand/src/lib.rs
index 4742cb089e..f411ef9b3c 100644
--- a/crates/hir_expand/src/lib.rs
+++ b/crates/hir_expand/src/lib.rs
@@ -24,9 +24,9 @@ use std::{hash::Hash, iter, sync::Arc};
 
 use base_db::{impl_intern_key, salsa, CrateId, FileId, FileRange};
 use syntax::{
-    algo::{self, skip_trivia_token},
+    algo::skip_trivia_token,
     ast::{self, AstNode, HasAttrs},
-    Direction, SyntaxNode, SyntaxToken,
+    Direction, SyntaxNode, SyntaxToken, TextRange,
 };
 
 use crate::{
@@ -600,15 +600,13 @@ impl<'a> InFile<&'a SyntaxNode> {
 
     /// Attempts to map the syntax node back up its macro calls.
     pub fn original_file_range_opt(self, db: &dyn db::AstDatabase) -> Option<FileRange> {
-        match ascend_node_border_tokens(db, self) {
-            Some(InFile { file_id, value: (first, last) }) => {
-                let original_file = file_id.original_file(db);
-                let range = first.text_range().cover(last.text_range());
-                if file_id != original_file.into() {
+        match original_range_opt(db, self) {
+            Some(range) => {
+                let original_file = range.file_id.original_file(db);
+                if range.file_id != original_file.into() {
                     tracing::error!("Failed mapping up more for {:?}", range);
-                    return None;
                 }
-                Some(FileRange { file_id: original_file, range })
+                Some(FileRange { file_id: original_file, range: range.value })
             }
             _ if !self.file_id.is_macro() => Some(FileRange {
                 file_id: self.file_id.original_file(db),
@@ -619,29 +617,28 @@ impl<'a> InFile<&'a SyntaxNode> {
     }
 }
 
-fn ascend_node_border_tokens(
+fn original_range_opt(
     db: &dyn db::AstDatabase,
-    InFile { file_id, value: node }: InFile<&SyntaxNode>,
-) -> Option<InFile<(SyntaxToken, SyntaxToken)>> {
-    let expansion = file_id.expansion_info(db)?;
+    node: InFile<&SyntaxNode>,
+) -> Option<InFile<TextRange>> {
+    let expansion = node.file_id.expansion_info(db)?;
 
     // the input node has only one token ?
-    let first = skip_trivia_token(node.first_token()?, Direction::Next)?;
-    let last = skip_trivia_token(node.last_token()?, Direction::Prev)?;
-    let is_single_token = first == last;
+    let single = skip_trivia_token(node.value.first_token()?, Direction::Next)?
+        == skip_trivia_token(node.value.last_token()?, Direction::Prev)?;
 
-    node.descendants().find_map(|it| {
+    node.value.descendants().find_map(|it| {
         let first = skip_trivia_token(it.first_token()?, Direction::Next)?;
-        let first = ascend_call_token(db, &expansion, InFile::new(file_id, first))?;
+        let first = ascend_call_token(db, &expansion, node.with_value(first))?;
 
         let last = skip_trivia_token(it.last_token()?, Direction::Prev)?;
-        let last = ascend_call_token(db, &expansion, InFile::new(file_id, last))?;
+        let last = ascend_call_token(db, &expansion, node.with_value(last))?;
 
-        if (!is_single_token && first == last) || (first.file_id != last.file_id) {
+        if (!single && first == last) || (first.file_id != last.file_id) {
             return None;
         }
 
-        Some(InFile::new(first.file_id, (first.value, last.value)))
+        Some(first.with_value(first.value.text_range().cover(last.value.text_range())))
     })
 }
 
@@ -677,23 +674,6 @@ impl<N: AstNode> InFile<N> {
         self.value.syntax().descendants().filter_map(T::cast).map(move |n| self.with_value(n))
     }
 
-    pub fn original_ast_node(self, db: &dyn db::AstDatabase) -> Option<InFile<N>> {
-        match ascend_node_border_tokens(db, self.syntax()) {
-            Some(InFile { file_id, value: (first, last) }) => {
-                let original_file = file_id.original_file(db);
-                if file_id != original_file.into() {
-                    let range = first.text_range().cover(last.text_range());
-                    tracing::error!("Failed mapping up more for {:?}", range);
-                    return None;
-                }
-                let anc = algo::least_common_ancestor(&first.parent()?, &last.parent()?)?;
-                Some(InFile::new(file_id, anc.ancestors().find_map(N::cast)?))
-            }
-            _ if !self.file_id.is_macro() => Some(self),
-            _ => None,
-        }
-    }
-
     pub fn syntax(&self) -> InFile<&SyntaxNode> {
         self.with_value(self.value.syntax())
     }
diff --git a/crates/ide/src/doc_links.rs b/crates/ide/src/doc_links.rs
index dbdbfcd8eb..8c47b809b9 100644
--- a/crates/ide/src/doc_links.rs
+++ b/crates/ide/src/doc_links.rs
@@ -473,17 +473,12 @@ fn get_doc_base_url(db: &RootDatabase, krate: &Crate) -> Option<Url> {
         }
         _ => {
             krate.get_html_root_url(db).or_else(|| {
-                let version = krate.version(db);
                 // Fallback to docs.rs. This uses `display_name` and can never be
                 // correct, but that's what fallbacks are about.
                 //
                 // FIXME: clicking on the link should just open the file in the editor,
                 // instead of falling back to external urls.
-                Some(format!(
-                    "https://docs.rs/{krate}/{version}/",
-                    krate = display_name,
-                    version = version.as_deref().unwrap_or("*")
-                ))
+                Some(format!("https://docs.rs/{krate}/*/", krate = display_name))
             })?
         }
     };
diff --git a/crates/ide/src/doc_links/intra_doc_links.rs b/crates/ide/src/doc_links/intra_doc_links.rs
index d94999dddd..1df9aaae28 100644
--- a/crates/ide/src/doc_links/intra_doc_links.rs
+++ b/crates/ide/src/doc_links/intra_doc_links.rs
@@ -21,8 +21,7 @@ pub(super) fn parse_intra_doc_link(s: &str) -> (&str, Option<hir::Namespace>) {
         (hir::Namespace::Values, (VALUES.0.iter(), VALUES.1.iter())),
         (hir::Namespace::Macros, (MACROS.0.iter(), MACROS.1.iter())),
     ]
-    .iter()
-    .cloned()
+    .into_iter()
     .find_map(|(ns, (mut prefixes, mut suffixes))| {
         if let Some(prefix) = prefixes.find(|&&prefix| {
             s.starts_with(prefix)
@@ -42,8 +41,7 @@ pub(super) fn strip_prefixes_suffixes(s: &str) -> &str {
         (VALUES.0.iter(), VALUES.1.iter()),
         (MACROS.0.iter(), MACROS.1.iter()),
     ]
-    .iter()
-    .cloned()
+    .into_iter()
     .find_map(|(mut prefixes, mut suffixes)| {
         if let Some(prefix) = prefixes.find(|&&prefix| {
             s.starts_with(prefix)
diff --git a/crates/ide/src/lib.rs b/crates/ide/src/lib.rs
index bc447177af..c2412254ef 100644
--- a/crates/ide/src/lib.rs
+++ b/crates/ide/src/lib.rs
@@ -219,7 +219,6 @@ impl Analysis {
             file_id,
             Edition::CURRENT,
             None,
-            None,
             cfg_options.clone(),
             cfg_options,
             Env::default(),
diff --git a/crates/ide_assists/src/handlers/auto_import.rs b/crates/ide_assists/src/handlers/auto_import.rs
index cac736ff85..a5858869c5 100644
--- a/crates/ide_assists/src/handlers/auto_import.rs
+++ b/crates/ide_assists/src/handlers/auto_import.rs
@@ -95,7 +95,7 @@ pub(crate) fn auto_import(acc: &mut Assists, ctx: &AssistContext) -> Option<()>
         NodeOrToken::Token(token) => token.text_range(),
     };
     let group_label = group_label(import_assets.import_candidate());
-    let scope = ImportScope::find_insert_use_container(
+    let scope = ImportScope::find_insert_use_container_with_macros(
         &match syntax_under_caret {
             NodeOrToken::Node(it) => it,
             NodeOrToken::Token(it) => it.parent()?,
@@ -164,60 +164,6 @@ mod tests {
 
     use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
 
-    #[test]
-    fn not_applicable_if_scope_inside_macro() {
-        check_assist_not_applicable(
-            auto_import,
-            r"
-mod bar {
-    pub struct Baz;
-}
-macro_rules! foo {
-    ($it:ident) => {
-        mod __ {
-            fn __(x: $it) {}
-        }
-    };
-}
-foo! {
-    Baz$0
-}
-",
-        );
-    }
-
-    #[test]
-    fn applicable_in_attributes() {
-        check_assist(
-            auto_import,
-            r"
-//- proc_macros: identity
-#[proc_macros::identity]
-mod foo {
-    mod bar {
-        const _: Baz$0 = ();
-    }
-}
-mod baz {
-    pub struct Baz;
-}
-",
-            r"
-#[proc_macros::identity]
-mod foo {
-    mod bar {
-        use crate::baz::Baz;
-
-        const _: Baz = ();
-    }
-}
-mod baz {
-    pub struct Baz;
-}
-",
-        );
-    }
-
     #[test]
     fn applicable_when_found_an_import_partial() {
         check_assist(
diff --git a/crates/ide_assists/src/handlers/expand_glob_import.rs b/crates/ide_assists/src/handlers/expand_glob_import.rs
index 34eb235ce2..3abf06d588 100644
--- a/crates/ide_assists/src/handlers/expand_glob_import.rs
+++ b/crates/ide_assists/src/handlers/expand_glob_import.rs
@@ -226,7 +226,7 @@ fn find_imported_defs(ctx: &AssistContext, star: SyntaxToken) -> Option<Vec<Def>
 
     Some(
         [Direction::Prev, Direction::Next]
-            .iter()
+            .into_iter()
             .flat_map(|dir| {
                 parent_use_item_syntax
                     .siblings(dir.to_owned())
diff --git a/crates/ide_assists/src/handlers/extract_function.rs b/crates/ide_assists/src/handlers/extract_function.rs
index 3a334efe0a..7ffb5728cc 100644
--- a/crates/ide_assists/src/handlers/extract_function.rs
+++ b/crates/ide_assists/src/handlers/extract_function.rs
@@ -91,7 +91,7 @@ pub(crate) fn extract_function(acc: &mut Assists, ctx: &AssistContext) -> Option
 
     let target_range = body.text_range();
 
-    let scope = ImportScope::find_insert_use_container(&node, &ctx.sema)?;
+    let scope = ImportScope::find_insert_use_container_with_macros(&node, &ctx.sema)?;
 
     acc.add(
         AssistId("extract_function", crate::AssistKind::RefactorExtract),
diff --git a/crates/ide_assists/src/handlers/extract_struct_from_enum_variant.rs b/crates/ide_assists/src/handlers/extract_struct_from_enum_variant.rs
index 8e28f0443d..3b812cdf17 100644
--- a/crates/ide_assists/src/handlers/extract_struct_from_enum_variant.rs
+++ b/crates/ide_assists/src/handlers/extract_struct_from_enum_variant.rs
@@ -314,7 +314,7 @@ fn process_references(
                 if let Some(mut mod_path) = mod_path {
                     mod_path.pop_segment();
                     mod_path.push_segment(variant_hir_name.clone());
-                    let scope = ImportScope::find_insert_use_container(&scope_node, &ctx.sema)?;
+                    let scope = ImportScope::find_insert_use_container(&scope_node)?;
                     visited_modules.insert(module);
                     return Some((segment, scope_node, Some((scope, mod_path))));
                 }
diff --git a/crates/ide_assists/src/handlers/replace_qualified_name_with_use.rs b/crates/ide_assists/src/handlers/replace_qualified_name_with_use.rs
index 8df8c4b726..47600be763 100644
--- a/crates/ide_assists/src/handlers/replace_qualified_name_with_use.rs
+++ b/crates/ide_assists/src/handlers/replace_qualified_name_with_use.rs
@@ -70,7 +70,7 @@ pub(crate) fn replace_qualified_name_with_use(
         })
         .flatten();
 
-    let scope = ImportScope::find_insert_use_container(path.syntax(), &ctx.sema)?;
+    let scope = ImportScope::find_insert_use_container_with_macros(path.syntax(), &ctx.sema)?;
     let target = path.syntax().text_range();
     acc.add(
         AssistId("replace_qualified_name_with_use", AssistKind::RefactorRewrite),
diff --git a/crates/ide_completion/src/completions/attribute/derive.rs b/crates/ide_completion/src/completions/attribute/derive.rs
index 33b8481932..5c08d12ef2 100644
--- a/crates/ide_completion/src/completions/attribute/derive.rs
+++ b/crates/ide_completion/src/completions/attribute/derive.rs
@@ -98,7 +98,7 @@ fn flyimport_attribute(ctx: &CompletionContext, acc: &mut Completions) -> Option
         &ctx.sema,
         parent.clone(),
     )?;
-    let import_scope = ImportScope::find_insert_use_container(&parent, &ctx.sema)?;
+    let import_scope = ImportScope::find_insert_use_container_with_macros(&parent, &ctx.sema)?;
     acc.add_all(
         import_assets
             .search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind)
diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs
index 956411f1a3..a5c134714b 100644
--- a/crates/ide_completion/src/completions/flyimport.rs
+++ b/crates/ide_completion/src/completions/flyimport.rs
@@ -129,7 +129,7 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext)
 
     let user_input_lowercased = potential_import_name.to_lowercase();
     let import_assets = import_assets(ctx, potential_import_name)?;
-    let import_scope = ImportScope::find_insert_use_container(
+    let import_scope = ImportScope::find_insert_use_container_with_macros(
         &position_for_import(ctx, Some(import_assets.import_candidate()))?,
         &ctx.sema,
     )?;
diff --git a/crates/ide_completion/src/completions/postfix.rs b/crates/ide_completion/src/completions/postfix.rs
index c239401e48..4ee257ab43 100644
--- a/crates/ide_completion/src/completions/postfix.rs
+++ b/crates/ide_completion/src/completions/postfix.rs
@@ -244,7 +244,8 @@ fn add_custom_postfix_completions(
     postfix_snippet: impl Fn(&str, &str, &str) -> Builder,
     receiver_text: &str,
 ) -> Option<()> {
-    let import_scope = ImportScope::find_insert_use_container(&ctx.token.parent()?, &ctx.sema)?;
+    let import_scope =
+        ImportScope::find_insert_use_container_with_macros(&ctx.token.parent()?, &ctx.sema)?;
     ctx.config.postfix_snippets().filter(|(_, snip)| snip.scope == SnippetScope::Expr).for_each(
         |(trigger, snippet)| {
             let imports = match snippet.imports(ctx, &import_scope) {
diff --git a/crates/ide_completion/src/completions/snippet.rs b/crates/ide_completion/src/completions/snippet.rs
index 12bccfae11..1840e780ed 100644
--- a/crates/ide_completion/src/completions/snippet.rs
+++ b/crates/ide_completion/src/completions/snippet.rs
@@ -102,7 +102,8 @@ fn add_custom_completions(
     cap: SnippetCap,
     scope: SnippetScope,
 ) -> Option<()> {
-    let import_scope = ImportScope::find_insert_use_container(&ctx.token.parent()?, &ctx.sema)?;
+    let import_scope =
+        ImportScope::find_insert_use_container_with_macros(&ctx.token.parent()?, &ctx.sema)?;
     ctx.config.prefix_snippets().filter(|(_, snip)| snip.scope == scope).for_each(
         |(trigger, snip)| {
             let imports = match snip.imports(ctx, &import_scope) {
diff --git a/crates/ide_completion/src/lib.rs b/crates/ide_completion/src/lib.rs
index d9618642c4..463744f22a 100644
--- a/crates/ide_completion/src/lib.rs
+++ b/crates/ide_completion/src/lib.rs
@@ -183,7 +183,7 @@ pub fn resolve_completion_edits(
     let _p = profile::span("resolve_completion_edits");
     let ctx = CompletionContext::new(db, position, config)?;
     let position_for_import = &position_for_import(&ctx, None)?;
-    let scope = ImportScope::find_insert_use_container(position_for_import, &ctx.sema)?;
+    let scope = ImportScope::find_insert_use_container_with_macros(position_for_import, &ctx.sema)?;
 
     let current_module = ctx.sema.scope(position_for_import).module()?;
     let current_crate = current_module.krate();
diff --git a/crates/ide_db/src/helpers/insert_use.rs b/crates/ide_db/src/helpers/insert_use.rs
index 1f3e3c55bf..9889dd772e 100644
--- a/crates/ide_db/src/helpers/insert_use.rs
+++ b/crates/ide_db/src/helpers/insert_use.rs
@@ -8,7 +8,7 @@ use hir::Semantics;
 use syntax::{
     algo,
     ast::{self, make, AstNode, HasAttrs, HasModuleItem, HasVisibility, PathSegmentKind},
-    ted, AstToken, Direction, NodeOrToken, SyntaxNode, SyntaxToken,
+    match_ast, ted, AstToken, Direction, NodeOrToken, SyntaxNode, SyntaxToken,
 };
 
 use crate::{
@@ -50,10 +50,7 @@ pub enum ImportScope {
 }
 
 impl ImportScope {
-    // FIXME: Remove this?
-    #[cfg(test)]
     fn from(syntax: SyntaxNode) -> Option<Self> {
-        use syntax::match_ast;
         fn contains_cfg_attr(attrs: &dyn HasAttrs) -> bool {
             attrs
                 .attrs()
@@ -79,60 +76,16 @@ impl ImportScope {
     }
 
     /// Determines the containing syntax node in which to insert a `use` statement affecting `position`.
-    /// Returns the original source node inside attributes.
-    pub fn find_insert_use_container(
+    pub fn find_insert_use_container_with_macros(
         position: &SyntaxNode,
         sema: &Semantics<'_, RootDatabase>,
     ) -> Option<Self> {
-        fn contains_cfg_attr(attrs: &dyn HasAttrs) -> bool {
-            attrs
-                .attrs()
-                .any(|attr| attr.as_simple_call().map_or(false, |(ident, _)| ident == "cfg"))
-        }
+        sema.ancestors_with_macros(position.clone()).find_map(Self::from)
+    }
 
-        // Walk up the ancestor tree searching for a suitable node to do insertions on
-        // with special handling on cfg-gated items, in which case we want to insert imports locally
-        // or FIXME: annotate inserted imports with the same cfg
-        for syntax in sema.ancestors_with_macros(position.clone()) {
-            if let Some(file) = ast::SourceFile::cast(syntax.clone()) {
-                return Some(ImportScope::File(file));
-            } else if let Some(item) = ast::Item::cast(syntax) {
-                return match item {
-                    ast::Item::Const(konst) if contains_cfg_attr(&konst) => {
-                        // FIXME: Instead of bailing out with None, we should note down that
-                        // this import needs an attribute added
-                        match sema.original_ast_node(konst)?.body()? {
-                            ast::Expr::BlockExpr(block) => block,
-                            _ => return None,
-                        }
-                        .stmt_list()
-                        .map(ImportScope::Block)
-                    }
-                    ast::Item::Fn(func) if contains_cfg_attr(&func) => {
-                        // FIXME: Instead of bailing out with None, we should note down that
-                        // this import needs an attribute added
-                        sema.original_ast_node(func)?.body()?.stmt_list().map(ImportScope::Block)
-                    }
-                    ast::Item::Static(statik) if contains_cfg_attr(&statik) => {
-                        // FIXME: Instead of bailing out with None, we should note down that
-                        // this import needs an attribute added
-                        match sema.original_ast_node(statik)?.body()? {
-                            ast::Expr::BlockExpr(block) => block,
-                            _ => return None,
-                        }
-                        .stmt_list()
-                        .map(ImportScope::Block)
-                    }
-                    ast::Item::Module(module) => {
-                        // early return is important here, if we can't find the original module
-                        // in the input there is no way for us to insert an import anywhere.
-                        sema.original_ast_node(module)?.item_list().map(ImportScope::Module)
-                    }
-                    _ => continue,
-                };
-            }
-        }
-        None
+    /// Determines the containing syntax node in which to insert a `use` statement affecting `position`.
+    pub fn find_insert_use_container(position: &SyntaxNode) -> Option<Self> {
+        std::iter::successors(Some(position.clone()), SyntaxNode::parent).find_map(Self::from)
     }
 
     pub fn as_syntax_node(&self) -> &SyntaxNode {
diff --git a/crates/proc_macro_srv/src/abis/abi_1_55/rustc_server.rs b/crates/proc_macro_srv/src/abis/abi_1_55/rustc_server.rs
index 6105238d0b..f8626c5f62 100644
--- a/crates/proc_macro_srv/src/abis/abi_1_55/rustc_server.rs
+++ b/crates/proc_macro_srv/src/abis/abi_1_55/rustc_server.rs
@@ -488,8 +488,8 @@ impl server::Literal for Rustc {
         // They must still be present to be ABI-compatible and work with upstream proc_macro.
         "".to_owned()
     }
-    fn from_str(&mut self, s: &str) -> Result<Self::Literal, ()> {
-        Ok(Literal { text: s.into(), id: tt::TokenId::unspecified() })
+    fn from_str(&mut self, _s: &str) -> Result<Self::Literal, ()> {
+        unimplemented!()
     }
     fn symbol(&mut self, literal: &Self::Literal) -> String {
         literal.text.to_string()
diff --git a/crates/proc_macro_srv/src/abis/abi_1_56/rustc_server.rs b/crates/proc_macro_srv/src/abis/abi_1_56/rustc_server.rs
index 1cebc289f8..fb8a4c8cbe 100644
--- a/crates/proc_macro_srv/src/abis/abi_1_56/rustc_server.rs
+++ b/crates/proc_macro_srv/src/abis/abi_1_56/rustc_server.rs
@@ -489,8 +489,8 @@ impl server::Literal for Rustc {
         // They must still be present to be ABI-compatible and work with upstream proc_macro.
         "".to_owned()
     }
-    fn from_str(&mut self, s: &str) -> Result<Self::Literal, ()> {
-        Ok(Literal { text: s.into(), id: tt::TokenId::unspecified() })
+    fn from_str(&mut self, _s: &str) -> Result<Self::Literal, ()> {
+        unimplemented!()
     }
     fn symbol(&mut self, literal: &Self::Literal) -> String {
         literal.text.to_string()
diff --git a/crates/project_model/src/project_json.rs b/crates/project_model/src/project_json.rs
index d8d0d07aff..75ad66a5cc 100644
--- a/crates/project_model/src/project_json.rs
+++ b/crates/project_model/src/project_json.rs
@@ -29,7 +29,6 @@ pub struct Crate {
     pub(crate) display_name: Option<CrateDisplayName>,
     pub(crate) root_module: AbsPathBuf,
     pub(crate) edition: Edition,
-    pub(crate) version: Option<String>,
     pub(crate) deps: Vec<Dependency>,
     pub(crate) cfg: Vec<CfgFlag>,
     pub(crate) target: Option<String>,
@@ -81,7 +80,6 @@ impl ProjectJson {
                             .map(CrateDisplayName::from_canonical_name),
                         root_module,
                         edition: crate_data.edition.into(),
-                        version: crate_data.version.as_ref().map(ToString::to_string),
                         deps: crate_data
                             .deps
                             .into_iter()
@@ -129,8 +127,6 @@ struct CrateData {
     display_name: Option<String>,
     root_module: PathBuf,
     edition: EditionData,
-    #[serde(default)]
-    version: Option<semver::Version>,
     deps: Vec<DepData>,
     #[serde(default)]
     cfg: Vec<CfgFlag>,
diff --git a/crates/project_model/src/sysroot.rs b/crates/project_model/src/sysroot.rs
index 415bc4c9b7..52750f4896 100644
--- a/crates/project_model/src/sysroot.rs
+++ b/crates/project_model/src/sysroot.rs
@@ -43,8 +43,7 @@ impl Sysroot {
         // core is added as a dependency before std in order to
         // mimic rustcs dependency order
         ["core", "alloc", "std"]
-            .iter()
-            .copied()
+            .into_iter()
             .zip(iter::repeat(true))
             .chain(iter::once(("test", false)))
             .filter_map(move |(name, prelude)| Some((name, self.by_name(name)?, prelude)))
@@ -78,7 +77,7 @@ impl Sysroot {
         for path in SYSROOT_CRATES.trim().lines() {
             let name = path.split('/').last().unwrap();
             let root = [format!("{}/src/lib.rs", path), format!("lib{}/lib.rs", path)]
-                .iter()
+                .into_iter()
                 .map(|it| sysroot.root.join(it))
                 .filter_map(|it| ManifestPath::try_from(it).ok())
                 .find(|it| fs::metadata(it).is_ok());
diff --git a/crates/project_model/src/workspace.rs b/crates/project_model/src/workspace.rs
index 2fc88bf505..54e3bae17b 100644
--- a/crates/project_model/src/workspace.rs
+++ b/crates/project_model/src/workspace.rs
@@ -468,7 +468,6 @@ fn project_json_to_crate_graph(
                     file_id,
                     krate.edition,
                     krate.display_name.clone(),
-                    krate.version.clone(),
                     cfg_options.clone(),
                     cfg_options,
                     env,
@@ -676,7 +675,6 @@ fn detached_files_to_crate_graph(
             file_id,
             Edition::CURRENT,
             display_name,
-            None,
             cfg_options.clone(),
             cfg_options.clone(),
             Env::default(),
@@ -826,7 +824,6 @@ fn add_target_crate_root(
         file_id,
         edition,
         Some(display_name),
-        Some(pkg.version.to_string()),
         cfg_options,
         potential_cfg_options,
         env,
@@ -869,7 +866,6 @@ fn sysroot_to_crate_graph(
                 file_id,
                 Edition::CURRENT,
                 Some(display_name),
-                None,
                 cfg_options.clone(),
                 cfg_options.clone(),
                 env,
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs
index bef943464a..8e947b5540 100644
--- a/crates/rust-analyzer/src/global_state.rs
+++ b/crates/rust-analyzer/src/global_state.rs
@@ -8,7 +8,7 @@ use std::{sync::Arc, time::Instant};
 use crossbeam_channel::{unbounded, Receiver, Sender};
 use flycheck::FlycheckHandle;
 use ide::{Analysis, AnalysisHost, Cancellable, Change, FileId};
-use ide_db::base_db::{CrateId, FileLoader, SourceDatabase};
+use ide_db::base_db::CrateId;
 use lsp_types::{SemanticTokens, Url};
 use parking_lot::{Mutex, RwLock};
 use proc_macro_api::ProcMacroServer;
@@ -58,7 +58,6 @@ pub(crate) struct GlobalState {
     pub(crate) mem_docs: MemDocs,
     pub(crate) semantic_tokens_cache: Arc<Mutex<FxHashMap<Url, SemanticTokens>>>,
     pub(crate) shutdown_requested: bool,
-    pub(crate) proc_macro_changed: bool,
     pub(crate) last_reported_status: Option<lsp_ext::ServerStatusParams>,
     pub(crate) source_root_config: SourceRootConfig,
     pub(crate) proc_macro_client: Option<ProcMacroServer>,
@@ -148,7 +147,6 @@ impl GlobalState {
             mem_docs: MemDocs::default(),
             semantic_tokens_cache: Arc::new(Default::default()),
             shutdown_requested: false,
-            proc_macro_changed: false,
             last_reported_status: None,
             source_root_config: SourceRootConfig::default(),
             proc_macro_client: None,
@@ -189,15 +187,6 @@ impl GlobalState {
             }
 
             for file in changed_files {
-                if !file.is_created_or_deleted() {
-                    let crates = self.analysis_host.raw_database().relevant_crates(file.file_id);
-                    let crate_graph = self.analysis_host.raw_database().crate_graph();
-
-                    if crates.iter().any(|&krate| !crate_graph[krate].proc_macro.is_empty()) {
-                        self.proc_macro_changed = true;
-                    }
-                }
-
                 if let Some(path) = vfs.file_path(file.file_id).as_path() {
                     let path = path.to_path_buf();
                     if reload::should_refresh_for_change(&path, file.change_kind) {
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index 4a1060596b..9f08ad5ebf 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -561,7 +561,7 @@ impl GlobalState {
                 s.shutdown_requested = true;
                 Ok(())
             })?
-            .on_sync_mut::<lsp_ext::MemoryUsage>(handlers::handle_memory_usage)?
+            .on_sync_mut::<lsp_ext::MemoryUsage>(|s, p| handlers::handle_memory_usage(s, p))?
             .on_sync::<lsp_ext::JoinLines>(handlers::handle_join_lines)?
             .on_sync::<lsp_ext::OnEnter>(handlers::handle_on_enter)?
             .on_sync::<lsp_types::request::SelectionRangeRequest>(handlers::handle_selection_range)?
diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs
index 7ba5697176..6a6df9c1dd 100644
--- a/crates/rust-analyzer/src/reload.rs
+++ b/crates/rust-analyzer/src/reload.rs
@@ -66,11 +66,6 @@ impl GlobalState {
             message: None,
         };
 
-        if self.proc_macro_changed {
-            status.health = lsp_ext::Health::Warning;
-            status.message =
-                Some("Reload required due to source changes of a procedural macro.".into())
-        }
         if let Some(error) = self.fetch_build_data_error() {
             status.health = lsp_ext::Health::Warning;
             status.message = Some(error)


Test patch:
diff --git a/crates/ide_assists/src/tests.rs b/crates/ide_assists/src/tests.rs
index 5a79979533..7f3c93d740 100644
--- a/crates/ide_assists/src/tests.rs
+++ b/crates/ide_assists/src/tests.rs
@@ -2,7 +2,7 @@ mod sourcegen;
 mod generated;
 
 use expect_test::expect;
-use hir::{db::DefDatabase, Semantics};
+use hir::Semantics;
 use ide_db::{
     base_db::{fixture::WithFixture, FileId, FileRange, SourceDatabaseExt},
     helpers::{
@@ -117,8 +117,7 @@ enum ExpectedResult<'a> {
 
 #[track_caller]
 fn check(handler: Handler, before: &str, expected: ExpectedResult, assist_label: Option<&str>) {
-    let (mut db, file_with_caret_id, range_or_offset) = RootDatabase::with_range_or_offset(before);
-    db.set_enable_proc_attr_macros(true);
+    let (db, file_with_caret_id, range_or_offset) = RootDatabase::with_range_or_offset(before);
     let text_without_caret = db.file_text(file_with_caret_id).to_string();
 
     let frange = FileRange { file_id: file_with_caret_id, range: range_or_offset.into() };
diff --git a/crates/ide_db/src/helpers/insert_use/tests.rs b/crates/ide_db/src/helpers/insert_use/tests.rs
index 34a6900e26..f3b9c7130f 100644
--- a/crates/ide_db/src/helpers/insert_use/tests.rs
+++ b/crates/ide_db/src/helpers/insert_use/tests.rs
@@ -1,7 +1,5 @@
-use base_db::fixture::WithFixture;
 use hir::PrefixKind;
-use stdx::trim_indent;
-use test_utils::{assert_eq_text, CURSOR_MARKER};
+use test_utils::{assert_eq_text, extract_range_or_offset, CURSOR_MARKER};
 
 use super::*;
 
@@ -867,20 +865,17 @@ fn check_with_config(
     ra_fixture_after: &str,
     config: &InsertUseConfig,
 ) {
-    let (db, file_id, pos) = if ra_fixture_before.contains(CURSOR_MARKER) {
-        let (db, file_id, range_or_offset) = RootDatabase::with_range_or_offset(ra_fixture_before);
-        (db, file_id, Some(range_or_offset))
+    let (text, pos) = if ra_fixture_before.contains(CURSOR_MARKER) {
+        let (range_or_offset, text) = extract_range_or_offset(ra_fixture_before);
+        (text, Some(range_or_offset))
     } else {
-        let (db, file_id) = RootDatabase::with_single_file(ra_fixture_before);
-        (db, file_id, None)
+        (ra_fixture_before.to_owned(), None)
     };
-    let sema = &Semantics::new(&db);
-    let source_file = sema.parse(file_id);
-    let syntax = source_file.syntax().clone_for_update();
+    let syntax = ast::SourceFile::parse(&text).tree().syntax().clone_for_update();
     let file = pos
         .and_then(|pos| syntax.token_at_offset(pos.expect_offset()).next()?.parent())
-        .and_then(|it| ImportScope::find_insert_use_container(&it, sema))
-        .or_else(|| ImportScope::from(syntax))
+        .and_then(|it| super::ImportScope::find_insert_use_container(&it))
+        .or_else(|| super::ImportScope::from(syntax))
         .unwrap();
     let path = ast::SourceFile::parse(&format!("use {};", path))
         .tree()
@@ -891,7 +886,7 @@ fn check_with_config(
 
     insert_use(&file, path, config);
     let result = file.as_syntax_node().ancestors().last().unwrap().to_string();
-    assert_eq_text!(&trim_indent(ra_fixture_after), &result);
+    assert_eq_text!(ra_fixture_after, &result);
 }
 
 fn check(
@@ -947,6 +942,6 @@ fn check_merge_only_fail(ra_fixture0: &str, ra_fixture1: &str, mb: MergeBehavior
 
 fn check_guess(ra_fixture: &str, expected: ImportGranularityGuess) {
     let syntax = ast::SourceFile::parse(ra_fixture).tree().syntax().clone();
-    let file = ImportScope::from(syntax).unwrap();
+    let file = super::ImportScope::from(syntax).unwrap();
     assert_eq!(super::guess_granularity_from_scope(&file), expected);
 }
diff --git a/crates/ide_db/src/tests/sourcegen_lints.rs b/crates/ide_db/src/tests/sourcegen_lints.rs
index 3c37aa6cb9..3a44fab0f8 100644
--- a/crates/ide_db/src/tests/sourcegen_lints.rs
+++ b/crates/ide_db/src/tests/sourcegen_lints.rs
@@ -105,7 +105,7 @@ fn generate_lint_descriptor(buf: &mut String) {
 
 fn generate_feature_descriptor(buf: &mut String, src_dir: &Path) {
     let mut features = ["language-features", "library-features"]
-        .iter()
+        .into_iter()
         .flat_map(|it| sourcegen::list_files(&src_dir.join(it)))
         .filter(|path| {
             // Get all `.md ` files
diff --git a/crates/project_model/src/tests.rs b/crates/project_model/src/tests.rs
index 252acde14d..647d30605d 100644
--- a/crates/project_model/src/tests.rs
+++ b/crates/project_model/src/tests.rs
@@ -121,9 +121,6 @@ fn cargo_hello_world_project_model_with_wildcard_overrides() {
                             1,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -181,9 +178,6 @@ fn cargo_hello_world_project_model_with_wildcard_overrides() {
                             6,
                         ),
                         edition: Edition2015,
-                        version: Some(
-                            "0.2.98",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -250,9 +244,6 @@ fn cargo_hello_world_project_model_with_wildcard_overrides() {
                             3,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -319,9 +310,6 @@ fn cargo_hello_world_project_model_with_wildcard_overrides() {
                             5,
                         ),
                         edition: Edition2015,
-                        version: Some(
-                            "0.2.98",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -378,9 +366,6 @@ fn cargo_hello_world_project_model_with_wildcard_overrides() {
                             2,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -447,9 +432,6 @@ fn cargo_hello_world_project_model_with_wildcard_overrides() {
                             7,
                         ),
                         edition: Edition2015,
-                        version: Some(
-                            "0.2.98",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -506,9 +488,6 @@ fn cargo_hello_world_project_model_with_wildcard_overrides() {
                             4,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -597,9 +576,6 @@ fn cargo_hello_world_project_model_with_selective_overrides() {
                             1,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -659,9 +635,6 @@ fn cargo_hello_world_project_model_with_selective_overrides() {
                             6,
                         ),
                         edition: Edition2015,
-                        version: Some(
-                            "0.2.98",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -728,9 +701,6 @@ fn cargo_hello_world_project_model_with_selective_overrides() {
                             3,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -799,9 +769,6 @@ fn cargo_hello_world_project_model_with_selective_overrides() {
                             5,
                         ),
                         edition: Edition2015,
-                        version: Some(
-                            "0.2.98",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -858,9 +825,6 @@ fn cargo_hello_world_project_model_with_selective_overrides() {
                             2,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -929,9 +893,6 @@ fn cargo_hello_world_project_model_with_selective_overrides() {
                             7,
                         ),
                         edition: Edition2015,
-                        version: Some(
-                            "0.2.98",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -988,9 +949,6 @@ fn cargo_hello_world_project_model_with_selective_overrides() {
                             4,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1072,9 +1030,6 @@ fn cargo_hello_world_project_model() {
                             1,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1134,9 +1089,6 @@ fn cargo_hello_world_project_model() {
                             6,
                         ),
                         edition: Edition2015,
-                        version: Some(
-                            "0.2.98",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1205,9 +1157,6 @@ fn cargo_hello_world_project_model() {
                             3,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1276,9 +1225,6 @@ fn cargo_hello_world_project_model() {
                             5,
                         ),
                         edition: Edition2015,
-                        version: Some(
-                            "0.2.98",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1337,9 +1283,6 @@ fn cargo_hello_world_project_model() {
                             2,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1408,9 +1351,6 @@ fn cargo_hello_world_project_model() {
                             7,
                         ),
                         edition: Edition2015,
-                        version: Some(
-                            "0.2.98",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1469,9 +1409,6 @@ fn cargo_hello_world_project_model() {
                             4,
                         ),
                         edition: Edition2018,
-                        version: Some(
-                            "0.1.0",
-                        ),
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1553,7 +1490,6 @@ fn rust_project_hello_world_project_model() {
                             1,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1591,7 +1527,6 @@ fn rust_project_hello_world_project_model() {
                             11,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1619,7 +1554,6 @@ fn rust_project_hello_world_project_model() {
                             8,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1647,7 +1581,6 @@ fn rust_project_hello_world_project_model() {
                             5,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1685,7 +1618,6 @@ fn rust_project_hello_world_project_model() {
                             2,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1713,7 +1645,6 @@ fn rust_project_hello_world_project_model() {
                             12,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1778,7 +1709,6 @@ fn rust_project_hello_world_project_model() {
                             9,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1806,7 +1736,6 @@ fn rust_project_hello_world_project_model() {
                             6,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1834,7 +1763,6 @@ fn rust_project_hello_world_project_model() {
                             3,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1862,7 +1790,6 @@ fn rust_project_hello_world_project_model() {
                             10,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -1890,7 +1817,6 @@ fn rust_project_hello_world_project_model() {
                             7,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
@@ -2000,7 +1926,6 @@ fn rust_project_hello_world_project_model() {
                             4,
                         ),
                         edition: Edition2018,
-                        version: None,
                         display_name: Some(
                             CrateDisplayName {
                                 crate_name: CrateName(
diff --git a/crates/rust-analyzer/tests/slow-tests/support.rs b/crates/rust-analyzer/tests/slow-tests/support.rs
index 99ae418f7c..a8c2a5bb61 100644
--- a/crates/rust-analyzer/tests/slow-tests/support.rs
+++ b/crates/rust-analyzer/tests/slow-tests/support.rs
@@ -212,8 +212,8 @@ impl Server {
                     if req.method == "client/registerCapability" {
                         let params = req.params.to_string();
                         if ["workspace/didChangeWatchedFiles", "textDocument/didSave"]
-                            .iter()
-                            .any(|&it| params.contains(it))
+                            .into_iter()
+                            .any(|it| params.contains(it))
                         {
                             continue;
                         }