]> git.lizzy.rs Git - rust.git/blob - src/librustdoc/doctree.rs
Rollup merge of #69599 - Centril:typeck-tweak-wording, r=davidtwco
[rust.git] / src / librustdoc / doctree.rs
1 //! This module is used to store stuff from Rust's AST in a more convenient
2 //! manner (and with prettier names) before cleaning.
3 pub use self::StructType::*;
4
5 use rustc_ast::ast;
6 use rustc_ast::ast::Name;
7 use rustc_span::hygiene::MacroKind;
8 use rustc_span::{self, Span};
9
10 use rustc_hir as hir;
11 use rustc_hir::def_id::CrateNum;
12
13 pub struct Module<'hir> {
14     pub name: Option<Name>,
15     pub attrs: &'hir [ast::Attribute],
16     pub where_outer: Span,
17     pub where_inner: Span,
18     pub extern_crates: Vec<ExternCrate<'hir>>,
19     pub imports: Vec<Import<'hir>>,
20     pub structs: Vec<Struct<'hir>>,
21     pub unions: Vec<Union<'hir>>,
22     pub enums: Vec<Enum<'hir>>,
23     pub fns: Vec<Function<'hir>>,
24     pub mods: Vec<Module<'hir>>,
25     pub id: hir::HirId,
26     pub typedefs: Vec<Typedef<'hir>>,
27     pub opaque_tys: Vec<OpaqueTy<'hir>>,
28     pub statics: Vec<Static<'hir>>,
29     pub constants: Vec<Constant<'hir>>,
30     pub traits: Vec<Trait<'hir>>,
31     pub vis: &'hir hir::Visibility<'hir>,
32     pub impls: Vec<Impl<'hir>>,
33     pub foreigns: Vec<ForeignItem<'hir>>,
34     pub macros: Vec<Macro<'hir>>,
35     pub proc_macros: Vec<ProcMacro<'hir>>,
36     pub trait_aliases: Vec<TraitAlias<'hir>>,
37     pub is_crate: bool,
38 }
39
40 impl Module<'hir> {
41     pub fn new(
42         name: Option<Name>,
43         attrs: &'hir [ast::Attribute],
44         vis: &'hir hir::Visibility<'hir>,
45     ) -> Module<'hir> {
46         Module {
47             name,
48             id: hir::CRATE_HIR_ID,
49             vis,
50             where_outer: rustc_span::DUMMY_SP,
51             where_inner: rustc_span::DUMMY_SP,
52             attrs,
53             extern_crates: Vec::new(),
54             imports: Vec::new(),
55             structs: Vec::new(),
56             unions: Vec::new(),
57             enums: Vec::new(),
58             fns: Vec::new(),
59             mods: Vec::new(),
60             typedefs: Vec::new(),
61             opaque_tys: Vec::new(),
62             statics: Vec::new(),
63             constants: Vec::new(),
64             traits: Vec::new(),
65             impls: Vec::new(),
66             foreigns: Vec::new(),
67             macros: Vec::new(),
68             proc_macros: Vec::new(),
69             trait_aliases: Vec::new(),
70             is_crate: false,
71         }
72     }
73 }
74
75 #[derive(Debug, Clone, Copy)]
76 pub enum StructType {
77     /// A braced struct
78     Plain,
79     /// A tuple struct
80     Tuple,
81     /// A unit struct
82     Unit,
83 }
84
85 pub struct Struct<'hir> {
86     pub vis: &'hir hir::Visibility<'hir>,
87     pub id: hir::HirId,
88     pub struct_type: StructType,
89     pub name: Name,
90     pub generics: &'hir hir::Generics<'hir>,
91     pub attrs: &'hir [ast::Attribute],
92     pub fields: &'hir [hir::StructField<'hir>],
93     pub whence: Span,
94 }
95
96 pub struct Union<'hir> {
97     pub vis: &'hir hir::Visibility<'hir>,
98     pub id: hir::HirId,
99     pub struct_type: StructType,
100     pub name: Name,
101     pub generics: &'hir hir::Generics<'hir>,
102     pub attrs: &'hir [ast::Attribute],
103     pub fields: &'hir [hir::StructField<'hir>],
104     pub whence: Span,
105 }
106
107 pub struct Enum<'hir> {
108     pub vis: &'hir hir::Visibility<'hir>,
109     pub variants: Vec<Variant<'hir>>,
110     pub generics: &'hir hir::Generics<'hir>,
111     pub attrs: &'hir [ast::Attribute],
112     pub id: hir::HirId,
113     pub whence: Span,
114     pub name: Name,
115 }
116
117 pub struct Variant<'hir> {
118     pub name: Name,
119     pub id: hir::HirId,
120     pub attrs: &'hir [ast::Attribute],
121     pub def: &'hir hir::VariantData<'hir>,
122     pub whence: Span,
123 }
124
125 pub struct Function<'hir> {
126     pub decl: &'hir hir::FnDecl<'hir>,
127     pub attrs: &'hir [ast::Attribute],
128     pub id: hir::HirId,
129     pub name: Name,
130     pub vis: &'hir hir::Visibility<'hir>,
131     pub header: hir::FnHeader,
132     pub whence: Span,
133     pub generics: &'hir hir::Generics<'hir>,
134     pub body: hir::BodyId,
135 }
136
137 pub struct Typedef<'hir> {
138     pub ty: &'hir hir::Ty<'hir>,
139     pub gen: &'hir hir::Generics<'hir>,
140     pub name: Name,
141     pub id: hir::HirId,
142     pub attrs: &'hir [ast::Attribute],
143     pub whence: Span,
144     pub vis: &'hir hir::Visibility<'hir>,
145 }
146
147 pub struct OpaqueTy<'hir> {
148     pub opaque_ty: &'hir hir::OpaqueTy<'hir>,
149     pub name: Name,
150     pub id: hir::HirId,
151     pub attrs: &'hir [ast::Attribute],
152     pub whence: Span,
153     pub vis: &'hir hir::Visibility<'hir>,
154 }
155
156 #[derive(Debug)]
157 pub struct Static<'hir> {
158     pub type_: &'hir hir::Ty<'hir>,
159     pub mutability: hir::Mutability,
160     pub expr: hir::BodyId,
161     pub name: Name,
162     pub attrs: &'hir [ast::Attribute],
163     pub vis: &'hir hir::Visibility<'hir>,
164     pub id: hir::HirId,
165     pub whence: Span,
166 }
167
168 pub struct Constant<'hir> {
169     pub type_: &'hir hir::Ty<'hir>,
170     pub expr: hir::BodyId,
171     pub name: Name,
172     pub attrs: &'hir [ast::Attribute],
173     pub vis: &'hir hir::Visibility<'hir>,
174     pub id: hir::HirId,
175     pub whence: Span,
176 }
177
178 pub struct Trait<'hir> {
179     pub is_auto: hir::IsAuto,
180     pub unsafety: hir::Unsafety,
181     pub name: Name,
182     pub items: Vec<&'hir hir::TraitItem<'hir>>,
183     pub generics: &'hir hir::Generics<'hir>,
184     pub bounds: &'hir [hir::GenericBound<'hir>],
185     pub attrs: &'hir [ast::Attribute],
186     pub id: hir::HirId,
187     pub whence: Span,
188     pub vis: &'hir hir::Visibility<'hir>,
189 }
190
191 pub struct TraitAlias<'hir> {
192     pub name: Name,
193     pub generics: &'hir hir::Generics<'hir>,
194     pub bounds: &'hir [hir::GenericBound<'hir>],
195     pub attrs: &'hir [ast::Attribute],
196     pub id: hir::HirId,
197     pub whence: Span,
198     pub vis: &'hir hir::Visibility<'hir>,
199 }
200
201 #[derive(Debug)]
202 pub struct Impl<'hir> {
203     pub unsafety: hir::Unsafety,
204     pub polarity: hir::ImplPolarity,
205     pub defaultness: hir::Defaultness,
206     pub constness: hir::Constness,
207     pub generics: &'hir hir::Generics<'hir>,
208     pub trait_: &'hir Option<hir::TraitRef<'hir>>,
209     pub for_: &'hir hir::Ty<'hir>,
210     pub items: Vec<&'hir hir::ImplItem<'hir>>,
211     pub attrs: &'hir [ast::Attribute],
212     pub whence: Span,
213     pub vis: &'hir hir::Visibility<'hir>,
214     pub id: hir::HirId,
215 }
216
217 pub struct ForeignItem<'hir> {
218     pub vis: &'hir hir::Visibility<'hir>,
219     pub id: hir::HirId,
220     pub name: Name,
221     pub kind: &'hir hir::ForeignItemKind<'hir>,
222     pub attrs: &'hir [ast::Attribute],
223     pub whence: Span,
224 }
225
226 // For Macro we store the DefId instead of the NodeId, since we also create
227 // these imported macro_rules (which only have a DUMMY_NODE_ID).
228 pub struct Macro<'hir> {
229     pub name: Name,
230     pub hid: hir::HirId,
231     pub def_id: hir::def_id::DefId,
232     pub attrs: &'hir [ast::Attribute],
233     pub whence: Span,
234     pub matchers: Vec<Span>,
235     pub imported_from: Option<Name>,
236 }
237
238 pub struct ExternCrate<'hir> {
239     pub name: Name,
240     pub cnum: CrateNum,
241     pub path: Option<String>,
242     pub vis: &'hir hir::Visibility<'hir>,
243     pub attrs: &'hir [ast::Attribute],
244     pub whence: Span,
245 }
246
247 pub struct Import<'hir> {
248     pub name: Name,
249     pub id: hir::HirId,
250     pub vis: &'hir hir::Visibility<'hir>,
251     pub attrs: &'hir [ast::Attribute],
252     pub path: &'hir hir::Path<'hir>,
253     pub glob: bool,
254     pub whence: Span,
255 }
256
257 pub struct ProcMacro<'hir> {
258     pub name: Name,
259     pub id: hir::HirId,
260     pub kind: MacroKind,
261     pub helpers: Vec<Name>,
262     pub attrs: &'hir [ast::Attribute],
263     pub whence: Span,
264 }
265
266 pub fn struct_type_from_def(vdata: &hir::VariantData) -> StructType {
267     match *vdata {
268         hir::VariantData::Struct(..) => Plain,
269         hir::VariantData::Tuple(..) => Tuple,
270         hir::VariantData::Unit(..) => Unit,
271     }
272 }