Rollup merge of #52835 - GuillaumeGomez:ice-rustdoc-links, r=eddyb
Fix Alias intra doc ICE Fixes #52611. cc @QuietMisdreavus r? @varkor
This commit is contained in:
commit
f52ef3b839
4 changed files with 56 additions and 23 deletions
|
@ -1194,7 +1194,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 {
|
||||||
|
@ -1205,26 +1206,29 @@ 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) = if def.is_enum() {
|
||||||
};
|
def.all_fields().find(|item| item.ident.name == item_name)
|
||||||
let elem = if is_enum {
|
} else {
|
||||||
cx.tcx.adt_def(did).all_fields().find(|item| item.ident.name == item_name)
|
def.non_enum_variant()
|
||||||
} else {
|
.fields
|
||||||
cx.tcx.adt_def(did)
|
.iter()
|
||||||
.non_enum_variant()
|
.find(|item| item.ident.name == item_name)
|
||||||
.fields
|
} {
|
||||||
.iter()
|
Ok((ty.def,
|
||||||
.find(|item| item.ident.name == item_name)
|
Some(format!("{}.{}",
|
||||||
};
|
if def.is_enum() {
|
||||||
if let Some(item) = elem {
|
"variant"
|
||||||
Ok((ty.def,
|
} else {
|
||||||
Some(format!("{}.{}",
|
"structfield"
|
||||||
if is_enum { "variant" } else { "structfield" },
|
},
|
||||||
item.ident))))
|
item.ident))))
|
||||||
} else {
|
} else {
|
||||||
Err(())
|
Err(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => Err(()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
16
src/test/rustdoc-ui/intra-doc-alias-ice.rs
Normal file
16
src/test/rustdoc-ui/intra-doc-alias-ice.rs
Normal 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() {}
|
13
src/test/rustdoc-ui/intra-doc-alias-ice.stderr
Normal file
13
src/test/rustdoc-ui/intra-doc-alias-ice.stderr
Normal 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 `/]`
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue