Print visible name for types as well as modules.
This commit extends previous work in #55007 where the name from the visible parent was used for modules. Now, we also print the name from the visible parent for types.
This commit is contained in:
parent
b5f5a2715e
commit
1db42756f7
4 changed files with 37 additions and 14 deletions
|
|
@ -210,12 +210,12 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
|||
|
||||
let visible_parent = visible_parent_map.get(&cur_def).cloned();
|
||||
let actual_parent = self.parent(cur_def);
|
||||
debug!(
|
||||
"try_push_visible_item_path: visible_parent={:?} actual_parent={:?}",
|
||||
visible_parent, actual_parent,
|
||||
);
|
||||
|
||||
let data = cur_def_key.disambiguated_data.data;
|
||||
debug!(
|
||||
"try_push_visible_item_path: data={:?} visible_parent={:?} actual_parent={:?}",
|
||||
data, visible_parent, actual_parent,
|
||||
);
|
||||
let symbol = match data {
|
||||
// In order to output a path that could actually be imported (valid and visible),
|
||||
// we need to handle re-exports correctly.
|
||||
|
|
@ -248,16 +248,16 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
|||
// the children of the visible parent (as was done when computing
|
||||
// `visible_parent_map`), looking for the specific child we currently have and then
|
||||
// have access to the re-exported name.
|
||||
DefPathData::Module(module_name) if visible_parent != actual_parent => {
|
||||
let mut name: Option<ast::Ident> = None;
|
||||
if let Some(visible_parent) = visible_parent {
|
||||
for child in self.item_children(visible_parent).iter() {
|
||||
if child.def.def_id() == cur_def {
|
||||
name = Some(child.ident);
|
||||
}
|
||||
}
|
||||
}
|
||||
name.map(|n| n.as_str()).unwrap_or(module_name.as_str())
|
||||
DefPathData::Module(actual_name) |
|
||||
DefPathData::TypeNs(actual_name) if visible_parent != actual_parent => {
|
||||
visible_parent
|
||||
.and_then(|parent| {
|
||||
self.item_children(parent)
|
||||
.iter()
|
||||
.find(|child| child.def.def_id() == cur_def)
|
||||
.map(|child| child.ident.as_str())
|
||||
})
|
||||
.unwrap_or_else(|| actual_name.as_str())
|
||||
},
|
||||
_ => {
|
||||
data.get_opt_name().map(|n| n.as_str()).unwrap_or_else(|| {
|
||||
|
|
|
|||
3
src/test/ui/issues/auxiliary/issue-56943.rs
Normal file
3
src/test/ui/issues/auxiliary/issue-56943.rs
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
pub struct S;
|
||||
mod m { pub struct S; }
|
||||
pub use crate::m::S as S2;
|
||||
8
src/test/ui/issues/issue-56943.rs
Normal file
8
src/test/ui/issues/issue-56943.rs
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
// aux-build:issue-56943.rs
|
||||
|
||||
extern crate issue_56943;
|
||||
|
||||
fn main() {
|
||||
let _: issue_56943::S = issue_56943::S2;
|
||||
//~^ ERROR mismatched types [E0308]
|
||||
}
|
||||
12
src/test/ui/issues/issue-56943.stderr
Normal file
12
src/test/ui/issues/issue-56943.stderr
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-56943.rs:6:29
|
||||
|
|
||||
LL | let _: issue_56943::S = issue_56943::S2;
|
||||
| ^^^^^^^^^^^^^^^ expected struct `issue_56943::S`, found struct `issue_56943::S2`
|
||||
|
|
||||
= note: expected type `issue_56943::S`
|
||||
found type `issue_56943::S2`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue