Skip to content

Commit e7ef5d8

Browse files
committed
Merge commit '9b3d03408c66749d56466bb09baf2a7177deb6ce' into sync-from-ra
2 parents c40cfcf + 9b3d034 commit e7ef5d8

File tree

136 files changed

+3862
-1448
lines changed

Some content is hidden

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

136 files changed

+3862
-1448
lines changed

src/tools/rust-analyzer/Cargo.lock

+6-6
Original file line numberDiff line numberDiff line change
@@ -999,23 +999,23 @@ checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
999999

10001000
[[package]]
10011001
name = "lsp-server"
1002-
version = "0.7.1"
1003-
source = "registry+https://github.com/rust-lang/crates.io-index"
1004-
checksum = "3711e4d6f491dc9edc0f1df80e204f38206775ac92c1241e89b79229a850bc00"
1002+
version = "0.7.3"
10051003
dependencies = [
10061004
"crossbeam-channel",
10071005
"log",
1006+
"lsp-types",
10081007
"serde",
10091008
"serde_json",
10101009
]
10111010

10121011
[[package]]
10131012
name = "lsp-server"
1014-
version = "0.7.2"
1013+
version = "0.7.3"
1014+
source = "registry+https://github.com/rust-lang/crates.io-index"
1015+
checksum = "72417faa455bfb4e5bf14b157d8e2ca2ed74b4e89b8cf42ea2d864825ae5c8a2"
10151016
dependencies = [
10161017
"crossbeam-channel",
10171018
"log",
1018-
"lsp-types",
10191019
"serde",
10201020
"serde_json",
10211021
]
@@ -1555,7 +1555,7 @@ dependencies = [
15551555
"ide-ssr",
15561556
"itertools",
15571557
"load-cargo",
1558-
"lsp-server 0.7.1",
1558+
"lsp-server 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
15591559
"lsp-types",
15601560
"mbe",
15611561
"mimalloc",

src/tools/rust-analyzer/Cargo.toml

+3-2
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ proc-macro-test = { path = "./crates/proc-macro-test" }
8686
# In-tree crates that are published separately and follow semver. See lib/README.md
8787
line-index = { version = "0.1.0-pre.1" }
8888
la-arena = { version = "0.3.1" }
89-
lsp-server = { version = "0.7.1" }
89+
lsp-server = { version = "0.7.3" }
9090

9191
# non-local crates
9292
smallvec = { version = "1.10.0", features = [
@@ -97,7 +97,8 @@ smallvec = { version = "1.10.0", features = [
9797
smol_str = "0.2.0"
9898
nohash-hasher = "0.2.0"
9999
text-size = "1.1.0"
100-
serde = { version = "1.0.156", features = ["derive"] }
100+
# See https://github.com/serde-rs/serde/issues/2538#issuecomment-1684517372 for why we pin serde
101+
serde = { version = "1.0.156, < 1.0.172", features = ["derive"] }
101102
serde_json = "1.0.96"
102103
triomphe = { version = "0.1.8", default-features = false, features = ["std"] }
103104
# can't upgrade due to dashmap depending on 0.12.3 currently

src/tools/rust-analyzer/crates/base-db/src/fixture.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ impl ChangeFixture {
130130
let mut default_crate_root: Option<FileId> = None;
131131
let mut default_target_data_layout: Option<String> = None;
132132
let mut default_cfg = CfgOptions::default();
133+
let mut default_env = Env::new_for_test_fixture();
133134

134135
let mut file_set = FileSet::default();
135136
let mut current_source_root_kind = SourceRootKind::Local;
@@ -200,6 +201,7 @@ impl ChangeFixture {
200201
assert!(default_crate_root.is_none());
201202
default_crate_root = Some(file_id);
202203
default_cfg = meta.cfg;
204+
default_env.extend(meta.env.iter().map(|(x, y)| (x.to_owned(), y.to_owned())));
203205
default_target_data_layout = meta.target_data_layout;
204206
}
205207

@@ -220,7 +222,7 @@ impl ChangeFixture {
220222
None,
221223
default_cfg,
222224
Default::default(),
223-
Env::new_for_test_fixture(),
225+
default_env,
224226
false,
225227
CrateOrigin::Local { repo: None, name: None },
226228
default_target_data_layout

src/tools/rust-analyzer/crates/base-db/src/input.rs

+6
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,12 @@ impl fmt::Display for Edition {
686686
}
687687
}
688688

689+
impl Extend<(String, String)> for Env {
690+
fn extend<T: IntoIterator<Item = (String, String)>>(&mut self, iter: T) {
691+
self.entries.extend(iter);
692+
}
693+
}
694+
689695
impl FromIterator<(String, String)> for Env {
690696
fn from_iter<T: IntoIterator<Item = (String, String)>>(iter: T) -> Self {
691697
Env { entries: FromIterator::from_iter(iter) }

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

+4-6
Original file line numberDiff line numberDiff line change
@@ -431,12 +431,10 @@ impl AttrsWithOwner {
431431
.item_tree(db)
432432
.raw_attrs(AttrOwner::ModItem(definition_tree_id.value.into()))
433433
.clone(),
434-
ModuleOrigin::BlockExpr { block } => RawAttrs::from_attrs_owner(
435-
db.upcast(),
436-
InFile::new(block.file_id, block.to_node(db.upcast()))
437-
.as_ref()
438-
.map(|it| it as &dyn ast::HasAttrs),
439-
),
434+
ModuleOrigin::BlockExpr { id, .. } => {
435+
let tree = db.block_item_tree_query(id);
436+
tree.raw_attrs(AttrOwner::TopLevel).clone()
437+
}
440438
}
441439
}
442440
AttrDefId::FieldId(it) => {

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,9 @@ impl ExprCollector<'_> {
505505
let mut args = Vec::new();
506506
let mut arg_types = Vec::new();
507507
if let Some(pl) = e.param_list() {
508+
let num_params = pl.params().count();
509+
args.reserve_exact(num_params);
510+
arg_types.reserve_exact(num_params);
508511
for param in pl.params() {
509512
let pat = this.collect_pat_top(param.pat());
510513
let type_ref =
@@ -1100,7 +1103,9 @@ impl ExprCollector<'_> {
11001103
ast::Stmt::ExprStmt(es) => matches!(es.expr(), Some(ast::Expr::MacroExpr(_))),
11011104
_ => false,
11021105
});
1103-
statement_has_item || matches!(block.tail_expr(), Some(ast::Expr::MacroExpr(_)))
1106+
statement_has_item
1107+
|| matches!(block.tail_expr(), Some(ast::Expr::MacroExpr(_)))
1108+
|| (block.may_carry_attributes() && block.attrs().next().is_some())
11041109
};
11051110

11061111
let block_id = if block_has_items {

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

+10-10
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ fn outer() {
3838
"#,
3939
expect![[r#"
4040
block scope
41-
CrateStruct: t
42-
PlainStruct: t v
43-
SelfStruct: t
41+
CrateStruct: ti
42+
PlainStruct: ti vi
43+
SelfStruct: ti
4444
Struct: v
4545
SuperStruct: _
4646
@@ -66,7 +66,7 @@ fn outer() {
6666
"#,
6767
expect![[r#"
6868
block scope
69-
imported: t v
69+
imported: ti vi
7070
name: v
7171
7272
crate
@@ -92,9 +92,9 @@ fn outer() {
9292
"#,
9393
expect![[r#"
9494
block scope
95-
inner1: t
95+
inner1: ti
9696
inner2: v
97-
outer: v
97+
outer: vi
9898
9999
block scope
100100
inner: v
@@ -121,7 +121,7 @@ struct Struct {}
121121
"#,
122122
expect![[r#"
123123
block scope
124-
Struct: t
124+
Struct: ti
125125
126126
crate
127127
Struct: t
@@ -153,7 +153,7 @@ fn outer() {
153153
"#,
154154
expect![[r#"
155155
block scope
156-
ResolveMe: t
156+
ResolveMe: ti
157157
158158
block scope
159159
m2: t
@@ -214,7 +214,7 @@ fn f() {
214214
"#,
215215
expect![[r#"
216216
block scope
217-
ResolveMe: t
217+
ResolveMe: ti
218218
219219
block scope
220220
h: v
@@ -292,7 +292,7 @@ pub mod cov_mark {
292292
nested: v
293293
294294
crate
295-
cov_mark: t
295+
cov_mark: ti
296296
f: v
297297
"#]],
298298
);

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ impl ExternCrateDeclData {
487487
db.crate_def_map(loc.container.krate())
488488
.extern_prelude()
489489
.find(|&(prelude_name, ..)| *prelude_name == name)
490-
.map(|(_, root)| root.krate())
490+
.map(|(_, (root, _))| root.krate())
491491
};
492492

493493
Arc::new(Self {

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

+3
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + Upcast<dyn ExpandDataba
8282
#[salsa::invoke(ItemTree::file_item_tree_query)]
8383
fn file_item_tree(&self, file_id: HirFileId) -> Arc<ItemTree>;
8484

85+
#[salsa::invoke(ItemTree::block_item_tree_query)]
86+
fn block_item_tree_query(&self, block_id: BlockId) -> Arc<ItemTree>;
87+
8588
#[salsa::invoke(crate_def_map_wait)]
8689
#[salsa::transparent]
8790
fn crate_def_map(&self, krate: CrateId) -> Arc<DefMap>;

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

+74-7
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
nameres::DefMap,
1212
path::{ModPath, PathKind},
1313
visibility::Visibility,
14-
ModuleDefId, ModuleId,
14+
CrateRootModuleId, ModuleDefId, ModuleId,
1515
};
1616

1717
/// Find a path that can be used to refer to a certain item. This can depend on
@@ -81,7 +81,7 @@ fn find_path_inner(
8181
}
8282

8383
let def_map = from.def_map(db);
84-
let crate_root = def_map.crate_root().into();
84+
let crate_root = def_map.crate_root();
8585
// - if the item is a module, jump straight to module search
8686
if let ItemInNs::Types(ModuleDefId::ModuleId(module_id)) = item {
8787
let mut visited_modules = FxHashSet::default();
@@ -149,7 +149,7 @@ fn find_path_for_module(
149149
db: &dyn DefDatabase,
150150
def_map: &DefMap,
151151
visited_modules: &mut FxHashSet<ModuleId>,
152-
crate_root: ModuleId,
152+
crate_root: CrateRootModuleId,
153153
from: ModuleId,
154154
module_id: ModuleId,
155155
max_len: usize,
@@ -183,7 +183,7 @@ fn find_path_for_module(
183183

184184
// - if the item is the crate root of a dependency crate, return the name from the extern prelude
185185
let root_def_map = crate_root.def_map(db);
186-
for (name, def_id) in root_def_map.extern_prelude() {
186+
for (name, (def_id, _extern_crate)) in root_def_map.extern_prelude() {
187187
if module_id == def_id {
188188
let name = scope_name.unwrap_or_else(|| name.clone());
189189

@@ -192,7 +192,7 @@ fn find_path_for_module(
192192
def_map[local_id]
193193
.scope
194194
.type_(&name)
195-
.filter(|&(id, _)| id != ModuleDefId::ModuleId(def_id))
195+
.filter(|&(id, _)| id != ModuleDefId::ModuleId(def_id.into()))
196196
})
197197
.is_some();
198198
let kind = if name_already_occupied_in_type_ns {
@@ -224,6 +224,7 @@ fn find_path_for_module(
224224
)
225225
}
226226

227+
// FIXME: Do we still need this now that we record import origins, and hence aliases?
227228
fn find_in_scope(
228229
db: &dyn DefDatabase,
229230
def_map: &DefMap,
@@ -244,7 +245,7 @@ fn find_in_prelude(
244245
item: ItemInNs,
245246
from: ModuleId,
246247
) -> Option<ModPath> {
247-
let prelude_module = root_def_map.prelude()?;
248+
let (prelude_module, _) = root_def_map.prelude()?;
248249
// Preludes in block DefMaps are ignored, only the crate DefMap is searched
249250
let prelude_def_map = prelude_module.def_map(db);
250251
let prelude_scope = &prelude_def_map[prelude_module.local_id].scope;
@@ -293,7 +294,7 @@ fn calculate_best_path(
293294
db: &dyn DefDatabase,
294295
def_map: &DefMap,
295296
visited_modules: &mut FxHashSet<ModuleId>,
296-
crate_root: ModuleId,
297+
crate_root: CrateRootModuleId,
297298
max_len: usize,
298299
item: ItemInNs,
299300
from: ModuleId,
@@ -346,6 +347,11 @@ fn calculate_best_path(
346347
let extern_paths = crate_graph[from.krate].dependencies.iter().filter_map(|dep| {
347348
let import_map = db.import_map(dep.crate_id);
348349
import_map.import_info_for(item).and_then(|info| {
350+
if info.is_doc_hidden {
351+
// the item or import is `#[doc(hidden)]`, so skip it as it is in an external crate
352+
return None;
353+
}
354+
349355
// Determine best path for containing module and append last segment from `info`.
350356
// FIXME: we should guide this to look up the path locally, or from the same crate again?
351357
let mut path = find_path_for_module(
@@ -1293,4 +1299,65 @@ pub mod prelude {
12931299
"None",
12941300
);
12951301
}
1302+
1303+
#[test]
1304+
fn different_crate_renamed_through_dep() {
1305+
check_found_path(
1306+
r#"
1307+
//- /main.rs crate:main deps:intermediate
1308+
$0
1309+
//- /intermediate.rs crate:intermediate deps:std
1310+
pub extern crate std as std_renamed;
1311+
//- /std.rs crate:std
1312+
pub struct S;
1313+
"#,
1314+
"intermediate::std_renamed::S",
1315+
"intermediate::std_renamed::S",
1316+
"intermediate::std_renamed::S",
1317+
"intermediate::std_renamed::S",
1318+
);
1319+
}
1320+
1321+
#[test]
1322+
fn different_crate_doc_hidden() {
1323+
check_found_path(
1324+
r#"
1325+
//- /main.rs crate:main deps:intermediate
1326+
$0
1327+
//- /intermediate.rs crate:intermediate deps:std
1328+
#[doc(hidden)]
1329+
pub extern crate std;
1330+
pub extern crate std as longer;
1331+
//- /std.rs crate:std
1332+
pub struct S;
1333+
"#,
1334+
"intermediate::longer::S",
1335+
"intermediate::longer::S",
1336+
"intermediate::longer::S",
1337+
"intermediate::longer::S",
1338+
);
1339+
}
1340+
1341+
#[test]
1342+
fn respect_doc_hidden() {
1343+
check_found_path(
1344+
r#"
1345+
//- /main.rs crate:main deps:std,lazy_static
1346+
$0
1347+
//- /lazy_static.rs crate:lazy_static deps:core
1348+
#[doc(hidden)]
1349+
pub use core::ops::Deref as __Deref;
1350+
//- /std.rs crate:std deps:core
1351+
pub use core::ops;
1352+
//- /core.rs crate:core
1353+
pub mod ops {
1354+
pub trait Deref {}
1355+
}
1356+
"#,
1357+
"std::ops::Deref",
1358+
"std::ops::Deref",
1359+
"std::ops::Deref",
1360+
"std::ops::Deref",
1361+
);
1362+
}
12961363
}

0 commit comments

Comments
 (0)