rustdoc-json: Better Header Type
- Make ABI an enum, instead of being stringly typed - Replace Qualifier HashSet with 3 bools - Merge ABI field into header, as they always occor together
This commit is contained in:
parent
b8c56fa8c3
commit
aa601574a5
3 changed files with 58 additions and 37 deletions
|
@ -2777,6 +2777,10 @@ impl FnHeader {
|
||||||
pub fn is_const(&self) -> bool {
|
pub fn is_const(&self) -> bool {
|
||||||
matches!(&self.constness, Constness::Const)
|
matches!(&self.constness, Constness::Const)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_unsafe(&self) -> bool {
|
||||||
|
matches!(&self.unsafety, Unsafety::Unsafe)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, HashStable_Generic)]
|
#[derive(Debug, HashStable_Generic)]
|
||||||
|
|
|
@ -12,6 +12,7 @@ use rustc_hir::{def::CtorKind, def_id::DefId};
|
||||||
use rustc_middle::ty::{self, TyCtxt};
|
use rustc_middle::ty::{self, TyCtxt};
|
||||||
use rustc_span::def_id::CRATE_DEF_INDEX;
|
use rustc_span::def_id::CRATE_DEF_INDEX;
|
||||||
use rustc_span::Pos;
|
use rustc_span::Pos;
|
||||||
|
use rustc_target::spec::abi::Abi as RustcAbi;
|
||||||
|
|
||||||
use rustdoc_json_types::*;
|
use rustdoc_json_types::*;
|
||||||
|
|
||||||
|
@ -19,7 +20,6 @@ use crate::clean::utils::print_const_expr;
|
||||||
use crate::clean::{self, ItemId};
|
use crate::clean::{self, ItemId};
|
||||||
use crate::formats::item_type::ItemType;
|
use crate::formats::item_type::ItemType;
|
||||||
use crate::json::JsonRenderer;
|
use crate::json::JsonRenderer;
|
||||||
use std::collections::HashSet;
|
|
||||||
|
|
||||||
impl JsonRenderer<'_> {
|
impl JsonRenderer<'_> {
|
||||||
pub(super) fn convert_item(&self, item: clean::Item) -> Option<Item> {
|
pub(super) fn convert_item(&self, item: clean::Item) -> Option<Item> {
|
||||||
|
@ -271,22 +271,28 @@ crate fn from_ctor_kind(struct_type: CtorKind) -> StructType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
crate fn from_fn_header(header: &rustc_hir::FnHeader) -> HashSet<Qualifiers> {
|
crate fn from_fn_header(header: &rustc_hir::FnHeader) -> Header {
|
||||||
let mut v = HashSet::new();
|
Header {
|
||||||
|
async_: header.is_async(),
|
||||||
if let rustc_hir::Unsafety::Unsafe = header.unsafety {
|
const_: header.is_const(),
|
||||||
v.insert(Qualifiers::Unsafe);
|
unsafe_: header.is_unsafe(),
|
||||||
|
abi: convert_abi(header.abi),
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let rustc_hir::IsAsync::Async = header.asyncness {
|
fn convert_abi(a: RustcAbi) -> Abi {
|
||||||
v.insert(Qualifiers::Async);
|
match a {
|
||||||
|
RustcAbi::Rust => Abi::Rust,
|
||||||
|
RustcAbi::C { unwind } => Abi::C { unwind },
|
||||||
|
RustcAbi::Cdecl { unwind } => Abi::Cdecl { unwind },
|
||||||
|
RustcAbi::Stdcall { unwind } => Abi::Stdcall { unwind },
|
||||||
|
RustcAbi::Fastcall { unwind } => Abi::Fastcall { unwind },
|
||||||
|
RustcAbi::Aapcs { unwind } => Abi::Aapcs { unwind },
|
||||||
|
RustcAbi::Win64 { unwind } => Abi::Win64 { unwind },
|
||||||
|
RustcAbi::SysV64 { unwind } => Abi::SysV64 { unwind },
|
||||||
|
RustcAbi::System { unwind } => Abi::System { unwind },
|
||||||
|
_ => Abi::Other(a.to_string()),
|
||||||
}
|
}
|
||||||
|
|
||||||
if let rustc_hir::Constness::Const = header.constness {
|
|
||||||
v.insert(Qualifiers::Const);
|
|
||||||
}
|
|
||||||
|
|
||||||
v
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FromWithTcx<clean::Function> for Function {
|
impl FromWithTcx<clean::Function> for Function {
|
||||||
|
@ -296,7 +302,6 @@ impl FromWithTcx<clean::Function> for Function {
|
||||||
decl: decl.into_tcx(tcx),
|
decl: decl.into_tcx(tcx),
|
||||||
generics: generics.into_tcx(tcx),
|
generics: generics.into_tcx(tcx),
|
||||||
header: from_fn_header(&header),
|
header: from_fn_header(&header),
|
||||||
abi: header.abi.to_string(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -465,16 +470,14 @@ impl FromWithTcx<clean::BareFunctionDecl> for FunctionPointer {
|
||||||
fn from_tcx(bare_decl: clean::BareFunctionDecl, tcx: TyCtxt<'_>) -> Self {
|
fn from_tcx(bare_decl: clean::BareFunctionDecl, tcx: TyCtxt<'_>) -> Self {
|
||||||
let clean::BareFunctionDecl { unsafety, generic_params, decl, abi } = bare_decl;
|
let clean::BareFunctionDecl { unsafety, generic_params, decl, abi } = bare_decl;
|
||||||
FunctionPointer {
|
FunctionPointer {
|
||||||
header: if let rustc_hir::Unsafety::Unsafe = unsafety {
|
header: Header {
|
||||||
let mut hs = HashSet::new();
|
unsafe_: matches!(unsafety, rustc_hir::Unsafety::Unsafe),
|
||||||
hs.insert(Qualifiers::Unsafe);
|
const_: false,
|
||||||
hs
|
async_: false,
|
||||||
} else {
|
abi: convert_abi(abi),
|
||||||
HashSet::new()
|
|
||||||
},
|
},
|
||||||
generic_params: generic_params.into_iter().map(|x| x.into_tcx(tcx)).collect(),
|
generic_params: generic_params.into_iter().map(|x| x.into_tcx(tcx)).collect(),
|
||||||
decl: decl.into_tcx(tcx),
|
decl: decl.into_tcx(tcx),
|
||||||
abi: abi.to_string(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -554,7 +557,6 @@ crate fn from_function_method(
|
||||||
decl: decl.into_tcx(tcx),
|
decl: decl.into_tcx(tcx),
|
||||||
generics: generics.into_tcx(tcx),
|
generics: generics.into_tcx(tcx),
|
||||||
header: from_fn_header(&header),
|
header: from_fn_header(&header),
|
||||||
abi: header.abi.to_string(),
|
|
||||||
has_body,
|
has_body,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,13 +3,13 @@
|
||||||
//! These types are the public API exposed through the `--output-format json` flag. The [`Crate`]
|
//! These types are the public API exposed through the `--output-format json` flag. The [`Crate`]
|
||||||
//! struct is the root of the JSON blob and all other items are contained within.
|
//! struct is the root of the JSON blob and all other items are contained within.
|
||||||
|
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::HashMap;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
/// rustdoc format-version.
|
/// rustdoc format-version.
|
||||||
pub const FORMAT_VERSION: u32 = 10;
|
pub const FORMAT_VERSION: u32 = 11;
|
||||||
|
|
||||||
/// A `Crate` is the root of the emitted JSON blob. It contains all type/documentation information
|
/// A `Crate` is the root of the emitted JSON blob. It contains all type/documentation information
|
||||||
/// about the language items in the local crate, as well as info about external items to allow
|
/// about the language items in the local crate, as well as info about external items to allow
|
||||||
|
@ -287,29 +287,45 @@ pub enum StructType {
|
||||||
Unit,
|
Unit,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[non_exhaustive]
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
|
||||||
#[serde(rename_all = "snake_case")]
|
pub struct Header {
|
||||||
pub enum Qualifiers {
|
#[serde(rename = "const")]
|
||||||
Const,
|
pub const_: bool,
|
||||||
Unsafe,
|
#[serde(rename = "unsafe")]
|
||||||
Async,
|
pub unsafe_: bool,
|
||||||
|
#[serde(rename = "async")]
|
||||||
|
pub async_: bool,
|
||||||
|
pub abi: Abi,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
|
||||||
|
pub enum Abi {
|
||||||
|
// We only have a concrete listing here for stable ABI's because their are so many
|
||||||
|
// See rustc_ast_passes::feature_gate::PostExpansionVisitor::check_abi for the list
|
||||||
|
Rust,
|
||||||
|
C { unwind: bool },
|
||||||
|
Cdecl { unwind: bool },
|
||||||
|
Stdcall { unwind: bool },
|
||||||
|
Fastcall { unwind: bool },
|
||||||
|
Aapcs { unwind: bool },
|
||||||
|
Win64 { unwind: bool },
|
||||||
|
SysV64 { unwind: bool },
|
||||||
|
System { unwind: bool },
|
||||||
|
Other(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
pub struct Function {
|
pub struct Function {
|
||||||
pub decl: FnDecl,
|
pub decl: FnDecl,
|
||||||
pub generics: Generics,
|
pub generics: Generics,
|
||||||
pub header: HashSet<Qualifiers>,
|
pub header: Header,
|
||||||
pub abi: String,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
pub struct Method {
|
pub struct Method {
|
||||||
pub decl: FnDecl,
|
pub decl: FnDecl,
|
||||||
pub generics: Generics,
|
pub generics: Generics,
|
||||||
pub header: HashSet<Qualifiers>,
|
pub header: Header,
|
||||||
pub abi: String,
|
|
||||||
pub has_body: bool,
|
pub has_body: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,8 +442,7 @@ pub enum Type {
|
||||||
pub struct FunctionPointer {
|
pub struct FunctionPointer {
|
||||||
pub decl: FnDecl,
|
pub decl: FnDecl,
|
||||||
pub generic_params: Vec<GenericParamDef>,
|
pub generic_params: Vec<GenericParamDef>,
|
||||||
pub header: HashSet<Qualifiers>,
|
pub header: Header,
|
||||||
pub abi: String,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue