Rollup merge of #81227 - CraftSpider:struct-type-clean, r=jyn514

Remove doctree::StructType

Also removes it from the Union type, as unions can only ever be 'Plain'. Adds a new StructType to JSON, 'union', as the easiest way to encode the type of a union there. This leaves only one item in doctree, `Module`.

r? `@jyn514`
This commit is contained in:
Mara Bos 2021-01-22 14:30:16 +00:00 committed by GitHub
commit 2ceee72427
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 24 additions and 53 deletions

View File

@ -5,7 +5,7 @@ use std::iter::once;
use rustc_ast as ast; use rustc_ast as ast;
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::{CtorKind, DefKind, Res}; use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX}; use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX};
use rustc_hir::Mutability; use rustc_hir::Mutability;
use rustc_metadata::creader::LoadedMacro; use rustc_metadata::creader::LoadedMacro;
@ -17,7 +17,6 @@ use rustc_span::Span;
use crate::clean::{self, Attributes, GetDefId, ToSource, TypeKind}; use crate::clean::{self, Attributes, GetDefId, ToSource, TypeKind};
use crate::core::DocContext; use crate::core::DocContext;
use crate::doctree;
use super::Clean; use super::Clean;
@ -246,11 +245,7 @@ fn build_struct(cx: &DocContext<'_>, did: DefId) -> clean::Struct {
let variant = cx.tcx.adt_def(did).non_enum_variant(); let variant = cx.tcx.adt_def(did).non_enum_variant();
clean::Struct { clean::Struct {
struct_type: match variant.ctor_kind { struct_type: variant.ctor_kind,
CtorKind::Fictive => doctree::Plain,
CtorKind::Fn => doctree::Tuple,
CtorKind::Const => doctree::Unit,
},
generics: (cx.tcx.generics_of(did), predicates).clean(cx), generics: (cx.tcx.generics_of(did), predicates).clean(cx),
fields: variant.fields.clean(cx), fields: variant.fields.clean(cx),
fields_stripped: false, fields_stripped: false,
@ -262,7 +257,6 @@ fn build_union(cx: &DocContext<'_>, did: DefId) -> clean::Union {
let variant = cx.tcx.adt_def(did).non_enum_variant(); let variant = cx.tcx.adt_def(did).non_enum_variant();
clean::Union { clean::Union {
struct_type: doctree::Plain,
generics: (cx.tcx.generics_of(did), predicates).clean(cx), generics: (cx.tcx.generics_of(did), predicates).clean(cx),
fields: variant.fields.clean(cx), fields: variant.fields.clean(cx),
fields_stripped: false, fields_stripped: false,

View File

@ -1827,7 +1827,7 @@ impl Clean<Visibility> for ty::Visibility {
impl Clean<VariantStruct> for rustc_hir::VariantData<'_> { impl Clean<VariantStruct> for rustc_hir::VariantData<'_> {
fn clean(&self, cx: &DocContext<'_>) -> VariantStruct { fn clean(&self, cx: &DocContext<'_>) -> VariantStruct {
VariantStruct { VariantStruct {
struct_type: doctree::struct_type_from_def(self), struct_type: CtorKind::from_hir(self),
fields: self.fields().iter().map(|x| x.clean(cx)).collect(), fields: self.fields().iter().map(|x| x.clean(cx)).collect(),
fields_stripped: false, fields_stripped: false,
} }
@ -1842,7 +1842,7 @@ impl Clean<Item> for ty::VariantDef {
self.fields.iter().map(|f| cx.tcx.type_of(f.did).clean(cx)).collect(), self.fields.iter().map(|f| cx.tcx.type_of(f.did).clean(cx)).collect(),
), ),
CtorKind::Fictive => Variant::Struct(VariantStruct { CtorKind::Fictive => Variant::Struct(VariantStruct {
struct_type: doctree::Plain, struct_type: CtorKind::Fictive,
fields_stripped: false, fields_stripped: false,
fields: self fields: self
.fields .fields
@ -1996,13 +1996,12 @@ impl Clean<Vec<Item>> for (&hir::Item<'_>, Option<Symbol>) {
bounds: bounds.clean(cx), bounds: bounds.clean(cx),
}), }),
ItemKind::Union(ref variant_data, ref generics) => UnionItem(Union { ItemKind::Union(ref variant_data, ref generics) => UnionItem(Union {
struct_type: doctree::struct_type_from_def(&variant_data),
generics: generics.clean(cx), generics: generics.clean(cx),
fields: variant_data.fields().clean(cx), fields: variant_data.fields().clean(cx),
fields_stripped: false, fields_stripped: false,
}), }),
ItemKind::Struct(ref variant_data, ref generics) => StructItem(Struct { ItemKind::Struct(ref variant_data, ref generics) => StructItem(Struct {
struct_type: doctree::struct_type_from_def(&variant_data), struct_type: CtorKind::from_hir(variant_data),
generics: generics.clean(cx), generics: generics.clean(cx),
fields: variant_data.fields().clean(cx), fields: variant_data.fields().clean(cx),
fields_stripped: false, fields_stripped: false,

View File

@ -16,7 +16,7 @@ use rustc_attr::{ConstStability, Deprecation, Stability, StabilityLevel};
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_feature::UnstableFeatures; use rustc_feature::UnstableFeatures;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::Res; use rustc_hir::def::{CtorKind, Res};
use rustc_hir::def_id::{CrateNum, DefId}; use rustc_hir::def_id::{CrateNum, DefId};
use rustc_hir::lang_items::LangItem; use rustc_hir::lang_items::LangItem;
use rustc_hir::Mutability; use rustc_hir::Mutability;
@ -37,7 +37,6 @@ use crate::clean::inline;
use crate::clean::types::Type::{QPath, ResolvedPath}; use crate::clean::types::Type::{QPath, ResolvedPath};
use crate::clean::Clean; use crate::clean::Clean;
use crate::core::DocContext; use crate::core::DocContext;
use crate::doctree;
use crate::formats::cache::cache; use crate::formats::cache::cache;
use crate::formats::item_type::ItemType; use crate::formats::item_type::ItemType;
use crate::html::render::cache::ExternalLocation; use crate::html::render::cache::ExternalLocation;
@ -1685,7 +1684,7 @@ impl Visibility {
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
crate struct Struct { crate struct Struct {
crate struct_type: doctree::StructType, crate struct_type: CtorKind,
crate generics: Generics, crate generics: Generics,
crate fields: Vec<Item>, crate fields: Vec<Item>,
crate fields_stripped: bool, crate fields_stripped: bool,
@ -1693,7 +1692,6 @@ crate struct Struct {
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
crate struct Union { crate struct Union {
crate struct_type: doctree::StructType,
crate generics: Generics, crate generics: Generics,
crate fields: Vec<Item>, crate fields: Vec<Item>,
crate fields_stripped: bool, crate fields_stripped: bool,
@ -1704,7 +1702,7 @@ crate struct Union {
/// only as a variant in an enum. /// only as a variant in an enum.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
crate struct VariantStruct { crate struct VariantStruct {
crate struct_type: doctree::StructType, crate struct_type: CtorKind,
crate fields: Vec<Item>, crate fields: Vec<Item>,
crate fields_stripped: bool, crate fields_stripped: bool,
} }

View File

@ -1,7 +1,5 @@
//! This module is used to store stuff from Rust's AST in a more convenient //! This module is used to store stuff from Rust's AST in a more convenient
//! manner (and with prettier names) before cleaning. //! manner (and with prettier names) before cleaning.
crate use self::StructType::*;
use rustc_span::{self, Span, Symbol}; use rustc_span::{self, Span, Symbol};
use rustc_hir as hir; use rustc_hir as hir;
@ -34,21 +32,3 @@ impl Module<'hir> {
} }
} }
} }
#[derive(Debug, Clone, Copy)]
crate enum StructType {
/// A braced struct
Plain,
/// A tuple struct
Tuple,
/// A unit struct
Unit,
}
crate fn struct_type_from_def(vdata: &hir::VariantData<'_>) -> StructType {
match *vdata {
hir::VariantData::Struct(..) => Plain,
hir::VariantData::Tuple(..) => Tuple,
hir::VariantData::Unit(..) => Unit,
}
}

View File

@ -52,6 +52,7 @@ use rustc_attr::{Deprecation, StabilityLevel};
use rustc_data_structures::flock; use rustc_data_structures::flock;
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::CtorKind;
use rustc_hir::def_id::{DefId, LOCAL_CRATE}; use rustc_hir::def_id::{DefId, LOCAL_CRATE};
use rustc_hir::Mutability; use rustc_hir::Mutability;
use rustc_middle::middle::stability; use rustc_middle::middle::stability;
@ -67,7 +68,6 @@ use serde::{Serialize, Serializer};
use crate::clean::{self, AttributesExt, GetDefId, RenderedLink, SelfTy, TypeKind}; use crate::clean::{self, AttributesExt, GetDefId, RenderedLink, SelfTy, TypeKind};
use crate::config::{RenderInfo, RenderOptions}; use crate::config::{RenderInfo, RenderOptions};
use crate::docfs::{DocFS, PathError}; use crate::docfs::{DocFS, PathError};
use crate::doctree;
use crate::error::Error; use crate::error::Error;
use crate::formats::cache::{cache, Cache}; use crate::formats::cache::{cache, Cache};
use crate::formats::item_type::ItemType; use crate::formats::item_type::ItemType;
@ -3103,7 +3103,7 @@ fn item_struct(
_ => None, _ => None,
}) })
.peekable(); .peekable();
if let doctree::Plain = s.struct_type { if let CtorKind::Fictive = s.struct_type {
if fields.peek().is_some() { if fields.peek().is_some() {
write!( write!(
w, w,
@ -3353,7 +3353,7 @@ fn render_struct(
w: &mut Buffer, w: &mut Buffer,
it: &clean::Item, it: &clean::Item,
g: Option<&clean::Generics>, g: Option<&clean::Generics>,
ty: doctree::StructType, ty: CtorKind,
fields: &[clean::Item], fields: &[clean::Item],
tab: &str, tab: &str,
structhead: bool, structhead: bool,
@ -3370,7 +3370,7 @@ fn render_struct(
write!(w, "{}", g.print()) write!(w, "{}", g.print())
} }
match ty { match ty {
doctree::Plain => { CtorKind::Fictive => {
if let Some(g) = g { if let Some(g) = g {
write!(w, "{}", WhereClause { gens: g, indent: 0, end_newline: true }) write!(w, "{}", WhereClause { gens: g, indent: 0, end_newline: true })
} }
@ -3402,7 +3402,7 @@ fn render_struct(
} }
write!(w, "}}"); write!(w, "}}");
} }
doctree::Tuple => { CtorKind::Fn => {
write!(w, "("); write!(w, "(");
for (i, field) in fields.iter().enumerate() { for (i, field) in fields.iter().enumerate() {
if i > 0 { if i > 0 {
@ -3427,7 +3427,7 @@ fn render_struct(
} }
write!(w, ";"); write!(w, ";");
} }
doctree::Unit => { CtorKind::Const => {
// Needed for PhantomData. // Needed for PhantomData.
if let Some(g) = g { if let Some(g) = g {
write!(w, "{}", WhereClause { gens: g, indent: 0, end_newline: false }) write!(w, "{}", WhereClause { gens: g, indent: 0, end_newline: false })
@ -4462,7 +4462,7 @@ fn sidebar_struct(cx: &Context<'_>, buf: &mut Buffer, it: &clean::Item, s: &clea
let fields = get_struct_fields_name(&s.fields); let fields = get_struct_fields_name(&s.fields);
if !fields.is_empty() { if !fields.is_empty() {
if let doctree::Plain = s.struct_type { if let CtorKind::Fictive = s.struct_type {
sidebar.push_str(&format!( sidebar.push_str(&format!(
"<a class=\"sidebar-title\" href=\"#fields\">Fields</a>\ "<a class=\"sidebar-title\" href=\"#fields\">Fields</a>\
<div class=\"sidebar-links\">{}</div>", <div class=\"sidebar-links\">{}</div>",

View File

@ -5,11 +5,11 @@
use std::convert::From; use std::convert::From;
use rustc_ast::ast; use rustc_ast::ast;
use rustc_hir::def::CtorKind;
use rustc_span::def_id::{DefId, CRATE_DEF_INDEX}; use rustc_span::def_id::{DefId, CRATE_DEF_INDEX};
use rustc_span::Pos; use rustc_span::Pos;
use crate::clean; use crate::clean;
use crate::doctree;
use crate::formats::item_type::ItemType; use crate::formats::item_type::ItemType;
use crate::json::types::*; use crate::json::types::*;
use crate::json::JsonRenderer; use crate::json::JsonRenderer;
@ -210,9 +210,9 @@ impl From<clean::Struct> for Struct {
impl From<clean::Union> for Struct { impl From<clean::Union> for Struct {
fn from(struct_: clean::Union) -> Self { fn from(struct_: clean::Union) -> Self {
let clean::Union { struct_type, generics, fields, fields_stripped } = struct_; let clean::Union { generics, fields, fields_stripped } = struct_;
Struct { Struct {
struct_type: struct_type.into(), struct_type: StructType::Union,
generics: generics.into(), generics: generics.into(),
fields_stripped, fields_stripped,
fields: ids(fields), fields: ids(fields),
@ -221,13 +221,12 @@ impl From<clean::Union> for Struct {
} }
} }
impl From<doctree::StructType> for StructType { impl From<CtorKind> for StructType {
fn from(struct_type: doctree::StructType) -> Self { fn from(struct_type: CtorKind) -> Self {
use doctree::StructType::*;
match struct_type { match struct_type {
Plain => StructType::Plain, CtorKind::Fictive => StructType::Plain,
Tuple => StructType::Tuple, CtorKind::Fn => StructType::Tuple,
Unit => StructType::Unit, CtorKind::Const => StructType::Unit,
} }
} }
} }

View File

@ -270,6 +270,7 @@ pub enum StructType {
Plain, Plain,
Tuple, Tuple,
Unit, Unit,
Union,
} }
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]