From c50c4f8bbb8da046c19765f0bd909e634bdd9cdb Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 15 Mar 2024 09:28:39 +0100 Subject: [PATCH] internal: Use assoc items as anchors for spans --- crates/hir-expand/src/span_map.rs | 60 ++++++++++++++++--- crates/ide-db/src/defs.rs | 11 ++-- .../src/integrated_benchmarks.rs | 9 +-- crates/syntax/src/ast/node_ext.rs | 11 ++++ 4 files changed, 74 insertions(+), 17 deletions(-) diff --git a/crates/hir-expand/src/span_map.rs b/crates/hir-expand/src/span_map.rs index 3713578478e..eae2c8fb632 100644 --- a/crates/hir-expand/src/span_map.rs +++ b/crates/hir-expand/src/span_map.rs @@ -1,12 +1,13 @@ //! Span maps for real files and macro expansions. use span::{FileId, HirFileId, HirFileIdRepr, MacroFileId, Span, SyntaxContextId}; -use syntax::{AstNode, TextRange}; +use stdx::TupleExt; +use syntax::{ast, AstNode, TextRange}; use triomphe::Arc; pub use span::RealSpanMap; -use crate::db::ExpandDatabase; +use crate::{attrs::collect_attrs, db::ExpandDatabase}; pub type ExpansionSpanMap = span::SpanMap; @@ -83,13 +84,54 @@ pub(crate) fn real_span_map(db: &dyn ExpandDatabase, file_id: FileId) -> Arc + { + if let Some(extern_item_list) = it.extern_item_list() { + pairs.extend( + extern_item_list.extern_items().map(ast::Item::from).map(item_to_entry), + ); + } + } + ast::Item::Impl(it) if !collect_attrs(it).map(TupleExt::tail).any(|it| it.is_left()) => { + if let Some(assoc_item_list) = it.assoc_item_list() { + pairs.extend(assoc_item_list.assoc_items().map(ast::Item::from).map(item_to_entry)); + } + } + ast::Item::Module(it) if !collect_attrs(it).map(TupleExt::tail).any(|it| it.is_left()) => { + if let Some(item_list) = it.item_list() { + pairs.extend(item_list.items().map(item_to_entry)); + } + } + ast::Item::Trait(it) if !collect_attrs(it).map(TupleExt::tail).any(|it| it.is_left()) => { + if let Some(assoc_item_list) = it.assoc_item_list() { + pairs.extend(assoc_item_list.assoc_items().map(ast::Item::from).map(item_to_entry)); + } + } + _ => (), + }); Arc::new(RealSpanMap::from_file( file_id, diff --git a/crates/ide-db/src/defs.rs b/crates/ide-db/src/defs.rs index 33970de1e4b..c0f0faba35c 100644 --- a/crates/ide-db/src/defs.rs +++ b/crates/ide-db/src/defs.rs @@ -407,7 +407,7 @@ pub fn defined(self) -> Option { } pub fn classify(sema: &Semantics<'_, RootDatabase>, name: &ast::Name) -> Option { - let _p = tracing::span!(tracing::Level::INFO, "classify_name").entered(); + let _p = tracing::span!(tracing::Level::INFO, "NameClass::classify").entered(); let parent = name.syntax().parent()?; @@ -499,7 +499,8 @@ pub fn classify_lifetime( sema: &Semantics<'_, RootDatabase>, lifetime: &ast::Lifetime, ) -> Option { - let _p = tracing::span!(tracing::Level::INFO, "classify_lifetime", ?lifetime).entered(); + let _p = tracing::span!(tracing::Level::INFO, "NameClass::classify_lifetime", ?lifetime) + .entered(); let parent = lifetime.syntax().parent()?; if let Some(it) = ast::LifetimeParam::cast(parent.clone()) { @@ -590,7 +591,8 @@ pub fn classify( sema: &Semantics<'_, RootDatabase>, name_ref: &ast::NameRef, ) -> Option { - let _p = tracing::span!(tracing::Level::INFO, "classify_name_ref", ?name_ref).entered(); + let _p = + tracing::span!(tracing::Level::INFO, "NameRefClass::classify", ?name_ref).entered(); let parent = name_ref.syntax().parent()?; @@ -689,7 +691,8 @@ pub fn classify_lifetime( sema: &Semantics<'_, RootDatabase>, lifetime: &ast::Lifetime, ) -> Option { - let _p = tracing::span!(tracing::Level::INFO, "classify_lifetime_ref", ?lifetime).entered(); + let _p = tracing::span!(tracing::Level::INFO, "NameRefClass::classify_lifetime", ?lifetime) + .entered(); let parent = lifetime.syntax().parent()?; match parent.kind() { SyntaxKind::BREAK_EXPR | SyntaxKind::CONTINUE_EXPR => { diff --git a/crates/rust-analyzer/src/integrated_benchmarks.rs b/crates/rust-analyzer/src/integrated_benchmarks.rs index ae58e6b9b24..1c5a862c703 100644 --- a/crates/rust-analyzer/src/integrated_benchmarks.rs +++ b/crates/rust-analyzer/src/integrated_benchmarks.rs @@ -56,8 +56,6 @@ fn integrated_highlighting_benchmark() { vfs.file_id(&path).unwrap_or_else(|| panic!("can't find virtual file for {path}")) }; - let _g = crate::tracing::hprof::init("*>150"); - { let _it = stdx::timeit("initial"); let analysis = host.analysis(); @@ -67,13 +65,16 @@ fn integrated_highlighting_benchmark() { { let _it = stdx::timeit("change"); let mut text = host.analysis().file_text(file_id).unwrap().to_string(); - text.push_str("\npub fn _dummy() {}\n"); + text = text.replace( + "self.data.cargo_buildScripts_rebuildOnSave", + "self. data. cargo_buildScripts_rebuildOnSave", + ); let mut change = ChangeWithProcMacros::new(); change.change_file(file_id, Some(text)); host.apply_change(change); } - let _g = crate::tracing::hprof::init("*>50"); + let _g = crate::tracing::hprof::init("*>20"); { let _it = stdx::timeit("after change"); diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index 1bc1ef8434f..c3d6f50e6b0 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -139,6 +139,17 @@ fn from(assoc: ast::AssocItem) -> Self { } } +impl From for ast::Item { + fn from(extern_item: ast::ExternItem) -> Self { + match extern_item { + ast::ExternItem::Static(it) => ast::Item::Static(it), + ast::ExternItem::Fn(it) => ast::Item::Fn(it), + ast::ExternItem::MacroCall(it) => ast::Item::MacroCall(it), + ast::ExternItem::TypeAlias(it) => ast::Item::TypeAlias(it), + } + } +} + #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum AttrKind { Inner,