Skip to content

Commit e557333

Browse files
authored
Merge pull request #20009 from Veykril/push-rvnnorzvpnqv
Optimize `pub(crate)` and `pub(self)` visibility resolution
2 parents bad1c63 + 6ff82fb commit e557333

File tree

14 files changed

+136
-73
lines changed

14 files changed

+136
-73
lines changed

src/tools/rust-analyzer/crates/hir-def/src/expr_store/pretty.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,11 @@ pub fn print_variant_body_hir(db: &dyn DefDatabase, owner: VariantId, edition: E
141141
let FieldData { name, type_ref, visibility, is_unsafe } = data;
142142
match visibility {
143143
crate::item_tree::RawVisibility::Module(interned, _visibility_explicitness) => {
144-
w!(p, "{}", interned.display(db, p.edition))
144+
w!(p, "pub(in {})", interned.display(db, p.edition))
145145
}
146146
crate::item_tree::RawVisibility::Public => w!(p, "pub "),
147+
crate::item_tree::RawVisibility::PubCrate => w!(p, "pub(crate) "),
148+
crate::item_tree::RawVisibility::PubSelf(_) => w!(p, "pub(self) "),
147149
}
148150
if *is_unsafe {
149151
w!(p, "unsafe ");

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,6 @@ fn main() {
397397
fn underscore_import() {
398398
// This used to panic, because the default (private) visibility inside block expressions would
399399
// point into the containing `DefMap`, which visibilities should never be able to do.
400-
cov_mark::check!(adjust_vis_in_block_def_map);
401400
check_at(
402401
r#"
403402
mod m {
@@ -457,7 +456,6 @@ fn foo() {
457456
#[test]
458457
fn is_visible_from_same_def_map() {
459458
// Regression test for https://github.com/rust-lang/rust-analyzer/issues/9481
460-
cov_mark::check!(is_visible_from_same_block_def_map);
461459
check_at(
462460
r#"
463461
fn outer() {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,7 @@ fn find_local_import_locations(
615615
cov_mark::hit!(discount_private_imports);
616616
false
617617
}
618+
Visibility::PubCrate(_) => true,
618619
Visibility::Public => true,
619620
};
620621

@@ -1286,7 +1287,6 @@ $0
12861287

12871288
#[test]
12881289
fn explicit_private_imports_crate() {
1289-
cov_mark::check!(explicit_private_imports);
12901290
check_found_path(
12911291
r#"
12921292
//- /main.rs

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

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::{
2020
LocalModuleId, Lookup, MacroId, ModuleDefId, ModuleId, TraitId, UseId,
2121
db::DefDatabase,
2222
per_ns::{Item, MacrosItem, PerNs, TypesItem, ValuesItem},
23-
visibility::{Visibility, VisibilityExplicitness},
23+
visibility::Visibility,
2424
};
2525

2626
#[derive(Debug, Default)]
@@ -720,33 +720,19 @@ impl ItemScope {
720720
}
721721

722722
/// Marks everything that is not a procedural macro as private to `this_module`.
723-
pub(crate) fn censor_non_proc_macros(&mut self, this_module: ModuleId) {
723+
pub(crate) fn censor_non_proc_macros(&mut self, krate: Crate) {
724724
self.types
725725
.values_mut()
726726
.map(|def| &mut def.vis)
727727
.chain(self.values.values_mut().map(|def| &mut def.vis))
728728
.chain(self.unnamed_trait_imports.iter_mut().map(|(_, def)| &mut def.vis))
729-
.for_each(|vis| match vis {
730-
&mut Visibility::Module(_, visibility_explicitness) => {
731-
*vis = Visibility::Module(this_module, visibility_explicitness)
732-
}
733-
Visibility::Public => {
734-
*vis = Visibility::Module(this_module, VisibilityExplicitness::Implicit)
735-
}
736-
});
729+
.for_each(|vis| *vis = Visibility::PubCrate(krate));
737730

738731
for mac in self.macros.values_mut() {
739732
if matches!(mac.def, MacroId::ProcMacroId(_) if mac.import.is_none()) {
740733
continue;
741734
}
742-
match mac.vis {
743-
Visibility::Module(_, visibility_explicitness) => {
744-
mac.vis = Visibility::Module(this_module, visibility_explicitness)
745-
}
746-
Visibility::Public => {
747-
mac.vis = Visibility::Module(this_module, VisibilityExplicitness::Implicit)
748-
}
749-
}
735+
mac.vis = Visibility::PubCrate(krate)
750736
}
751737
}
752738

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

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -414,30 +414,17 @@ impl Index<RawVisibilityId> for ItemTree {
414414
type Output = RawVisibility;
415415
fn index(&self, index: RawVisibilityId) -> &Self::Output {
416416
static VIS_PUB: RawVisibility = RawVisibility::Public;
417-
static VIS_PRIV_IMPLICIT: OnceLock<RawVisibility> = OnceLock::new();
418-
static VIS_PRIV_EXPLICIT: OnceLock<RawVisibility> = OnceLock::new();
419-
static VIS_PUB_CRATE: OnceLock<RawVisibility> = OnceLock::new();
417+
static VIS_PRIV_IMPLICIT: RawVisibility =
418+
RawVisibility::PubSelf(VisibilityExplicitness::Implicit);
419+
static VIS_PRIV_EXPLICIT: RawVisibility =
420+
RawVisibility::PubSelf(VisibilityExplicitness::Explicit);
421+
static VIS_PUB_CRATE: RawVisibility = RawVisibility::PubCrate;
420422

421423
match index {
422-
RawVisibilityId::PRIV_IMPLICIT => VIS_PRIV_IMPLICIT.get_or_init(|| {
423-
RawVisibility::Module(
424-
Interned::new(ModPath::from_kind(PathKind::SELF)),
425-
VisibilityExplicitness::Implicit,
426-
)
427-
}),
428-
RawVisibilityId::PRIV_EXPLICIT => VIS_PRIV_EXPLICIT.get_or_init(|| {
429-
RawVisibility::Module(
430-
Interned::new(ModPath::from_kind(PathKind::SELF)),
431-
VisibilityExplicitness::Explicit,
432-
)
433-
}),
424+
RawVisibilityId::PRIV_IMPLICIT => &VIS_PRIV_IMPLICIT,
425+
RawVisibilityId::PRIV_EXPLICIT => &VIS_PRIV_EXPLICIT,
434426
RawVisibilityId::PUB => &VIS_PUB,
435-
RawVisibilityId::PUB_CRATE => VIS_PUB_CRATE.get_or_init(|| {
436-
RawVisibility::Module(
437-
Interned::new(ModPath::from_kind(PathKind::Crate)),
438-
VisibilityExplicitness::Explicit,
439-
)
440-
}),
427+
RawVisibilityId::PUB_CRATE => &VIS_PUB_CRATE,
441428
_ => &self.vis.arena[index.0 as usize],
442429
}
443430
}
@@ -555,6 +542,10 @@ pub enum RawVisibility {
555542
/// `pub(in module)`, `pub(crate)` or `pub(super)`. Also private, which is
556543
/// equivalent to `pub(self)`.
557544
Module(Interned<ModPath>, VisibilityExplicitness),
545+
/// `pub(self)`.
546+
PubSelf(VisibilityExplicitness),
547+
/// `pub(crate)`.
548+
PubCrate,
558549
/// `pub`.
559550
Public,
560551
}

src/tools/rust-analyzer/crates/hir-def/src/item_tree/pretty.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,11 @@ impl Printer<'_> {
108108
fn print_visibility(&mut self, vis: RawVisibilityId) {
109109
match &self.tree[vis] {
110110
RawVisibility::Module(path, _expl) => {
111-
w!(self, "pub({}) ", path.display(self.db, self.edition))
111+
w!(self, "pub(in {}) ", path.display(self.db, self.edition))
112112
}
113113
RawVisibility::Public => w!(self, "pub "),
114+
RawVisibility::PubCrate => w!(self, "pub(crate) "),
115+
RawVisibility::PubSelf(_) => w!(self, "pub(self) "),
114116
};
115117
}
116118

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use a::{c, d::{e}};
3939
pub(self) extern crate self as renamed;
4040
4141
// AstId: ExternCrate[7E1C, 0]
42-
pub(super) extern crate bli;
42+
pub(in super) extern crate bli;
4343
4444
// AstId: Use[0000, 0]
4545
pub use crate::path::{nested, items as renamed, Trait as _};

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ impl<N: AstIdNode> HasModule for ItemLoc<N> {
149149

150150
#[derive(Debug)]
151151
pub struct AssocItemLoc<N: AstIdNode> {
152+
// FIXME: Store this as an erased `salsa::Id` to save space
152153
pub container: ItemContainerId,
153154
pub id: AstId<N>,
154155
}
@@ -577,6 +578,7 @@ pub type LocalModuleId = Idx<nameres::ModuleData>;
577578

578579
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
579580
pub struct FieldId {
581+
// FIXME: Store this as an erased `salsa::Id` to save space
580582
pub parent: VariantId,
581583
pub local_id: LocalFieldId,
582584
}
@@ -592,6 +594,7 @@ pub struct TupleFieldId {
592594

593595
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
594596
pub struct TypeOrConstParamId {
597+
// FIXME: Store this as an erased `salsa::Id` to save space
595598
pub parent: GenericDefId,
596599
pub local_id: LocalTypeOrConstParamId,
597600
}
@@ -650,6 +653,7 @@ impl From<ConstParamId> for TypeOrConstParamId {
650653

651654
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
652655
pub struct LifetimeParamId {
656+
// FIXME: Store this as an erased `salsa::Id` to save space
653657
pub parent: GenericDefId,
654658
pub local_id: LocalLifetimeParamId,
655659
}

src/tools/rust-analyzer/crates/hir-def/src/nameres/collector.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,9 +437,8 @@ impl<'db> DefCollector<'db> {
437437
// Additionally, while the proc macro entry points must be `pub`, they are not publicly
438438
// exported in type/value namespace. This function reduces the visibility of all items
439439
// in the crate root that aren't proc macros.
440-
let module_id = self.def_map.module_id(DefMap::ROOT);
441440
let root = &mut self.def_map.modules[DefMap::ROOT];
442-
root.scope.censor_non_proc_macros(module_id);
441+
root.scope.censor_non_proc_macros(self.def_map.krate);
443442
}
444443
}
445444

src/tools/rust-analyzer/crates/hir-def/src/nameres/path_resolution.rs

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ impl DefMap {
106106
visibility: &RawVisibility,
107107
within_impl: bool,
108108
) -> Option<Visibility> {
109-
let mut vis = match visibility {
109+
let vis = match visibility {
110110
RawVisibility::Module(path, explicitness) => {
111111
let (result, remaining) = self.resolve_path(
112112
local_def_map,
@@ -120,29 +120,36 @@ impl DefMap {
120120
return None;
121121
}
122122
let types = result.take_types()?;
123-
match types {
123+
let mut vis = match types {
124124
ModuleDefId::ModuleId(m) => Visibility::Module(m, *explicitness),
125125
// error: visibility needs to refer to module
126126
_ => {
127127
return None;
128128
}
129+
};
130+
131+
// In block expressions, `self` normally refers to the containing non-block module, and
132+
// `super` to its parent (etc.). However, visibilities must only refer to a module in the
133+
// DefMap they're written in, so we restrict them when that happens.
134+
if let Visibility::Module(m, mv) = vis {
135+
// ...unless we're resolving visibility for an associated item in an impl.
136+
if self.block_id() != m.block && !within_impl {
137+
vis = Visibility::Module(self.module_id(Self::ROOT), mv);
138+
tracing::debug!(
139+
"visibility {:?} points outside DefMap, adjusting to {:?}",
140+
m,
141+
vis
142+
);
143+
}
129144
}
145+
vis
146+
}
147+
RawVisibility::PubSelf(explicitness) => {
148+
Visibility::Module(self.module_id(original_module), *explicitness)
130149
}
131150
RawVisibility::Public => Visibility::Public,
151+
RawVisibility::PubCrate => Visibility::PubCrate(self.krate),
132152
};
133-
134-
// In block expressions, `self` normally refers to the containing non-block module, and
135-
// `super` to its parent (etc.). However, visibilities must only refer to a module in the
136-
// DefMap they're written in, so we restrict them when that happens.
137-
if let Visibility::Module(m, mv) = vis {
138-
// ...unless we're resolving visibility for an associated item in an impl.
139-
if self.block_id() != m.block && !within_impl {
140-
cov_mark::hit!(adjust_vis_in_block_def_map);
141-
vis = Visibility::Module(self.module_id(Self::ROOT), mv);
142-
tracing::debug!("visibility {:?} points outside DefMap, adjusting to {:?}", m, vis);
143-
}
144-
}
145-
146153
Some(vis)
147154
}
148155

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,10 @@ impl<'db> Resolver<'db> {
305305
}),
306306
)
307307
}
308+
RawVisibility::PubSelf(explicitness) => {
309+
Some(Visibility::Module(self.module(), *explicitness))
310+
}
311+
RawVisibility::PubCrate => Some(Visibility::PubCrate(self.krate())),
308312
RawVisibility::Public => Some(Visibility::Public),
309313
}
310314
}

0 commit comments

Comments
 (0)