Skip to content

Commit

Permalink
Print visible name for types as well as modules.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
davidtwco committed Jan 21, 2019
1 parent b5f5a27 commit 1db4275
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 14 deletions.
28 changes: 14 additions & 14 deletions src/librustc/ty/item_path.rs
Expand Up @@ -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.
Expand Down Expand Up @@ -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(|| {
Expand Down
3 changes: 3 additions & 0 deletions src/test/ui/issues/auxiliary/issue-56943.rs
@@ -0,0 +1,3 @@
pub struct S;
mod m { pub struct S; }
pub use crate::m::S as S2;
8 changes: 8 additions & 0 deletions src/test/ui/issues/issue-56943.rs
@@ -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 changes: 12 additions & 0 deletions src/test/ui/issues/issue-56943.stderr
@@ -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`.

0 comments on commit 1db4275

Please sign in to comment.