1
Fork 0

Fix Alias intra doc ICE

This commit is contained in:
Guillaume Gomez 2018-07-30 00:07:39 +02:00
parent 75af9df71b
commit d5f1f70a8e
4 changed files with 50 additions and 23 deletions

View file

@ -1197,7 +1197,8 @@ fn resolve(cx: &DocContext, path_str: &str, is_val: bool) -> Result<(Def, Option
})?; })?;
match ty.def { match ty.def {
Def::Struct(did) | Def::Union(did) | Def::Enum(did) | Def::TyAlias(did) => { Def::Struct(did) | Def::Union(did) | Def::Enum(did) | Def::TyAlias(did) => {
let item = cx.tcx.inherent_impls(did).iter() let item = cx.tcx.inherent_impls(did)
.iter()
.flat_map(|imp| cx.tcx.associated_items(*imp)) .flat_map(|imp| cx.tcx.associated_items(*imp))
.find(|item| item.ident.name == item_name); .find(|item| item.ident.name == item_name);
if let Some(item) = item { if let Some(item) = item {
@ -1208,26 +1209,23 @@ fn resolve(cx: &DocContext, path_str: &str, is_val: bool) -> Result<(Def, Option
}; };
Ok((ty.def, Some(format!("{}.{}", out, item_name)))) Ok((ty.def, Some(format!("{}.{}", out, item_name))))
} else { } else {
let is_enum = match ty.def { match cx.tcx.type_of(did).sty {
Def::Enum(_) => true, ty::TyAdt(def, _) => {
_ => false, if let Some(item) = def.all_fields()
}; .find(|item| item.ident.name == item_name) {
let elem = if is_enum { Ok((ty.def,
cx.tcx.adt_def(did).all_fields().find(|item| item.ident.name == item_name) Some(format!("{}.{}",
} else { if def.is_enum() {
cx.tcx.adt_def(did) "variant"
.non_enum_variant() } else {
.fields "structfield"
.iter() },
.find(|item| item.ident.name == item_name) item.ident))))
}; } else {
if let Some(item) = elem { Err(())
Ok((ty.def, }
Some(format!("{}.{}", }
if is_enum { "variant" } else { "structfield" }, _ => Err(()),
item.ident))))
} else {
Err(())
} }
} }
} }

View file

@ -105,8 +105,8 @@ impl<'a, 'tcx, 'rcx> RustdocVisitor<'a, 'tcx, 'rcx> {
} }
pub fn visit_variant_data(&mut self, item: &hir::Item, pub fn visit_variant_data(&mut self, item: &hir::Item,
name: ast::Name, sd: &hir::VariantData, name: ast::Name, sd: &hir::VariantData,
generics: &hir::Generics) -> Struct { generics: &hir::Generics) -> Struct {
debug!("Visiting struct"); debug!("Visiting struct");
let struct_type = struct_type_from_def(&*sd); let struct_type = struct_type_from_def(&*sd);
Struct { Struct {

View file

@ -0,0 +1,16 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![deny(intra_doc_link_resolution_failure)]
pub type TypeAlias = usize;
/// [broken cross-reference](TypeAlias::hoge) //~ ERROR
pub fn some_public_item() {}

View file

@ -0,0 +1,13 @@
error: `[TypeAlias::hoge]` cannot be resolved, ignoring it...
--> $DIR/intra-doc-alias-ice.rs:15:30
|
15 | /// [broken cross-reference](TypeAlias::hoge) //~ ERROR
| ^^^^^^^^^^^^^^^ cannot be resolved, ignoring
|
note: lint level defined here
--> $DIR/intra-doc-alias-ice.rs:11:9
|
11 | #![deny(intra_doc_link_resolution_failure)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`