From 6c70806b3106277e6ab9f34da49923e6cb111626 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 25 Oct 2024 13:29:07 +0200 Subject: [PATCH] Invert token iteration order in macro mapping --- .../rust-analyzer/crates/hir/src/semantics.rs | 4 +++ .../rust-analyzer/crates/ide-db/src/lib.rs | 6 +++-- .../crates/ide/src/call_hierarchy.rs | 5 ++-- .../rust-analyzer/crates/ide/src/hover.rs | 2 +- .../crates/ide/src/hover/tests.rs | 26 +++++++++---------- .../crates/ide/src/references.rs | 10 +++---- .../crates/ide/src/syntax_highlighting.rs | 3 ++- .../test_data/highlight_issue_18089.html | 2 +- 8 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/tools/rust-analyzer/crates/hir/src/semantics.rs b/src/tools/rust-analyzer/crates/hir/src/semantics.rs index 860754d5e70..592a4b4853d 100644 --- a/src/tools/rust-analyzer/crates/hir/src/semantics.rs +++ b/src/tools/rust-analyzer/crates/hir/src/semantics.rs @@ -954,6 +954,10 @@ fn descend_into_macros_impl( }; while let Some((expansion, ref mut tokens)) = stack.pop() { + // Reverse the tokens so we prefer first tokens (to accommodate for popping from the + // back) + // alternatively we could pop from the front but that would shift the content on every pop + tokens.reverse(); while let Some((token, ctx)) = tokens.pop() { let was_not_remapped = (|| { // First expand into attribute invocations diff --git a/src/tools/rust-analyzer/crates/ide-db/src/lib.rs b/src/tools/rust-analyzer/crates/ide-db/src/lib.rs index b7b133ac10e..b764f852f04 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/lib.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/lib.rs @@ -301,6 +301,8 @@ pub struct Ranker<'a> { } impl<'a> Ranker<'a> { + pub const MAX_RANK: usize = 0b1110; + pub fn from_token(token: &'a syntax::SyntaxToken) -> Self { let kind = token.kind(); Ranker { kind, text: token.text(), ident_kind: kind.is_any_identifier() } @@ -317,9 +319,9 @@ pub fn rank_token(&self, tok: &syntax::SyntaxToken) -> usize { // anything that mapped into a token tree has likely no semantic information let no_tt_parent = tok.parent().map_or(false, |it| it.kind() != parser::SyntaxKind::TOKEN_TREE); - !((both_idents as usize) + (both_idents as usize) | ((exact_same_kind as usize) << 1) | ((same_text as usize) << 2) - | ((no_tt_parent as usize) << 3)) + | ((no_tt_parent as usize) << 3) } } diff --git a/src/tools/rust-analyzer/crates/ide/src/call_hierarchy.rs b/src/tools/rust-analyzer/crates/ide/src/call_hierarchy.rs index 1b82c00d1dc..e5b4ed17b2a 100644 --- a/src/tools/rust-analyzer/crates/ide/src/call_hierarchy.rs +++ b/src/tools/rust-analyzer/crates/ide/src/call_hierarchy.rs @@ -510,6 +510,7 @@ fn caller$0() { expect![[]], ); } + #[test] fn test_call_hierarchy_in_macros_incoming_different_files() { check_hierarchy( @@ -591,9 +592,9 @@ fn $ident() { "#, expect!["callee Function FileId(0) 22..37 30..36"], expect![[r#" - callee Function FileId(0) 38..52 44..50 : FileId(0):44..50 caller Function FileId(0) 38..52 : FileId(0):44..50 - caller Function FileId(1) 130..136 130..136 : FileId(0):44..50"#]], + caller Function FileId(1) 130..136 130..136 : FileId(0):44..50 + callee Function FileId(0) 38..52 44..50 : FileId(0):44..50"#]], expect![[]], ); } diff --git a/src/tools/rust-analyzer/crates/ide/src/hover.rs b/src/tools/rust-analyzer/crates/ide/src/hover.rs index 91ec672feba..6cac4f1ee48 100644 --- a/src/tools/rust-analyzer/crates/ide/src/hover.rs +++ b/src/tools/rust-analyzer/crates/ide/src/hover.rs @@ -184,7 +184,7 @@ fn hover_offset( let ranker = Ranker::from_token(&original_token); - descended.sort_by_cached_key(|tok| ranker.rank_token(tok)); + descended.sort_by_cached_key(|tok| !ranker.rank_token(tok)); let mut res = vec![]; for token in descended { diff --git a/src/tools/rust-analyzer/crates/ide/src/hover/tests.rs b/src/tools/rust-analyzer/crates/ide/src/hover/tests.rs index ef835f5bef8..3e402630419 100644 --- a/src/tools/rust-analyzer/crates/ide/src/hover/tests.rs +++ b/src/tools/rust-analyzer/crates/ide/src/hover/tests.rs @@ -288,19 +288,6 @@ fn $name() {} expect![[r#" *abc* - ```rust - test::module - ``` - - ```rust - fn abc() - ``` - - --- - - Inner - --- - ```rust test ``` @@ -312,6 +299,19 @@ fn abc() --- Outer + --- + + ```rust + test::module + ``` + + ```rust + fn abc() + ``` + + --- + + Inner "#]], ); } diff --git a/src/tools/rust-analyzer/crates/ide/src/references.rs b/src/tools/rust-analyzer/crates/ide/src/references.rs index e7cb8a253f4..339315db571 100644 --- a/src/tools/rust-analyzer/crates/ide/src/references.rs +++ b/src/tools/rust-analyzer/crates/ide/src/references.rs @@ -1701,14 +1701,14 @@ fn f() { } "#, expect![[r#" - func Function FileId(0) 137..146 140..144 - - FileId(0) 161..165 - - func Function FileId(0) 137..146 140..144 module FileId(0) 181..185 + + + func Function FileId(0) 137..146 140..144 + + FileId(0) 161..165 "#]], ) } diff --git a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting.rs b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting.rs index 54d5307adff..0747d1b404b 100644 --- a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting.rs +++ b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting.rs @@ -397,6 +397,7 @@ fn item(&self) -> &ast::Item { Some(AttrOrDerive::Derive(_)) => inside_attribute, None => false, }; + let descended_element = if in_macro { // Attempt to descend tokens into macro-calls. let res = match element { @@ -412,7 +413,7 @@ fn item(&self) -> &ast::Item { let tok = tok.value; let my_rank = ranker.rank_token(&tok); - if my_rank > 0b1110 { + if my_rank >= Ranker::MAX_RANK { // a rank of 0b1110 means that we have found a maximally interesting // token so stop early. t = Some(tok); diff --git a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_issue_18089.html b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_issue_18089.html index d07ba74db24..361dcd1bc37 100644 --- a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_issue_18089.html +++ b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_issue_18089.html @@ -50,4 +50,4 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd } #[proc_macros::issue_18089] -fn template() {} \ No newline at end of file +fn template() {} \ No newline at end of file