Skip to content

Commit 904d8f6

Browse files
committed
Auto merge of rust-lang#134681 - lnicola:sync-from-ra, r=lnicola
Subtree update of `rust-analyzer` r? `@ghost`
2 parents 85c3989 + 8dbdcc0 commit 904d8f6

File tree

113 files changed

+3082
-2151
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+3082
-2151
lines changed

src/tools/rust-analyzer/Cargo.lock

+30-39
Original file line numberDiff line numberDiff line change
@@ -1011,24 +1011,25 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
10111011
[[package]]
10121012
name = "lsp-server"
10131013
version = "0.7.7"
1014+
source = "registry+https://github.com/rust-lang/crates.io-index"
1015+
checksum = "550446e84739dcaf6d48a4a093973850669e13e8a34d8f8d64851041be267cd9"
10141016
dependencies = [
10151017
"crossbeam-channel",
1016-
"ctrlc",
10171018
"log",
1018-
"lsp-types",
10191019
"serde",
10201020
"serde_json",
10211021
]
10221022

10231023
[[package]]
10241024
name = "lsp-server"
1025-
version = "0.7.7"
1026-
source = "registry+https://github.com/rust-lang/crates.io-index"
1027-
checksum = "550446e84739dcaf6d48a4a093973850669e13e8a34d8f8d64851041be267cd9"
1025+
version = "0.7.8"
10281026
dependencies = [
10291027
"crossbeam-channel",
1028+
"ctrlc",
10301029
"log",
1030+
"lsp-types",
10311031
"serde",
1032+
"serde_derive",
10321033
"serde_json",
10331034
]
10341035

@@ -1289,7 +1290,6 @@ name = "paths"
12891290
version = "0.0.0"
12901291
dependencies = [
12911292
"camino",
1292-
"serde",
12931293
]
12941294

12951295
[[package]]
@@ -1352,12 +1352,12 @@ dependencies = [
13521352
name = "proc-macro-api"
13531353
version = "0.0.0"
13541354
dependencies = [
1355-
"base-db",
13561355
"indexmap",
13571356
"intern",
13581357
"paths",
13591358
"rustc-hash 2.0.0",
13601359
"serde",
1360+
"serde_derive",
13611361
"serde_json",
13621362
"span",
13631363
"stdx",
@@ -1369,7 +1369,6 @@ dependencies = [
13691369
name = "proc-macro-srv"
13701370
version = "0.0.0"
13711371
dependencies = [
1372-
"base-db",
13731372
"expect-test",
13741373
"intern",
13751374
"libloading",
@@ -1448,6 +1447,7 @@ dependencies = [
14481447
"rustc-hash 2.0.0",
14491448
"semver",
14501449
"serde",
1450+
"serde_derive",
14511451
"serde_json",
14521452
"span",
14531453
"stdx",
@@ -1507,9 +1507,9 @@ dependencies = [
15071507

15081508
[[package]]
15091509
name = "ra-ap-rustc_abi"
1510-
version = "0.85.0"
1510+
version = "0.87.0"
15111511
source = "registry+https://github.com/rust-lang/crates.io-index"
1512-
checksum = "af462c3a2d524b84a51b6848b439787f01b35c6c1086d3e3086a5f5eea92ed9a"
1512+
checksum = "28b782af0a7a8df16ddf43cd70da9f17bc3b1ce712c9e4992b6edb16f5f53632"
15131513
dependencies = [
15141514
"bitflags 2.6.0",
15151515
"ra-ap-rustc_index",
@@ -1518,19 +1518,19 @@ dependencies = [
15181518

15191519
[[package]]
15201520
name = "ra-ap-rustc_index"
1521-
version = "0.85.0"
1521+
version = "0.87.0"
15221522
source = "registry+https://github.com/rust-lang/crates.io-index"
1523-
checksum = "be6bb8cb0ab78d94a222f1ffd3e87254cdfb57413382b8d6ebe26a85482f99d1"
1523+
checksum = "ce5742f134960482f543b35ecebec3cacc6d79a9a685713518b4d8d70c5f9aa8"
15241524
dependencies = [
15251525
"ra-ap-rustc_index_macros",
15261526
"smallvec",
15271527
]
15281528

15291529
[[package]]
15301530
name = "ra-ap-rustc_index_macros"
1531-
version = "0.85.0"
1531+
version = "0.87.0"
15321532
source = "registry+https://github.com/rust-lang/crates.io-index"
1533-
checksum = "c24b1641455b46e87435b7321219672077066e678963d239a4a2904732979b16"
1533+
checksum = "d7ea011fcf68309a8835ad01d91c032cb18444617b00e2cab21d45b208164441"
15341534
dependencies = [
15351535
"proc-macro2",
15361536
"quote",
@@ -1539,29 +1539,29 @@ dependencies = [
15391539

15401540
[[package]]
15411541
name = "ra-ap-rustc_lexer"
1542-
version = "0.85.0"
1542+
version = "0.87.0"
15431543
source = "registry+https://github.com/rust-lang/crates.io-index"
1544-
checksum = "94daa86974417981fed2f12bd8fb00158dfa6fee561152bed689278c846d0272"
1544+
checksum = "eb76f0a4d4c20859e41f0a23bff0f37ab9ca9171c214a6c7dd72ea69434865dc"
15451545
dependencies = [
15461546
"unicode-properties",
15471547
"unicode-xid",
15481548
]
15491549

15501550
[[package]]
15511551
name = "ra-ap-rustc_parse_format"
1552-
version = "0.85.0"
1552+
version = "0.87.0"
15531553
source = "registry+https://github.com/rust-lang/crates.io-index"
1554-
checksum = "fc07f6bd581746f358e39c4b6bfe8d455b3d6ad1a857821016d0d42eeb5e1e3e"
1554+
checksum = "06080bd35078305421a62da77f3c128482d8d44441b6da8ce9d146d1cd9cdb5b"
15551555
dependencies = [
15561556
"ra-ap-rustc_index",
15571557
"ra-ap-rustc_lexer",
15581558
]
15591559

15601560
[[package]]
15611561
name = "ra-ap-rustc_pattern_analysis"
1562-
version = "0.85.0"
1562+
version = "0.87.0"
15631563
source = "registry+https://github.com/rust-lang/crates.io-index"
1564-
checksum = "2f49b86e1276c1c3c72898410def29b699415f4e7d1dfb3531daf79794694372"
1564+
checksum = "68a3154fe4c20c177d7b3c678a2d3a97aba0cca156ddef88959915041889daf0"
15651565
dependencies = [
15661566
"ra-ap-rustc_index",
15671567
"rustc-hash 2.0.0",
@@ -1676,7 +1676,7 @@ dependencies = [
16761676
"intern",
16771677
"itertools",
16781678
"load-cargo",
1679-
"lsp-server 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)",
1679+
"lsp-server 0.7.7",
16801680
"lsp-types",
16811681
"memchr",
16821682
"mimalloc",
@@ -1695,6 +1695,7 @@ dependencies = [
16951695
"scip",
16961696
"semver",
16971697
"serde",
1698+
"serde_derive",
16981699
"serde_json",
16991700
"stdx",
17001701
"syntax",
@@ -1822,18 +1823,18 @@ dependencies = [
18221823

18231824
[[package]]
18241825
name = "serde"
1825-
version = "1.0.206"
1826+
version = "1.0.216"
18261827
source = "registry+https://github.com/rust-lang/crates.io-index"
1827-
checksum = "5b3e4cd94123dd520a128bcd11e34d9e9e423e7e3e50425cb1b4b1e3549d0284"
1828+
checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e"
18281829
dependencies = [
18291830
"serde_derive",
18301831
]
18311832

18321833
[[package]]
18331834
name = "serde_derive"
1834-
version = "1.0.206"
1835+
version = "1.0.216"
18351836
source = "registry+https://github.com/rust-lang/crates.io-index"
1836-
checksum = "fabfb6138d2383ea8208cf98ccf69cdfb1aff4088460681d84189aa259762f97"
1837+
checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e"
18371838
dependencies = [
18381839
"proc-macro2",
18391840
"quote",
@@ -1924,12 +1925,6 @@ version = "0.3.2"
19241925
source = "registry+https://github.com/rust-lang/crates.io-index"
19251926
checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a"
19261927

1927-
[[package]]
1928-
name = "stable_deref_trait"
1929-
version = "1.2.0"
1930-
source = "registry+https://github.com/rust-lang/crates.io-index"
1931-
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
1932-
19331928
[[package]]
19341929
name = "stdx"
19351930
version = "0.0.0"
@@ -1946,9 +1941,9 @@ dependencies = [
19461941

19471942
[[package]]
19481943
name = "syn"
1949-
version = "2.0.74"
1944+
version = "2.0.87"
19501945
source = "registry+https://github.com/rust-lang/crates.io-index"
1951-
checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7"
1946+
checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d"
19521947
dependencies = [
19531948
"proc-macro2",
19541949
"quote",
@@ -2264,13 +2259,9 @@ dependencies = [
22642259

22652260
[[package]]
22662261
name = "triomphe"
2267-
version = "0.1.13"
2262+
version = "0.1.14"
22682263
source = "registry+https://github.com/rust-lang/crates.io-index"
2269-
checksum = "e6631e42e10b40c0690bf92f404ebcfe6e1fdb480391d15f17cc8e96eeed5369"
2270-
dependencies = [
2271-
"serde",
2272-
"stable_deref_trait",
2273-
]
2264+
checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85"
22742265

22752266
[[package]]
22762267
name = "tt"

src/tools/rust-analyzer/Cargo.toml

+8-7
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,11 @@ vfs-notify = { path = "./crates/vfs-notify", version = "0.0.0" }
8585
vfs = { path = "./crates/vfs", version = "0.0.0" }
8686
edition = { path = "./crates/edition", version = "0.0.0" }
8787

88-
ra-ap-rustc_lexer = { version = "0.85", default-features = false }
89-
ra-ap-rustc_parse_format = { version = "0.85", default-features = false }
90-
ra-ap-rustc_index = { version = "0.85", default-features = false }
91-
ra-ap-rustc_abi = { version = "0.85", default-features = false }
92-
ra-ap-rustc_pattern_analysis = { version = "0.85", default-features = false }
88+
ra-ap-rustc_lexer = { version = "0.87", default-features = false }
89+
ra-ap-rustc_parse_format = { version = "0.87", default-features = false }
90+
ra-ap-rustc_index = { version = "0.87", default-features = false }
91+
ra-ap-rustc_abi = { version = "0.87", default-features = false }
92+
ra-ap-rustc_pattern_analysis = { version = "0.87", default-features = false }
9393

9494
# local crates that aren't published to crates.io. These should not have versions.
9595
test-fixture = { path = "./crates/test-fixture" }
@@ -138,7 +138,8 @@ pulldown-cmark = { version = "0.9.0", default-features = false }
138138
rayon = "1.8.0"
139139
rustc-hash = "2.0.0"
140140
semver = "1.0.14"
141-
serde = { version = "1.0.192", features = ["derive"] }
141+
serde = { version = "1.0.192" }
142+
serde_derive = { version = "1.0.192" }
142143
serde_json = "1.0.108"
143144
smallvec = { version = "1.10.0", features = [
144145
"const_new",
@@ -157,7 +158,7 @@ tracing-subscriber = { version = "0.3.18", default-features = false, features =
157158
"time",
158159
"tracing-log",
159160
] }
160-
triomphe = { version = "0.1.10", default-features = false, features = ["std"] }
161+
triomphe = { version = "0.1.14", default-features = false, features = ["std"] }
161162
url = "2.3.1"
162163
xshell = "0.2.5"
163164

src/tools/rust-analyzer/crates/hir-def/src/body.rs

+38-14
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use smallvec::SmallVec;
1818
use span::{Edition, MacroFileId};
1919
use syntax::{ast, AstPtr, SyntaxNodePtr};
2020
use triomphe::Arc;
21+
use tt::TextRange;
2122

2223
use crate::{
2324
db::DefDatabase,
@@ -143,15 +144,7 @@ pub struct BodySourceMap {
143144

144145
pub types: TypesSourceMap,
145146

146-
// FIXME: Make this a sane struct.
147-
template_map: Option<
148-
Box<(
149-
// format_args!
150-
FxHashMap<ExprId, (HygieneId, Vec<(syntax::TextRange, Name)>)>,
151-
// asm!
152-
FxHashMap<ExprId, Vec<Vec<(syntax::TextRange, usize)>>>,
153-
)>,
154-
>,
147+
template_map: Option<Box<FormatTemplate>>,
155148

156149
expansions: FxHashMap<InFile<AstPtr<ast::MacroCall>>, MacroFileId>,
157150

@@ -160,6 +153,20 @@ pub struct BodySourceMap {
160153
diagnostics: Vec<BodyDiagnostic>,
161154
}
162155

156+
#[derive(Default, Debug, Eq, PartialEq)]
157+
struct FormatTemplate {
158+
/// A map from `format_args!()` expressions to their captures.
159+
format_args_to_captures: FxHashMap<ExprId, (HygieneId, Vec<(syntax::TextRange, Name)>)>,
160+
/// A map from `asm!()` expressions to their captures.
161+
asm_to_captures: FxHashMap<ExprId, Vec<Vec<(syntax::TextRange, usize)>>>,
162+
/// A map from desugared expressions of implicit captures to their source.
163+
///
164+
/// The value stored for each capture is its template literal and offset inside it. The template literal
165+
/// is from the `format_args[_nl]!()` macro and so needs to be mapped up once to go to the user-written
166+
/// template.
167+
implicit_capture_to_source: FxHashMap<ExprId, InFile<(AstPtr<ast::Expr>, TextRange)>>,
168+
}
169+
163170
#[derive(Debug, Eq, PartialEq)]
164171
pub enum BodyDiagnostic {
165172
InactiveCode { node: InFile<SyntaxNodePtr>, cfg: CfgExpr, opts: CfgOptions },
@@ -798,18 +805,29 @@ impl BodySourceMap {
798805
node: InFile<&ast::FormatArgsExpr>,
799806
) -> Option<(HygieneId, &[(syntax::TextRange, Name)])> {
800807
let src = node.map(AstPtr::new).map(AstPtr::upcast::<ast::Expr>);
801-
let (hygiene, names) =
802-
self.template_map.as_ref()?.0.get(&self.expr_map.get(&src)?.as_expr()?)?;
808+
let (hygiene, names) = self
809+
.template_map
810+
.as_ref()?
811+
.format_args_to_captures
812+
.get(&self.expr_map.get(&src)?.as_expr()?)?;
803813
Some((*hygiene, &**names))
804814
}
805815

816+
pub fn format_args_implicit_capture(
817+
&self,
818+
capture_expr: ExprId,
819+
) -> Option<InFile<(AstPtr<ast::Expr>, TextRange)>> {
820+
self.template_map.as_ref()?.implicit_capture_to_source.get(&capture_expr).copied()
821+
}
822+
806823
pub fn asm_template_args(
807824
&self,
808825
node: InFile<&ast::AsmExpr>,
809826
) -> Option<(ExprId, &[Vec<(syntax::TextRange, usize)>])> {
810827
let src = node.map(AstPtr::new).map(AstPtr::upcast::<ast::Expr>);
811828
let expr = self.expr_map.get(&src)?.as_expr()?;
812-
Some(expr).zip(self.template_map.as_ref()?.1.get(&expr).map(std::ops::Deref::deref))
829+
Some(expr)
830+
.zip(self.template_map.as_ref()?.asm_to_captures.get(&expr).map(std::ops::Deref::deref))
813831
}
814832

815833
/// Get a reference to the body source map's diagnostics.
@@ -835,8 +853,14 @@ impl BodySourceMap {
835853
types,
836854
} = self;
837855
if let Some(template_map) = template_map {
838-
template_map.0.shrink_to_fit();
839-
template_map.1.shrink_to_fit();
856+
let FormatTemplate {
857+
format_args_to_captures,
858+
asm_to_captures,
859+
implicit_capture_to_source,
860+
} = &mut **template_map;
861+
format_args_to_captures.shrink_to_fit();
862+
asm_to_captures.shrink_to_fit();
863+
implicit_capture_to_source.shrink_to_fit();
840864
}
841865
expr_map.shrink_to_fit();
842866
expr_map_back.shrink_to_fit();

src/tools/rust-analyzer/crates/hir-def/src/body/lower.rs

+16-4
Original file line numberDiff line numberDiff line change
@@ -1957,17 +1957,29 @@ impl ExprCollector<'_> {
19571957
_ => None,
19581958
});
19591959
let mut mappings = vec![];
1960-
let (fmt, hygiene) = match template.and_then(|it| self.expand_macros_to_string(it)) {
1961-
Some((s, is_direct_literal)) => {
1960+
let (fmt, hygiene) = match template.and_then(|template| {
1961+
self.expand_macros_to_string(template.clone()).map(|it| (it, template))
1962+
}) {
1963+
Some(((s, is_direct_literal), template)) => {
19621964
let call_ctx = self.expander.syntax_context();
19631965
let hygiene = self.hygiene_id_for(s.syntax().text_range().start());
19641966
let fmt = format_args::parse(
19651967
&s,
19661968
fmt_snippet,
19671969
args,
19681970
is_direct_literal,
1969-
|name| {
1971+
|name, range| {
19701972
let expr_id = self.alloc_expr_desugared(Expr::Path(Path::from(name)));
1973+
if let Some(range) = range {
1974+
self.source_map
1975+
.template_map
1976+
.get_or_insert_with(Default::default)
1977+
.implicit_capture_to_source
1978+
.insert(
1979+
expr_id,
1980+
self.expander.in_file((AstPtr::new(&template), range)),
1981+
);
1982+
}
19711983
if !hygiene.is_root() {
19721984
self.body.expr_hygiene.insert(expr_id, hygiene);
19731985
}
@@ -2139,7 +2151,7 @@ impl ExprCollector<'_> {
21392151
self.source_map
21402152
.template_map
21412153
.get_or_insert_with(Default::default)
2142-
.0
2154+
.format_args_to_captures
21432155
.insert(idx, (hygiene, mappings));
21442156
idx
21452157
}

0 commit comments

Comments
 (0)