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
@ -1194,7 +1194,8 @@ fn resolve(cx: &DocContext, path_str: &str, is_val: bool) -> Result<(Def, Option
|
||||
})?;
|
||||
match ty.def {
|
||||
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))
|
||||
.find(|item| item.ident.name == item_name);
|
||||
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))))
|
||||
} else {
|
||||
let is_enum = match ty.def {
|
||||
Def::Enum(_) => true,
|
||||
_ => false,
|
||||
};
|
||||
let elem = if is_enum {
|
||||
cx.tcx.adt_def(did).all_fields().find(|item| item.ident.name == item_name)
|
||||
} else {
|
||||
cx.tcx.adt_def(did)
|
||||
.non_enum_variant()
|
||||
.fields
|
||||
.iter()
|
||||
.find(|item| item.ident.name == item_name)
|
||||
};
|
||||
if let Some(item) = elem {
|
||||
Ok((ty.def,
|
||||
Some(format!("{}.{}",
|
||||
if is_enum { "variant" } else { "structfield" },
|
||||
item.ident))))
|
||||
} else {
|
||||
Err(())
|
||||
match cx.tcx.type_of(did).sty {
|
||||
ty::TyAdt(def, _) => {
|
||||
if let Some(item) = if def.is_enum() {
|
||||
def.all_fields().find(|item| item.ident.name == item_name)
|
||||
} else {
|
||||
def.non_enum_variant()
|
||||
.fields
|
||||
.iter()
|
||||
.find(|item| item.ident.name == item_name)
|
||||
} {
|
||||
Ok((ty.def,
|
||||
Some(format!("{}.{}",
|
||||
if def.is_enum() {
|
||||
"variant"
|
||||
} else {
|
||||
"structfield"
|
||||
},
|
||||
item.ident))))
|
||||
} else {
|
||||
Err(())
|
||||
}
|
||||
}
|
||||
_ => Err(()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -105,8 +105,8 @@ impl<'a, 'tcx, 'rcx> RustdocVisitor<'a, 'tcx, 'rcx> {
|
||||
}
|
||||
|
||||
pub fn visit_variant_data(&mut self, item: &hir::Item,
|
||||
name: ast::Name, sd: &hir::VariantData,
|
||||
generics: &hir::Generics) -> Struct {
|
||||
name: ast::Name, sd: &hir::VariantData,
|
||||
generics: &hir::Generics) -> Struct {
|
||||
debug!("Visiting struct");
|
||||
let struct_type = struct_type_from_def(&*sd);
|
||||
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…
x
Reference in New Issue
Block a user