1use std::borrow::Cow;
3use std::fmt;
4use std::ops::Not;
5
6use rustc_abi::ExternAbi;
7use rustc_ast::util::parser::ExprPrecedence;
8use rustc_ast::{
9 self as ast, FloatTy, InlineAsmOptions, InlineAsmTemplatePiece, IntTy, Label, LitIntType,
10 LitKind, TraitObjectSyntax, UintTy, UnsafeBinderCastKind,
11};
12pub use rustc_ast::{
13 AssignOp, AssignOpKind, AttrId, AttrStyle, BinOp, BinOpKind, BindingMode, BorrowKind,
14 BoundConstness, BoundPolarity, ByRef, CaptureBy, DelimArgs, ImplPolarity, IsAuto,
15 MetaItemInner, MetaItemLit, Movability, Mutability, Pinnedness, UnOp,
16};
17use rustc_attr_ir::Attribute;
18use rustc_data_structures::fingerprint::Fingerprint;
19use rustc_data_structures::fx::FxIndexSet;
20use rustc_data_structures::sorted_map::SortedMap;
21use rustc_data_structures::steal::Steal;
22use rustc_data_structures::tagged_ptr::TaggedRef;
23use rustc_data_structures::unord::UnordMap;
24use rustc_error_messages::{DiagArgValue, IntoDiagArg};
25use rustc_hir_id::{HirId, ItemLocalId, ItemLocalMap, OwnerId};
26use rustc_index::IndexVec;
27use rustc_macros::{Decodable, Encodable, StableHash};
28use rustc_span::def_id::LocalDefId;
29use rustc_span::{
30 BytePos, DUMMY_SP, DesugaringKind, ErrorGuaranteed, Ident, LocalExpnId, Span, Spanned, Symbol,
31 kw, sym,
32};
33use rustc_target::asm;
34use tracing::debug;
35
36use crate::def::{CtorKind, DefKind, MacroKinds, PerNS, Res};
37use crate::def_id::{DefId, LocalDefIdMap};
38use crate::intravisit::FnKind;
39use crate::lints::DelayedLints;
40
41#[derive(#[automatically_derived]impl ::core::fmt::Debug for AngleBrackets {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
AngleBrackets::Missing => "Missing",
AngleBrackets::Empty => "Empty",
AngleBrackets::Full => "Full",
})
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for AngleBrackets { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for AngleBrackets {
}
#[automatically_derived]impl ::core::clone::Clone for AngleBrackets {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
AngleBrackets {
}
#[automatically_derived]impl ::core::cmp::PartialEq for AngleBrackets {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for AngleBrackets { }Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
AngleBrackets {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
AngleBrackets::Missing => 0u8.stable_hash(__hcx, __hasher),
AngleBrackets::Empty => 1u8.stable_hash(__hcx, __hasher),
AngleBrackets::Full => 2u8.stable_hash(__hcx, __hasher),
}
match *self {
AngleBrackets::Missing => {}
AngleBrackets::Empty => {}
AngleBrackets::Full => {}
}
}
}
};StableHash)]
42pub enum AngleBrackets {
43 Missing,
45 Empty,
47 Full,
49}
50
51#[derive(#[automatically_derived]impl ::core::fmt::Debug for LifetimeSource {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Reference =>
::core::fmt::Formatter::write_str(f, "Reference"),
Self::Path { angle_brackets: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Path angle_brackets", &__self_0),
Self::OutlivesBound =>
::core::fmt::Formatter::write_str(f, "OutlivesBound"),
Self::PreciseCapturing =>
::core::fmt::Formatter::write_str(f, "PreciseCapturing"),
Self::Other => ::core::fmt::Formatter::write_str(f, "Other"),
}
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for LifetimeSource { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for LifetimeSource {
}
#[automatically_derived]impl ::core::clone::Clone for LifetimeSource {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<AngleBrackets>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
LifetimeSource {
}
#[automatically_derived]impl ::core::cmp::PartialEq for LifetimeSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Path { angle_brackets: __self_0 }, Self::Path {
angle_brackets: __arg1_0 }) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for LifetimeSource {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<AngleBrackets>;
}
}Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
LifetimeSource {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
LifetimeSource::Reference =>
0u8.stable_hash(__hcx, __hasher),
LifetimeSource::Path { angle_brackets: ref __binding_0 } =>
1u8.stable_hash(__hcx, __hasher),
LifetimeSource::OutlivesBound =>
2u8.stable_hash(__hcx, __hasher),
LifetimeSource::PreciseCapturing =>
3u8.stable_hash(__hcx, __hasher),
LifetimeSource::Other => 4u8.stable_hash(__hcx, __hasher),
}
match *self {
LifetimeSource::Reference => {}
LifetimeSource::Path { angle_brackets: ref __binding_0 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
}
LifetimeSource::OutlivesBound => {}
LifetimeSource::PreciseCapturing => {}
LifetimeSource::Other => {}
}
}
}
};StableHash)]
52pub enum LifetimeSource {
53 Reference,
55
56 Path { angle_brackets: AngleBrackets },
59
60 OutlivesBound,
62
63 PreciseCapturing,
65
66 Other,
73}
74
75#[derive(#[automatically_derived]impl ::core::fmt::Debug for LifetimeSyntax {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LifetimeSyntax::Implicit => "Implicit",
LifetimeSyntax::ExplicitAnonymous => "ExplicitAnonymous",
LifetimeSyntax::ExplicitBound => "ExplicitBound",
})
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for LifetimeSyntax { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for LifetimeSyntax {
}
#[automatically_derived]impl ::core::clone::Clone for LifetimeSyntax {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
LifetimeSyntax {
}
#[automatically_derived]impl ::core::cmp::PartialEq for LifetimeSyntax {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for LifetimeSyntax { }Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
LifetimeSyntax {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
LifetimeSyntax::Implicit =>
0u8.stable_hash(__hcx, __hasher),
LifetimeSyntax::ExplicitAnonymous =>
1u8.stable_hash(__hcx, __hasher),
LifetimeSyntax::ExplicitBound =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
LifetimeSyntax::Implicit => {}
LifetimeSyntax::ExplicitAnonymous => {}
LifetimeSyntax::ExplicitBound => {}
}
}
}
};StableHash)]
76pub enum LifetimeSyntax {
77 Implicit,
79
80 ExplicitAnonymous,
82
83 ExplicitBound,
85}
86
87impl From<Ident> for LifetimeSyntax {
88 fn from(ident: Ident) -> Self {
89 let name = ident.name;
90
91 if name == sym::empty {
92 {
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("A lifetime name should never be empty")));
};unreachable!("A lifetime name should never be empty");
93 } else if name == kw::UnderscoreLifetime {
94 LifetimeSyntax::ExplicitAnonymous
95 } else {
96 if true {
if !name.as_str().starts_with('\'') {
::core::panicking::panic("assertion failed: name.as_str().starts_with(\'\\\'\')")
};
};debug_assert!(name.as_str().starts_with('\''));
97 LifetimeSyntax::ExplicitBound
98 }
99 }
100}
101
102#[derive(#[automatically_derived]impl ::core::fmt::Debug for Lifetime {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"Lifetime hir_id ident kind source syntax", &self.hir_id,
&self.ident, &self.kind, &self.source, &&self.syntax)
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for Lifetime { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for Lifetime {
}
#[automatically_derived]impl ::core::clone::Clone for Lifetime {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<LifetimeKind>;
let _: ::core::clone::AssertParamIsClone<LifetimeSource>;
let _: ::core::clone::AssertParamIsClone<LifetimeSyntax>;
*self
}
}Clone, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Lifetime {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Lifetime {
hir_id: ref __binding_0,
ident: ref __binding_1,
kind: ref __binding_2,
source: ref __binding_3,
syntax: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
153#[repr(align(4))]
161pub struct Lifetime {
162 #[stable_hash(ignore)]
163 pub hir_id: HirId,
164
165 pub ident: Ident,
169
170 pub kind: LifetimeKind,
172
173 pub source: LifetimeSource,
176
177 pub syntax: LifetimeSyntax,
180}
181
182#[derive(#[automatically_derived]impl ::core::fmt::Debug for ParamName {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Plain(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Plain",
&__self_0),
Self::Error(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Error",
&__self_0),
Self::Fresh => ::core::fmt::Formatter::write_str(f, "Fresh"),
}
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for ParamName { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ParamName {
}
#[automatically_derived]impl ::core::clone::Clone for ParamName {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
*self
}
}Clone, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ParamName {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ParamName::Plain(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
ParamName::Error(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
ParamName::Fresh => 2u8.stable_hash(__hcx, __hasher),
}
match *self {
ParamName::Plain(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ParamName::Error(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ParamName::Fresh => {}
}
}
}
};StableHash)]
183pub enum ParamName {
184 Plain(Ident),
186
187 Error(Ident),
193
194 Fresh,
209}
210
211impl ParamName {
212 pub fn ident(&self) -> Ident {
213 match *self {
214 ParamName::Plain(ident) | ParamName::Error(ident) => ident,
215 ParamName::Fresh => Ident::with_dummy_span(kw::UnderscoreLifetime),
216 }
217 }
218}
219
220#[derive(#[automatically_derived]impl ::core::fmt::Debug for LifetimeKind {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Param(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Param",
&__self_0),
Self::ImplicitObjectLifetimeDefault =>
::core::fmt::Formatter::write_str(f,
"ImplicitObjectLifetimeDefault"),
Self::Error(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Error",
&__self_0),
Self::Infer => ::core::fmt::Formatter::write_str(f, "Infer"),
Self::Static => ::core::fmt::Formatter::write_str(f, "Static"),
}
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for LifetimeKind { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for LifetimeKind {
}
#[automatically_derived]impl ::core::clone::Clone for LifetimeKind {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
LifetimeKind {
}
#[automatically_derived]impl ::core::cmp::PartialEq for LifetimeKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Param(__self_0), Self::Param(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Error(__self_0), Self::Error(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for LifetimeKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<LocalDefId>;
let _: ::core::cmp::AssertParamIsEq<ErrorGuaranteed>;
}
}Eq, #[automatically_derived]impl ::core::hash::Hash for LifetimeKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Param(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::Error(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for LifetimeKind
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
LifetimeKind::Param(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
LifetimeKind::ImplicitObjectLifetimeDefault =>
1u8.stable_hash(__hcx, __hasher),
LifetimeKind::Error(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
LifetimeKind::Infer => 3u8.stable_hash(__hcx, __hasher),
LifetimeKind::Static => 4u8.stable_hash(__hcx, __hasher),
}
match *self {
LifetimeKind::Param(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
LifetimeKind::ImplicitObjectLifetimeDefault => {}
LifetimeKind::Error(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
LifetimeKind::Infer => {}
LifetimeKind::Static => {}
}
}
}
};StableHash)]
221pub enum LifetimeKind {
222 Param(LocalDefId),
224
225 ImplicitObjectLifetimeDefault,
237
238 Error(ErrorGuaranteed),
241
242 Infer,
246
247 Static,
249}
250
251impl LifetimeKind {
252 fn is_elided(&self) -> bool {
253 match self {
254 LifetimeKind::ImplicitObjectLifetimeDefault | LifetimeKind::Infer => true,
255
256 LifetimeKind::Error(..) | LifetimeKind::Param(..) | LifetimeKind::Static => false,
261 }
262 }
263}
264
265impl fmt::Display for Lifetime {
266 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
267 self.ident.name.fmt(f)
268 }
269}
270
271impl Lifetime {
272 pub fn new(
273 hir_id: HirId,
274 ident: Ident,
275 kind: LifetimeKind,
276 source: LifetimeSource,
277 syntax: LifetimeSyntax,
278 ) -> Lifetime {
279 let lifetime = Lifetime { hir_id, ident, kind, source, syntax };
280
281 #[cfg(debug_assertions)]
283 match (lifetime.is_elided(), lifetime.is_anonymous()) {
284 (false, false) => {} (false, true) => {} (true, true) => {} (true, false) => { ::core::panicking::panic_fmt(format_args!("bad Lifetime")); }panic!("bad Lifetime"),
288 }
289
290 lifetime
291 }
292
293 pub fn is_elided(&self) -> bool {
294 self.kind.is_elided()
295 }
296
297 pub fn is_anonymous(&self) -> bool {
298 self.ident.name == kw::UnderscoreLifetime
299 }
300
301 pub fn is_implicit(&self) -> bool {
302 #[allow(non_exhaustive_omitted_patterns)] match self.syntax {
LifetimeSyntax::Implicit => true,
_ => false,
}matches!(self.syntax, LifetimeSyntax::Implicit)
303 }
304
305 pub fn is_static(&self) -> bool {
306 self.kind == LifetimeKind::Static
307 }
308
309 pub fn suggestion(&self, new_lifetime: &str) -> (Span, String) {
310 use LifetimeSource::*;
311 use LifetimeSyntax::*;
312
313 if true {
if !new_lifetime.starts_with('\'') {
::core::panicking::panic("assertion failed: new_lifetime.starts_with(\'\\\'\')")
};
};debug_assert!(new_lifetime.starts_with('\''));
314
315 match (self.syntax, self.source) {
316 (ExplicitBound | ExplicitAnonymous, _) => (self.ident.span, ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}", new_lifetime))
})format!("{new_lifetime}")),
318
319 (Implicit, Path { angle_brackets: AngleBrackets::Full }) => {
321 (self.ident.span, ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}, ", new_lifetime))
})format!("{new_lifetime}, "))
322 }
323
324 (Implicit, Path { angle_brackets: AngleBrackets::Empty }) => {
326 (self.ident.span, ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}", new_lifetime))
})format!("{new_lifetime}"))
327 }
328
329 (Implicit, Path { angle_brackets: AngleBrackets::Missing }) => {
331 (self.ident.span.shrink_to_hi(), ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("<{0}>", new_lifetime))
})format!("<{new_lifetime}>"))
332 }
333
334 (Implicit, Reference) => (self.ident.span, ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0} ", new_lifetime))
})format!("{new_lifetime} ")),
336
337 (Implicit, source) => {
338 {
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("can\'t suggest for a implicit lifetime of {0:?}",
source)));
}unreachable!("can't suggest for a implicit lifetime of {source:?}")
339 }
340 }
341 }
342}
343
344#[derive(#[automatically_derived]impl<'hir, R: ::core::fmt::Debug> ::core::fmt::Debug
for Path<'hir, R> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Path span res segments", &self.span, &self.res, &&self.segments)
}
}Debug, #[automatically_derived]impl<'hir, R: ::core::clone::Clone>
::core::clone::Clone for Path<'hir, R> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
Path {
span: ::core::clone::Clone::clone(&self.span),
res: ::core::clone::Clone::clone(&self.res),
segments: ::core::clone::Clone::clone(&self.segments),
}
}
}Clone, #[automatically_derived]impl<'hir, R: ::core::marker::Copy>
::core::marker::Copy for Path<'hir, R> {
}Copy, const _: () =
{
impl<'hir, R> ::rustc_data_structures::stable_hash::StableHash for
Path<'hir, R> where
R: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Path {
span: ref __binding_0,
res: ref __binding_1,
segments: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
348pub struct Path<'hir, R = Res> {
349 pub span: Span,
350 pub res: R,
352 pub segments: &'hir [PathSegment<'hir>],
354}
355
356pub type UsePath<'hir> = Path<'hir, PerNS<Option<Res>>>;
358
359impl Path<'_> {
360 pub fn is_global(&self) -> bool {
361 self.segments.first().is_some_and(|segment| segment.ident.name == kw::PathRoot)
362 }
363}
364
365#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for PathSegment<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"PathSegment ident hir_id res args infer_args delegation_child_segment";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.ident, &self.hir_id, &self.res, &self.args,
&self.infer_args, &&self.delegation_child_segment];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for PathSegment<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for PathSegment<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Res>;
let _:
::core::clone::AssertParamIsClone<Option<&'hir GenericArgs<'hir>>>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for PathSegment<'hir>
{
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PathSegment<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PathSegment {
ident: ref __binding_0,
hir_id: ref __binding_1,
res: ref __binding_2,
args: ref __binding_3,
infer_args: ref __binding_4,
delegation_child_segment: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{}
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
368pub struct PathSegment<'hir> {
369 pub ident: Ident,
371 #[stable_hash(ignore)]
372 pub hir_id: HirId,
373 pub res: Res,
374
375 pub args: Option<&'hir GenericArgs<'hir>>,
381
382 pub infer_args: bool,
387
388 pub delegation_child_segment: bool,
392}
393
394impl<'hir> PathSegment<'hir> {
395 pub fn new(ident: Ident, hir_id: HirId, res: Res) -> PathSegment<'hir> {
397 PathSegment {
398 ident,
399 hir_id,
400 res,
401 infer_args: true,
402 args: None,
403 delegation_child_segment: false,
404 }
405 }
406
407 pub fn invalid() -> Self {
408 Self::new(Ident::dummy(), HirId::INVALID, Res::Err)
409 }
410
411 pub fn args(&self) -> &GenericArgs<'hir> {
412 if let Some(ref args) = self.args { args } else { GenericArgs::NONE }
413 }
414}
415
416#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for ConstItemRhs<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for ConstItemRhs<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<BodyId>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for ConstItemRhs<'hir>
{
}Copy, #[automatically_derived]impl<'hir> ::core::fmt::Debug for ConstItemRhs<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Body(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Body",
&__self_0),
Self::Direct(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Direct", &__self_0),
}
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ConstItemRhs<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ConstItemRhs::Body(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
ConstItemRhs::Direct(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
ConstItemRhs::Body(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstItemRhs::Direct(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
417pub enum ConstItemRhs<'hir> {
418 Body(BodyId),
419 Direct(&'hir ConstArg<'hir>),
420}
421
422impl<'hir> ConstItemRhs<'hir> {
423 pub fn hir_id(&self) -> HirId {
424 match self {
425 ConstItemRhs::Body(body_id) => body_id.hir_id,
426 ConstItemRhs::Direct(ct_arg) => ct_arg.hir_id,
427 }
428 }
429
430 pub fn span<'tcx>(&self, tcx: impl crate::intravisit::HirTyCtxt<'tcx>) -> Span {
431 match self {
432 ConstItemRhs::Body(body_id) => tcx.hir_body(*body_id).value.span,
433 ConstItemRhs::Direct(ct_arg) => ct_arg.span,
434 }
435 }
436}
437
438#[derive(#[automatically_derived]impl<'hir, Unambig: ::core::clone::Clone>
::core::clone::Clone for ConstArg<'hir, Unambig> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
ConstArg {
hir_id: ::core::clone::Clone::clone(&self.hir_id),
kind: ::core::clone::Clone::clone(&self.kind),
span: ::core::clone::Clone::clone(&self.span),
}
}
}Clone, #[automatically_derived]impl<'hir, Unambig: ::core::marker::Copy>
::core::marker::Copy for ConstArg<'hir, Unambig> {
}Copy, #[automatically_derived]impl<'hir, Unambig: ::core::fmt::Debug>
::core::fmt::Debug for ConstArg<'hir, Unambig> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"ConstArg hir_id kind span", &self.hir_id, &self.kind,
&&self.span)
}
}Debug, const _: () =
{
impl<'hir, Unambig> ::rustc_data_structures::stable_hash::StableHash
for ConstArg<'hir, Unambig> where
Unambig: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ConstArg {
hir_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
452#[repr(C)]
453pub struct ConstArg<'hir, Unambig = ()> {
454 #[stable_hash(ignore)]
455 pub hir_id: HirId,
456 pub kind: ConstArgKind<'hir, Unambig>,
457 pub span: Span,
458}
459
460impl<'hir> ConstArg<'hir, AmbigArg> {
461 pub fn as_unambig_ct(&self) -> &ConstArg<'hir> {
472 let ptr = self as *const ConstArg<'hir, AmbigArg> as *const ConstArg<'hir, ()>;
475 unsafe { &*ptr }
476 }
477}
478
479impl<'hir> ConstArg<'hir> {
480 pub fn try_as_ambig_ct(&self) -> Option<&ConstArg<'hir, AmbigArg>> {
486 if let ConstArgKind::Infer(()) = self.kind {
487 return None;
488 }
489
490 let ptr = self as *const ConstArg<'hir> as *const ConstArg<'hir, AmbigArg>;
494 Some(unsafe { &*ptr })
495 }
496}
497
498impl<'hir, Unambig> ConstArg<'hir, Unambig> {
499 pub fn anon_const_hir_id(&self) -> Option<HirId> {
500 match self.kind {
501 ConstArgKind::Anon(ac) => Some(ac.hir_id),
502 _ => None,
503 }
504 }
505}
506
507#[derive(#[automatically_derived]impl<'hir, Unambig: ::core::clone::Clone>
::core::clone::Clone for ConstArgKind<'hir, Unambig> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
match self {
Self::Tup(__self_0) =>
ConstArgKind::Tup(::core::clone::Clone::clone(__self_0)),
Self::Path(__self_0) =>
ConstArgKind::Path(::core::clone::Clone::clone(__self_0)),
Self::Anon(__self_0) =>
ConstArgKind::Anon(::core::clone::Clone::clone(__self_0)),
Self::Struct(__self_0, __self_1) =>
ConstArgKind::Struct(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::TupleCall(__self_0, __self_1) =>
ConstArgKind::TupleCall(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::Array(__self_0) =>
ConstArgKind::Array(::core::clone::Clone::clone(__self_0)),
Self::Error(__self_0) =>
ConstArgKind::Error(::core::clone::Clone::clone(__self_0)),
Self::Infer(__self_0) =>
ConstArgKind::Infer(::core::clone::Clone::clone(__self_0)),
Self::Literal { lit: __self_0, negated: __self_1 } =>
ConstArgKind::Literal {
lit: ::core::clone::Clone::clone(__self_0),
negated: ::core::clone::Clone::clone(__self_1),
},
}
}
}Clone, #[automatically_derived]impl<'hir, Unambig: ::core::marker::Copy>
::core::marker::Copy for ConstArgKind<'hir, Unambig> {
}Copy, #[automatically_derived]impl<'hir, Unambig: ::core::fmt::Debug>
::core::fmt::Debug for ConstArgKind<'hir, Unambig> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Tup(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Tup",
&__self_0),
Self::Path(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Path",
&__self_0),
Self::Anon(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Anon",
&__self_0),
Self::Struct(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Struct", __self_0, &__self_1),
Self::TupleCall(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TupleCall", __self_0, &__self_1),
Self::Array(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Array",
&__self_0),
Self::Error(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Error",
&__self_0),
Self::Infer(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Infer",
&__self_0),
Self::Literal { lit: __self_0, negated: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Literal lit negated", __self_0, &__self_1),
}
}
}Debug, const _: () =
{
impl<'hir, Unambig> ::rustc_data_structures::stable_hash::StableHash
for ConstArgKind<'hir, Unambig> where
Unambig: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ConstArgKind::Tup(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
ConstArgKind::Path(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
ConstArgKind::Anon(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
ConstArgKind::Struct(ref __binding_0, ref __binding_1) =>
3u8.stable_hash(__hcx, __hasher),
ConstArgKind::TupleCall(ref __binding_0, ref __binding_1) =>
4u8.stable_hash(__hcx, __hasher),
ConstArgKind::Array(ref __binding_0) =>
5u8.stable_hash(__hcx, __hasher),
ConstArgKind::Error(ref __binding_0) =>
6u8.stable_hash(__hcx, __hasher),
ConstArgKind::Infer(ref __binding_0) =>
7u8.stable_hash(__hcx, __hasher),
ConstArgKind::Literal {
lit: ref __binding_0, negated: ref __binding_1 } =>
8u8.stable_hash(__hcx, __hasher),
}
match *self {
ConstArgKind::Tup(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Path(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Anon(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Struct(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ConstArgKind::TupleCall(ref __binding_0, ref __binding_1) =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Array(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Error(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Infer(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Literal {
lit: ref __binding_0, negated: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
509#[repr(u8, C)]
510pub enum ConstArgKind<'hir, Unambig = ()> {
511 Tup(&'hir [ConstArg<'hir>]),
512 Path(QPath<'hir>),
518 Anon(&'hir AnonConst),
519 Struct(QPath<'hir>, &'hir [ConstArgExprField<'hir>]),
521 TupleCall(QPath<'hir>, &'hir [ConstArg<'hir>]),
523 Array(&'hir ConstArgArrayExpr<'hir>),
525 Error(ErrorGuaranteed),
527 Infer(Unambig),
530 Literal {
531 lit: LitKind,
532 negated: bool,
533 },
534}
535
536#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for ConstArgExprField<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
ConstArgExprField<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
ConstArgExprField<'hir> {
}Copy, #[automatically_derived]impl<'hir> ::core::fmt::Debug for
ConstArgExprField<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"ConstArgExprField hir_id span field expr", &self.hir_id,
&self.span, &self.field, &&self.expr)
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ConstArgExprField<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ConstArgExprField {
hir_id: ref __binding_0,
span: ref __binding_1,
field: ref __binding_2,
expr: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
537pub struct ConstArgExprField<'hir> {
538 pub hir_id: HirId,
539 pub span: Span,
540 pub field: Ident,
541 pub expr: &'hir ConstArg<'hir>,
542}
543
544#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for ConstArgArrayExpr<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
ConstArgArrayExpr<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir [ConstArg<'hir>]>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
ConstArgArrayExpr<'hir> {
}Copy, #[automatically_derived]impl<'hir> ::core::fmt::Debug for
ConstArgArrayExpr<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ConstArgArrayExpr span elems", &self.span, &&self.elems)
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ConstArgArrayExpr<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ConstArgArrayExpr {
span: ref __binding_0, elems: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
545pub struct ConstArgArrayExpr<'hir> {
546 pub span: Span,
547 pub elems: &'hir [ConstArg<'hir>],
548}
549
550#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for InferArgKind {
}
#[automatically_derived]impl ::core::clone::Clone for InferArgKind {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::Copy for InferArgKind { }Copy, #[automatically_derived]impl ::core::fmt::Debug for InferArgKind {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
InferArgKind::TypeOrConst => "TypeOrConst",
InferArgKind::Const => "Const",
})
}
}Debug, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
InferArgKind {
}
#[automatically_derived]impl ::core::cmp::PartialEq for InferArgKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for InferArgKind { }Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for InferArgKind
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
InferArgKind::TypeOrConst =>
0u8.stable_hash(__hcx, __hasher),
InferArgKind::Const => 1u8.stable_hash(__hcx, __hasher),
}
match *self {
InferArgKind::TypeOrConst => {}
InferArgKind::Const => {}
}
}
}
};StableHash)]
552pub enum InferArgKind {
553 TypeOrConst,
556 Const,
559}
560
561#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for InferArg {
}
#[automatically_derived]impl ::core::clone::Clone for InferArg {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<InferArgKind>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::Copy for InferArg { }Copy, #[automatically_derived]impl ::core::fmt::Debug for InferArg {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"InferArg hir_id span kind", &self.hir_id, &self.span,
&&self.kind)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for InferArg {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
InferArg {
hir_id: ref __binding_0,
span: ref __binding_1,
kind: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
562pub struct InferArg {
563 #[stable_hash(ignore)]
564 pub hir_id: HirId,
565 pub span: Span,
566 pub kind: InferArgKind,
567}
568
569impl InferArg {
570 pub fn to_ty(&self) -> Ty<'static> {
571 Ty { kind: TyKind::Infer(()), span: self.span, hir_id: self.hir_id }
572 }
573}
574
575#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for GenericArg<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Lifetime(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Lifetime", &__self_0),
Self::Type(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Type",
&__self_0),
Self::Const(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
&__self_0),
Self::Infer(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Infer",
&__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for GenericArg<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for GenericArg<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir, AmbigArg>>;
let _:
::core::clone::AssertParamIsClone<&'hir ConstArg<'hir,
AmbigArg>>;
let _: ::core::clone::AssertParamIsClone<&'hir InferArg>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for GenericArg<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
GenericArg<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
GenericArg::Lifetime(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
GenericArg::Type(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
GenericArg::Const(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
GenericArg::Infer(ref __binding_0) =>
3u8.stable_hash(__hcx, __hasher),
}
match *self {
GenericArg::Lifetime(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericArg::Type(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericArg::Const(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericArg::Infer(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
576pub enum GenericArg<'hir> {
577 Lifetime(&'hir Lifetime),
578 Type(&'hir Ty<'hir, AmbigArg>),
579 Const(&'hir ConstArg<'hir, AmbigArg>),
580 Infer(&'hir InferArg),
590}
591
592impl GenericArg<'_> {
593 pub fn span(&self) -> Span {
594 match self {
595 GenericArg::Lifetime(l) => l.ident.span,
596 GenericArg::Type(t) => t.span,
597 GenericArg::Const(c) => c.span,
598 GenericArg::Infer(i) => i.span,
599 }
600 }
601
602 pub fn hir_id(&self) -> HirId {
603 match self {
604 GenericArg::Lifetime(l) => l.hir_id,
605 GenericArg::Type(t) => t.hir_id,
606 GenericArg::Const(c) => c.hir_id,
607 GenericArg::Infer(i) => i.hir_id,
608 }
609 }
610
611 pub fn descr(&self) -> &'static str {
612 match self {
613 GenericArg::Lifetime(_) => "lifetime",
614 GenericArg::Type(_) => "type",
615 GenericArg::Const(_) => "constant",
616 GenericArg::Infer(InferArg { kind: InferArgKind::TypeOrConst, .. }) => "placeholder",
617 GenericArg::Infer(InferArg { kind: InferArgKind::Const, .. }) => "constant",
618 }
619 }
620
621 pub fn to_ord(&self) -> ast::ParamKindOrd {
622 match self {
623 GenericArg::Lifetime(_) => ast::ParamKindOrd::Lifetime,
624 GenericArg::Type(_) | GenericArg::Const(_) | GenericArg::Infer(_) => {
625 ast::ParamKindOrd::TypeOrConst
626 }
627 }
628 }
629
630 pub fn is_ty_or_const(&self) -> bool {
631 match self {
632 GenericArg::Lifetime(_) => false,
633 GenericArg::Type(_) | GenericArg::Const(_) | GenericArg::Infer(_) => true,
634 }
635 }
636}
637
638#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for GenericArgs<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"GenericArgs args constraints parenthesized span_ext", &self.args,
&self.constraints, &self.parenthesized, &&self.span_ext)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for GenericArgs<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for GenericArgs<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [GenericArg<'hir>]>;
let _:
::core::clone::AssertParamIsClone<&'hir [AssocItemConstraint<'hir>]>;
let _: ::core::clone::AssertParamIsClone<GenericArgsParentheses>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for GenericArgs<'hir>
{
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
GenericArgs<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
GenericArgs {
args: ref __binding_0,
constraints: ref __binding_1,
parenthesized: ref __binding_2,
span_ext: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
640pub struct GenericArgs<'hir> {
641 pub args: &'hir [GenericArg<'hir>],
643 pub constraints: &'hir [AssocItemConstraint<'hir>],
645 pub parenthesized: GenericArgsParentheses,
650 pub span_ext: Span,
663}
664
665impl<'hir> GenericArgs<'hir> {
666 pub const NONE: &'hir GenericArgs<'hir> = &GenericArgs {
667 args: &[],
668 constraints: &[],
669 parenthesized: GenericArgsParentheses::No,
670 span_ext: DUMMY_SP,
671 };
672
673 pub fn paren_sugar_inputs_output(&self) -> Option<(&[Ty<'hir>], &Ty<'hir>)> {
678 if self.parenthesized != GenericArgsParentheses::ParenSugar {
679 return None;
680 }
681
682 let inputs = self
683 .args
684 .iter()
685 .find_map(|arg| {
686 let GenericArg::Type(ty) = arg else { return None };
687 let TyKind::Tup(tys) = &ty.kind else { return None };
688 Some(tys)
689 })
690 .unwrap();
691
692 Some((inputs, self.paren_sugar_output_inner()))
693 }
694
695 pub fn paren_sugar_output(&self) -> Option<&Ty<'hir>> {
700 (self.parenthesized == GenericArgsParentheses::ParenSugar)
701 .then(|| self.paren_sugar_output_inner())
702 }
703
704 fn paren_sugar_output_inner(&self) -> &Ty<'hir> {
705 let [constraint] = self.constraints.try_into().unwrap();
706 if true {
{
match (&constraint.ident.name, &sym::Output) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(constraint.ident.name, sym::Output);
707 constraint.ty().unwrap()
708 }
709
710 pub fn has_err(&self) -> Option<ErrorGuaranteed> {
711 self.args
712 .iter()
713 .find_map(|arg| {
714 let GenericArg::Type(ty) = arg else { return None };
715 let TyKind::Err(guar) = ty.kind else { return None };
716 Some(guar)
717 })
718 .or_else(|| {
719 self.constraints.iter().find_map(|constraint| {
720 let TyKind::Err(guar) = constraint.ty()?.kind else { return None };
721 Some(guar)
722 })
723 })
724 }
725
726 #[inline]
727 pub fn num_lifetime_args(&self) -> usize {
728 self.args.iter().filter(|arg| #[allow(non_exhaustive_omitted_patterns)] match arg {
GenericArg::Lifetime(_) => true,
_ => false,
}matches!(arg, GenericArg::Lifetime(_))).count()
729 }
730
731 #[inline]
732 pub fn has_lifetime_args(&self) -> bool {
733 self.args.iter().any(|arg| #[allow(non_exhaustive_omitted_patterns)] match arg {
GenericArg::Lifetime(_) => true,
_ => false,
}matches!(arg, GenericArg::Lifetime(_)))
734 }
735
736 #[inline]
737 pub fn num_generic_params(&self) -> usize {
740 self.args.iter().filter(|arg| !#[allow(non_exhaustive_omitted_patterns)] match arg {
GenericArg::Lifetime(_) => true,
_ => false,
}matches!(arg, GenericArg::Lifetime(_))).count()
741 }
742
743 pub fn span(&self) -> Option<Span> {
749 let span_ext = self.span_ext()?;
750 Some(span_ext.with_lo(span_ext.lo() + BytePos(1)).with_hi(span_ext.hi() - BytePos(1)))
751 }
752
753 pub fn span_ext(&self) -> Option<Span> {
755 Some(self.span_ext).filter(|span| !span.is_empty())
756 }
757
758 pub fn is_empty(&self) -> bool {
759 self.args.is_empty()
760 }
761}
762
763#[derive(#[automatically_derived]impl ::core::marker::Copy for GenericArgsParentheses {
}Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for GenericArgsParentheses {
}
#[automatically_derived]impl ::core::clone::Clone for GenericArgsParentheses {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
GenericArgsParentheses {
}
#[automatically_derived]impl ::core::cmp::PartialEq for GenericArgsParentheses
{
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for GenericArgsParentheses { }Eq, #[automatically_derived]impl ::core::fmt::Debug for GenericArgsParentheses {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
GenericArgsParentheses::No => "No",
GenericArgsParentheses::ReturnTypeNotation =>
"ReturnTypeNotation",
GenericArgsParentheses::ParenSugar => "ParenSugar",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
GenericArgsParentheses {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
GenericArgsParentheses::No =>
0u8.stable_hash(__hcx, __hasher),
GenericArgsParentheses::ReturnTypeNotation =>
1u8.stable_hash(__hcx, __hasher),
GenericArgsParentheses::ParenSugar =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
GenericArgsParentheses::No => {}
GenericArgsParentheses::ReturnTypeNotation => {}
GenericArgsParentheses::ParenSugar => {}
}
}
}
};StableHash)]
764pub enum GenericArgsParentheses {
765 No,
766 ReturnTypeNotation,
769 ParenSugar,
771}
772
773#[derive(#[automatically_derived]impl ::core::marker::Copy for TraitBoundModifiers { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for TraitBoundModifiers {
}
#[automatically_derived]impl ::core::clone::Clone for TraitBoundModifiers {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<BoundConstness>;
let _: ::core::clone::AssertParamIsClone<BoundPolarity>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
TraitBoundModifiers {
}
#[automatically_derived]impl ::core::cmp::PartialEq for TraitBoundModifiers {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.constness == other.constness && self.polarity == other.polarity
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for TraitBoundModifiers {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<BoundConstness>;
let _: ::core::cmp::AssertParamIsEq<BoundPolarity>;
}
}Eq, #[automatically_derived]impl ::core::hash::Hash for TraitBoundModifiers {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.constness, state);
::core::hash::Hash::hash(&self.polarity, state)
}
}Hash, #[automatically_derived]impl ::core::fmt::Debug for TraitBoundModifiers {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TraitBoundModifiers constness polarity", &self.constness,
&&self.polarity)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
TraitBoundModifiers {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitBoundModifiers {
constness: ref __binding_0, polarity: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
775pub struct TraitBoundModifiers {
776 pub constness: BoundConstness,
777 pub polarity: BoundPolarity,
778}
779
780impl TraitBoundModifiers {
781 pub const NONE: Self =
782 TraitBoundModifiers { constness: BoundConstness::Never, polarity: BoundPolarity::Positive };
783}
784
785#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for GenericBound<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for GenericBound<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<PolyTraitRef<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _:
::core::clone::AssertParamIsClone<&'hir [PreciseCapturingArg<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for GenericBound<'hir>
{
}Copy, #[automatically_derived]impl<'hir> ::core::fmt::Debug for GenericBound<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Trait(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Trait",
&__self_0),
Self::Outlives(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Outlives", &__self_0),
Self::Use(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Use",
__self_0, &__self_1),
}
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
GenericBound<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
GenericBound::Trait(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
GenericBound::Outlives(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
GenericBound::Use(ref __binding_0, ref __binding_1) =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
GenericBound::Trait(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericBound::Outlives(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericBound::Use(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
786pub enum GenericBound<'hir> {
787 Trait(PolyTraitRef<'hir>),
788 Outlives(&'hir Lifetime),
789 Use(&'hir [PreciseCapturingArg<'hir>], Span),
790}
791
792impl GenericBound<'_> {
793 pub fn trait_ref(&self) -> Option<&TraitRef<'_>> {
794 match self {
795 GenericBound::Trait(data) => Some(&data.trait_ref),
796 _ => None,
797 }
798 }
799
800 pub fn span(&self) -> Span {
801 match self {
802 GenericBound::Trait(t, ..) => t.span,
803 GenericBound::Outlives(l) => l.ident.span,
804 GenericBound::Use(_, span) => *span,
805 }
806 }
807}
808
809pub type GenericBounds<'hir> = &'hir [GenericBound<'hir>];
810
811#[derive(#[automatically_derived]impl ::core::marker::Copy for MissingLifetimeKind { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for MissingLifetimeKind {
}
#[automatically_derived]impl ::core::clone::Clone for MissingLifetimeKind {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
MissingLifetimeKind {
}
#[automatically_derived]impl ::core::cmp::PartialEq for MissingLifetimeKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for MissingLifetimeKind { }Eq, #[automatically_derived]impl ::core::cmp::PartialOrd for MissingLifetimeKind {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]impl ::core::cmp::Ord for MissingLifetimeKind {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}Ord, #[automatically_derived]impl ::core::hash::Hash for MissingLifetimeKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
MissingLifetimeKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
MissingLifetimeKind::Underscore =>
0u8.stable_hash(__hcx, __hasher),
MissingLifetimeKind::Ampersand =>
1u8.stable_hash(__hcx, __hasher),
MissingLifetimeKind::Comma =>
2u8.stable_hash(__hcx, __hasher),
MissingLifetimeKind::Brackets =>
3u8.stable_hash(__hcx, __hasher),
}
match *self {
MissingLifetimeKind::Underscore => {}
MissingLifetimeKind::Ampersand => {}
MissingLifetimeKind::Comma => {}
MissingLifetimeKind::Brackets => {}
}
}
}
};StableHash, #[automatically_derived]impl ::core::fmt::Debug for MissingLifetimeKind {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
MissingLifetimeKind::Underscore => "Underscore",
MissingLifetimeKind::Ampersand => "Ampersand",
MissingLifetimeKind::Comma => "Comma",
MissingLifetimeKind::Brackets => "Brackets",
})
}
}Debug)]
812pub enum MissingLifetimeKind {
813 Underscore,
815 Ampersand,
817 Comma,
819 Brackets,
821}
822
823#[derive(#[automatically_derived]impl ::core::marker::Copy for LifetimeParamKind { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for LifetimeParamKind {
}
#[automatically_derived]impl ::core::clone::Clone for LifetimeParamKind {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<MissingLifetimeKind>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for LifetimeParamKind {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Explicit =>
::core::fmt::Formatter::write_str(f, "Explicit"),
Self::Elided(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Elided", &__self_0),
Self::Error => ::core::fmt::Formatter::write_str(f, "Error"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
LifetimeParamKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
LifetimeParamKind::Explicit =>
0u8.stable_hash(__hcx, __hasher),
LifetimeParamKind::Elided(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
LifetimeParamKind::Error =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
LifetimeParamKind::Explicit => {}
LifetimeParamKind::Elided(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
LifetimeParamKind::Error => {}
}
}
}
};StableHash)]
824pub enum LifetimeParamKind {
825 Explicit,
828
829 Elided(MissingLifetimeKind),
832
833 Error,
835}
836
837#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
GenericParamKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Lifetime { kind: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Lifetime kind", &__self_0),
Self::Type { default: __self_0, synthetic: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Type default synthetic", __self_0, &__self_1),
Self::Const { ty: __self_0, default: __self_1, arg_pos: __self_2 }
=>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Const ty default arg_pos", __self_0, __self_1, &__self_2),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for GenericParamKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
GenericParamKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<LifetimeParamKind>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _:
::core::clone::AssertParamIsClone<Option<&'hir ConstArg<'hir>>>;
let _: ::core::clone::AssertParamIsClone<Option<u16>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
GenericParamKind<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
GenericParamKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
GenericParamKind::Lifetime { kind: ref __binding_0 } =>
0u8.stable_hash(__hcx, __hasher),
GenericParamKind::Type {
default: ref __binding_0, synthetic: ref __binding_1 } =>
1u8.stable_hash(__hcx, __hasher),
GenericParamKind::Const {
ty: ref __binding_0,
default: ref __binding_1,
arg_pos: ref __binding_2 } =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
GenericParamKind::Lifetime { kind: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericParamKind::Type {
default: ref __binding_0, synthetic: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
GenericParamKind::Const {
ty: ref __binding_0,
default: ref __binding_1,
arg_pos: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
838pub enum GenericParamKind<'hir> {
839 Lifetime {
841 kind: LifetimeParamKind,
842 },
843 Type {
844 default: Option<&'hir Ty<'hir>>,
845 synthetic: bool,
846 },
847 Const {
848 ty: &'hir Ty<'hir>,
849 default: Option<&'hir ConstArg<'hir>>,
851 arg_pos: Option<u16>,
854 },
855}
856
857#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for GenericParam<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"GenericParam hir_id def_id name span pure_wrt_drop kind colon_span source";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.hir_id, &self.def_id, &self.name, &self.span,
&self.pure_wrt_drop, &self.kind, &self.colon_span,
&&self.source];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for GenericParam<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for GenericParam<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<ParamName>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<GenericParamKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<Span>>;
let _: ::core::clone::AssertParamIsClone<GenericParamSource>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for GenericParam<'hir>
{
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
GenericParam<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
GenericParam {
hir_id: ref __binding_0,
def_id: ref __binding_1,
name: ref __binding_2,
span: ref __binding_3,
pure_wrt_drop: ref __binding_4,
kind: ref __binding_5,
colon_span: ref __binding_6,
source: ref __binding_7 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
858pub struct GenericParam<'hir> {
859 #[stable_hash(ignore)]
860 pub hir_id: HirId,
861 pub def_id: LocalDefId,
862 pub name: ParamName,
863 pub span: Span,
864 pub pure_wrt_drop: bool,
865 pub kind: GenericParamKind<'hir>,
866 pub colon_span: Option<Span>,
867 pub source: GenericParamSource,
868}
869
870impl<'hir> GenericParam<'hir> {
871 pub fn is_impl_trait(&self) -> bool {
875 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
GenericParamKind::Type { synthetic: true, .. } => true,
_ => false,
}matches!(self.kind, GenericParamKind::Type { synthetic: true, .. })
876 }
877
878 pub fn is_elided_lifetime(&self) -> bool {
882 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
GenericParamKind::Lifetime { kind: LifetimeParamKind::Elided(_) } => true,
_ => false,
}matches!(self.kind, GenericParamKind::Lifetime { kind: LifetimeParamKind::Elided(_) })
883 }
884
885 pub fn is_lifetime(&self) -> bool {
886 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
GenericParamKind::Lifetime { .. } => true,
_ => false,
}matches!(self.kind, GenericParamKind::Lifetime { .. })
887 }
888}
889
890#[derive(#[automatically_derived]impl ::core::fmt::Debug for GenericParamSource {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
GenericParamSource::Generics => "Generics",
GenericParamSource::Binder => "Binder",
})
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for GenericParamSource {
}
#[automatically_derived]impl ::core::clone::Clone for GenericParamSource {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::Copy for GenericParamSource { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
GenericParamSource {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
GenericParamSource::Generics =>
0u8.stable_hash(__hcx, __hasher),
GenericParamSource::Binder =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
GenericParamSource::Generics => {}
GenericParamSource::Binder => {}
}
}
}
};StableHash)]
897pub enum GenericParamSource {
898 Generics,
900 Binder,
902}
903
904#[derive(#[automatically_derived]impl ::core::default::Default for GenericParamCount {
#[inline]
fn default() -> Self {
GenericParamCount {
lifetimes: ::core::default::Default::default(),
types: ::core::default::Default::default(),
consts: ::core::default::Default::default(),
infer: ::core::default::Default::default(),
}
}
}Default)]
905pub struct GenericParamCount {
906 pub lifetimes: usize,
907 pub types: usize,
908 pub consts: usize,
909 pub infer: usize,
910}
911
912#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Generics<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"Generics params predicates has_where_clause_predicates where_clause_span span",
&self.params, &self.predicates, &self.has_where_clause_predicates,
&self.where_clause_span, &&self.span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Generics<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Generics<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _:
::core::clone::AssertParamIsClone<&'hir [WherePredicate<'hir>]>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Generics<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Generics<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Generics {
params: ref __binding_0,
predicates: ref __binding_1,
has_where_clause_predicates: ref __binding_2,
where_clause_span: ref __binding_3,
span: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
915pub struct Generics<'hir> {
916 pub params: &'hir [GenericParam<'hir>],
917 pub predicates: &'hir [WherePredicate<'hir>],
918 pub has_where_clause_predicates: bool,
919 pub where_clause_span: Span,
920 pub span: Span,
921}
922
923impl<'hir> Generics<'hir> {
924 pub const fn empty() -> &'hir Generics<'hir> {
925 const NOPE: Generics<'_> = Generics {
926 params: &[],
927 predicates: &[],
928 has_where_clause_predicates: false,
929 where_clause_span: DUMMY_SP,
930 span: DUMMY_SP,
931 };
932 &NOPE
933 }
934
935 pub fn get_named(&self, name: Symbol) -> Option<&GenericParam<'hir>> {
936 self.params.iter().find(|¶m| name == param.name.ident().name)
937 }
938
939 pub fn span_for_lifetime_suggestion(&self) -> Option<Span> {
941 if let Some(first) = self.params.first()
942 && self.span.contains(first.span)
943 {
944 Some(first.span.shrink_to_lo())
947 } else {
948 None
949 }
950 }
951
952 pub fn span_for_param_suggestion(&self) -> Option<Span> {
954 self.params.iter().any(|p| self.span.contains(p.span)).then(|| {
955 self.span.with_lo(self.span.hi() - BytePos(1)).shrink_to_lo()
958 })
959 }
960
961 pub fn tail_span_for_predicate_suggestion(&self) -> Span {
964 let end = self.where_clause_span.shrink_to_hi();
965 if self.has_where_clause_predicates {
966 self.predicates
967 .iter()
968 .rfind(|&p| p.kind.in_where_clause())
969 .map_or(end, |p| p.span)
970 .shrink_to_hi()
971 .to(end)
972 } else {
973 end
974 }
975 }
976
977 pub fn add_where_or_trailing_comma(&self) -> &'static str {
978 if self.has_where_clause_predicates {
979 ","
980 } else if self.where_clause_span.is_empty() {
981 " where"
982 } else {
983 ""
985 }
986 }
987
988 pub fn bounds_for_param(
989 &self,
990 param_def_id: LocalDefId,
991 ) -> impl Iterator<Item = &WhereBoundPredicate<'hir>> {
992 self.predicates.iter().filter_map(move |pred| match pred.kind {
993 WherePredicateKind::BoundPredicate(bp)
994 if bp.is_param_bound(param_def_id.to_def_id()) =>
995 {
996 Some(bp)
997 }
998 _ => None,
999 })
1000 }
1001
1002 pub fn outlives_for_param(
1003 &self,
1004 param_def_id: LocalDefId,
1005 ) -> impl Iterator<Item = &WhereRegionPredicate<'_>> {
1006 self.predicates.iter().filter_map(move |pred| match pred.kind {
1007 WherePredicateKind::RegionPredicate(rp) if rp.is_param_bound(param_def_id) => Some(rp),
1008 _ => None,
1009 })
1010 }
1011
1012 pub fn bounds_span_for_suggestions(
1023 &self,
1024 param_def_id: LocalDefId,
1025 ) -> Option<(Span, Option<Span>)> {
1026 self.bounds_for_param(param_def_id).flat_map(|bp| bp.bounds.iter().rev()).find_map(
1027 |bound| {
1028 let span_for_parentheses = if let Some(trait_ref) = bound.trait_ref()
1029 && let [.., segment] = trait_ref.path.segments
1030 && let Some(ret_ty) = segment.args().paren_sugar_output()
1031 && let ret_ty = ret_ty.peel_refs()
1032 && let TyKind::TraitObject(_, tagged_ptr) = ret_ty.kind
1033 && let TraitObjectSyntax::Dyn = tagged_ptr.tag()
1034 && ret_ty.span.can_be_used_for_suggestions()
1035 {
1036 Some(ret_ty.span)
1037 } else {
1038 None
1039 };
1040
1041 span_for_parentheses.map_or_else(
1042 || {
1043 let bs = bound.span();
1046 bs.from_expansion().not().then(|| (bs.shrink_to_hi(), None))
1051 },
1052 |span| Some((span.shrink_to_hi(), Some(span.shrink_to_lo()))),
1053 )
1054 },
1055 )
1056 }
1057
1058 pub fn span_for_predicate_removal(&self, pos: usize) -> Span {
1059 let predicate = &self.predicates[pos];
1060 let span = predicate.span;
1061
1062 if !predicate.kind.in_where_clause() {
1063 return span;
1066 }
1067
1068 if pos < self.predicates.len() - 1 {
1070 let next_pred = &self.predicates[pos + 1];
1071 if next_pred.kind.in_where_clause() {
1072 return span.until(next_pred.span);
1075 }
1076 }
1077
1078 if pos > 0 {
1079 let prev_pred = &self.predicates[pos - 1];
1080 if prev_pred.kind.in_where_clause() {
1081 return prev_pred.span.shrink_to_hi().to(span);
1084 }
1085 }
1086
1087 self.where_clause_span
1091 }
1092
1093 pub fn span_for_bound_removal(&self, predicate_pos: usize, bound_pos: usize) -> Span {
1094 let predicate = &self.predicates[predicate_pos];
1095 let bounds = predicate.kind.bounds();
1096
1097 if bounds.len() == 1 {
1098 return self.span_for_predicate_removal(predicate_pos);
1099 }
1100
1101 let bound_span = bounds[bound_pos].span();
1102 if bound_pos < bounds.len() - 1 {
1103 bound_span.to(bounds[bound_pos + 1].span().shrink_to_lo())
1109 } else {
1110 bound_span.with_lo(bounds[bound_pos - 1].span().hi())
1116 }
1117 }
1118
1119 pub fn span_for_param_removal(&self, param_index: usize) -> Span {
1142 if param_index >= self.params.len() {
1143 return self.span.shrink_to_hi();
1144 }
1145
1146 let is_param_explicit = |par: &&GenericParam<'_>| match par.kind {
1147 GenericParamKind::Type { .. }
1148 | GenericParamKind::Const { .. }
1149 | GenericParamKind::Lifetime { kind: LifetimeParamKind::Explicit } => true,
1150 _ => false,
1151 };
1152
1153 if let Some(next) = self.params[param_index + 1..].iter().find(is_param_explicit) {
1155 self.params[param_index].span.until(next.span)
1156 } else if let Some(prev) = self.params[..param_index].iter().rfind(is_param_explicit) {
1157 let mut prev_span = prev.span;
1158 if let Some(prev_bounds_span) = self.span_for_param_bounds(prev) {
1160 prev_span = prev_span.to(prev_bounds_span);
1161 }
1162
1163 prev_span.shrink_to_hi().to(
1165 if let Some(cur_bounds_span) = self.span_for_param_bounds(&self.params[param_index])
1166 {
1167 cur_bounds_span
1168 } else {
1169 self.params[param_index].span
1170 },
1171 )
1172 } else {
1173 self.span
1175 }
1176 }
1177
1178 fn span_for_param_bounds(&self, param: &GenericParam<'hir>) -> Option<Span> {
1189 self.predicates
1190 .iter()
1191 .find(|pred| {
1192 if let WherePredicateKind::BoundPredicate(WhereBoundPredicate {
1193 origin: PredicateOrigin::GenericParam,
1194 bounded_ty,
1195 ..
1196 }) = pred.kind
1197 {
1198 bounded_ty.span == param.span
1199 } else {
1200 false
1201 }
1202 })
1203 .map(|pred| pred.span)
1204 }
1205}
1206
1207#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for WherePredicate<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"WherePredicate hir_id span kind", &self.hir_id, &self.span,
&&self.kind)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for WherePredicate<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
WherePredicate<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _:
::core::clone::AssertParamIsClone<&'hir WherePredicateKind<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
WherePredicate<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
WherePredicate<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
WherePredicate {
hir_id: ref __binding_0,
span: ref __binding_1,
kind: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1209pub struct WherePredicate<'hir> {
1210 #[stable_hash(ignore)]
1211 pub hir_id: HirId,
1212 pub span: Span,
1213 pub kind: &'hir WherePredicateKind<'hir>,
1214}
1215
1216#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
WherePredicateKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::BoundPredicate(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"BoundPredicate", &__self_0),
Self::RegionPredicate(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"RegionPredicate", &__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for WherePredicateKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
WherePredicateKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<WhereBoundPredicate<'hir>>;
let _: ::core::clone::AssertParamIsClone<WhereRegionPredicate<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
WherePredicateKind<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
WherePredicateKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
WherePredicateKind::BoundPredicate(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
WherePredicateKind::RegionPredicate(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
WherePredicateKind::BoundPredicate(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
WherePredicateKind::RegionPredicate(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1218pub enum WherePredicateKind<'hir> {
1219 BoundPredicate(WhereBoundPredicate<'hir>),
1221 RegionPredicate(WhereRegionPredicate<'hir>),
1223}
1224
1225impl<'hir> WherePredicateKind<'hir> {
1226 pub fn in_where_clause(&self) -> bool {
1227 match self {
1228 WherePredicateKind::BoundPredicate(p) => p.origin == PredicateOrigin::WhereClause,
1229 WherePredicateKind::RegionPredicate(p) => p.in_where_clause,
1230 }
1231 }
1232
1233 pub fn bounds(&self) -> GenericBounds<'hir> {
1234 match self {
1235 WherePredicateKind::BoundPredicate(p) => p.bounds,
1236 WherePredicateKind::RegionPredicate(p) => p.bounds,
1237 }
1238 }
1239}
1240
1241#[derive(#[automatically_derived]impl ::core::marker::Copy for PredicateOrigin { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for PredicateOrigin {
}
#[automatically_derived]impl ::core::clone::Clone for PredicateOrigin {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::fmt::Debug for PredicateOrigin {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
PredicateOrigin::WhereClause => "WhereClause",
PredicateOrigin::GenericParam => "GenericParam",
PredicateOrigin::ImplTrait => "ImplTrait",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
PredicateOrigin {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PredicateOrigin::WhereClause =>
0u8.stable_hash(__hcx, __hasher),
PredicateOrigin::GenericParam =>
1u8.stable_hash(__hcx, __hasher),
PredicateOrigin::ImplTrait =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
PredicateOrigin::WhereClause => {}
PredicateOrigin::GenericParam => {}
PredicateOrigin::ImplTrait => {}
}
}
}
};StableHash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
PredicateOrigin {
}
#[automatically_derived]impl ::core::cmp::PartialEq for PredicateOrigin {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for PredicateOrigin { }Eq)]
1242pub enum PredicateOrigin {
1243 WhereClause,
1244 GenericParam,
1245 ImplTrait,
1246}
1247
1248#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
WhereBoundPredicate<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"WhereBoundPredicate origin bound_generic_params bounded_ty bounds",
&self.origin, &self.bound_generic_params, &self.bounded_ty,
&&self.bounds)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for WhereBoundPredicate<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
WhereBoundPredicate<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<PredicateOrigin>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
WhereBoundPredicate<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
WhereBoundPredicate<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
WhereBoundPredicate {
origin: ref __binding_0,
bound_generic_params: ref __binding_1,
bounded_ty: ref __binding_2,
bounds: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1250pub struct WhereBoundPredicate<'hir> {
1251 pub origin: PredicateOrigin,
1253 pub bound_generic_params: &'hir [GenericParam<'hir>],
1255 pub bounded_ty: &'hir Ty<'hir>,
1257 pub bounds: GenericBounds<'hir>,
1259}
1260
1261impl<'hir> WhereBoundPredicate<'hir> {
1262 pub fn is_param_bound(&self, param_def_id: DefId) -> bool {
1264 self.bounded_ty.as_generic_param().is_some_and(|(def_id, _)| def_id == param_def_id)
1265 }
1266}
1267
1268#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
WhereRegionPredicate<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"WhereRegionPredicate in_where_clause lifetime bounds",
&self.in_where_clause, &self.lifetime, &&self.bounds)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for WhereRegionPredicate<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
WhereRegionPredicate<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
WhereRegionPredicate<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
WhereRegionPredicate<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
WhereRegionPredicate {
in_where_clause: ref __binding_0,
lifetime: ref __binding_1,
bounds: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1270pub struct WhereRegionPredicate<'hir> {
1271 pub in_where_clause: bool,
1272 pub lifetime: &'hir Lifetime,
1273 pub bounds: GenericBounds<'hir>,
1274}
1275
1276impl<'hir> WhereRegionPredicate<'hir> {
1277 fn is_param_bound(&self, param_def_id: LocalDefId) -> bool {
1279 self.lifetime.kind == LifetimeKind::Param(param_def_id)
1280 }
1281}
1282
1283#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl<'tcx>
::core::clone::TrivialClone for ParentedNode<'tcx> {
}
#[automatically_derived]impl<'tcx> ::core::clone::Clone for ParentedNode<'tcx>
{
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<ItemLocalId>;
let _: ::core::clone::AssertParamIsClone<Node<'tcx>>;
*self
}
}Clone, #[automatically_derived]impl<'tcx> ::core::marker::Copy for ParentedNode<'tcx>
{
}Copy, #[automatically_derived]impl<'tcx> ::core::fmt::Debug for ParentedNode<'tcx> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ParentedNode parent node", &self.parent, &&self.node)
}
}Debug)]
1287pub struct ParentedNode<'tcx> {
1288 pub parent: ItemLocalId,
1289 pub node: Node<'tcx>,
1290}
1291
1292#[derive(#[automatically_derived]impl<'tcx> ::core::fmt::Debug for AttributeMap<'tcx> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"AttributeMap map define_opaque opt_hash", &self.map,
&self.define_opaque, &&self.opt_hash)
}
}Debug)]
1294pub struct AttributeMap<'tcx> {
1295 pub map: SortedMap<ItemLocalId, &'tcx [Attribute]>,
1296 pub define_opaque: Option<&'tcx [(Span, LocalDefId)]>,
1298 pub opt_hash: Option<Fingerprint>,
1300}
1301
1302impl<'tcx> AttributeMap<'tcx> {
1303 pub const EMPTY: &'static AttributeMap<'static> = &AttributeMap {
1304 map: SortedMap::new(),
1305 opt_hash: Some(Fingerprint::ZERO),
1306 define_opaque: None,
1307 };
1308
1309 #[inline]
1310 pub fn get(&self, id: ItemLocalId) -> &'tcx [Attribute] {
1311 self.map.get(&id).copied().unwrap_or(&[])
1312 }
1313}
1314
1315pub struct OwnerNodes<'tcx> {
1319 pub opt_hash: Option<Fingerprint>,
1322 pub nodes: IndexVec<ItemLocalId, ParentedNode<'tcx>>,
1327 pub bodies: SortedMap<ItemLocalId, &'tcx Body<'tcx>>,
1329}
1330
1331impl<'tcx> OwnerNodes<'tcx> {
1332 pub fn node(&self) -> OwnerNode<'tcx> {
1333 self.nodes[ItemLocalId::ZERO].node.as_owner().unwrap()
1335 }
1336
1337 pub fn synthetic() -> OwnerNodes<'tcx> {
1339 OwnerNodes {
1340 opt_hash: Some(Fingerprint::ZERO),
1343 nodes: IndexVec::from_elem_n(
1344 ParentedNode { parent: ItemLocalId::INVALID, node: OwnerNode::Synthetic.into() },
1345 1,
1346 ),
1347 bodies: SortedMap::new(),
1348 }
1349 }
1350}
1351
1352impl fmt::Debug for OwnerNodes<'_> {
1353 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1354 f.debug_struct("OwnerNodes")
1355 .field("node", &self.nodes[ItemLocalId::ZERO])
1357 .field(
1358 "parents",
1359 &fmt::from_fn(|f| {
1360 f.debug_list()
1361 .entries(self.nodes.iter_enumerated().map(|(id, parented_node)| {
1362 fmt::from_fn(move |f| f.write_fmt(format_args!("({1:?}, {0:?})", parented_node.parent, id))write!(f, "({id:?}, {:?})", parented_node.parent))
1363 }))
1364 .finish()
1365 }),
1366 )
1367 .field("bodies", &self.bodies)
1368 .field("opt_hash", &self.opt_hash)
1369 .finish()
1370 }
1371}
1372
1373#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for OwnerInfo<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"OwnerInfo nodes parenting attrs trait_map children delayed_lints opt_hash";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.nodes, &self.parenting, &self.attrs, &self.trait_map,
&self.children, &self.delayed_lints, &&self.opt_hash];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug)]
1375pub struct OwnerInfo<'hir> {
1376 pub nodes: OwnerNodes<'hir>,
1378 pub parenting: LocalDefIdMap<ItemLocalId>,
1380 pub attrs: AttributeMap<'hir>,
1382 pub trait_map: ItemLocalMap<&'hir [TraitCandidate<'hir>]>,
1385 pub children: UnordMap<LocalDefId, MaybeOwner<'hir>>,
1387
1388 pub delayed_lints: Steal<DelayedLints>,
1394
1395 pub opt_hash: Option<Fingerprint>,
1397}
1398
1399impl<'tcx> OwnerInfo<'tcx> {
1400 #[inline]
1401 pub fn node(&self) -> OwnerNode<'tcx> {
1402 self.nodes.node()
1403 }
1404
1405 #[inline]
1409 pub fn fingerprint(&self) -> Fingerprint {
1410 let body = self.nodes.opt_hash.expect("HIR hash requested without needs_hir_hash");
1411 let attrs = self.attrs.opt_hash.expect("HIR hash requested without needs_hir_hash");
1412 body.combine(attrs)
1413 }
1414}
1415
1416#[derive(#[automatically_derived]impl<'tcx> ::core::marker::Copy for MaybeOwner<'tcx> {
}Copy, #[automatically_derived]#[doc(hidden)]unsafe impl<'tcx>
::core::clone::TrivialClone for MaybeOwner<'tcx> {
}
#[automatically_derived]impl<'tcx> ::core::clone::Clone for MaybeOwner<'tcx> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'tcx OwnerInfo<'tcx>>;
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]impl<'tcx> ::core::fmt::Debug for MaybeOwner<'tcx> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Owner(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Owner",
&__self_0),
Self::NonOwner(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"NonOwner", &__self_0),
}
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
MaybeOwner<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
MaybeOwner::Owner(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
MaybeOwner::NonOwner(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
MaybeOwner::Owner(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
MaybeOwner::NonOwner(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1417pub enum MaybeOwner<'tcx> {
1418 Owner(&'tcx OwnerInfo<'tcx>),
1419 NonOwner(HirId),
1420}
1421
1422impl<'tcx> MaybeOwner<'tcx> {
1423 #[inline]
1424 pub fn as_owner(self) -> Option<&'tcx OwnerInfo<'tcx>> {
1425 match self {
1426 MaybeOwner::Owner(i) => Some(i),
1427 MaybeOwner::NonOwner(_) => None,
1428 }
1429 }
1430
1431 #[inline]
1432 pub fn unwrap(self) -> &'tcx OwnerInfo<'tcx> {
1433 self.as_owner().unwrap_or_else(|| { ::core::panicking::panic_fmt(format_args!("Not a HIR owner")); }panic!("Not a HIR owner"))
1434 }
1435}
1436
1437#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Closure<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"Closure def_id binder constness capture_clause bound_generic_params fn_decl body fn_decl_span fn_arg_span kind explicit_captures";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.def_id, &self.binder, &self.constness,
&self.capture_clause, &self.bound_generic_params,
&self.fn_decl, &self.body, &self.fn_decl_span,
&self.fn_arg_span, &self.kind, &&self.explicit_captures];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Closure<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Closure<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<ClosureBinder>;
let _: ::core::clone::AssertParamIsClone<Constness>;
let _: ::core::clone::AssertParamIsClone<CaptureBy>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir FnDecl<'hir>>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<Option<Span>>;
let _: ::core::clone::AssertParamIsClone<ClosureKind>;
let _: ::core::clone::AssertParamIsClone<&'hir [ExplicitCapture]>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Closure<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Closure<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Closure {
def_id: ref __binding_0,
binder: ref __binding_1,
constness: ref __binding_2,
capture_clause: ref __binding_3,
bound_generic_params: ref __binding_4,
fn_decl: ref __binding_5,
body: ref __binding_6,
fn_decl_span: ref __binding_7,
fn_arg_span: ref __binding_8,
kind: ref __binding_9,
explicit_captures: ref __binding_10 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
{ __binding_8.stable_hash(__hcx, __hasher); }
{ __binding_9.stable_hash(__hcx, __hasher); }
{ __binding_10.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1438pub struct Closure<'hir> {
1439 pub def_id: LocalDefId,
1440 pub binder: ClosureBinder,
1441 pub constness: Constness,
1442 pub capture_clause: CaptureBy,
1443 pub bound_generic_params: &'hir [GenericParam<'hir>],
1444 pub fn_decl: &'hir FnDecl<'hir>,
1445 pub body: BodyId,
1446 pub fn_decl_span: Span,
1448 pub fn_arg_span: Option<Span>,
1450 pub kind: ClosureKind,
1451 pub explicit_captures: &'hir [ExplicitCapture],
1452}
1453
1454#[derive(#[automatically_derived]impl ::core::fmt::Debug for ExplicitCapture {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ExplicitCapture var_hir_id", &&self.var_hir_id)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ExplicitCapture {
}
#[automatically_derived]impl ::core::clone::Clone for ExplicitCapture {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::Copy for ExplicitCapture { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ExplicitCapture {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ExplicitCapture { var_hir_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1457pub struct ExplicitCapture {
1458 pub var_hir_id: HirId,
1459}
1460
1461#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ClosureKind {
}
#[automatically_derived]impl ::core::clone::Clone for ClosureKind {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<CoroutineKind>;
let _: ::core::clone::AssertParamIsClone<CoroutineDesugaring>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
ClosureKind {
}
#[automatically_derived]impl ::core::cmp::PartialEq for ClosureKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Coroutine(__self_0), Self::Coroutine(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::CoroutineClosure(__self_0),
Self::CoroutineClosure(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for ClosureKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<CoroutineKind>;
let _: ::core::cmp::AssertParamIsEq<CoroutineDesugaring>;
}
}Eq, #[automatically_derived]impl ::core::fmt::Debug for ClosureKind {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Closure => ::core::fmt::Formatter::write_str(f, "Closure"),
Self::Coroutine(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Coroutine", &__self_0),
Self::CoroutineClosure(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"CoroutineClosure", &__self_0),
}
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for ClosureKind { }Copy, #[automatically_derived]impl ::core::hash::Hash for ClosureKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Coroutine(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::CoroutineClosure(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ClosureKind
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ClosureKind::Closure => 0u8.stable_hash(__hcx, __hasher),
ClosureKind::Coroutine(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
ClosureKind::CoroutineClosure(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
ClosureKind::Closure => {}
ClosureKind::Coroutine(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ClosureKind::CoroutineClosure(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ClosureKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
ClosureKind::Closure => { 0usize }
ClosureKind::Coroutine(ref __binding_0) => { 1usize }
ClosureKind::CoroutineClosure(ref __binding_0) => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
ClosureKind::Closure => {}
ClosureKind::Coroutine(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
ClosureKind::CoroutineClosure(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ClosureKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { ClosureKind::Closure }
1usize => {
ClosureKind::Coroutine(::rustc_serialize::Decodable::decode(__decoder))
}
2usize => {
ClosureKind::CoroutineClosure(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ClosureKind`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable)]
1462pub enum ClosureKind {
1463 Closure,
1465 Coroutine(CoroutineKind),
1470 CoroutineClosure(CoroutineDesugaring),
1475}
1476
1477#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Block<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"Block stmts expr hir_id rules span targeted_by_break";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.stmts, &self.expr, &self.hir_id, &self.rules, &self.span,
&&self.targeted_by_break];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Block<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Block<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [Stmt<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<BlockCheckMode>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Block<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Block<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Block {
stmts: ref __binding_0,
expr: ref __binding_1,
hir_id: ref __binding_2,
rules: ref __binding_3,
span: ref __binding_4,
targeted_by_break: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{}
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1481pub struct Block<'hir> {
1482 pub stmts: &'hir [Stmt<'hir>],
1484 pub expr: Option<&'hir Expr<'hir>>,
1487 #[stable_hash(ignore)]
1488 pub hir_id: HirId,
1489 pub rules: BlockCheckMode,
1491 pub span: Span,
1493 pub targeted_by_break: bool,
1497}
1498
1499impl<'hir> Block<'hir> {
1500 pub fn innermost_block(&self) -> &Block<'hir> {
1501 let mut block = self;
1502 while let Some(Expr { kind: ExprKind::Block(inner_block, _), .. }) = block.expr {
1503 block = inner_block;
1504 }
1505 block
1506 }
1507}
1508
1509#[derive(#[automatically_derived]impl ::core::fmt::Debug for TyFieldPath {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TyFieldPath variant field", &self.variant, &&self.field)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for TyFieldPath {
}
#[automatically_derived]impl ::core::clone::Clone for TyFieldPath {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<Ident>>;
let _: ::core::clone::AssertParamIsClone<Ident>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::Copy for TyFieldPath { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for TyFieldPath
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TyFieldPath {
variant: ref __binding_0, field: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1510pub struct TyFieldPath {
1511 pub variant: Option<Ident>,
1512 pub field: Ident,
1513}
1514
1515#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for TyPat<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"TyPat hir_id kind span", &self.hir_id, &self.kind, &&self.span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TyPat<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for TyPat<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<TyPatKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for TyPat<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TyPat<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TyPat {
hir_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1516pub struct TyPat<'hir> {
1517 #[stable_hash(ignore)]
1518 pub hir_id: HirId,
1519 pub kind: TyPatKind<'hir>,
1520 pub span: Span,
1521}
1522
1523#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Pat<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"Pat hir_id kind span default_binding_modes", &self.hir_id,
&self.kind, &self.span, &&self.default_binding_modes)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Pat<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Pat<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<PatKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Pat<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Pat<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Pat {
hir_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2,
default_binding_modes: ref __binding_3 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1524pub struct Pat<'hir> {
1525 #[stable_hash(ignore)]
1526 pub hir_id: HirId,
1527 pub kind: PatKind<'hir>,
1528 pub span: Span,
1529 pub default_binding_modes: bool,
1532}
1533
1534impl<'hir> Pat<'hir> {
1535 fn walk_short_(&self, it: &mut impl FnMut(&Pat<'hir>) -> bool) -> bool {
1536 if !it(self) {
1537 return false;
1538 }
1539
1540 use PatKind::*;
1541 match self.kind {
1542 Missing => ::core::panicking::unreachable_default_msg()unreachable!(),
1543 Wild | Never | Expr(_) | Range(..) | Binding(.., None) | Err(_) => true,
1544 Deref(s) | Ref(s, _, _) | Binding(.., Some(s)) | Guard(s, _) => s.walk_short_(it),
1545 Struct(_, fields, _) => fields.iter().all(|field| field.pat.walk_short_(it)),
1546 TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().all(|p| p.walk_short_(it)),
1547 Slice(before, slice, after) => {
1548 before.iter().chain(slice).chain(after.iter()).all(|p| p.walk_short_(it))
1549 }
1550 }
1551 }
1552
1553 pub fn walk_short(&self, mut it: impl FnMut(&Pat<'hir>) -> bool) -> bool {
1560 self.walk_short_(&mut it)
1561 }
1562
1563 fn walk_(&self, it: &mut impl FnMut(&Pat<'hir>) -> bool) {
1564 if !it(self) {
1565 return;
1566 }
1567
1568 use PatKind::*;
1569 match self.kind {
1570 Missing | Wild | Never | Expr(_) | Range(..) | Binding(.., None) | Err(_) => {}
1571 Deref(s) | Ref(s, _, _) | Binding(.., Some(s)) | Guard(s, _) => s.walk_(it),
1572 Struct(_, fields, _) => fields.iter().for_each(|field| field.pat.walk_(it)),
1573 TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().for_each(|p| p.walk_(it)),
1574 Slice(before, slice, after) => {
1575 before.iter().chain(slice).chain(after.iter()).for_each(|p| p.walk_(it))
1576 }
1577 }
1578 }
1579
1580 pub fn walk(&self, mut it: impl FnMut(&Pat<'hir>) -> bool) {
1584 self.walk_(&mut it)
1585 }
1586
1587 pub fn walk_always(&self, mut it: impl FnMut(&Pat<'_>)) {
1591 self.walk(|p| {
1592 it(p);
1593 true
1594 })
1595 }
1596
1597 pub fn is_never_pattern(&self) -> bool {
1599 let mut is_never_pattern = false;
1600 self.walk(|pat| match &pat.kind {
1601 PatKind::Never => {
1602 is_never_pattern = true;
1603 false
1604 }
1605 PatKind::Or(s) => {
1606 is_never_pattern = s.iter().all(|p| p.is_never_pattern());
1607 false
1608 }
1609 _ => true,
1610 });
1611 is_never_pattern
1612 }
1613
1614 pub fn is_guaranteed_to_constitute_read_for_never(&self) -> bool {
1623 match self.kind {
1624 PatKind::Wild => false,
1626
1627 PatKind::Guard(pat, _) => pat.is_guaranteed_to_constitute_read_for_never(),
1630
1631 PatKind::Or(subpats) => {
1640 subpats.iter().all(|pat| pat.is_guaranteed_to_constitute_read_for_never())
1641 }
1642
1643 PatKind::Never => true,
1645
1646 PatKind::Missing
1649 | PatKind::Binding(_, _, _, _)
1650 | PatKind::Struct(_, _, _)
1651 | PatKind::TupleStruct(_, _, _)
1652 | PatKind::Tuple(_, _)
1653 | PatKind::Ref(_, _, _)
1654 | PatKind::Deref(_)
1655 | PatKind::Expr(_)
1656 | PatKind::Range(_, _, _)
1657 | PatKind::Slice(_, _, _)
1658 | PatKind::Err(_) => true,
1659 }
1660 }
1661}
1662
1663#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for PatField<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"PatField hir_id ident pat is_shorthand span", &self.hir_id,
&self.ident, &self.pat, &self.is_shorthand, &&self.span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for PatField<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for PatField<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for PatField<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PatField<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PatField {
hir_id: ref __binding_0,
ident: ref __binding_1,
pat: ref __binding_2,
is_shorthand: ref __binding_3,
span: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1669pub struct PatField<'hir> {
1670 #[stable_hash(ignore)]
1671 pub hir_id: HirId,
1672 pub ident: Ident,
1674 pub pat: &'hir Pat<'hir>,
1676 pub is_shorthand: bool,
1677 pub span: Span,
1678}
1679
1680#[derive(#[automatically_derived]impl ::core::marker::Copy for RangeEnd { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for RangeEnd {
}
#[automatically_derived]impl ::core::clone::Clone for RangeEnd {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for RangeEnd
{
}
#[automatically_derived]impl ::core::cmp::PartialEq for RangeEnd {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::fmt::Debug for RangeEnd {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RangeEnd::Included => "Included",
RangeEnd::Excluded => "Excluded",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for RangeEnd {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
RangeEnd::Included => 0u8.stable_hash(__hcx, __hasher),
RangeEnd::Excluded => 1u8.stable_hash(__hcx, __hasher),
}
match *self {
RangeEnd::Included => {}
RangeEnd::Excluded => {}
}
}
}
};StableHash, #[automatically_derived]impl ::core::hash::Hash for RangeEnd {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]impl ::core::cmp::Eq for RangeEnd { }Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for RangeEnd {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
RangeEnd::Included => { 0usize }
RangeEnd::Excluded => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for RangeEnd {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { RangeEnd::Included }
1usize => { RangeEnd::Excluded }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RangeEnd`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
1681pub enum RangeEnd {
1682 Included,
1683 Excluded,
1684}
1685
1686impl fmt::Display for RangeEnd {
1687 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1688 f.write_str(match self {
1689 RangeEnd::Included => "..=",
1690 RangeEnd::Excluded => "..",
1691 })
1692 }
1693}
1694
1695#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for DotDotPos {
}
#[automatically_derived]impl ::core::clone::Clone for DotDotPos {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::Copy for DotDotPos { }Copy, #[automatically_derived]impl ::core::marker::StructuralPartialEq for DotDotPos
{
}
#[automatically_derived]impl ::core::cmp::PartialEq for DotDotPos {
#[inline]
fn eq(&self, other: &Self) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for DotDotPos {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u32>;
}
}Eq, #[automatically_derived]impl ::core::hash::Hash for DotDotPos {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for DotDotPos {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
DotDotPos(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1699pub struct DotDotPos(u32);
1700
1701impl DotDotPos {
1702 pub fn new(n: Option<usize>) -> Self {
1704 match n {
1705 Some(n) => {
1706 if !(n < u32::MAX as usize) {
::core::panicking::panic("assertion failed: n < u32::MAX as usize")
};assert!(n < u32::MAX as usize);
1707 Self(n as u32)
1708 }
1709 None => Self(u32::MAX),
1710 }
1711 }
1712
1713 pub fn as_opt_usize(&self) -> Option<usize> {
1714 if self.0 == u32::MAX { None } else { Some(self.0 as usize) }
1715 }
1716}
1717
1718impl fmt::Debug for DotDotPos {
1719 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1720 self.as_opt_usize().fmt(f)
1721 }
1722}
1723
1724#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for PatExpr<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"PatExpr hir_id span kind", &self.hir_id, &self.span, &&self.kind)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for PatExpr<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for PatExpr<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<PatExprKind<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for PatExpr<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PatExpr<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PatExpr {
hir_id: ref __binding_0,
span: ref __binding_1,
kind: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1725pub struct PatExpr<'hir> {
1726 #[stable_hash(ignore)]
1727 pub hir_id: HirId,
1728 pub span: Span,
1729 pub kind: PatExprKind<'hir>,
1730}
1731
1732#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for PatExprKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Lit { lit: __self_0, negated: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Lit lit negated", __self_0, &__self_1),
Self::Path(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Path",
&__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for PatExprKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for PatExprKind<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Lit>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<QPath<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for PatExprKind<'hir>
{
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PatExprKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PatExprKind::Lit {
lit: ref __binding_0, negated: ref __binding_1 } =>
0u8.stable_hash(__hcx, __hasher),
PatExprKind::Path(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
PatExprKind::Lit {
lit: ref __binding_0, negated: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
PatExprKind::Path(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1733pub enum PatExprKind<'hir> {
1734 Lit {
1735 lit: Lit,
1736 negated: bool,
1737 },
1738 Path(QPath<'hir>),
1740}
1741
1742#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for TyPatKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Range(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Range",
__self_0, &__self_1),
Self::NotNull => ::core::fmt::Formatter::write_str(f, "NotNull"),
Self::Or(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Or",
&__self_0),
Self::Err(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Err",
&__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TyPatKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for TyPatKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [TyPat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for TyPatKind<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TyPatKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TyPatKind::Range(ref __binding_0, ref __binding_1) =>
0u8.stable_hash(__hcx, __hasher),
TyPatKind::NotNull => 1u8.stable_hash(__hcx, __hasher),
TyPatKind::Or(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
TyPatKind::Err(ref __binding_0) =>
3u8.stable_hash(__hcx, __hasher),
}
match *self {
TyPatKind::Range(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyPatKind::NotNull => {}
TyPatKind::Or(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyPatKind::Err(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1743pub enum TyPatKind<'hir> {
1744 Range(&'hir ConstArg<'hir>, &'hir ConstArg<'hir>),
1746
1747 NotNull,
1749
1750 Or(&'hir [TyPat<'hir>]),
1752
1753 Err(ErrorGuaranteed),
1755}
1756
1757#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for PatKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Missing => ::core::fmt::Formatter::write_str(f, "Missing"),
Self::Wild => ::core::fmt::Formatter::write_str(f, "Wild"),
Self::Binding(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_struct_field4_finish(f,
"Binding", __self_0, __self_1, __self_2, &__self_3),
Self::Struct(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Struct", __self_0, __self_1, &__self_2),
Self::TupleStruct(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"TupleStruct", __self_0, __self_1, &__self_2),
Self::Or(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Or",
&__self_0),
Self::Never => ::core::fmt::Formatter::write_str(f, "Never"),
Self::Tuple(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Tuple",
__self_0, &__self_1),
Self::Deref(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Deref",
&__self_0),
Self::Ref(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Ref",
__self_0, __self_1, &__self_2),
Self::Expr(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Expr",
&__self_0),
Self::Guard(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Guard",
__self_0, &__self_1),
Self::Range(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Range",
__self_0, __self_1, &__self_2),
Self::Slice(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Slice",
__self_0, __self_1, &__self_2),
Self::Err(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Err",
&__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for PatKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for PatKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<BindingMode>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Pat<'hir>>>;
let _: ::core::clone::AssertParamIsClone<QPath<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [PatField<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Option<Span>>;
let _: ::core::clone::AssertParamIsClone<QPath<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Pat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<DotDotPos>;
let _: ::core::clone::AssertParamIsClone<&'hir [Pat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir [Pat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<Pinnedness>;
let _: ::core::clone::AssertParamIsClone<Mutability>;
let _: ::core::clone::AssertParamIsClone<&'hir PatExpr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir PatExpr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir PatExpr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<RangeEnd>;
let _: ::core::clone::AssertParamIsClone<&'hir [Pat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Pat<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Pat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for PatKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PatKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PatKind::Missing => 0u8.stable_hash(__hcx, __hasher),
PatKind::Wild => 1u8.stable_hash(__hcx, __hasher),
PatKind::Binding(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) =>
2u8.stable_hash(__hcx, __hasher),
PatKind::Struct(ref __binding_0, ref __binding_1,
ref __binding_2) => 3u8.stable_hash(__hcx, __hasher),
PatKind::TupleStruct(ref __binding_0, ref __binding_1,
ref __binding_2) => 4u8.stable_hash(__hcx, __hasher),
PatKind::Or(ref __binding_0) =>
5u8.stable_hash(__hcx, __hasher),
PatKind::Never => 6u8.stable_hash(__hcx, __hasher),
PatKind::Tuple(ref __binding_0, ref __binding_1) =>
7u8.stable_hash(__hcx, __hasher),
PatKind::Deref(ref __binding_0) =>
8u8.stable_hash(__hcx, __hasher),
PatKind::Ref(ref __binding_0, ref __binding_1,
ref __binding_2) => 9u8.stable_hash(__hcx, __hasher),
PatKind::Expr(ref __binding_0) =>
10u8.stable_hash(__hcx, __hasher),
PatKind::Guard(ref __binding_0, ref __binding_1) =>
11u8.stable_hash(__hcx, __hasher),
PatKind::Range(ref __binding_0, ref __binding_1,
ref __binding_2) => 12u8.stable_hash(__hcx, __hasher),
PatKind::Slice(ref __binding_0, ref __binding_1,
ref __binding_2) => 13u8.stable_hash(__hcx, __hasher),
PatKind::Err(ref __binding_0) =>
14u8.stable_hash(__hcx, __hasher),
}
match *self {
PatKind::Missing => {}
PatKind::Wild => {}
PatKind::Binding(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
PatKind::Struct(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::TupleStruct(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::Or(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PatKind::Never => {}
PatKind::Tuple(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
PatKind::Deref(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PatKind::Ref(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::Expr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PatKind::Guard(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
PatKind::Range(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::Slice(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::Err(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1758pub enum PatKind<'hir> {
1759 Missing,
1761
1762 Wild,
1764
1765 Binding(BindingMode, HirId, Ident, Option<&'hir Pat<'hir>>),
1776
1777 Struct(QPath<'hir>, &'hir [PatField<'hir>], Option<Span>),
1780
1781 TupleStruct(QPath<'hir>, &'hir [Pat<'hir>], DotDotPos),
1785
1786 Or(&'hir [Pat<'hir>]),
1789
1790 Never,
1792
1793 Tuple(&'hir [Pat<'hir>], DotDotPos),
1797
1798 Deref(&'hir Pat<'hir>),
1800
1801 Ref(&'hir Pat<'hir>, Pinnedness, Mutability),
1803
1804 Expr(&'hir PatExpr<'hir>),
1806
1807 Guard(&'hir Pat<'hir>, &'hir Expr<'hir>),
1809
1810 Range(Option<&'hir PatExpr<'hir>>, Option<&'hir PatExpr<'hir>>, RangeEnd),
1812
1813 Slice(&'hir [Pat<'hir>], Option<&'hir Pat<'hir>>, &'hir [Pat<'hir>]),
1823
1824 Err(ErrorGuaranteed),
1826}
1827
1828#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Stmt<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Stmt hir_id kind span", &self.hir_id, &self.kind, &&self.span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Stmt<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Stmt<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<StmtKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Stmt<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Stmt<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Stmt {
hir_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1830pub struct Stmt<'hir> {
1831 #[stable_hash(ignore)]
1832 pub hir_id: HirId,
1833 pub kind: StmtKind<'hir>,
1834 pub span: Span,
1835}
1836
1837#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for StmtKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Let(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Let",
&__self_0),
Self::Item(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Item",
&__self_0),
Self::Expr(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Expr",
&__self_0),
Self::Semi(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Semi",
&__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for StmtKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for StmtKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir LetStmt<'hir>>;
let _: ::core::clone::AssertParamIsClone<ItemId>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for StmtKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
StmtKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
StmtKind::Let(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
StmtKind::Item(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
StmtKind::Expr(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
StmtKind::Semi(ref __binding_0) =>
3u8.stable_hash(__hcx, __hasher),
}
match *self {
StmtKind::Let(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
StmtKind::Item(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
StmtKind::Expr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
StmtKind::Semi(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1839pub enum StmtKind<'hir> {
1840 Let(&'hir LetStmt<'hir>),
1842
1843 Item(ItemId),
1845
1846 Expr(&'hir Expr<'hir>),
1848
1849 Semi(&'hir Expr<'hir>),
1851}
1852
1853#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for LetStmt<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"LetStmt super_ pat ty init els hir_id span source";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.super_, &self.pat, &self.ty, &self.init, &self.els,
&self.hir_id, &self.span, &&self.source];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for LetStmt<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for LetStmt<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<Span>>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Block<'hir>>>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<LocalSource>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for LetStmt<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
LetStmt<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
LetStmt {
super_: ref __binding_0,
pat: ref __binding_1,
ty: ref __binding_2,
init: ref __binding_3,
els: ref __binding_4,
hir_id: ref __binding_5,
span: ref __binding_6,
source: ref __binding_7 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{}
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1855pub struct LetStmt<'hir> {
1856 pub super_: Option<Span>,
1858 pub pat: &'hir Pat<'hir>,
1859 pub ty: Option<&'hir Ty<'hir>>,
1861 pub init: Option<&'hir Expr<'hir>>,
1863 pub els: Option<&'hir Block<'hir>>,
1865 #[stable_hash(ignore)]
1866 pub hir_id: HirId,
1867 pub span: Span,
1868 pub source: LocalSource,
1872}
1873
1874#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Arm<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"Arm hir_id span pat guard body", &self.hir_id, &self.span,
&self.pat, &self.guard, &&self.body)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Arm<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Arm<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Arm<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Arm<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Arm {
hir_id: ref __binding_0,
span: ref __binding_1,
pat: ref __binding_2,
guard: ref __binding_3,
body: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1877pub struct Arm<'hir> {
1878 #[stable_hash(ignore)]
1879 pub hir_id: HirId,
1880 pub span: Span,
1881 pub pat: &'hir Pat<'hir>,
1883 pub guard: Option<&'hir Expr<'hir>>,
1885 pub body: &'hir Expr<'hir>,
1887}
1888
1889#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for LetExpr<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"LetExpr span pat ty init recovered", &self.span, &self.pat,
&self.ty, &self.init, &&self.recovered)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for LetExpr<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for LetExpr<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<ast::Recovered>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for LetExpr<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
LetExpr<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
LetExpr {
span: ref __binding_0,
pat: ref __binding_1,
ty: ref __binding_2,
init: ref __binding_3,
recovered: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1895pub struct LetExpr<'hir> {
1896 pub span: Span,
1897 pub pat: &'hir Pat<'hir>,
1898 pub ty: Option<&'hir Ty<'hir>>,
1899 pub init: &'hir Expr<'hir>,
1900 pub recovered: ast::Recovered,
1903}
1904
1905#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for ExprField<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"ExprField hir_id ident expr span is_shorthand", &self.hir_id,
&self.ident, &self.expr, &self.span, &&self.is_shorthand)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for ExprField<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for ExprField<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for ExprField<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ExprField<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ExprField {
hir_id: ref __binding_0,
ident: ref __binding_1,
expr: ref __binding_2,
span: ref __binding_3,
is_shorthand: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1906pub struct ExprField<'hir> {
1907 #[stable_hash(ignore)]
1908 pub hir_id: HirId,
1909 pub ident: Ident,
1910 pub expr: &'hir Expr<'hir>,
1911 pub span: Span,
1912 pub is_shorthand: bool,
1913}
1914
1915#[derive(#[automatically_derived]impl ::core::marker::Copy for BlockCheckMode { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for BlockCheckMode {
}
#[automatically_derived]impl ::core::clone::Clone for BlockCheckMode {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<UnsafeSource>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
BlockCheckMode {
}
#[automatically_derived]impl ::core::cmp::PartialEq for BlockCheckMode {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::UnsafeBlock(__self_0), Self::UnsafeBlock(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::fmt::Debug for BlockCheckMode {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::DefaultBlock =>
::core::fmt::Formatter::write_str(f, "DefaultBlock"),
Self::UnsafeBlock(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"UnsafeBlock", &__self_0),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
BlockCheckMode {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
BlockCheckMode::DefaultBlock =>
0u8.stable_hash(__hcx, __hasher),
BlockCheckMode::UnsafeBlock(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
BlockCheckMode::DefaultBlock => {}
BlockCheckMode::UnsafeBlock(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1916pub enum BlockCheckMode {
1917 DefaultBlock,
1918 UnsafeBlock(UnsafeSource),
1919}
1920
1921#[derive(#[automatically_derived]impl ::core::marker::Copy for UnsafeSource { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for UnsafeSource {
}
#[automatically_derived]impl ::core::clone::Clone for UnsafeSource {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
UnsafeSource {
}
#[automatically_derived]impl ::core::cmp::PartialEq for UnsafeSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::fmt::Debug for UnsafeSource {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
UnsafeSource::CompilerGenerated => "CompilerGenerated",
UnsafeSource::UserProvided => "UserProvided",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for UnsafeSource
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
UnsafeSource::CompilerGenerated =>
0u8.stable_hash(__hcx, __hasher),
UnsafeSource::UserProvided =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
UnsafeSource::CompilerGenerated => {}
UnsafeSource::UserProvided => {}
}
}
}
};StableHash)]
1922pub enum UnsafeSource {
1923 CompilerGenerated,
1924 UserProvided,
1925}
1926
1927#[derive(#[automatically_derived]impl ::core::marker::Copy for BodyId { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for BodyId {
}
#[automatically_derived]impl ::core::clone::Clone for BodyId {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for BodyId {
}
#[automatically_derived]impl ::core::cmp::PartialEq for BodyId {
#[inline]
fn eq(&self, other: &Self) -> bool { self.hir_id == other.hir_id }
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for BodyId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<HirId>;
}
}Eq, #[automatically_derived]impl ::core::hash::Hash for BodyId {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.hir_id, state)
}
}Hash, #[automatically_derived]impl ::core::fmt::Debug for BodyId {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "BodyId hir_id",
&&self.hir_id)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for BodyId {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
BodyId { hir_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1928pub struct BodyId {
1929 pub hir_id: HirId,
1930}
1931
1932#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Body<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Body params value", &self.params, &&self.value)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Body<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Body<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [Param<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Body<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Body<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Body { params: ref __binding_0, value: ref __binding_1 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1954pub struct Body<'hir> {
1955 pub params: &'hir [Param<'hir>],
1956 pub value: &'hir Expr<'hir>,
1957}
1958
1959impl<'hir> Body<'hir> {
1960 pub fn id(&self) -> BodyId {
1961 BodyId { hir_id: self.value.hir_id }
1962 }
1963}
1964
1965#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for CoroutineKind {
}
#[automatically_derived]impl ::core::clone::Clone for CoroutineKind {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<CoroutineDesugaring>;
let _: ::core::clone::AssertParamIsClone<CoroutineSource>;
let _: ::core::clone::AssertParamIsClone<Movability>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
CoroutineKind {
}
#[automatically_derived]impl ::core::cmp::PartialEq for CoroutineKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Desugared(__self_0, __self_1),
Self::Desugared(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::Coroutine(__self_0), Self::Coroutine(__arg1_0)) =>
__self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for CoroutineKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<CoroutineDesugaring>;
let _: ::core::cmp::AssertParamIsEq<CoroutineSource>;
let _: ::core::cmp::AssertParamIsEq<Movability>;
}
}Eq, #[automatically_derived]impl ::core::fmt::Debug for CoroutineKind {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Desugared(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Desugared", __self_0, &__self_1),
Self::Coroutine(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Coroutine", &__self_0),
}
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for CoroutineKind { }Copy, #[automatically_derived]impl ::core::hash::Hash for CoroutineKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Desugared(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
Self::Coroutine(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
}
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
CoroutineKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
CoroutineKind::Desugared(ref __binding_0, ref __binding_1)
=> 0u8.stable_hash(__hcx, __hasher),
CoroutineKind::Coroutine(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
CoroutineKind::Desugared(ref __binding_0, ref __binding_1)
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
CoroutineKind::Coroutine(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for CoroutineKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
CoroutineKind::Desugared(ref __binding_0, ref __binding_1)
=> {
0usize
}
CoroutineKind::Coroutine(ref __binding_0) => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
CoroutineKind::Desugared(ref __binding_0, ref __binding_1)
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
CoroutineKind::Coroutine(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for CoroutineKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
CoroutineKind::Desugared(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
CoroutineKind::Coroutine(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CoroutineKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
1967pub enum CoroutineKind {
1968 Desugared(CoroutineDesugaring, CoroutineSource),
1970
1971 Coroutine(Movability),
1973}
1974
1975impl CoroutineKind {
1976 pub fn movability(self) -> Movability {
1977 match self {
1978 CoroutineKind::Desugared(CoroutineDesugaring::Async, _)
1979 | CoroutineKind::Desugared(CoroutineDesugaring::AsyncGen, _) => Movability::Static,
1980 CoroutineKind::Desugared(CoroutineDesugaring::Gen, _) => Movability::Movable,
1981 CoroutineKind::Coroutine(mov) => mov,
1982 }
1983 }
1984
1985 pub fn is_fn_like(self) -> bool {
1986 #[allow(non_exhaustive_omitted_patterns)] match self {
CoroutineKind::Desugared(_, CoroutineSource::Fn) => true,
_ => false,
}matches!(self, CoroutineKind::Desugared(_, CoroutineSource::Fn))
1987 }
1988
1989 pub fn is_async_desugaring(self) -> bool {
1990 #[allow(non_exhaustive_omitted_patterns)] match self {
CoroutineKind::Desugared(CoroutineDesugaring::Async |
CoroutineDesugaring::AsyncGen, _) => true,
_ => false,
}matches!(
1991 self,
1992 CoroutineKind::Desugared(CoroutineDesugaring::Async | CoroutineDesugaring::AsyncGen, _)
1993 )
1994 }
1995
1996 pub fn to_plural_string(&self) -> String {
1997 match self {
1998 CoroutineKind::Desugared(d, CoroutineSource::Fn) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:#}fn bodies", d))
})format!("{d:#}fn bodies"),
1999 CoroutineKind::Desugared(d, CoroutineSource::Block) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:#}blocks", d))
})format!("{d:#}blocks"),
2000 CoroutineKind::Desugared(d, CoroutineSource::Closure) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:#}closure bodies", d))
})format!("{d:#}closure bodies"),
2001 CoroutineKind::Coroutine(_) => "coroutines".to_string(),
2002 }
2003 }
2004}
2005
2006impl fmt::Display for CoroutineKind {
2007 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2008 match self {
2009 CoroutineKind::Desugared(d, k) => {
2010 d.fmt(f)?;
2011 k.fmt(f)
2012 }
2013 CoroutineKind::Coroutine(_) => f.write_str("coroutine"),
2014 }
2015 }
2016}
2017
2018#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for CoroutineSource {
}
#[automatically_derived]impl ::core::clone::Clone for CoroutineSource {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
CoroutineSource {
}
#[automatically_derived]impl ::core::cmp::PartialEq for CoroutineSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for CoroutineSource { }Eq, #[automatically_derived]impl ::core::hash::Hash for CoroutineSource {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]impl ::core::fmt::Debug for CoroutineSource {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CoroutineSource::Block => "Block",
CoroutineSource::Closure => "Closure",
CoroutineSource::Fn => "Fn",
})
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for CoroutineSource { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
CoroutineSource {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
CoroutineSource::Block => 0u8.stable_hash(__hcx, __hasher),
CoroutineSource::Closure =>
1u8.stable_hash(__hcx, __hasher),
CoroutineSource::Fn => 2u8.stable_hash(__hcx, __hasher),
}
match *self {
CoroutineSource::Block => {}
CoroutineSource::Closure => {}
CoroutineSource::Fn => {}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for CoroutineSource {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
CoroutineSource::Block => { 0usize }
CoroutineSource::Closure => { 1usize }
CoroutineSource::Fn => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for CoroutineSource {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { CoroutineSource::Block }
1usize => { CoroutineSource::Closure }
2usize => { CoroutineSource::Fn }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CoroutineSource`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable)]
2024pub enum CoroutineSource {
2025 Block,
2027
2028 Closure,
2030
2031 Fn,
2033}
2034
2035impl fmt::Display for CoroutineSource {
2036 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2037 match self {
2038 CoroutineSource::Block => "block",
2039 CoroutineSource::Closure => "closure body",
2040 CoroutineSource::Fn => "fn body",
2041 }
2042 .fmt(f)
2043 }
2044}
2045
2046#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for CoroutineDesugaring {
}
#[automatically_derived]impl ::core::clone::Clone for CoroutineDesugaring {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
CoroutineDesugaring {
}
#[automatically_derived]impl ::core::cmp::PartialEq for CoroutineDesugaring {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for CoroutineDesugaring { }Eq, #[automatically_derived]impl ::core::fmt::Debug for CoroutineDesugaring {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CoroutineDesugaring::Async => "Async",
CoroutineDesugaring::Gen => "Gen",
CoroutineDesugaring::AsyncGen => "AsyncGen",
})
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for CoroutineDesugaring { }Copy, #[automatically_derived]impl ::core::hash::Hash for CoroutineDesugaring {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
CoroutineDesugaring {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
CoroutineDesugaring::Async =>
0u8.stable_hash(__hcx, __hasher),
CoroutineDesugaring::Gen =>
1u8.stable_hash(__hcx, __hasher),
CoroutineDesugaring::AsyncGen =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
CoroutineDesugaring::Async => {}
CoroutineDesugaring::Gen => {}
CoroutineDesugaring::AsyncGen => {}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for CoroutineDesugaring {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
CoroutineDesugaring::Async => { 0usize }
CoroutineDesugaring::Gen => { 1usize }
CoroutineDesugaring::AsyncGen => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for CoroutineDesugaring {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { CoroutineDesugaring::Async }
1usize => { CoroutineDesugaring::Gen }
2usize => { CoroutineDesugaring::AsyncGen }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CoroutineDesugaring`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable)]
2047pub enum CoroutineDesugaring {
2048 Async,
2050
2051 Gen,
2053
2054 AsyncGen,
2057}
2058
2059impl fmt::Display for CoroutineDesugaring {
2060 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2061 match self {
2062 CoroutineDesugaring::Async => {
2063 if f.alternate() {
2064 f.write_str("`async` ")?;
2065 } else {
2066 f.write_str("async ")?
2067 }
2068 }
2069 CoroutineDesugaring::Gen => {
2070 if f.alternate() {
2071 f.write_str("`gen` ")?;
2072 } else {
2073 f.write_str("gen ")?
2074 }
2075 }
2076 CoroutineDesugaring::AsyncGen => {
2077 if f.alternate() {
2078 f.write_str("`async gen` ")?;
2079 } else {
2080 f.write_str("async gen ")?
2081 }
2082 }
2083 }
2084
2085 Ok(())
2086 }
2087}
2088
2089#[derive(#[automatically_derived]impl ::core::marker::Copy for BodyOwnerKind { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for BodyOwnerKind {
}
#[automatically_derived]impl ::core::clone::Clone for BodyOwnerKind {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Mutability>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for BodyOwnerKind {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Fn => ::core::fmt::Formatter::write_str(f, "Fn"),
Self::Closure => ::core::fmt::Formatter::write_str(f, "Closure"),
Self::Const { inline: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Const inline", &__self_0),
Self::Static(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Static", &__self_0),
Self::GlobalAsm =>
::core::fmt::Formatter::write_str(f, "GlobalAsm"),
}
}
}Debug)]
2090pub enum BodyOwnerKind {
2091 Fn,
2093
2094 Closure,
2096
2097 Const { inline: bool },
2099
2100 Static(Mutability),
2102
2103 GlobalAsm,
2105}
2106
2107impl BodyOwnerKind {
2108 pub fn is_fn_or_closure(self) -> bool {
2109 match self {
2110 BodyOwnerKind::Fn | BodyOwnerKind::Closure => true,
2111 BodyOwnerKind::Const { .. } | BodyOwnerKind::Static(_) | BodyOwnerKind::GlobalAsm => {
2112 false
2113 }
2114 }
2115 }
2116}
2117
2118#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ConstContext {
}
#[automatically_derived]impl ::core::clone::Clone for ConstContext {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Mutability>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::Copy for ConstContext { }Copy, #[automatically_derived]impl ::core::fmt::Debug for ConstContext {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::ConstFn => ::core::fmt::Formatter::write_str(f, "ConstFn"),
Self::Static(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Static", &__self_0),
Self::Const { allow_const_fn_promotion: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Const allow_const_fn_promotion", &__self_0),
}
}
}Debug, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
ConstContext {
}
#[automatically_derived]impl ::core::cmp::PartialEq for ConstContext {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Static(__self_0), Self::Static(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Const { allow_const_fn_promotion: __self_0 },
Self::Const { allow_const_fn_promotion: __arg1_0 }) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for ConstContext {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Mutability>;
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq)]
2120pub enum ConstContext {
2121 ConstFn,
2123
2124 Static(Mutability),
2126
2127 Const {
2134 allow_const_fn_promotion: bool,
2138 },
2139}
2140
2141impl ConstContext {
2142 pub fn keyword_name(self) -> &'static str {
2146 match self {
2147 Self::Const { .. } => "const",
2148 Self::Static(Mutability::Not) => "static",
2149 Self::Static(Mutability::Mut) => "static mut",
2150 Self::ConstFn => "const fn",
2151 }
2152 }
2153}
2154
2155impl fmt::Display for ConstContext {
2158 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2159 match *self {
2160 Self::Const { .. } => f.write_fmt(format_args!("constant"))write!(f, "constant"),
2161 Self::Static(_) => f.write_fmt(format_args!("static"))write!(f, "static"),
2162 Self::ConstFn => f.write_fmt(format_args!("constant function"))write!(f, "constant function"),
2163 }
2164 }
2165}
2166
2167impl IntoDiagArg for ConstContext {
2168 fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue {
2169 DiagArgValue::Str(Cow::Borrowed(match self {
2170 ConstContext::ConstFn => "constant function",
2171 ConstContext::Static(_) => "static",
2172 ConstContext::Const { .. } => "constant",
2173 }))
2174 }
2175}
2176
2177pub type Lit = Spanned<LitKind>;
2179
2180#[derive(#[automatically_derived]impl ::core::marker::Copy for AnonConst { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for AnonConst {
}
#[automatically_derived]impl ::core::clone::Clone for AnonConst {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for AnonConst {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"AnonConst hir_id def_id body span", &self.hir_id, &self.def_id,
&self.body, &&self.span)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for AnonConst {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
AnonConst {
hir_id: ref __binding_0,
def_id: ref __binding_1,
body: ref __binding_2,
span: ref __binding_3 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2189pub struct AnonConst {
2190 #[stable_hash(ignore)]
2191 pub hir_id: HirId,
2192 pub def_id: LocalDefId,
2193 pub body: BodyId,
2194 pub span: Span,
2195}
2196
2197#[derive(#[automatically_derived]impl ::core::marker::Copy for ConstBlock { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ConstBlock {
}
#[automatically_derived]impl ::core::clone::Clone for ConstBlock {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for ConstBlock {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"ConstBlock hir_id def_id body", &self.hir_id, &self.def_id,
&&self.body)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ConstBlock {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ConstBlock {
hir_id: ref __binding_0,
def_id: ref __binding_1,
body: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2199pub struct ConstBlock {
2200 #[stable_hash(ignore)]
2201 pub hir_id: HirId,
2202 pub def_id: LocalDefId,
2203 pub body: BodyId,
2204}
2205
2206#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Expr<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Expr hir_id kind span", &self.hir_id, &self.kind, &&self.span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Expr<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Expr<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<ExprKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Expr<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Expr<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Expr {
hir_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2215pub struct Expr<'hir> {
2216 #[stable_hash(ignore)]
2217 pub hir_id: HirId,
2218 pub kind: ExprKind<'hir>,
2219 pub span: Span,
2220}
2221
2222impl Expr<'_> {
2223 pub fn precedence(&self, has_attr: &dyn Fn(HirId) -> bool) -> ExprPrecedence {
2224 let prefix_attrs_precedence = || -> ExprPrecedence {
2225 if has_attr(self.hir_id) { ExprPrecedence::Prefix } else { ExprPrecedence::Unambiguous }
2226 };
2227
2228 match &self.kind {
2229 ExprKind::Closure(closure) => match closure.fn_decl.output {
2230 FnRetTy::DefaultReturn(_) => ExprPrecedence::Jump,
2231 FnRetTy::Return(_) => prefix_attrs_precedence(),
2232 },
2233
2234 ExprKind::Break(..)
2235 | ExprKind::Ret(..)
2236 | ExprKind::Yield(..)
2237 | ExprKind::Become(..) => ExprPrecedence::Jump,
2238
2239 ExprKind::Binary(op, ..) => op.node.precedence(),
2241 ExprKind::Cast(..) => ExprPrecedence::Cast,
2242
2243 ExprKind::Assign(..) | ExprKind::AssignOp(..) => ExprPrecedence::Assign,
2244
2245 ExprKind::AddrOf(..) => ExprPrecedence::Prefix,
2247
2248 ExprKind::Let(..) | ExprKind::Unary(..) => ExprPrecedence::Prefix,
2253
2254 ExprKind::Array(_)
2256 | ExprKind::Block(..)
2257 | ExprKind::Call(..)
2258 | ExprKind::ConstBlock(_)
2259 | ExprKind::Continue(..)
2260 | ExprKind::Field(..)
2261 | ExprKind::If(..)
2262 | ExprKind::Index(..)
2263 | ExprKind::InlineAsm(..)
2264 | ExprKind::Lit(_)
2265 | ExprKind::Loop(..)
2266 | ExprKind::Match(..)
2267 | ExprKind::MethodCall(..)
2268 | ExprKind::OffsetOf(..)
2269 | ExprKind::Path(..)
2270 | ExprKind::Repeat(..)
2271 | ExprKind::Struct(..)
2272 | ExprKind::Tup(_)
2273 | ExprKind::Type(..)
2274 | ExprKind::UnsafeBinderCast(..)
2275 | ExprKind::Use(..)
2276 | ExprKind::Err(_) => prefix_attrs_precedence(),
2277
2278 ExprKind::DropTemps(expr, ..) => expr.precedence(has_attr),
2279 }
2280 }
2281
2282 pub fn is_syntactic_place_expr(&self) -> bool {
2287 self.is_place_expr(|_| true)
2288 }
2289
2290 pub fn is_place_expr(&self, mut allow_projections_from: impl FnMut(&Self) -> bool) -> bool {
2295 match self.kind {
2296 ExprKind::Path(QPath::Resolved(_, ref path)) => {
2297 #[allow(non_exhaustive_omitted_patterns)] match path.res {
Res::Local(..) | Res::Def(DefKind::Static { .. }, _) | Res::Err => true,
_ => false,
}matches!(path.res, Res::Local(..) | Res::Def(DefKind::Static { .. }, _) | Res::Err)
2298 }
2299
2300 ExprKind::Type(ref e, _) => e.is_place_expr(allow_projections_from),
2304
2305 ExprKind::UnsafeBinderCast(_, e, _) => e.is_place_expr(allow_projections_from),
2307
2308 ExprKind::Unary(UnOp::Deref, _) => true,
2309
2310 ExprKind::Field(ref base, _) | ExprKind::Index(ref base, _, _) => {
2311 allow_projections_from(base) || base.is_place_expr(allow_projections_from)
2312 }
2313
2314 ExprKind::Err(_guar)
2316 | ExprKind::Let(&LetExpr { recovered: ast::Recovered::Yes(_guar), .. }) => true,
2317
2318 ExprKind::Path(QPath::TypeRelative(..))
2321 | ExprKind::Call(..)
2322 | ExprKind::MethodCall(..)
2323 | ExprKind::Use(..)
2324 | ExprKind::Struct(..)
2325 | ExprKind::Tup(..)
2326 | ExprKind::If(..)
2327 | ExprKind::Match(..)
2328 | ExprKind::Closure { .. }
2329 | ExprKind::Block(..)
2330 | ExprKind::Repeat(..)
2331 | ExprKind::Array(..)
2332 | ExprKind::Break(..)
2333 | ExprKind::Continue(..)
2334 | ExprKind::Ret(..)
2335 | ExprKind::Become(..)
2336 | ExprKind::Let(..)
2337 | ExprKind::Loop(..)
2338 | ExprKind::Assign(..)
2339 | ExprKind::InlineAsm(..)
2340 | ExprKind::OffsetOf(..)
2341 | ExprKind::AssignOp(..)
2342 | ExprKind::Lit(_)
2343 | ExprKind::ConstBlock(..)
2344 | ExprKind::Unary(..)
2345 | ExprKind::AddrOf(..)
2346 | ExprKind::Binary(..)
2347 | ExprKind::Yield(..)
2348 | ExprKind::Cast(..)
2349 | ExprKind::DropTemps(..) => false,
2350 }
2351 }
2352
2353 pub fn is_constant_for_zero_repeat(&self) -> bool {
2356 match self.kind {
2359 ExprKind::ConstBlock(_) | ExprKind::Lit(_) => true,
2360 ExprKind::Cast(inner, _) | ExprKind::Type(inner, _) => {
2361 inner.is_constant_for_zero_repeat()
2362 }
2363
2364 ExprKind::Path(qpath) => {
2365 match qpath {
2366 QPath::Resolved(_, Path { res: Res::Def(def_kind, _), .. }) => match def_kind {
2367 DefKind::Const | DefKind::ConstParam | DefKind::AssocConst => true,
2368
2369 DefKind::Mod
2370 | DefKind::Struct
2371 | DefKind::Union
2372 | DefKind::Enum
2373 | DefKind::Variant
2374 | DefKind::Trait
2375 | DefKind::TyAlias
2376 | DefKind::ForeignTy
2377 | DefKind::TraitAlias
2378 | DefKind::AssocTy
2379 | DefKind::TyParam
2380 | DefKind::Fn
2381 | DefKind::Static { .. }
2382 | DefKind::Ctor(..)
2383 | DefKind::AssocFn
2384 | DefKind::Macro(_)
2385 | DefKind::ExternCrate
2386 | DefKind::Use
2387 | DefKind::ForeignMod
2388 | DefKind::AnonConst
2389 | DefKind::OpaqueTy
2390 | DefKind::Field
2391 | DefKind::LifetimeParam
2392 | DefKind::GlobalAsm
2393 | DefKind::Impl { .. }
2394 | DefKind::Closure
2395 | DefKind::SyntheticCoroutineBody
2396 | DefKind::TestBinderConstraints => false,
2397 },
2398
2399 QPath::Resolved(..) => false,
2401
2402 QPath::TypeRelative(..) => true,
2404 }
2405 }
2406
2407 ExprKind::Array(_)
2408 | ExprKind::Call(..)
2409 | ExprKind::MethodCall(..)
2410 | ExprKind::Use(..)
2411 | ExprKind::Tup(_)
2412 | ExprKind::Binary(..)
2413 | ExprKind::Unary(..)
2414 | ExprKind::DropTemps(_)
2415 | ExprKind::Let(_)
2416 | ExprKind::If(..)
2417 | ExprKind::Loop(..)
2418 | ExprKind::Match(..)
2419 | ExprKind::Closure(_)
2420 | ExprKind::Block(..)
2421 | ExprKind::Assign(..)
2422 | ExprKind::AssignOp(..)
2423 | ExprKind::Field(..)
2424 | ExprKind::Index(..)
2425 | ExprKind::AddrOf(..)
2426 | ExprKind::Break(..)
2427 | ExprKind::Continue(_)
2428 | ExprKind::Ret(_)
2429 | ExprKind::Become(_)
2430 | ExprKind::InlineAsm(_)
2431 | ExprKind::OffsetOf(..)
2432 | ExprKind::Struct(..)
2433 | ExprKind::Repeat(..)
2434 | ExprKind::Yield(..)
2435 | ExprKind::UnsafeBinderCast(..)
2436 | ExprKind::Err(_) => false,
2437 }
2438 }
2439
2440 pub fn range_span(&self) -> Option<Span> {
2443 is_range_literal(self).then(|| self.span.parent_callsite().unwrap())
2444 }
2445
2446 pub fn is_size_lit(&self) -> bool {
2449 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
ExprKind::Lit(Lit {
node: LitKind::Int(_,
LitIntType::Unsuffixed | LitIntType::Unsigned(UintTy::Usize)), ..
}) => true,
_ => false,
}matches!(
2450 self.kind,
2451 ExprKind::Lit(Lit {
2452 node: LitKind::Int(_, LitIntType::Unsuffixed | LitIntType::Unsigned(UintTy::Usize)),
2453 ..
2454 })
2455 )
2456 }
2457
2458 pub fn peel_drop_temps(&self) -> &Self {
2464 let mut expr = self;
2465 while let ExprKind::DropTemps(inner) = &expr.kind {
2466 expr = inner;
2467 }
2468 expr
2469 }
2470
2471 pub fn peel_blocks(&self) -> &Self {
2472 let mut expr = self;
2473 while let ExprKind::Block(Block { expr: Some(inner), .. }, _) = &expr.kind {
2474 expr = inner;
2475 }
2476 expr
2477 }
2478
2479 pub fn peel_borrows(&self) -> &Self {
2480 let mut expr = self;
2481 while let ExprKind::AddrOf(.., inner) = &expr.kind {
2482 expr = inner;
2483 }
2484 expr
2485 }
2486
2487 pub fn can_have_side_effects(&self) -> bool {
2488 match self.peel_drop_temps().kind {
2489 ExprKind::Path(_) | ExprKind::Lit(_) | ExprKind::OffsetOf(..) | ExprKind::Use(..) => {
2490 false
2491 }
2492 ExprKind::Type(base, _)
2493 | ExprKind::Unary(_, base)
2494 | ExprKind::Field(base, _)
2495 | ExprKind::Index(base, _, _)
2496 | ExprKind::AddrOf(.., base)
2497 | ExprKind::Cast(base, _)
2498 | ExprKind::UnsafeBinderCast(_, base, _) => {
2499 base.can_have_side_effects()
2503 }
2504 ExprKind::Binary(_, lhs, rhs) => {
2505 lhs.can_have_side_effects() || rhs.can_have_side_effects()
2509 }
2510 ExprKind::Struct(_, fields, init) => {
2511 let init_side_effects = match init {
2512 StructTailExpr::Base(init) => init.can_have_side_effects(),
2513 StructTailExpr::DefaultFields(_)
2514 | StructTailExpr::None
2515 | StructTailExpr::NoneWithError(_) => false,
2516 };
2517 fields.iter().map(|field| field.expr).any(|e| e.can_have_side_effects())
2518 || init_side_effects
2519 }
2520
2521 ExprKind::Array(args)
2522 | ExprKind::Tup(args)
2523 | ExprKind::Call(
2524 Expr {
2525 kind:
2526 ExprKind::Path(QPath::Resolved(
2527 None,
2528 Path { res: Res::Def(DefKind::Ctor(_, CtorKind::Fn), _), .. },
2529 )),
2530 ..
2531 },
2532 args,
2533 ) => args.iter().any(|arg| arg.can_have_side_effects()),
2534 ExprKind::Repeat(arg, _) => arg.can_have_side_effects(),
2535 ExprKind::If(..)
2536 | ExprKind::Match(..)
2537 | ExprKind::MethodCall(..)
2538 | ExprKind::Call(..)
2539 | ExprKind::Closure { .. }
2540 | ExprKind::Block(..)
2541 | ExprKind::Break(..)
2542 | ExprKind::Continue(..)
2543 | ExprKind::Ret(..)
2544 | ExprKind::Become(..)
2545 | ExprKind::Let(..)
2546 | ExprKind::Loop(..)
2547 | ExprKind::Assign(..)
2548 | ExprKind::InlineAsm(..)
2549 | ExprKind::AssignOp(..)
2550 | ExprKind::ConstBlock(..)
2551 | ExprKind::Yield(..)
2552 | ExprKind::DropTemps(..)
2553 | ExprKind::Err(_) => true,
2554 }
2555 }
2556
2557 pub fn is_approximately_pattern(&self) -> bool {
2559 match &self.kind {
2560 ExprKind::Array(_)
2561 | ExprKind::Call(..)
2562 | ExprKind::Tup(_)
2563 | ExprKind::Lit(_)
2564 | ExprKind::Path(_)
2565 | ExprKind::Struct(..) => true,
2566 _ => false,
2567 }
2568 }
2569
2570 pub fn equivalent_for_indexing(&self, other: &Expr<'_>) -> bool {
2575 match (self.kind, other.kind) {
2576 (ExprKind::Lit(lit1), ExprKind::Lit(lit2)) => lit1.node == lit2.node,
2577 (
2578 ExprKind::Path(QPath::Resolved(None, path1)),
2579 ExprKind::Path(QPath::Resolved(None, path2)),
2580 ) => path1.res == path2.res,
2581 (
2582 ExprKind::Struct(
2583 &QPath::Resolved(None, &Path { res: Res::Def(_, path1_def_id), .. }),
2584 args1,
2585 StructTailExpr::None,
2586 ),
2587 ExprKind::Struct(
2588 &QPath::Resolved(None, &Path { res: Res::Def(_, path2_def_id), .. }),
2589 args2,
2590 StructTailExpr::None,
2591 ),
2592 ) => {
2593 path2_def_id == path1_def_id
2594 && is_range_literal(self)
2595 && is_range_literal(other)
2596 && std::iter::zip(args1, args2)
2597 .all(|(a, b)| a.expr.equivalent_for_indexing(b.expr))
2598 }
2599 _ => false,
2600 }
2601 }
2602
2603 pub fn method_ident(&self) -> Option<Ident> {
2604 match self.kind {
2605 ExprKind::MethodCall(receiver_method, ..) => Some(receiver_method.ident),
2606 ExprKind::Unary(_, expr) | ExprKind::AddrOf(.., expr) => expr.method_ident(),
2607 _ => None,
2608 }
2609 }
2610}
2611
2612pub fn is_range_literal(expr: &Expr<'_>) -> bool {
2615 if let ExprKind::Struct(QPath::Resolved(None, path), _, StructTailExpr::None) = expr.kind
2616 && let [.., segment] = path.segments
2617 && let sym::RangeFrom
2618 | sym::RangeFull
2619 | sym::Range
2620 | sym::RangeToInclusive
2621 | sym::RangeTo
2622 | sym::RangeFromCopy
2623 | sym::RangeCopy
2624 | sym::RangeInclusiveCopy
2625 | sym::RangeToInclusiveCopy = segment.ident.name
2626 && expr.span.is_desugaring(DesugaringKind::RangeExpr)
2627 {
2628 true
2629 } else if let ExprKind::Call(func, _) = &expr.kind
2630 && let ExprKind::Path(QPath::Resolved(None, path)) = func.kind
2631 && let [.., segment] = path.segments
2632 && let sym::range_inclusive_new = segment.ident.name
2633 && expr.span.is_desugaring(DesugaringKind::RangeExpr)
2634 {
2635 true
2636 } else {
2637 false
2638 }
2639}
2640
2641pub fn expr_needs_parens(expr: &Expr<'_>) -> bool {
2648 match expr.kind {
2649 ExprKind::Cast(_, _) | ExprKind::Binary(_, _, _) => true,
2651 _ if is_range_literal(expr) => true,
2653 _ => false,
2654 }
2655}
2656
2657#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for ExprKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::ConstBlock(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ConstBlock", &__self_0),
Self::Array(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Array",
&__self_0),
Self::Call(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Call",
__self_0, &__self_1),
Self::MethodCall(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_struct_field4_finish(f,
"MethodCall", __self_0, __self_1, __self_2, &__self_3),
Self::Use(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Use",
__self_0, &__self_1),
Self::Tup(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Tup",
&__self_0),
Self::Binary(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Binary", __self_0, __self_1, &__self_2),
Self::Unary(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Unary",
__self_0, &__self_1),
Self::Lit(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Lit",
&__self_0),
Self::Cast(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Cast",
__self_0, &__self_1),
Self::Type(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Type",
__self_0, &__self_1),
Self::DropTemps(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"DropTemps", &__self_0),
Self::Let(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Let",
&__self_0),
Self::If(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "If",
__self_0, __self_1, &__self_2),
Self::Loop(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_struct_field4_finish(f, "Loop",
__self_0, __self_1, __self_2, &__self_3),
Self::Match(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Match",
__self_0, __self_1, &__self_2),
Self::Closure(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Closure", &__self_0),
Self::Block(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Block",
__self_0, &__self_1),
Self::Assign(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Assign", __self_0, __self_1, &__self_2),
Self::AssignOp(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"AssignOp", __self_0, __self_1, &__self_2),
Self::Field(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Field",
__self_0, &__self_1),
Self::Index(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Index",
__self_0, __self_1, &__self_2),
Self::Path(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Path",
&__self_0),
Self::AddrOf(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"AddrOf", __self_0, __self_1, &__self_2),
Self::Break(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Break",
__self_0, &__self_1),
Self::Continue(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Continue", &__self_0),
Self::Ret(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Ret",
&__self_0),
Self::Become(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Become", &__self_0),
Self::InlineAsm(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"InlineAsm", &__self_0),
Self::OffsetOf(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"OffsetOf", __self_0, &__self_1),
Self::Struct(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Struct", __self_0, __self_1, &__self_2),
Self::Repeat(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Repeat", __self_0, &__self_1),
Self::Yield(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Yield",
__self_0, &__self_1),
Self::UnsafeBinderCast(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"UnsafeBinderCast", __self_0, __self_1, &__self_2),
Self::Err(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Err",
&__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for ExprKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for ExprKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<ConstBlock>;
let _: ::core::clone::AssertParamIsClone<&'hir [Expr<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Expr<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir PathSegment<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Expr<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Expr<'hir>]>;
let _: ::core::clone::AssertParamIsClone<BinOp>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<UnOp>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Lit>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir LetExpr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Block<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<Label>>;
let _: ::core::clone::AssertParamIsClone<LoopSource>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Arm<'hir>]>;
let _: ::core::clone::AssertParamIsClone<MatchSource>;
let _: ::core::clone::AssertParamIsClone<&'hir Closure<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Block<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<Label>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<AssignOp>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<QPath<'hir>>;
let _: ::core::clone::AssertParamIsClone<BorrowKind>;
let _: ::core::clone::AssertParamIsClone<Mutability>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Destination>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir InlineAsm<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Ident]>;
let _: ::core::clone::AssertParamIsClone<&'hir QPath<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [ExprField<'hir>]>;
let _: ::core::clone::AssertParamIsClone<StructTailExpr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<YieldSource>;
let _: ::core::clone::AssertParamIsClone<UnsafeBinderCastKind>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
let _: ::core::clone::AssertParamIsClone<rustc_span::ErrorGuaranteed>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for ExprKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ExprKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ExprKind::ConstBlock(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
ExprKind::Array(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
ExprKind::Call(ref __binding_0, ref __binding_1) =>
2u8.stable_hash(__hcx, __hasher),
ExprKind::MethodCall(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) =>
3u8.stable_hash(__hcx, __hasher),
ExprKind::Use(ref __binding_0, ref __binding_1) =>
4u8.stable_hash(__hcx, __hasher),
ExprKind::Tup(ref __binding_0) =>
5u8.stable_hash(__hcx, __hasher),
ExprKind::Binary(ref __binding_0, ref __binding_1,
ref __binding_2) => 6u8.stable_hash(__hcx, __hasher),
ExprKind::Unary(ref __binding_0, ref __binding_1) =>
7u8.stable_hash(__hcx, __hasher),
ExprKind::Lit(ref __binding_0) =>
8u8.stable_hash(__hcx, __hasher),
ExprKind::Cast(ref __binding_0, ref __binding_1) =>
9u8.stable_hash(__hcx, __hasher),
ExprKind::Type(ref __binding_0, ref __binding_1) =>
10u8.stable_hash(__hcx, __hasher),
ExprKind::DropTemps(ref __binding_0) =>
11u8.stable_hash(__hcx, __hasher),
ExprKind::Let(ref __binding_0) =>
12u8.stable_hash(__hcx, __hasher),
ExprKind::If(ref __binding_0, ref __binding_1,
ref __binding_2) => 13u8.stable_hash(__hcx, __hasher),
ExprKind::Loop(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) =>
14u8.stable_hash(__hcx, __hasher),
ExprKind::Match(ref __binding_0, ref __binding_1,
ref __binding_2) => 15u8.stable_hash(__hcx, __hasher),
ExprKind::Closure(ref __binding_0) =>
16u8.stable_hash(__hcx, __hasher),
ExprKind::Block(ref __binding_0, ref __binding_1) =>
17u8.stable_hash(__hcx, __hasher),
ExprKind::Assign(ref __binding_0, ref __binding_1,
ref __binding_2) => 18u8.stable_hash(__hcx, __hasher),
ExprKind::AssignOp(ref __binding_0, ref __binding_1,
ref __binding_2) => 19u8.stable_hash(__hcx, __hasher),
ExprKind::Field(ref __binding_0, ref __binding_1) =>
20u8.stable_hash(__hcx, __hasher),
ExprKind::Index(ref __binding_0, ref __binding_1,
ref __binding_2) => 21u8.stable_hash(__hcx, __hasher),
ExprKind::Path(ref __binding_0) =>
22u8.stable_hash(__hcx, __hasher),
ExprKind::AddrOf(ref __binding_0, ref __binding_1,
ref __binding_2) => 23u8.stable_hash(__hcx, __hasher),
ExprKind::Break(ref __binding_0, ref __binding_1) =>
24u8.stable_hash(__hcx, __hasher),
ExprKind::Continue(ref __binding_0) =>
25u8.stable_hash(__hcx, __hasher),
ExprKind::Ret(ref __binding_0) =>
26u8.stable_hash(__hcx, __hasher),
ExprKind::Become(ref __binding_0) =>
27u8.stable_hash(__hcx, __hasher),
ExprKind::InlineAsm(ref __binding_0) =>
28u8.stable_hash(__hcx, __hasher),
ExprKind::OffsetOf(ref __binding_0, ref __binding_1) =>
29u8.stable_hash(__hcx, __hasher),
ExprKind::Struct(ref __binding_0, ref __binding_1,
ref __binding_2) => 30u8.stable_hash(__hcx, __hasher),
ExprKind::Repeat(ref __binding_0, ref __binding_1) =>
31u8.stable_hash(__hcx, __hasher),
ExprKind::Yield(ref __binding_0, ref __binding_1) =>
32u8.stable_hash(__hcx, __hasher),
ExprKind::UnsafeBinderCast(ref __binding_0, ref __binding_1,
ref __binding_2) => 33u8.stable_hash(__hcx, __hasher),
ExprKind::Err(ref __binding_0) =>
34u8.stable_hash(__hcx, __hasher),
}
match *self {
ExprKind::ConstBlock(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Array(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Call(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::MethodCall(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
ExprKind::Use(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Tup(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Binary(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Unary(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Lit(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Cast(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Type(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::DropTemps(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Let(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::If(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Loop(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
ExprKind::Match(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Closure(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Block(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Assign(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::AssignOp(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Field(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Index(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Path(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::AddrOf(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Break(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Continue(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Ret(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Become(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::InlineAsm(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::OffsetOf(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Struct(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Repeat(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Yield(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::UnsafeBinderCast(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Err(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2658pub enum ExprKind<'hir> {
2659 ConstBlock(ConstBlock),
2661 Array(&'hir [Expr<'hir>]),
2663 Call(&'hir Expr<'hir>, &'hir [Expr<'hir>]),
2670 MethodCall(&'hir PathSegment<'hir>, &'hir Expr<'hir>, &'hir [Expr<'hir>], Span),
2687 Use(&'hir Expr<'hir>, Span),
2689 Tup(&'hir [Expr<'hir>]),
2691 Binary(BinOp, &'hir Expr<'hir>, &'hir Expr<'hir>),
2693 Unary(UnOp, &'hir Expr<'hir>),
2695 Lit(Lit),
2697 Cast(&'hir Expr<'hir>, &'hir Ty<'hir>),
2699 Type(&'hir Expr<'hir>, &'hir Ty<'hir>),
2701 DropTemps(&'hir Expr<'hir>),
2707 Let(&'hir LetExpr<'hir>),
2712 If(&'hir Expr<'hir>, &'hir Expr<'hir>, Option<&'hir Expr<'hir>>),
2721 Loop(&'hir Block<'hir>, Option<Label>, LoopSource, Span),
2727 Match(&'hir Expr<'hir>, &'hir [Arm<'hir>], MatchSource),
2730 Closure(&'hir Closure<'hir>),
2737 Block(&'hir Block<'hir>, Option<Label>),
2739
2740 Assign(&'hir Expr<'hir>, &'hir Expr<'hir>, Span),
2742 AssignOp(AssignOp, &'hir Expr<'hir>, &'hir Expr<'hir>),
2746 Field(&'hir Expr<'hir>, Ident),
2748 Index(&'hir Expr<'hir>, &'hir Expr<'hir>, Span),
2752
2753 Path(QPath<'hir>),
2755
2756 AddrOf(BorrowKind, Mutability, &'hir Expr<'hir>),
2758 Break(Destination, Option<&'hir Expr<'hir>>),
2760 Continue(Destination),
2762 Ret(Option<&'hir Expr<'hir>>),
2764 Become(&'hir Expr<'hir>),
2766
2767 InlineAsm(&'hir InlineAsm<'hir>),
2769
2770 OffsetOf(&'hir Ty<'hir>, &'hir [Ident]),
2772
2773 Struct(&'hir QPath<'hir>, &'hir [ExprField<'hir>], StructTailExpr<'hir>),
2778
2779 Repeat(&'hir Expr<'hir>, &'hir ConstArg<'hir>),
2784
2785 Yield(&'hir Expr<'hir>, YieldSource),
2787
2788 UnsafeBinderCast(UnsafeBinderCastKind, &'hir Expr<'hir>, Option<&'hir Ty<'hir>>),
2791
2792 Err(rustc_span::ErrorGuaranteed),
2794}
2795
2796#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for StructTailExpr<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::None => ::core::fmt::Formatter::write_str(f, "None"),
Self::Base(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Base",
&__self_0),
Self::DefaultFields(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"DefaultFields", &__self_0),
Self::NoneWithError(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"NoneWithError", &__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for StructTailExpr<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
StructTailExpr<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
StructTailExpr<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
StructTailExpr<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
StructTailExpr::None => 0u8.stable_hash(__hcx, __hasher),
StructTailExpr::Base(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
StructTailExpr::DefaultFields(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
StructTailExpr::NoneWithError(ref __binding_0) =>
3u8.stable_hash(__hcx, __hasher),
}
match *self {
StructTailExpr::None => {}
StructTailExpr::Base(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
StructTailExpr::DefaultFields(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
StructTailExpr::NoneWithError(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2797pub enum StructTailExpr<'hir> {
2798 None,
2800 Base(&'hir Expr<'hir>),
2803 DefaultFields(Span),
2807 NoneWithError(ErrorGuaranteed),
2813}
2814
2815#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for QPath<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Resolved(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Resolved", __self_0, &__self_1),
Self::TypeRelative(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TypeRelative", __self_0, &__self_1),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for QPath<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for QPath<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Path<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir PathSegment<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for QPath<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
QPath<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
QPath::Resolved(ref __binding_0, ref __binding_1) =>
0u8.stable_hash(__hcx, __hasher),
QPath::TypeRelative(ref __binding_0, ref __binding_1) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
QPath::Resolved(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
QPath::TypeRelative(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2821pub enum QPath<'hir> {
2822 Resolved(Option<&'hir Ty<'hir>>, &'hir Path<'hir>),
2829
2830 TypeRelative(&'hir Ty<'hir>, &'hir PathSegment<'hir>),
2837}
2838
2839impl<'hir> QPath<'hir> {
2840 pub fn span(&self) -> Span {
2842 match *self {
2843 QPath::Resolved(_, path) => path.span,
2844 QPath::TypeRelative(qself, ps) => qself.span.to(ps.ident.span),
2845 }
2846 }
2847
2848 pub fn qself_span(&self) -> Span {
2851 match *self {
2852 QPath::Resolved(_, path) => path.span,
2853 QPath::TypeRelative(qself, _) => qself.span,
2854 }
2855 }
2856}
2857
2858#[derive(#[automatically_derived]impl ::core::marker::Copy for LocalSource { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for LocalSource {
}
#[automatically_derived]impl ::core::clone::Clone for LocalSource {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::fmt::Debug for LocalSource {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_c_like_enum_write_str(f,
"Normal AsyncFn AwaitDesugar AssignDesugar Contract",
match self {
LocalSource::Normal => 0usize,
LocalSource::AsyncFn => 7usize,
LocalSource::AwaitDesugar => 15usize,
LocalSource::AssignDesugar => 28usize,
LocalSource::Contract => 42usize,
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for LocalSource
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
LocalSource::Normal => 0u8.stable_hash(__hcx, __hasher),
LocalSource::AsyncFn => 1u8.stable_hash(__hcx, __hasher),
LocalSource::AwaitDesugar =>
2u8.stable_hash(__hcx, __hasher),
LocalSource::AssignDesugar =>
3u8.stable_hash(__hcx, __hasher),
LocalSource::Contract => 4u8.stable_hash(__hcx, __hasher),
}
match *self {
LocalSource::Normal => {}
LocalSource::AsyncFn => {}
LocalSource::AwaitDesugar => {}
LocalSource::AssignDesugar => {}
LocalSource::Contract => {}
}
}
}
};StableHash)]
2860pub enum LocalSource {
2861 Normal,
2863 AsyncFn,
2874 AwaitDesugar,
2876 AssignDesugar,
2878 Contract,
2880}
2881
2882#[derive(#[automatically_derived]impl ::core::marker::Copy for MatchSource { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for MatchSource {
}
#[automatically_derived]impl ::core::clone::Clone for MatchSource {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
MatchSource {
}
#[automatically_derived]impl ::core::cmp::PartialEq for MatchSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::TryDesugar(__self_0), Self::TryDesugar(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for MatchSource {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<HirId>;
}
}Eq, #[automatically_derived]impl ::core::hash::Hash for MatchSource {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::TryDesugar(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]impl ::core::fmt::Debug for MatchSource {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Normal => ::core::fmt::Formatter::write_str(f, "Normal"),
Self::Postfix => ::core::fmt::Formatter::write_str(f, "Postfix"),
Self::ForLoopDesugar =>
::core::fmt::Formatter::write_str(f, "ForLoopDesugar"),
Self::TryDesugar(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TryDesugar", &__self_0),
Self::AwaitDesugar =>
::core::fmt::Formatter::write_str(f, "AwaitDesugar"),
Self::FormatArgs =>
::core::fmt::Formatter::write_str(f, "FormatArgs"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for MatchSource
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
MatchSource::Normal => 0u8.stable_hash(__hcx, __hasher),
MatchSource::Postfix => 1u8.stable_hash(__hcx, __hasher),
MatchSource::ForLoopDesugar =>
2u8.stable_hash(__hcx, __hasher),
MatchSource::TryDesugar(ref __binding_0) =>
3u8.stable_hash(__hcx, __hasher),
MatchSource::AwaitDesugar =>
4u8.stable_hash(__hcx, __hasher),
MatchSource::FormatArgs => 5u8.stable_hash(__hcx, __hasher),
}
match *self {
MatchSource::Normal => {}
MatchSource::Postfix => {}
MatchSource::ForLoopDesugar => {}
MatchSource::TryDesugar(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
MatchSource::AwaitDesugar => {}
MatchSource::FormatArgs => {}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for MatchSource {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
MatchSource::Normal => { 0usize }
MatchSource::Postfix => { 1usize }
MatchSource::ForLoopDesugar => { 2usize }
MatchSource::TryDesugar(ref __binding_0) => { 3usize }
MatchSource::AwaitDesugar => { 4usize }
MatchSource::FormatArgs => { 5usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
MatchSource::Normal => {}
MatchSource::Postfix => {}
MatchSource::ForLoopDesugar => {}
MatchSource::TryDesugar(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
MatchSource::AwaitDesugar => {}
MatchSource::FormatArgs => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for MatchSource {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { MatchSource::Normal }
1usize => { MatchSource::Postfix }
2usize => { MatchSource::ForLoopDesugar }
3usize => {
MatchSource::TryDesugar(::rustc_serialize::Decodable::decode(__decoder))
}
4usize => { MatchSource::AwaitDesugar }
5usize => { MatchSource::FormatArgs }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MatchSource`, expected 0..6, actual {0}",
n));
}
}
}
}
};Decodable)]
2884pub enum MatchSource {
2885 Normal,
2887 Postfix,
2889 ForLoopDesugar,
2891 TryDesugar(HirId),
2893 AwaitDesugar,
2895 FormatArgs,
2897}
2898
2899impl MatchSource {
2900 #[inline]
2901 pub const fn name(self) -> &'static str {
2902 use MatchSource::*;
2903 match self {
2904 Normal => "match",
2905 Postfix => ".match",
2906 ForLoopDesugar => "for",
2907 TryDesugar(_) => "?",
2908 AwaitDesugar => ".await",
2909 FormatArgs => "format_args!()",
2910 }
2911 }
2912}
2913
2914#[derive(#[automatically_derived]impl ::core::marker::Copy for LoopSource { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for LoopSource {
}
#[automatically_derived]impl ::core::clone::Clone for LoopSource {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
LoopSource {
}
#[automatically_derived]impl ::core::cmp::PartialEq for LoopSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::fmt::Debug for LoopSource {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LoopSource::Loop => "Loop",
LoopSource::While => "While",
LoopSource::ForLoop => "ForLoop",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for LoopSource {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
LoopSource::Loop => 0u8.stable_hash(__hcx, __hasher),
LoopSource::While => 1u8.stable_hash(__hcx, __hasher),
LoopSource::ForLoop => 2u8.stable_hash(__hcx, __hasher),
}
match *self {
LoopSource::Loop => {}
LoopSource::While => {}
LoopSource::ForLoop => {}
}
}
}
};StableHash)]
2916pub enum LoopSource {
2917 Loop,
2919 While,
2921 ForLoop,
2923}
2924
2925impl LoopSource {
2926 pub fn name(self) -> &'static str {
2927 match self {
2928 LoopSource::Loop => "loop",
2929 LoopSource::While => "while",
2930 LoopSource::ForLoop => "for",
2931 }
2932 }
2933}
2934
2935#[derive(#[automatically_derived]impl ::core::marker::Copy for LoopIdError { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for LoopIdError {
}
#[automatically_derived]impl ::core::clone::Clone for LoopIdError {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::fmt::Debug for LoopIdError {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LoopIdError::OutsideLoopScope => "OutsideLoopScope",
LoopIdError::UnlabeledCfInWhileCondition =>
"UnlabeledCfInWhileCondition",
LoopIdError::UnresolvedLabel => "UnresolvedLabel",
})
}
}Debug, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
LoopIdError {
}
#[automatically_derived]impl ::core::cmp::PartialEq for LoopIdError {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for LoopIdError
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
LoopIdError::OutsideLoopScope =>
0u8.stable_hash(__hcx, __hasher),
LoopIdError::UnlabeledCfInWhileCondition =>
1u8.stable_hash(__hcx, __hasher),
LoopIdError::UnresolvedLabel =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
LoopIdError::OutsideLoopScope => {}
LoopIdError::UnlabeledCfInWhileCondition => {}
LoopIdError::UnresolvedLabel => {}
}
}
}
};StableHash)]
2936pub enum LoopIdError {
2937 OutsideLoopScope,
2938 UnlabeledCfInWhileCondition,
2939 UnresolvedLabel,
2940}
2941
2942impl fmt::Display for LoopIdError {
2943 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2944 f.write_str(match self {
2945 LoopIdError::OutsideLoopScope => "not inside loop scope",
2946 LoopIdError::UnlabeledCfInWhileCondition => {
2947 "unlabeled control flow (break or continue) in while condition"
2948 }
2949 LoopIdError::UnresolvedLabel => "label not found",
2950 })
2951 }
2952}
2953
2954#[derive(#[automatically_derived]impl ::core::marker::Copy for Destination { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for Destination {
}
#[automatically_derived]impl ::core::clone::Clone for Destination {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<Label>>;
let _: ::core::clone::AssertParamIsClone<Result<HirId, LoopIdError>>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for Destination {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Destination label target_id", &self.label, &&self.target_id)
}
}Debug, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
Destination {
}
#[automatically_derived]impl ::core::cmp::PartialEq for Destination {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.label == other.label && self.target_id == other.target_id
}
}PartialEq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Destination
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Destination {
label: ref __binding_0, target_id: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2955pub struct Destination {
2956 pub label: Option<Label>,
2958
2959 pub target_id: Result<HirId, LoopIdError>,
2962}
2963
2964#[derive(#[automatically_derived]impl ::core::marker::Copy for YieldSource { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for YieldSource {
}
#[automatically_derived]impl ::core::clone::Clone for YieldSource {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<HirId>>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for YieldSource {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Await { expr: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Await expr", &__self_0),
Self::Yield => ::core::fmt::Formatter::write_str(f, "Yield"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for YieldSource
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
YieldSource::Await { expr: ref __binding_0 } =>
0u8.stable_hash(__hcx, __hasher),
YieldSource::Yield => 1u8.stable_hash(__hcx, __hasher),
}
match *self {
YieldSource::Await { expr: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
YieldSource::Yield => {}
}
}
}
};StableHash)]
2966pub enum YieldSource {
2967 Await { expr: Option<HirId> },
2969 Yield,
2971}
2972
2973impl fmt::Display for YieldSource {
2974 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2975 f.write_str(match self {
2976 YieldSource::Await { .. } => "`await`",
2977 YieldSource::Yield => "`yield`",
2978 })
2979 }
2980}
2981
2982#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for FnSig<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"FnSig header decl span", &self.header, &self.decl, &&self.span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for FnSig<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for FnSig<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<FnHeader>;
let _: ::core::clone::AssertParamIsClone<&'hir FnDecl<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for FnSig<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
FnSig<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnSig {
header: ref __binding_0,
decl: ref __binding_1,
span: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2985pub struct FnSig<'hir> {
2986 pub header: FnHeader,
2987 pub decl: &'hir FnDecl<'hir>,
2988 pub span: Span,
2989}
2990
2991#[derive(#[automatically_derived]impl ::core::marker::Copy for TraitItemId { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for TraitItemId {
}
#[automatically_derived]impl ::core::clone::Clone for TraitItemId {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<OwnerId>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
TraitItemId {
}
#[automatically_derived]impl ::core::cmp::PartialEq for TraitItemId {
#[inline]
fn eq(&self, other: &Self) -> bool { self.owner_id == other.owner_id }
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for TraitItemId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<OwnerId>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for TraitItemId {
fn encode(&self, __encoder: &mut __E) {
let TraitItemId { owner_id: ref __binding_0 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for TraitItemId {
fn decode(__decoder: &mut __D) -> Self {
TraitItemId {
owner_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]impl ::core::fmt::Debug for TraitItemId {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TraitItemId owner_id", &&self.owner_id)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for TraitItemId
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitItemId { owner_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2995pub struct TraitItemId {
2996 pub owner_id: OwnerId,
2997}
2998
2999impl TraitItemId {
3000 #[inline]
3001 pub fn hir_id(&self) -> HirId {
3002 HirId::make_owner(self.owner_id.def_id)
3004 }
3005}
3006
3007#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for TraitItem<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"TraitItem ident owner_id generics kind span defaultness";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.ident, &self.owner_id, &self.generics, &self.kind,
&self.span, &&self.defaultness];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TraitItem<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for TraitItem<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<OwnerId>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<TraitItemKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<Defaultness>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for TraitItem<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitItem<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitItem {
ident: ref __binding_0,
owner_id: ref __binding_1,
generics: ref __binding_2,
kind: ref __binding_3,
span: ref __binding_4,
defaultness: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3012pub struct TraitItem<'hir> {
3013 pub ident: Ident,
3014 pub owner_id: OwnerId,
3015 pub generics: &'hir Generics<'hir>,
3016 pub kind: TraitItemKind<'hir>,
3017 pub span: Span,
3018 pub defaultness: Defaultness,
3019}
3020
3021macro_rules! expect_methods_self_kind {
3022 ( $( $name:ident, $ret_ty:ty, $pat:pat, $ret_val:expr; )* ) => {
3023 $(
3024 #[track_caller]
3025 pub fn $name(&self) -> $ret_ty {
3026 let $pat = &self.kind else { expect_failed(stringify!($name), self) };
3027 $ret_val
3028 }
3029 )*
3030 }
3031}
3032
3033macro_rules! expect_methods_self {
3034 ( $( $name:ident, $ret_ty:ty, $pat:pat, $ret_val:expr; )* ) => {
3035 $(
3036 #[track_caller]
3037 pub fn $name(&self) -> $ret_ty {
3038 let $pat = self else { expect_failed(stringify!($name), self) };
3039 $ret_val
3040 }
3041 )*
3042 }
3043}
3044
3045#[track_caller]
3046fn expect_failed<T: fmt::Debug>(ident: &'static str, found: T) -> ! {
3047 {
::core::panicking::panic_fmt(format_args!("{0}: found {1:?}", ident,
found));
}panic!("{ident}: found {found:?}")
3048}
3049
3050impl<'hir> TraitItem<'hir> {
3051 #[inline]
3052 pub fn hir_id(&self) -> HirId {
3053 HirId::make_owner(self.owner_id.def_id)
3055 }
3056
3057 pub fn trait_item_id(&self) -> TraitItemId {
3058 TraitItemId { owner_id: self.owner_id }
3059 }
3060
3061 #[track_caller]
pub fn expect_const(&self) -> (&'hir Ty<'hir>, Option<ConstItemRhs<'hir>>) {
let TraitItemKind::Const(ty, rhs) =
&self.kind else { expect_failed("expect_const", self) };
(ty, *rhs)
}
#[track_caller]
pub fn expect_fn(&self) -> (&FnSig<'hir>, &TraitFn<'hir>) {
let TraitItemKind::Fn(ty, trfn) =
&self.kind else { expect_failed("expect_fn", self) };
(ty, trfn)
}
#[track_caller]
pub fn expect_type(&self) -> (GenericBounds<'hir>, Option<&'hir Ty<'hir>>) {
let TraitItemKind::Type(bounds, ty) =
&self.kind else { expect_failed("expect_type", self) };
(bounds, *ty)
}expect_methods_self_kind! {
3062 expect_const, (&'hir Ty<'hir>, Option<ConstItemRhs<'hir>>),
3063 TraitItemKind::Const(ty, rhs), (ty, *rhs);
3064
3065 expect_fn, (&FnSig<'hir>, &TraitFn<'hir>),
3066 TraitItemKind::Fn(ty, trfn), (ty, trfn);
3067
3068 expect_type, (GenericBounds<'hir>, Option<&'hir Ty<'hir>>),
3069 TraitItemKind::Type(bounds, ty), (bounds, *ty);
3070 }
3071}
3072
3073#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for TraitFn<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Required(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Required", &__self_0),
Self::Provided(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Provided", &__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TraitFn<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for TraitFn<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [Option<Ident>]>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for TraitFn<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitFn<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitFn::Required(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
TraitFn::Provided(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
TraitFn::Required(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TraitFn::Provided(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3075pub enum TraitFn<'hir> {
3076 Required(&'hir [Option<Ident>]),
3078
3079 Provided(BodyId),
3081}
3082
3083#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for TraitItemKind<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Const(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Const",
__self_0, &__self_1),
Self::Fn(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Fn",
__self_0, &__self_1),
Self::Type(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Type",
__self_0, &__self_1),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TraitItemKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
TraitItemKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<ConstItemRhs<'hir>>>;
let _: ::core::clone::AssertParamIsClone<FnSig<'hir>>;
let _: ::core::clone::AssertParamIsClone<TraitFn<'hir>>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
TraitItemKind<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitItemKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitItemKind::Const(ref __binding_0, ref __binding_1) =>
0u8.stable_hash(__hcx, __hasher),
TraitItemKind::Fn(ref __binding_0, ref __binding_1) =>
1u8.stable_hash(__hcx, __hasher),
TraitItemKind::Type(ref __binding_0, ref __binding_1) =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
TraitItemKind::Const(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TraitItemKind::Fn(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TraitItemKind::Type(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3085pub enum TraitItemKind<'hir> {
3086 Const(&'hir Ty<'hir>, Option<ConstItemRhs<'hir>>),
3088 Fn(FnSig<'hir>, TraitFn<'hir>),
3090 Type(GenericBounds<'hir>, Option<&'hir Ty<'hir>>),
3093}
3094
3095#[derive(#[automatically_derived]impl ::core::marker::Copy for ImplItemId { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ImplItemId {
}
#[automatically_derived]impl ::core::clone::Clone for ImplItemId {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<OwnerId>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
ImplItemId {
}
#[automatically_derived]impl ::core::cmp::PartialEq for ImplItemId {
#[inline]
fn eq(&self, other: &Self) -> bool { self.owner_id == other.owner_id }
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for ImplItemId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<OwnerId>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ImplItemId {
fn encode(&self, __encoder: &mut __E) {
let ImplItemId { owner_id: ref __binding_0 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ImplItemId {
fn decode(__decoder: &mut __D) -> Self {
ImplItemId {
owner_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]impl ::core::fmt::Debug for ImplItemId {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ImplItemId owner_id", &&self.owner_id)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ImplItemId {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ImplItemId { owner_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3099pub struct ImplItemId {
3100 pub owner_id: OwnerId,
3101}
3102
3103impl ImplItemId {
3104 #[inline]
3105 pub fn hir_id(&self) -> HirId {
3106 HirId::make_owner(self.owner_id.def_id)
3108 }
3109}
3110
3111#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for ImplItem<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"ImplItem ident owner_id generics kind impl_kind span";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.ident, &self.owner_id, &self.generics, &self.kind,
&self.impl_kind, &&self.span];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for ImplItem<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for ImplItem<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<OwnerId>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<ImplItemKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<ImplItemImplKind>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for ImplItem<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ImplItem<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ImplItem {
ident: ref __binding_0,
owner_id: ref __binding_1,
generics: ref __binding_2,
kind: ref __binding_3,
impl_kind: ref __binding_4,
span: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3115pub struct ImplItem<'hir> {
3116 pub ident: Ident,
3117 pub owner_id: OwnerId,
3118 pub generics: &'hir Generics<'hir>,
3119 pub kind: ImplItemKind<'hir>,
3120 pub impl_kind: ImplItemImplKind,
3121 pub span: Span,
3122}
3123
3124#[derive(#[automatically_derived]impl ::core::fmt::Debug for ImplItemImplKind {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Inherent { vis_span: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Inherent vis_span", &__self_0),
Self::Trait { defaultness: __self_0, trait_item_def_id: __self_1 }
=>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Trait defaultness trait_item_def_id", __self_0, &__self_1),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ImplItemImplKind {
}
#[automatically_derived]impl ::core::clone::Clone for ImplItemImplKind {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<Defaultness>;
let _:
::core::clone::AssertParamIsClone<Result<DefId,
ErrorGuaranteed>>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::Copy for ImplItemImplKind { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ImplItemImplKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ImplItemImplKind::Inherent { vis_span: ref __binding_0 } =>
0u8.stable_hash(__hcx, __hasher),
ImplItemImplKind::Trait {
defaultness: ref __binding_0,
trait_item_def_id: ref __binding_1 } =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
ImplItemImplKind::Inherent { vis_span: ref __binding_0 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ImplItemImplKind::Trait {
defaultness: ref __binding_0,
trait_item_def_id: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3125pub enum ImplItemImplKind {
3126 Inherent {
3127 vis_span: Span,
3128 },
3129 Trait {
3130 defaultness: Defaultness,
3131 trait_item_def_id: Result<DefId, ErrorGuaranteed>,
3133 },
3134}
3135
3136impl<'hir> ImplItem<'hir> {
3137 #[inline]
3138 pub fn hir_id(&self) -> HirId {
3139 HirId::make_owner(self.owner_id.def_id)
3141 }
3142
3143 pub fn impl_item_id(&self) -> ImplItemId {
3144 ImplItemId { owner_id: self.owner_id }
3145 }
3146
3147 pub fn is_anon_const(&self) -> bool {
3149 #[allow(non_exhaustive_omitted_patterns)] match self.impl_kind {
ImplItemImplKind::Inherent { .. } => true,
_ => false,
}matches!(self.impl_kind, ImplItemImplKind::Inherent { .. })
3150 && #[allow(non_exhaustive_omitted_patterns)] match self.kind {
ImplItemKind::Const(..) => true,
_ => false,
}matches!(self.kind, ImplItemKind::Const(..))
3151 && self.ident.name == kw::Underscore
3152 }
3153
3154 pub fn vis_span(&self) -> Option<Span> {
3155 match self.impl_kind {
3156 ImplItemImplKind::Trait { .. } => None,
3157 ImplItemImplKind::Inherent { vis_span, .. } => Some(vis_span),
3158 }
3159 }
3160
3161 #[track_caller]
pub fn expect_const(&self) -> (&'hir Ty<'hir>, ConstItemRhs<'hir>) {
let ImplItemKind::Const(ty, rhs) =
&self.kind else { expect_failed("expect_const", self) };
(ty, *rhs)
}
#[track_caller]
pub fn expect_fn(&self) -> (&FnSig<'hir>, BodyId) {
let ImplItemKind::Fn(ty, body) =
&self.kind else { expect_failed("expect_fn", self) };
(ty, *body)
}
#[track_caller]
pub fn expect_type(&self) -> &'hir Ty<'hir> {
let ImplItemKind::Type(ty) =
&self.kind else { expect_failed("expect_type", self) };
ty
}expect_methods_self_kind! {
3162 expect_const, (&'hir Ty<'hir>, ConstItemRhs<'hir>), ImplItemKind::Const(ty, rhs), (ty, *rhs);
3163 expect_fn, (&FnSig<'hir>, BodyId), ImplItemKind::Fn(ty, body), (ty, *body);
3164 expect_type, &'hir Ty<'hir>, ImplItemKind::Type(ty), ty;
3165 }
3166}
3167
3168#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for ImplItemKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Const(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Const",
__self_0, &__self_1),
Self::Fn(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Fn",
__self_0, &__self_1),
Self::Type(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Type",
&__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for ImplItemKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for ImplItemKind<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<ConstItemRhs<'hir>>;
let _: ::core::clone::AssertParamIsClone<FnSig<'hir>>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for ImplItemKind<'hir>
{
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ImplItemKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ImplItemKind::Const(ref __binding_0, ref __binding_1) =>
0u8.stable_hash(__hcx, __hasher),
ImplItemKind::Fn(ref __binding_0, ref __binding_1) =>
1u8.stable_hash(__hcx, __hasher),
ImplItemKind::Type(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
ImplItemKind::Const(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ImplItemKind::Fn(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ImplItemKind::Type(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3170pub enum ImplItemKind<'hir> {
3171 Const(&'hir Ty<'hir>, ConstItemRhs<'hir>),
3174 Fn(FnSig<'hir>, BodyId),
3176 Type(&'hir Ty<'hir>),
3178}
3179
3180#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
AssocItemConstraint<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"AssocItemConstraint hir_id ident gen_args kind span",
&self.hir_id, &self.ident, &self.gen_args, &self.kind,
&&self.span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for AssocItemConstraint<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
AssocItemConstraint<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<&'hir GenericArgs<'hir>>;
let _:
::core::clone::AssertParamIsClone<AssocItemConstraintKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
AssocItemConstraint<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
AssocItemConstraint<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
AssocItemConstraint {
hir_id: ref __binding_0,
ident: ref __binding_1,
gen_args: ref __binding_2,
kind: ref __binding_3,
span: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3191pub struct AssocItemConstraint<'hir> {
3192 #[stable_hash(ignore)]
3193 pub hir_id: HirId,
3194 pub ident: Ident,
3195 pub gen_args: &'hir GenericArgs<'hir>,
3196 pub kind: AssocItemConstraintKind<'hir>,
3197 pub span: Span,
3198}
3199
3200impl<'hir> AssocItemConstraint<'hir> {
3201 pub fn ty(self) -> Option<&'hir Ty<'hir>> {
3203 match self.kind {
3204 AssocItemConstraintKind::Equality { term: Term::Ty(ty) } => Some(ty),
3205 _ => None,
3206 }
3207 }
3208
3209 pub fn ct(self) -> Option<&'hir ConstArg<'hir>> {
3211 match self.kind {
3212 AssocItemConstraintKind::Equality { term: Term::Const(ct) } => Some(ct),
3213 _ => None,
3214 }
3215 }
3216}
3217
3218#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Term<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Ty(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Ty",
&__self_0),
Self::Const(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
&__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Term<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Term<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Term<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Term<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Term::Ty(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
Term::Const(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
Term::Ty(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Term::Const(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3219pub enum Term<'hir> {
3220 Ty(&'hir Ty<'hir>),
3221 Const(&'hir ConstArg<'hir>),
3222}
3223
3224impl<'hir> From<&'hir Ty<'hir>> for Term<'hir> {
3225 fn from(ty: &'hir Ty<'hir>) -> Self {
3226 Term::Ty(ty)
3227 }
3228}
3229
3230impl<'hir> From<&'hir ConstArg<'hir>> for Term<'hir> {
3231 fn from(c: &'hir ConstArg<'hir>) -> Self {
3232 Term::Const(c)
3233 }
3234}
3235
3236#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
AssocItemConstraintKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Equality { term: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Equality term", &__self_0),
Self::Bound { bounds: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Bound bounds", &__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for AssocItemConstraintKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
AssocItemConstraintKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Term<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericBound<'hir>]>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
AssocItemConstraintKind<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
AssocItemConstraintKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
AssocItemConstraintKind::Equality { term: ref __binding_0 }
=> 0u8.stable_hash(__hcx, __hasher),
AssocItemConstraintKind::Bound { bounds: ref __binding_0 }
=> 1u8.stable_hash(__hcx, __hasher),
}
match *self {
AssocItemConstraintKind::Equality { term: ref __binding_0 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
AssocItemConstraintKind::Bound { bounds: ref __binding_0 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3238pub enum AssocItemConstraintKind<'hir> {
3239 Equality { term: Term<'hir> },
3246 Bound { bounds: &'hir [GenericBound<'hir>] },
3248}
3249
3250impl<'hir> AssocItemConstraintKind<'hir> {
3251 pub fn descr(&self) -> &'static str {
3252 match self {
3253 AssocItemConstraintKind::Equality { .. } => "binding",
3254 AssocItemConstraintKind::Bound { .. } => "constraint",
3255 }
3256 }
3257}
3258
3259#[derive(#[automatically_derived]impl ::core::fmt::Debug for AmbigArg {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match *self {}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for AmbigArg {
}
#[automatically_derived]impl ::core::clone::Clone for AmbigArg {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::Copy for AmbigArg { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for AmbigArg {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {}
}
}
};StableHash)]
3263pub enum AmbigArg {}
3264
3265#[derive(#[automatically_derived]impl<'hir, Unambig: ::core::fmt::Debug>
::core::fmt::Debug for Ty<'hir, Unambig> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Ty hir_id span kind", &self.hir_id, &self.span, &&self.kind)
}
}Debug, #[automatically_derived]impl<'hir, Unambig: ::core::clone::Clone>
::core::clone::Clone for Ty<'hir, Unambig> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
Ty {
hir_id: ::core::clone::Clone::clone(&self.hir_id),
span: ::core::clone::Clone::clone(&self.span),
kind: ::core::clone::Clone::clone(&self.kind),
}
}
}Clone, #[automatically_derived]impl<'hir, Unambig: ::core::marker::Copy>
::core::marker::Copy for Ty<'hir, Unambig> {
}Copy, const _: () =
{
impl<'hir, Unambig> ::rustc_data_structures::stable_hash::StableHash
for Ty<'hir, Unambig> where
Unambig: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Ty {
hir_id: ref __binding_0,
span: ref __binding_1,
kind: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3270#[repr(C)]
3271pub struct Ty<'hir, Unambig = ()> {
3272 #[stable_hash(ignore)]
3273 pub hir_id: HirId,
3274 pub span: Span,
3275 pub kind: TyKind<'hir, Unambig>,
3276}
3277
3278impl<'hir> Ty<'hir, AmbigArg> {
3279 pub fn as_unambig_ty(&self) -> &Ty<'hir> {
3290 let ptr = self as *const Ty<'hir, AmbigArg> as *const Ty<'hir, ()>;
3293 unsafe { &*ptr }
3294 }
3295}
3296
3297impl<'hir> Ty<'hir> {
3298 pub fn try_as_ambig_ty(&self) -> Option<&Ty<'hir, AmbigArg>> {
3304 if let TyKind::Infer(()) = self.kind {
3305 return None;
3306 }
3307
3308 let ptr = self as *const Ty<'hir> as *const Ty<'hir, AmbigArg>;
3312 Some(unsafe { &*ptr })
3313 }
3314}
3315
3316impl<'hir> Ty<'hir, AmbigArg> {
3317 pub fn peel_refs(&self) -> &Ty<'hir> {
3318 let mut final_ty = self.as_unambig_ty();
3319 while let TyKind::Ref(_, ty, _) = &final_ty.kind {
3320 final_ty = ty;
3321 }
3322 final_ty
3323 }
3324}
3325
3326impl<'hir> Ty<'hir> {
3327 pub fn peel_refs(&self) -> &Self {
3328 let mut final_ty = self;
3329 while let TyKind::Ref(_, ty, _) = &final_ty.kind {
3330 final_ty = ty;
3331 }
3332 final_ty
3333 }
3334
3335 pub fn as_generic_param(&self) -> Option<(DefId, Ident)> {
3337 let TyKind::Path(QPath::Resolved(None, path)) = self.kind else {
3338 return None;
3339 };
3340 let [segment] = &path.segments else {
3341 return None;
3342 };
3343 match path.res {
3344 Res::Def(DefKind::TyParam, def_id) | Res::SelfTyParam { trait_: def_id } => {
3345 Some((def_id, segment.ident))
3346 }
3347 _ => None,
3348 }
3349 }
3350
3351 pub fn find_self_aliases(&self) -> Vec<Span> {
3352 use crate::intravisit::Visitor;
3353 struct MyVisitor(Vec<Span>);
3354 impl<'v> Visitor<'v> for MyVisitor {
3355 fn visit_ty(&mut self, t: &'v Ty<'v, AmbigArg>) {
3356 if #[allow(non_exhaustive_omitted_patterns)] match &t.kind {
TyKind::Path(QPath::Resolved(_, Path {
res: crate::def::Res::SelfTyAlias { .. }, .. })) => true,
_ => false,
}matches!(
3357 &t.kind,
3358 TyKind::Path(QPath::Resolved(
3359 _,
3360 Path { res: crate::def::Res::SelfTyAlias { .. }, .. },
3361 ))
3362 ) {
3363 self.0.push(t.span);
3364 return;
3365 }
3366 crate::intravisit::walk_ty(self, t);
3367 }
3368 }
3369
3370 let mut my_visitor = MyVisitor(::alloc::vec::Vec::new()vec![]);
3371 my_visitor.visit_ty_unambig(self);
3372 my_visitor.0
3373 }
3374
3375 pub fn is_suggestable_infer_ty(&self) -> bool {
3378 fn are_suggestable_generic_args(generic_args: &[GenericArg<'_>]) -> bool {
3379 generic_args.iter().any(|arg| match arg {
3380 GenericArg::Type(ty) => ty.as_unambig_ty().is_suggestable_infer_ty(),
3381 GenericArg::Infer(_) => true,
3382 _ => false,
3383 })
3384 }
3385 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/8eb778d04094d3af4b26580cab327e0413eb1e02/compiler/rustc_hir/src/hir.rs:3385",
"rustc_hir::hir", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/8eb778d04094d3af4b26580cab327e0413eb1e02/compiler/rustc_hir/src/hir.rs"),
::tracing_core::__macro_support::Option::Some(3385u32),
::tracing_core::__macro_support::Option::Some("rustc_hir::hir"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("self")
}> =
::tracing::__macro_support::FieldName::new("self");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&self)
as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!(?self);
3386 match &self.kind {
3387 TyKind::Infer(()) => true,
3388 TyKind::Slice(ty) => ty.is_suggestable_infer_ty(),
3389 TyKind::Array(ty, length) => {
3390 ty.is_suggestable_infer_ty() || #[allow(non_exhaustive_omitted_patterns)] match length.kind {
ConstArgKind::Infer(..) => true,
_ => false,
}matches!(length.kind, ConstArgKind::Infer(..))
3391 }
3392 TyKind::Tup(tys) => tys.iter().any(Self::is_suggestable_infer_ty),
3393 TyKind::Ptr(ty, _) | TyKind::Ref(_, ty, _) => ty.is_suggestable_infer_ty(),
3394 TyKind::Path(QPath::TypeRelative(ty, segment)) => {
3395 ty.is_suggestable_infer_ty() || are_suggestable_generic_args(segment.args().args)
3396 }
3397 TyKind::Path(QPath::Resolved(ty_opt, Path { segments, .. })) => {
3398 ty_opt.is_some_and(Self::is_suggestable_infer_ty)
3399 || segments
3400 .iter()
3401 .any(|segment| are_suggestable_generic_args(segment.args().args))
3402 }
3403 _ => false,
3404 }
3405 }
3406}
3407
3408#[derive(#[automatically_derived]impl ::core::marker::Copy for PrimTy { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for PrimTy {
}
#[automatically_derived]impl ::core::clone::Clone for PrimTy {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<IntTy>;
let _: ::core::clone::AssertParamIsClone<UintTy>;
let _: ::core::clone::AssertParamIsClone<FloatTy>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for PrimTy {
}
#[automatically_derived]impl ::core::cmp::PartialEq for PrimTy {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Int(__self_0), Self::Int(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Uint(__self_0), Self::Uint(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Float(__self_0), Self::Float(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for PrimTy {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<IntTy>;
let _: ::core::cmp::AssertParamIsEq<UintTy>;
let _: ::core::cmp::AssertParamIsEq<FloatTy>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for PrimTy {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
PrimTy::Int(ref __binding_0) => { 0usize }
PrimTy::Uint(ref __binding_0) => { 1usize }
PrimTy::Float(ref __binding_0) => { 2usize }
PrimTy::Str => { 3usize }
PrimTy::Bool => { 4usize }
PrimTy::Char => { 5usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
PrimTy::Int(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
PrimTy::Uint(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
PrimTy::Float(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
PrimTy::Str => {}
PrimTy::Bool => {}
PrimTy::Char => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for PrimTy {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
PrimTy::Int(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
PrimTy::Uint(::rustc_serialize::Decodable::decode(__decoder))
}
2usize => {
PrimTy::Float(::rustc_serialize::Decodable::decode(__decoder))
}
3usize => { PrimTy::Str }
4usize => { PrimTy::Bool }
5usize => { PrimTy::Char }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PrimTy`, expected 0..6, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]impl ::core::hash::Hash for PrimTy {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Int(__self_0) => ::core::hash::Hash::hash(__self_0, state),
Self::Uint(__self_0) => ::core::hash::Hash::hash(__self_0, state),
Self::Float(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]impl ::core::fmt::Debug for PrimTy {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Int(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Int",
&__self_0),
Self::Uint(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Uint",
&__self_0),
Self::Float(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Float",
&__self_0),
Self::Str => ::core::fmt::Formatter::write_str(f, "Str"),
Self::Bool => ::core::fmt::Formatter::write_str(f, "Bool"),
Self::Char => ::core::fmt::Formatter::write_str(f, "Char"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for PrimTy {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PrimTy::Int(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
PrimTy::Uint(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
PrimTy::Float(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
PrimTy::Str => 3u8.stable_hash(__hcx, __hasher),
PrimTy::Bool => 4u8.stable_hash(__hcx, __hasher),
PrimTy::Char => 5u8.stable_hash(__hcx, __hasher),
}
match *self {
PrimTy::Int(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PrimTy::Uint(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PrimTy::Float(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PrimTy::Str => {}
PrimTy::Bool => {}
PrimTy::Char => {}
}
}
}
};StableHash)]
3410pub enum PrimTy {
3411 Int(IntTy),
3412 Uint(UintTy),
3413 Float(FloatTy),
3414 Str,
3415 Bool,
3416 Char,
3417}
3418
3419impl PrimTy {
3420 pub const ALL: [Self; 19] = [
3422 Self::Int(IntTy::I8),
3424 Self::Int(IntTy::I16),
3425 Self::Int(IntTy::I32),
3426 Self::Int(IntTy::I64),
3427 Self::Int(IntTy::I128),
3428 Self::Int(IntTy::Isize),
3429 Self::Uint(UintTy::U8),
3430 Self::Uint(UintTy::U16),
3431 Self::Uint(UintTy::U32),
3432 Self::Uint(UintTy::U64),
3433 Self::Uint(UintTy::U128),
3434 Self::Uint(UintTy::Usize),
3435 Self::Float(FloatTy::F16),
3436 Self::Float(FloatTy::F32),
3437 Self::Float(FloatTy::F64),
3438 Self::Float(FloatTy::F128),
3439 Self::Bool,
3440 Self::Char,
3441 Self::Str,
3442 ];
3443
3444 pub fn name_str(self) -> &'static str {
3448 match self {
3449 PrimTy::Int(i) => i.name_str(),
3450 PrimTy::Uint(u) => u.name_str(),
3451 PrimTy::Float(f) => f.name_str(),
3452 PrimTy::Str => "str",
3453 PrimTy::Bool => "bool",
3454 PrimTy::Char => "char",
3455 }
3456 }
3457
3458 pub fn name(self) -> Symbol {
3459 match self {
3460 PrimTy::Int(i) => i.name(),
3461 PrimTy::Uint(u) => u.name(),
3462 PrimTy::Float(f) => f.name(),
3463 PrimTy::Str => sym::str,
3464 PrimTy::Bool => sym::bool,
3465 PrimTy::Char => sym::char,
3466 }
3467 }
3468
3469 pub fn from_name(name: Symbol) -> Option<Self> {
3472 let ty = match name {
3473 sym::i8 => Self::Int(IntTy::I8),
3475 sym::i16 => Self::Int(IntTy::I16),
3476 sym::i32 => Self::Int(IntTy::I32),
3477 sym::i64 => Self::Int(IntTy::I64),
3478 sym::i128 => Self::Int(IntTy::I128),
3479 sym::isize => Self::Int(IntTy::Isize),
3480 sym::u8 => Self::Uint(UintTy::U8),
3481 sym::u16 => Self::Uint(UintTy::U16),
3482 sym::u32 => Self::Uint(UintTy::U32),
3483 sym::u64 => Self::Uint(UintTy::U64),
3484 sym::u128 => Self::Uint(UintTy::U128),
3485 sym::usize => Self::Uint(UintTy::Usize),
3486 sym::f16 => Self::Float(FloatTy::F16),
3487 sym::f32 => Self::Float(FloatTy::F32),
3488 sym::f64 => Self::Float(FloatTy::F64),
3489 sym::f128 => Self::Float(FloatTy::F128),
3490 sym::bool => Self::Bool,
3491 sym::char => Self::Char,
3492 sym::str => Self::Str,
3493 _ => return None,
3494 };
3495 Some(ty)
3496 }
3497}
3498
3499#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for FnPtrTy<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"FnPtrTy safety abi generic_params decl param_idents",
&self.safety, &self.abi, &self.generic_params, &self.decl,
&&self.param_idents)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for FnPtrTy<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for FnPtrTy<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Safety>;
let _: ::core::clone::AssertParamIsClone<ExternAbi>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir FnDecl<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Option<Ident>]>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for FnPtrTy<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
FnPtrTy<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnPtrTy {
safety: ref __binding_0,
abi: ref __binding_1,
generic_params: ref __binding_2,
decl: ref __binding_3,
param_idents: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3500pub struct FnPtrTy<'hir> {
3501 pub safety: Safety,
3502 pub abi: ExternAbi,
3503 pub generic_params: &'hir [GenericParam<'hir>],
3504 pub decl: &'hir FnDecl<'hir>,
3505 pub param_idents: &'hir [Option<Ident>],
3508}
3509
3510#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for UnsafeBinderTy<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"UnsafeBinderTy generic_params inner_ty", &self.generic_params,
&&self.inner_ty)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for UnsafeBinderTy<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
UnsafeBinderTy<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
UnsafeBinderTy<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
UnsafeBinderTy<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
UnsafeBinderTy {
generic_params: ref __binding_0, inner_ty: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3511pub struct UnsafeBinderTy<'hir> {
3512 pub generic_params: &'hir [GenericParam<'hir>],
3513 pub inner_ty: &'hir Ty<'hir>,
3514}
3515
3516#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for OpaqueTy<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"OpaqueTy hir_id def_id bounds origin span", &self.hir_id,
&self.def_id, &self.bounds, &self.origin, &&self.span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for OpaqueTy<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for OpaqueTy<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
let _: ::core::clone::AssertParamIsClone<OpaqueTyOrigin<LocalDefId>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for OpaqueTy<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
OpaqueTy<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
OpaqueTy {
hir_id: ref __binding_0,
def_id: ref __binding_1,
bounds: ref __binding_2,
origin: ref __binding_3,
span: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3517pub struct OpaqueTy<'hir> {
3518 #[stable_hash(ignore)]
3519 pub hir_id: HirId,
3520 pub def_id: LocalDefId,
3521 pub bounds: GenericBounds<'hir>,
3522 pub origin: OpaqueTyOrigin<LocalDefId>,
3523 pub span: Span,
3524}
3525
3526#[derive(#[automatically_derived]impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug>
::core::fmt::Debug for PreciseCapturingArgKind<T, U> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Lifetime(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Lifetime", &__self_0),
Self::Param(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Param",
&__self_0),
}
}
}Debug, #[automatically_derived]impl<T: ::core::clone::Clone, U: ::core::clone::Clone>
::core::clone::Clone for PreciseCapturingArgKind<T, U> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
match self {
Self::Lifetime(__self_0) =>
PreciseCapturingArgKind::Lifetime(::core::clone::Clone::clone(__self_0)),
Self::Param(__self_0) =>
PreciseCapturingArgKind::Param(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]impl<T: ::core::marker::Copy, U: ::core::marker::Copy>
::core::marker::Copy for PreciseCapturingArgKind<T, U> {
}Copy, const _: () =
{
impl<T, U> ::rustc_data_structures::stable_hash::StableHash for
PreciseCapturingArgKind<T, U> where
T: ::rustc_data_structures::stable_hash::StableHash,
U: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PreciseCapturingArgKind::Lifetime(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
PreciseCapturingArgKind::Param(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
PreciseCapturingArgKind::Lifetime(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PreciseCapturingArgKind::Param(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<T, U, __E: ::rustc_span::SpanEncoder>
::rustc_serialize::Encodable<__E> for
PreciseCapturingArgKind<T, U> where
T: ::rustc_serialize::Encodable<__E>,
U: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
PreciseCapturingArgKind::Lifetime(ref __binding_0) => {
0usize
}
PreciseCapturingArgKind::Param(ref __binding_0) => {
1usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
PreciseCapturingArgKind::Lifetime(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
PreciseCapturingArgKind::Param(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<T, U, __D: ::rustc_span::SpanDecoder>
::rustc_serialize::Decodable<__D> for
PreciseCapturingArgKind<T, U> where
T: ::rustc_serialize::Decodable<__D>,
U: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
PreciseCapturingArgKind::Lifetime(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
PreciseCapturingArgKind::Param(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PreciseCapturingArgKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
3527pub enum PreciseCapturingArgKind<T, U> {
3528 Lifetime(T),
3529 Param(U),
3531}
3532
3533pub type PreciseCapturingArg<'hir> =
3534 PreciseCapturingArgKind<&'hir Lifetime, PreciseCapturingNonLifetimeArg>;
3535
3536impl PreciseCapturingArg<'_> {
3537 pub fn hir_id(self) -> HirId {
3538 match self {
3539 PreciseCapturingArg::Lifetime(lt) => lt.hir_id,
3540 PreciseCapturingArg::Param(param) => param.hir_id,
3541 }
3542 }
3543
3544 pub fn name(self) -> Symbol {
3545 match self {
3546 PreciseCapturingArg::Lifetime(lt) => lt.ident.name,
3547 PreciseCapturingArg::Param(param) => param.ident.name,
3548 }
3549 }
3550}
3551
3552#[derive(#[automatically_derived]impl ::core::fmt::Debug for
PreciseCapturingNonLifetimeArg {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"PreciseCapturingNonLifetimeArg hir_id ident res", &self.hir_id,
&self.ident, &&self.res)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for PreciseCapturingNonLifetimeArg {
}
#[automatically_derived]impl ::core::clone::Clone for
PreciseCapturingNonLifetimeArg {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<Res>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::Copy for
PreciseCapturingNonLifetimeArg {
}Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
PreciseCapturingNonLifetimeArg {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PreciseCapturingNonLifetimeArg {
hir_id: ref __binding_0,
ident: ref __binding_1,
res: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3557pub struct PreciseCapturingNonLifetimeArg {
3558 #[stable_hash(ignore)]
3559 pub hir_id: HirId,
3560 pub ident: Ident,
3561 pub res: Res,
3562}
3563
3564#[derive(#[automatically_derived]impl ::core::marker::Copy for RpitContext { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for RpitContext {
}
#[automatically_derived]impl ::core::clone::Clone for RpitContext {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
RpitContext {
}
#[automatically_derived]impl ::core::cmp::PartialEq for RpitContext {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for RpitContext { }Eq, #[automatically_derived]impl ::core::fmt::Debug for RpitContext {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RpitContext::Trait => "Trait",
RpitContext::TraitImpl => "TraitImpl",
})
}
}Debug)]
3565#[derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for RpitContext
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
RpitContext::Trait => 0u8.stable_hash(__hcx, __hasher),
RpitContext::TraitImpl => 1u8.stable_hash(__hcx, __hasher),
}
match *self {
RpitContext::Trait => {}
RpitContext::TraitImpl => {}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for RpitContext {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
RpitContext::Trait => { 0usize }
RpitContext::TraitImpl => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for RpitContext {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { RpitContext::Trait }
1usize => { RpitContext::TraitImpl }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RpitContext`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
3566pub enum RpitContext {
3567 Trait,
3568 TraitImpl,
3569}
3570
3571#[derive(#[automatically_derived]impl<D: ::core::marker::Copy> ::core::marker::Copy for
OpaqueTyOrigin<D> {
}Copy, #[automatically_derived]impl<D: ::core::clone::Clone> ::core::clone::Clone for
OpaqueTyOrigin<D> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
match self {
Self::FnReturn { parent: __self_0, in_trait_or_impl: __self_1 } =>
OpaqueTyOrigin::FnReturn {
parent: ::core::clone::Clone::clone(__self_0),
in_trait_or_impl: ::core::clone::Clone::clone(__self_1),
},
Self::AsyncFn { parent: __self_0, in_trait_or_impl: __self_1 } =>
OpaqueTyOrigin::AsyncFn {
parent: ::core::clone::Clone::clone(__self_0),
in_trait_or_impl: ::core::clone::Clone::clone(__self_1),
},
Self::TyAlias { parent: __self_0, in_assoc_ty: __self_1 } =>
OpaqueTyOrigin::TyAlias {
parent: ::core::clone::Clone::clone(__self_0),
in_assoc_ty: ::core::clone::Clone::clone(__self_1),
},
}
}
}Clone, #[automatically_derived]impl<D: ::core::cmp::PartialEq>
::core::marker::StructuralPartialEq for OpaqueTyOrigin<D> {
}
#[automatically_derived]impl<D: ::core::cmp::PartialEq> ::core::cmp::PartialEq
for OpaqueTyOrigin<D> {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::FnReturn { parent: __self_0, in_trait_or_impl: __self_1
}, Self::FnReturn {
parent: __arg1_0, in_trait_or_impl: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::AsyncFn { parent: __self_0, in_trait_or_impl: __self_1
}, Self::AsyncFn {
parent: __arg1_0, in_trait_or_impl: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::TyAlias { parent: __self_0, in_assoc_ty: __self_1 },
Self::TyAlias { parent: __arg1_0, in_assoc_ty: __arg1_1 })
=> __self_1 == __arg1_1 && __self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]impl<D: ::core::cmp::Eq> ::core::cmp::Eq for
OpaqueTyOrigin<D> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<D>;
let _: ::core::cmp::AssertParamIsEq<Option<RpitContext>>;
let _: ::core::cmp::AssertParamIsEq<Option<RpitContext>>;
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, #[automatically_derived]impl<D: ::core::fmt::Debug> ::core::fmt::Debug for
OpaqueTyOrigin<D> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::FnReturn { parent: __self_0, in_trait_or_impl: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"FnReturn parent in_trait_or_impl", __self_0, &__self_1),
Self::AsyncFn { parent: __self_0, in_trait_or_impl: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"AsyncFn parent in_trait_or_impl", __self_0, &__self_1),
Self::TyAlias { parent: __self_0, in_assoc_ty: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TyAlias parent in_assoc_ty", __self_0, &__self_1),
}
}
}Debug)]
3573#[derive(const _: () =
{
impl<D> ::rustc_data_structures::stable_hash::StableHash for
OpaqueTyOrigin<D> where
D: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
OpaqueTyOrigin::FnReturn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> 0u8.stable_hash(__hcx, __hasher),
OpaqueTyOrigin::AsyncFn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> 1u8.stable_hash(__hcx, __hasher),
OpaqueTyOrigin::TyAlias {
parent: ref __binding_0, in_assoc_ty: ref __binding_1 } =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
OpaqueTyOrigin::FnReturn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
OpaqueTyOrigin::AsyncFn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
OpaqueTyOrigin::TyAlias {
parent: ref __binding_0, in_assoc_ty: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<D, __E: ::rustc_span::SpanEncoder>
::rustc_serialize::Encodable<__E> for OpaqueTyOrigin<D> where
D: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
OpaqueTyOrigin::FnReturn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
0usize
}
OpaqueTyOrigin::AsyncFn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
1usize
}
OpaqueTyOrigin::TyAlias {
parent: ref __binding_0, in_assoc_ty: ref __binding_1 } => {
2usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
OpaqueTyOrigin::FnReturn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
OpaqueTyOrigin::AsyncFn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
OpaqueTyOrigin::TyAlias {
parent: ref __binding_0, in_assoc_ty: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<D, __D: ::rustc_span::SpanDecoder>
::rustc_serialize::Decodable<__D> for OpaqueTyOrigin<D> where
D: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
OpaqueTyOrigin::FnReturn {
parent: ::rustc_serialize::Decodable::decode(__decoder),
in_trait_or_impl: ::rustc_serialize::Decodable::decode(__decoder),
}
}
1usize => {
OpaqueTyOrigin::AsyncFn {
parent: ::rustc_serialize::Decodable::decode(__decoder),
in_trait_or_impl: ::rustc_serialize::Decodable::decode(__decoder),
}
}
2usize => {
OpaqueTyOrigin::TyAlias {
parent: ::rustc_serialize::Decodable::decode(__decoder),
in_assoc_ty: ::rustc_serialize::Decodable::decode(__decoder),
}
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `OpaqueTyOrigin`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable)]
3574pub enum OpaqueTyOrigin<D> {
3575 FnReturn {
3577 parent: D,
3579 in_trait_or_impl: Option<RpitContext>,
3581 },
3582 AsyncFn {
3584 parent: D,
3586 in_trait_or_impl: Option<RpitContext>,
3588 },
3589 TyAlias {
3591 parent: D,
3593 in_assoc_ty: bool,
3595 },
3596}
3597
3598#[derive(#[automatically_derived]impl ::core::fmt::Debug for
DelegationSelfTyPropagationKind {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::SelfTy(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"SelfTy", &__self_0),
Self::SelfParam =>
::core::fmt::Formatter::write_str(f, "SelfParam"),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for DelegationSelfTyPropagationKind {
}
#[automatically_derived]impl ::core::clone::Clone for
DelegationSelfTyPropagationKind {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::Copy for
DelegationSelfTyPropagationKind {
}Copy, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
DelegationSelfTyPropagationKind {
}
#[automatically_derived]impl ::core::cmp::PartialEq for
DelegationSelfTyPropagationKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::SelfTy(__self_0), Self::SelfTy(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for
DelegationSelfTyPropagationKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<HirId>;
}
}Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
DelegationSelfTyPropagationKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
DelegationSelfTyPropagationKind::SelfTy(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
DelegationSelfTyPropagationKind::SelfParam =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
DelegationSelfTyPropagationKind::SelfTy(ref __binding_0) =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
}
DelegationSelfTyPropagationKind::SelfParam => {}
}
}
}
};StableHash)]
3599pub enum DelegationSelfTyPropagationKind {
3600 SelfTy(HirId ),
3603 SelfParam,
3606}
3607
3608#[derive(#[automatically_derived]impl ::core::fmt::Debug for DelegationInfo {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"DelegationInfo call_expr_id call_path_res child_seg_id parent_seg_id_for_sig child_seg_id_for_sig self_ty_propagation_kind group_id arguments_to_map";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.call_expr_id, &self.call_path_res, &self.child_seg_id,
&self.parent_seg_id_for_sig, &self.child_seg_id_for_sig,
&self.self_ty_propagation_kind, &self.group_id,
&&self.arguments_to_map];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
DelegationInfo {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
DelegationInfo {
call_expr_id: ref __binding_0,
call_path_res: ref __binding_1,
child_seg_id: ref __binding_2,
parent_seg_id_for_sig: ref __binding_3,
child_seg_id_for_sig: ref __binding_4,
self_ty_propagation_kind: ref __binding_5,
group_id: ref __binding_6,
arguments_to_map: ref __binding_7 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3609pub struct DelegationInfo {
3610 pub call_expr_id: HirId,
3611 pub call_path_res: DefId,
3612
3613 pub child_seg_id: HirId,
3616
3617 pub parent_seg_id_for_sig: Option<HirId>,
3623 pub child_seg_id_for_sig: Option<HirId>,
3624
3625 pub self_ty_propagation_kind: Option<DelegationSelfTyPropagationKind>,
3626 pub group_id: Option<(LocalExpnId, bool )>,
3627
3628 pub arguments_to_map: FxIndexSet<usize>,
3629}
3630
3631#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
InferDelegationSig<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Input(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Input",
&__self_0),
Self::Output(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Output", &__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for InferDelegationSig<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
InferDelegationSig<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<usize>;
let _: ::core::clone::AssertParamIsClone<&'hir DelegationInfo>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
InferDelegationSig<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
InferDelegationSig<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
InferDelegationSig::Input(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
InferDelegationSig::Output(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
InferDelegationSig::Input(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
InferDelegationSig::Output(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3632pub enum InferDelegationSig<'hir> {
3633 Input(usize),
3634 Output(&'hir DelegationInfo),
3636}
3637
3638#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
InferDelegation<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::DefId(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "DefId",
&__self_0),
Self::Sig(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Sig",
__self_0, &__self_1),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for InferDelegation<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
InferDelegation<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<DefId>;
let _: ::core::clone::AssertParamIsClone<InferDelegationSig<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
InferDelegation<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
InferDelegation<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
InferDelegation::DefId(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
InferDelegation::Sig(ref __binding_0, ref __binding_1) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
InferDelegation::DefId(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
InferDelegation::Sig(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3639pub enum InferDelegation<'hir> {
3640 DefId(DefId),
3643 Sig(DefId, InferDelegationSig<'hir>),
3645}
3646
3647#[repr(u8, C)]
3653#[derive(#[automatically_derived]impl<'hir, Unambig: ::core::fmt::Debug>
::core::fmt::Debug for TyKind<'hir, Unambig> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::InferDelegation(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"InferDelegation", &__self_0),
Self::Slice(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Slice",
&__self_0),
Self::Array(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Array",
__self_0, &__self_1),
Self::Ptr(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Ptr",
__self_0, &__self_1),
Self::Ref(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Ref",
__self_0, __self_1, &__self_2),
Self::FnPtr(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "FnPtr",
&__self_0),
Self::UnsafeBinder(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"UnsafeBinder", &__self_0),
Self::Never => ::core::fmt::Formatter::write_str(f, "Never"),
Self::Tup(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Tup",
&__self_0),
Self::Path(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Path",
&__self_0),
Self::OpaqueDef(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"OpaqueDef", &__self_0),
Self::TraitAscription(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TraitAscription", &__self_0),
Self::TraitObject(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TraitObject", __self_0, &__self_1),
Self::Err(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Err",
&__self_0),
Self::Pat(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Pat",
__self_0, &__self_1),
Self::FieldOf(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"FieldOf", __self_0, &__self_1),
Self::View(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "View",
__self_0, &__self_1),
Self::Infer(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Infer",
&__self_0),
}
}
}Debug, #[automatically_derived]impl<'hir, Unambig: ::core::clone::Clone>
::core::clone::Clone for TyKind<'hir, Unambig> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
match self {
Self::InferDelegation(__self_0) =>
TyKind::InferDelegation(::core::clone::Clone::clone(__self_0)),
Self::Slice(__self_0) =>
TyKind::Slice(::core::clone::Clone::clone(__self_0)),
Self::Array(__self_0, __self_1) =>
TyKind::Array(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::Ptr(__self_0, __self_1) =>
TyKind::Ptr(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::Ref(__self_0, __self_1, __self_2) =>
TyKind::Ref(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1),
::core::clone::Clone::clone(__self_2)),
Self::FnPtr(__self_0) =>
TyKind::FnPtr(::core::clone::Clone::clone(__self_0)),
Self::UnsafeBinder(__self_0) =>
TyKind::UnsafeBinder(::core::clone::Clone::clone(__self_0)),
Self::Never => TyKind::Never,
Self::Tup(__self_0) =>
TyKind::Tup(::core::clone::Clone::clone(__self_0)),
Self::Path(__self_0) =>
TyKind::Path(::core::clone::Clone::clone(__self_0)),
Self::OpaqueDef(__self_0) =>
TyKind::OpaqueDef(::core::clone::Clone::clone(__self_0)),
Self::TraitAscription(__self_0) =>
TyKind::TraitAscription(::core::clone::Clone::clone(__self_0)),
Self::TraitObject(__self_0, __self_1) =>
TyKind::TraitObject(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::Err(__self_0) =>
TyKind::Err(::core::clone::Clone::clone(__self_0)),
Self::Pat(__self_0, __self_1) =>
TyKind::Pat(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::FieldOf(__self_0, __self_1) =>
TyKind::FieldOf(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::View(__self_0, __self_1) =>
TyKind::View(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::Infer(__self_0) =>
TyKind::Infer(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]impl<'hir, Unambig: ::core::marker::Copy>
::core::marker::Copy for TyKind<'hir, Unambig> {
}Copy, const _: () =
{
impl<'hir, Unambig> ::rustc_data_structures::stable_hash::StableHash
for TyKind<'hir, Unambig> where
Unambig: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TyKind::InferDelegation(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
TyKind::Slice(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
TyKind::Array(ref __binding_0, ref __binding_1) =>
2u8.stable_hash(__hcx, __hasher),
TyKind::Ptr(ref __binding_0, ref __binding_1) =>
3u8.stable_hash(__hcx, __hasher),
TyKind::Ref(ref __binding_0, ref __binding_1,
ref __binding_2) => 4u8.stable_hash(__hcx, __hasher),
TyKind::FnPtr(ref __binding_0) =>
5u8.stable_hash(__hcx, __hasher),
TyKind::UnsafeBinder(ref __binding_0) =>
6u8.stable_hash(__hcx, __hasher),
TyKind::Never => 7u8.stable_hash(__hcx, __hasher),
TyKind::Tup(ref __binding_0) =>
8u8.stable_hash(__hcx, __hasher),
TyKind::Path(ref __binding_0) =>
9u8.stable_hash(__hcx, __hasher),
TyKind::OpaqueDef(ref __binding_0) =>
10u8.stable_hash(__hcx, __hasher),
TyKind::TraitAscription(ref __binding_0) =>
11u8.stable_hash(__hcx, __hasher),
TyKind::TraitObject(ref __binding_0, ref __binding_1) =>
12u8.stable_hash(__hcx, __hasher),
TyKind::Err(ref __binding_0) =>
13u8.stable_hash(__hcx, __hasher),
TyKind::Pat(ref __binding_0, ref __binding_1) =>
14u8.stable_hash(__hcx, __hasher),
TyKind::FieldOf(ref __binding_0, ref __binding_1) =>
15u8.stable_hash(__hcx, __hasher),
TyKind::View(ref __binding_0, ref __binding_1) =>
16u8.stable_hash(__hcx, __hasher),
TyKind::Infer(ref __binding_0) =>
17u8.stable_hash(__hcx, __hasher),
}
match *self {
TyKind::InferDelegation(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Slice(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Array(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Ptr(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Ref(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
TyKind::FnPtr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::UnsafeBinder(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Never => {}
TyKind::Tup(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Path(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::OpaqueDef(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::TraitAscription(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::TraitObject(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Err(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Pat(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::FieldOf(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::View(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Infer(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3654pub enum TyKind<'hir, Unambig = ()> {
3655 InferDelegation(InferDelegation<'hir>),
3657 Slice(&'hir Ty<'hir>),
3659 Array(&'hir Ty<'hir>, &'hir ConstArg<'hir>),
3661 Ptr(&'hir Ty<'hir>, Mutability),
3663 Ref(&'hir Lifetime, &'hir Ty<'hir>, Mutability),
3665 FnPtr(&'hir FnPtrTy<'hir>),
3667 UnsafeBinder(&'hir UnsafeBinderTy<'hir>),
3669 Never,
3671 Tup(&'hir [Ty<'hir>]),
3673 Path(QPath<'hir>),
3678 OpaqueDef(&'hir OpaqueTy<'hir>),
3680 TraitAscription(GenericBounds<'hir>),
3682 TraitObject(&'hir [PolyTraitRef<'hir>], TaggedRef<'hir, Lifetime, TraitObjectSyntax>),
3688 Err(rustc_span::ErrorGuaranteed),
3690 Pat(&'hir Ty<'hir>, &'hir TyPat<'hir>),
3692 FieldOf(&'hir Ty<'hir>, &'hir TyFieldPath),
3696 View(&'hir Ty<'hir>, &'hir [Ident]),
3698 Infer(Unambig),
3704}
3705
3706#[derive(#[automatically_derived]impl ::core::fmt::Debug for InlineAsmRegOrRegClass {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Reg { reg: __self_0, source_name: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Reg reg source_name", __self_0, &__self_1),
Self::RegClass(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"RegClass", &__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for InlineAsmRegOrRegClass {
}
#[automatically_derived]impl ::core::clone::Clone for InlineAsmRegOrRegClass {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<asm::InlineAsmReg>;
let _: ::core::clone::AssertParamIsClone<Option<Symbol>>;
let _: ::core::clone::AssertParamIsClone<asm::InlineAsmRegClass>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::Copy for InlineAsmRegOrRegClass {
}Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
InlineAsmRegOrRegClass {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
InlineAsmRegOrRegClass::Reg {
reg: ref __binding_0, source_name: ref __binding_1 } =>
0u8.stable_hash(__hcx, __hasher),
InlineAsmRegOrRegClass::RegClass(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
InlineAsmRegOrRegClass::Reg {
reg: ref __binding_0, source_name: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
InlineAsmRegOrRegClass::RegClass(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3709pub enum InlineAsmRegOrRegClass {
3710 Reg { reg: asm::InlineAsmReg, source_name: Option<Symbol> },
3711 RegClass(asm::InlineAsmRegClass),
3712}
3713
3714impl InlineAsmRegOrRegClass {
3715 pub fn as_target(self) -> asm::InlineAsmRegOrRegClass {
3717 match self {
3718 Self::Reg { reg, .. } => asm::InlineAsmRegOrRegClass::Reg(reg),
3719 Self::RegClass(reg_class) => asm::InlineAsmRegOrRegClass::RegClass(reg_class),
3720 }
3721 }
3722
3723 pub fn reg_class(self) -> asm::InlineAsmRegClass {
3725 self.as_target().reg_class()
3726 }
3727
3728 pub fn source_name(self) -> Option<Symbol> {
3730 match self {
3731 Self::Reg { source_name, .. } => source_name,
3732 Self::RegClass(_) => None,
3733 }
3734 }
3735}
3736
3737impl fmt::Display for InlineAsmRegOrRegClass {
3739 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3740 self.as_target().fmt(f)
3741 }
3742}
3743
3744#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
InlineAsmOperand<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::In { reg: __self_0, expr: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"In reg expr", __self_0, &__self_1),
Self::Out { reg: __self_0, late: __self_1, expr: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Out reg late expr", __self_0, __self_1, &__self_2),
Self::InOut { reg: __self_0, late: __self_1, expr: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"InOut reg late expr", __self_0, __self_1, &__self_2),
Self::SplitInOut {
reg: __self_0,
late: __self_1,
in_expr: __self_2,
out_expr: __self_3 } =>
::core::fmt::Formatter::debug_struct_field4_finish(f,
"SplitInOut reg late in_expr out_expr", __self_0, __self_1,
__self_2, &__self_3),
Self::Const { anon_const: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Const anon_const", &__self_0),
Self::SymFn { expr: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"SymFn expr", &__self_0),
Self::SymStatic { path: __self_0, def_id: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"SymStatic path def_id", __self_0, &__self_1),
Self::Label { block: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Label block", &__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for InlineAsmOperand<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
InlineAsmOperand<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<InlineAsmRegOrRegClass>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<ConstBlock>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<QPath<'hir>>;
let _: ::core::clone::AssertParamIsClone<DefId>;
let _: ::core::clone::AssertParamIsClone<&'hir Block<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
InlineAsmOperand<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
InlineAsmOperand<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
InlineAsmOperand::In {
reg: ref __binding_0, expr: ref __binding_1 } =>
0u8.stable_hash(__hcx, __hasher),
InlineAsmOperand::Out {
reg: ref __binding_0,
late: ref __binding_1,
expr: ref __binding_2 } => 1u8.stable_hash(__hcx, __hasher),
InlineAsmOperand::InOut {
reg: ref __binding_0,
late: ref __binding_1,
expr: ref __binding_2 } => 2u8.stable_hash(__hcx, __hasher),
InlineAsmOperand::SplitInOut {
reg: ref __binding_0,
late: ref __binding_1,
in_expr: ref __binding_2,
out_expr: ref __binding_3 } =>
3u8.stable_hash(__hcx, __hasher),
InlineAsmOperand::Const { anon_const: ref __binding_0 } =>
4u8.stable_hash(__hcx, __hasher),
InlineAsmOperand::SymFn { expr: ref __binding_0 } =>
5u8.stable_hash(__hcx, __hasher),
InlineAsmOperand::SymStatic {
path: ref __binding_0, def_id: ref __binding_1 } =>
6u8.stable_hash(__hcx, __hasher),
InlineAsmOperand::Label { block: ref __binding_0 } =>
7u8.stable_hash(__hcx, __hasher),
}
match *self {
InlineAsmOperand::In {
reg: ref __binding_0, expr: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::Out {
reg: ref __binding_0,
late: ref __binding_1,
expr: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::InOut {
reg: ref __binding_0,
late: ref __binding_1,
expr: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::SplitInOut {
reg: ref __binding_0,
late: ref __binding_1,
in_expr: ref __binding_2,
out_expr: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::Const { anon_const: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::SymFn { expr: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::SymStatic {
path: ref __binding_0, def_id: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::Label { block: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3745pub enum InlineAsmOperand<'hir> {
3746 In {
3747 reg: InlineAsmRegOrRegClass,
3748 expr: &'hir Expr<'hir>,
3749 },
3750 Out {
3751 reg: InlineAsmRegOrRegClass,
3752 late: bool,
3753 expr: Option<&'hir Expr<'hir>>,
3754 },
3755 InOut {
3756 reg: InlineAsmRegOrRegClass,
3757 late: bool,
3758 expr: &'hir Expr<'hir>,
3759 },
3760 SplitInOut {
3761 reg: InlineAsmRegOrRegClass,
3762 late: bool,
3763 in_expr: &'hir Expr<'hir>,
3764 out_expr: Option<&'hir Expr<'hir>>,
3765 },
3766 Const {
3767 anon_const: ConstBlock,
3768 },
3769 SymFn {
3770 expr: &'hir Expr<'hir>,
3771 },
3772 SymStatic {
3773 path: QPath<'hir>,
3774 def_id: DefId,
3775 },
3776 Label {
3777 block: &'hir Block<'hir>,
3778 },
3779}
3780
3781impl<'hir> InlineAsmOperand<'hir> {
3782 pub fn reg(&self) -> Option<InlineAsmRegOrRegClass> {
3783 match *self {
3784 Self::In { reg, .. }
3785 | Self::Out { reg, .. }
3786 | Self::InOut { reg, .. }
3787 | Self::SplitInOut { reg, .. } => Some(reg),
3788 Self::Const { .. }
3789 | Self::SymFn { .. }
3790 | Self::SymStatic { .. }
3791 | Self::Label { .. } => None,
3792 }
3793 }
3794
3795 pub fn is_clobber(&self) -> bool {
3796 #[allow(non_exhaustive_omitted_patterns)] match self {
InlineAsmOperand::Out {
reg: InlineAsmRegOrRegClass::Reg { .. }, expr: None, .. } => true,
_ => false,
}matches!(
3797 self,
3798 InlineAsmOperand::Out { reg: InlineAsmRegOrRegClass::Reg { .. }, expr: None, .. }
3799 )
3800 }
3801}
3802
3803#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for InlineAsm<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"InlineAsm asm_macro template template_strs operands options line_spans";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.asm_macro, &self.template, &self.template_strs,
&self.operands, &self.options, &&self.line_spans];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for InlineAsm<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for InlineAsm<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<ast::AsmMacro>;
let _:
::core::clone::AssertParamIsClone<&'hir [InlineAsmTemplatePiece]>;
let _:
::core::clone::AssertParamIsClone<&'hir [(Symbol,
Option<Symbol>, Span)]>;
let _:
::core::clone::AssertParamIsClone<&'hir [(InlineAsmOperand<'hir>,
Span)]>;
let _: ::core::clone::AssertParamIsClone<InlineAsmOptions>;
let _: ::core::clone::AssertParamIsClone<&'hir [Span]>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for InlineAsm<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
InlineAsm<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
InlineAsm {
asm_macro: ref __binding_0,
template: ref __binding_1,
template_strs: ref __binding_2,
operands: ref __binding_3,
options: ref __binding_4,
line_spans: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3804pub struct InlineAsm<'hir> {
3805 pub asm_macro: ast::AsmMacro,
3806 pub template: &'hir [InlineAsmTemplatePiece],
3807 pub template_strs: &'hir [(Symbol, Option<Symbol>, Span)],
3808 pub operands: &'hir [(InlineAsmOperand<'hir>, Span)],
3809 pub options: InlineAsmOptions,
3810 pub line_spans: &'hir [Span],
3811}
3812
3813impl InlineAsm<'_> {
3814 pub fn contains_label(&self) -> bool {
3815 self.operands.iter().any(|x| #[allow(non_exhaustive_omitted_patterns)] match x.0 {
InlineAsmOperand::Label { .. } => true,
_ => false,
}matches!(x.0, InlineAsmOperand::Label { .. }))
3816 }
3817}
3818
3819#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Param<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"Param hir_id pat ty_span span", &self.hir_id, &self.pat,
&self.ty_span, &&self.span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Param<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Param<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Param<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Param<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Param {
hir_id: ref __binding_0,
pat: ref __binding_1,
ty_span: ref __binding_2,
span: ref __binding_3 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3821pub struct Param<'hir> {
3822 #[stable_hash(ignore)]
3823 pub hir_id: HirId,
3824 pub pat: &'hir Pat<'hir>,
3825 pub ty_span: Span,
3826 pub span: Span,
3827}
3828
3829#[derive(#[automatically_derived]impl ::core::fmt::Debug for SplattedArgIndexError {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::InvalidIndex { splatted_arg_index: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"InvalidIndex splatted_arg_index", &__self_0),
Self::OutOfBounds {
splatted_arg_index: __self_0, args_len: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"OutOfBounds splatted_arg_index args_len", __self_0,
&__self_1),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for SplattedArgIndexError {
}
#[automatically_derived]impl ::core::clone::Clone for SplattedArgIndexError {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<u8>;
let _: ::core::clone::AssertParamIsClone<u16>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::Copy for SplattedArgIndexError {
}Copy, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
SplattedArgIndexError {
}
#[automatically_derived]impl ::core::cmp::PartialEq for SplattedArgIndexError
{
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::InvalidIndex { splatted_arg_index: __self_0 },
Self::InvalidIndex { splatted_arg_index: __arg1_0 }) =>
__self_0 == __arg1_0,
(Self::OutOfBounds {
splatted_arg_index: __self_0, args_len: __self_1 },
Self::OutOfBounds {
splatted_arg_index: __arg1_0, args_len: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for SplattedArgIndexError {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
let _: ::core::cmp::AssertParamIsEq<u16>;
}
}Eq)]
3831pub enum SplattedArgIndexError {
3832 InvalidIndex { splatted_arg_index: u8 },
3836
3837 OutOfBounds { splatted_arg_index: u8, args_len: u16 },
3839}
3840
3841#[derive(#[automatically_derived]impl ::core::marker::Copy for FnDeclFlags { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for FnDeclFlags {
}
#[automatically_derived]impl ::core::clone::Clone for FnDeclFlags {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
FnDeclFlags {
}
#[automatically_derived]impl ::core::cmp::PartialEq for FnDeclFlags {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.flags == other.flags && self.splatted == other.splatted
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for FnDeclFlags {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
}
}Eq, #[automatically_derived]impl ::core::cmp::PartialOrd for FnDeclFlags {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]impl ::core::cmp::Ord for FnDeclFlags {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
match ::core::cmp::Ord::cmp(&self.flags, &other.flags) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(&self.splatted, &other.splatted),
cmp => cmp,
}
}
}Ord, #[automatically_derived]impl ::core::hash::Hash for FnDeclFlags {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.flags, state);
::core::hash::Hash::hash(&self.splatted, state)
}
}Hash)]
3843#[derive(const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for FnDeclFlags {
fn encode(&self, __encoder: &mut __E) {
let FnDeclFlags {
flags: ref __binding_0, splatted: ref __binding_1 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for FnDeclFlags {
fn decode(__decoder: &mut __D) -> Self {
FnDeclFlags {
flags: ::rustc_serialize::Decodable::decode(__decoder),
splatted: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for FnDeclFlags
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnDeclFlags {
flags: ref __binding_0, splatted: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3844pub struct FnDeclFlags {
3845 flags: u8,
3847
3848 splatted: u8,
3852}
3853
3854impl fmt::Debug for FnDeclFlags {
3855 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3856 let mut f = f.debug_tuple("FnDeclFlags");
3857 f.field(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("ImplicitSelfKind({0:?})",
self.implicit_self()))
})format!("ImplicitSelfKind({:?})", self.implicit_self()));
3858
3859 if self.lifetime_elision_allowed() {
3860 f.field(&"LifetimeElisionAllowed");
3861 } else {
3862 f.field(&"NoLifetimeElision");
3863 }
3864
3865 if self.c_variadic() {
3866 f.field(&"CVariadic");
3867 }
3868
3869 if let Some(index) = self.splatted() {
3870 f.field(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Splatted({0})", index))
})format!("Splatted({})", index));
3871 }
3872
3873 f.finish()
3874 }
3875}
3876
3877impl FnDeclFlags {
3878 const IMPLICIT_SELF_MASK: u8 = 0b111;
3880
3881 const C_VARIADIC_FLAG: u8 = 1 << 3;
3883
3884 const LIFETIME_ELISION_ALLOWED_FLAG: u8 = 1 << 4;
3886
3887 const NO_SPLATTED_ARG_INDEX: u8 = u8::MAX;
3890
3891 pub fn default() -> Self {
3896 Self { flags: 0, splatted: 0 }
3897 .set_implicit_self(ImplicitSelfKind::None)
3898 .set_lifetime_elision_allowed(false)
3899 .set_c_variadic(false)
3900 .set_no_splatted_args()
3901 }
3902
3903 #[must_use = "this method does not modify the receiver"]
3905 pub fn set_implicit_self(mut self, implicit_self: ImplicitSelfKind) -> Self {
3906 self.flags &= !Self::IMPLICIT_SELF_MASK;
3907
3908 match implicit_self {
3909 ImplicitSelfKind::None => self.flags |= 0,
3910 ImplicitSelfKind::Imm => self.flags |= 1,
3911 ImplicitSelfKind::Mut => self.flags |= 2,
3912 ImplicitSelfKind::RefImm => self.flags |= 3,
3913 ImplicitSelfKind::RefMut => self.flags |= 4,
3914 }
3915
3916 self
3917 }
3918
3919 #[must_use = "this method does not modify the receiver"]
3921 pub fn set_c_variadic(mut self, c_variadic: bool) -> Self {
3922 if c_variadic {
3923 self.flags |= Self::C_VARIADIC_FLAG;
3924 } else {
3925 self.flags &= !Self::C_VARIADIC_FLAG;
3926 }
3927
3928 self
3929 }
3930
3931 #[must_use = "this method does not modify the receiver"]
3933 pub fn set_lifetime_elision_allowed(mut self, allowed: bool) -> Self {
3934 if allowed {
3935 self.flags |= Self::LIFETIME_ELISION_ALLOWED_FLAG;
3936 } else {
3937 self.flags &= !Self::LIFETIME_ELISION_ALLOWED_FLAG;
3938 }
3939
3940 self
3941 }
3942
3943 #[must_use = "this method does not modify the receiver"]
3946 pub fn set_splatted(
3947 mut self,
3948 splatted: Option<u8>,
3949 args_len: usize,
3950 ) -> Result<Self, SplattedArgIndexError> {
3951 if let Some(splatted_arg_index) = splatted {
3952 if splatted_arg_index == Self::NO_SPLATTED_ARG_INDEX {
3953 return Err(SplattedArgIndexError::InvalidIndex { splatted_arg_index });
3956 } else if usize::from(splatted_arg_index) >= args_len {
3957 return Err(SplattedArgIndexError::OutOfBounds {
3958 splatted_arg_index,
3959 args_len: args_len as u16,
3960 });
3961 }
3962
3963 self.splatted = splatted_arg_index;
3964 } else {
3965 self.splatted = Self::NO_SPLATTED_ARG_INDEX;
3966 }
3967
3968 Ok(self)
3969 }
3970
3971 #[must_use = "this method does not modify the receiver"]
3973 pub fn set_no_splatted_args(mut self) -> Self {
3974 self.splatted = Self::NO_SPLATTED_ARG_INDEX;
3975
3976 self
3977 }
3978
3979 pub fn implicit_self(self) -> ImplicitSelfKind {
3981 match self.flags & Self::IMPLICIT_SELF_MASK {
3982 0 => ImplicitSelfKind::None,
3983 1 => ImplicitSelfKind::Imm,
3984 2 => ImplicitSelfKind::Mut,
3985 3 => ImplicitSelfKind::RefImm,
3986 4 => ImplicitSelfKind::RefMut,
3987 _ => ::core::panicking::unreachable_default_msg()unreachable!(),
3988 }
3989 }
3990
3991 pub fn c_variadic(self) -> bool {
3993 self.flags & Self::C_VARIADIC_FLAG != 0
3994 }
3995
3996 pub fn lifetime_elision_allowed(self) -> bool {
3998 self.flags & Self::LIFETIME_ELISION_ALLOWED_FLAG != 0
3999 }
4000
4001 pub fn splatted(self) -> Option<u8> {
4003 if self.splatted == Self::NO_SPLATTED_ARG_INDEX { None } else { Some(self.splatted) }
4004 }
4005}
4006
4007#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for FnDecl<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"FnDecl inputs output fn_decl_kind", &self.inputs, &self.output,
&&self.fn_decl_kind)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for FnDecl<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for FnDecl<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [Ty<'hir>]>;
let _: ::core::clone::AssertParamIsClone<FnRetTy<'hir>>;
let _: ::core::clone::AssertParamIsClone<FnDeclFlags>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for FnDecl<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
FnDecl<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnDecl {
inputs: ref __binding_0,
output: ref __binding_1,
fn_decl_kind: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4009pub struct FnDecl<'hir> {
4010 pub inputs: &'hir [Ty<'hir>],
4014 pub output: FnRetTy<'hir>,
4015 pub fn_decl_kind: FnDeclFlags,
4017}
4018
4019impl<'hir> FnDecl<'hir> {
4020 pub fn opt_delegation_sig_id(&self) -> Option<DefId> {
4021 if let FnRetTy::Return(ty) = self.output
4022 && let TyKind::InferDelegation(InferDelegation::Sig(sig_id, _)) = ty.kind
4023 {
4024 return Some(sig_id);
4025 }
4026 None
4027 }
4028
4029 pub fn opt_delegation_info(&self) -> Option<&'hir DelegationInfo> {
4030 if let FnRetTy::Return(ty) = self.output
4031 && let TyKind::InferDelegation(InferDelegation::Sig(_, kind)) = ty.kind
4032 && let InferDelegationSig::Output(generics) = kind
4033 {
4034 return Some(generics);
4035 }
4036
4037 None
4038 }
4039
4040 pub fn implicit_self(&self) -> ImplicitSelfKind {
4041 self.fn_decl_kind.implicit_self()
4042 }
4043
4044 pub fn c_variadic(&self) -> bool {
4045 self.fn_decl_kind.c_variadic()
4046 }
4047
4048 pub fn lifetime_elision_allowed(&self) -> bool {
4049 self.fn_decl_kind.lifetime_elision_allowed()
4050 }
4051
4052 pub fn splatted(&self) -> Option<u8> {
4053 self.fn_decl_kind.splatted()
4054 }
4055
4056 pub fn dummy(span: Span) -> Self {
4057 Self {
4058 inputs: &[],
4059 output: FnRetTy::DefaultReturn(span),
4060 fn_decl_kind: FnDeclFlags::default().set_lifetime_elision_allowed(true),
4061 }
4062 }
4063}
4064
4065#[derive(#[automatically_derived]impl ::core::marker::Copy for ImplicitSelfKind { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ImplicitSelfKind {
}
#[automatically_derived]impl ::core::clone::Clone for ImplicitSelfKind {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
ImplicitSelfKind {
}
#[automatically_derived]impl ::core::cmp::PartialEq for ImplicitSelfKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for ImplicitSelfKind { }Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ImplicitSelfKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
ImplicitSelfKind::Imm => { 0usize }
ImplicitSelfKind::Mut => { 1usize }
ImplicitSelfKind::RefImm => { 2usize }
ImplicitSelfKind::RefMut => { 3usize }
ImplicitSelfKind::None => { 4usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ImplicitSelfKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { ImplicitSelfKind::Imm }
1usize => { ImplicitSelfKind::Mut }
2usize => { ImplicitSelfKind::RefImm }
3usize => { ImplicitSelfKind::RefMut }
4usize => { ImplicitSelfKind::None }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ImplicitSelfKind`, expected 0..5, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]impl ::core::fmt::Debug for ImplicitSelfKind {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_c_like_enum_write_str(f,
"Imm Mut RefImm RefMut None",
match self {
ImplicitSelfKind::Imm => 0usize,
ImplicitSelfKind::Mut => 4usize,
ImplicitSelfKind::RefImm => 8usize,
ImplicitSelfKind::RefMut => 15usize,
ImplicitSelfKind::None => 22usize,
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ImplicitSelfKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ImplicitSelfKind::Imm => 0u8.stable_hash(__hcx, __hasher),
ImplicitSelfKind::Mut => 1u8.stable_hash(__hcx, __hasher),
ImplicitSelfKind::RefImm =>
2u8.stable_hash(__hcx, __hasher),
ImplicitSelfKind::RefMut =>
3u8.stable_hash(__hcx, __hasher),
ImplicitSelfKind::None => 4u8.stable_hash(__hcx, __hasher),
}
match *self {
ImplicitSelfKind::Imm => {}
ImplicitSelfKind::Mut => {}
ImplicitSelfKind::RefImm => {}
ImplicitSelfKind::RefMut => {}
ImplicitSelfKind::None => {}
}
}
}
};StableHash)]
4067pub enum ImplicitSelfKind {
4068 Imm,
4070 Mut,
4072 RefImm,
4074 RefMut,
4076 None,
4079}
4080
4081impl ImplicitSelfKind {
4082 pub fn has_implicit_self(&self) -> bool {
4084 !#[allow(non_exhaustive_omitted_patterns)] match *self {
ImplicitSelfKind::None => true,
_ => false,
}matches!(*self, ImplicitSelfKind::None)
4085 }
4086}
4087
4088#[derive(#[automatically_derived]impl ::core::marker::Copy for IsAsync { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for IsAsync {
}
#[automatically_derived]impl ::core::clone::Clone for IsAsync {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for IsAsync {
}
#[automatically_derived]impl ::core::cmp::PartialEq for IsAsync {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Async(__self_0), Self::Async(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for IsAsync {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Span>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for IsAsync {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
IsAsync::Async(ref __binding_0) => { 0usize }
IsAsync::NotAsync => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
IsAsync::Async(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
IsAsync::NotAsync => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for IsAsync {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
IsAsync::Async(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => { IsAsync::NotAsync }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `IsAsync`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]impl ::core::fmt::Debug for IsAsync {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Async(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Async",
&__self_0),
Self::NotAsync =>
::core::fmt::Formatter::write_str(f, "NotAsync"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for IsAsync {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
IsAsync::Async(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
IsAsync::NotAsync => 1u8.stable_hash(__hcx, __hasher),
}
match *self {
IsAsync::Async(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
IsAsync::NotAsync => {}
}
}
}
};StableHash)]
4089pub enum IsAsync {
4090 Async(Span),
4091 NotAsync,
4092}
4093
4094impl IsAsync {
4095 pub fn is_async(self) -> bool {
4096 #[allow(non_exhaustive_omitted_patterns)] match self {
IsAsync::Async(_) => true,
_ => false,
}matches!(self, IsAsync::Async(_))
4097 }
4098}
4099
4100#[derive(#[automatically_derived]impl ::core::marker::Copy for Defaultness { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for Defaultness {
}
#[automatically_derived]impl ::core::clone::Clone for Defaultness {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
Defaultness {
}
#[automatically_derived]impl ::core::cmp::PartialEq for Defaultness {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Default { has_value: __self_0 }, Self::Default {
has_value: __arg1_0 }) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for Defaultness {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, #[automatically_derived]impl ::core::fmt::Debug for Defaultness {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Default { has_value: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Default has_value", &__self_0),
Self::Final => ::core::fmt::Formatter::write_str(f, "Final"),
}
}
}Debug, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Defaultness {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Defaultness::Default { has_value: ref __binding_0 } => {
0usize
}
Defaultness::Final => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
Defaultness::Default { has_value: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Defaultness::Final => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Defaultness {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
Defaultness::Default {
has_value: ::rustc_serialize::Decodable::decode(__decoder),
}
}
1usize => { Defaultness::Final }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Defaultness`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Defaultness
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Defaultness::Default { has_value: ref __binding_0 } =>
0u8.stable_hash(__hcx, __hasher),
Defaultness::Final => 1u8.stable_hash(__hcx, __hasher),
}
match *self {
Defaultness::Default { has_value: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Defaultness::Final => {}
}
}
}
};StableHash)]
4101#[derive(#[automatically_derived]impl ::core::default::Default for Defaultness {
#[inline]
fn default() -> Self { Self::Final }
}Default)]
4102pub enum Defaultness {
4103 Default {
4104 has_value: bool,
4105 },
4106 #[default]
4107 Final,
4108}
4109
4110impl Defaultness {
4111 pub fn has_value(&self) -> bool {
4112 match *self {
4113 Defaultness::Default { has_value } => has_value,
4114 Defaultness::Final => true,
4115 }
4116 }
4117
4118 pub fn is_final(&self) -> bool {
4119 *self == Defaultness::Final
4120 }
4121
4122 pub fn is_default(&self) -> bool {
4123 #[allow(non_exhaustive_omitted_patterns)] match *self {
Defaultness::Default { .. } => true,
_ => false,
}matches!(*self, Defaultness::Default { .. })
4124 }
4125}
4126
4127#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for FnRetTy<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::DefaultReturn(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"DefaultReturn", &__self_0),
Self::Return(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Return", &__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for FnRetTy<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for FnRetTy<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for FnRetTy<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
FnRetTy<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnRetTy::DefaultReturn(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
FnRetTy::Return(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
FnRetTy::DefaultReturn(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
FnRetTy::Return(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4128pub enum FnRetTy<'hir> {
4129 DefaultReturn(Span),
4135 Return(&'hir Ty<'hir>),
4137}
4138
4139impl<'hir> FnRetTy<'hir> {
4140 #[inline]
4141 pub fn span(&self) -> Span {
4142 match *self {
4143 Self::DefaultReturn(span) => span,
4144 Self::Return(ref ty) => ty.span,
4145 }
4146 }
4147
4148 pub fn is_suggestable_infer_ty(&self) -> Option<&'hir Ty<'hir>> {
4149 if let Self::Return(ty) = self
4150 && ty.is_suggestable_infer_ty()
4151 {
4152 return Some(*ty);
4153 }
4154 None
4155 }
4156}
4157
4158#[derive(#[automatically_derived]impl ::core::marker::Copy for ClosureBinder { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ClosureBinder {
}
#[automatically_derived]impl ::core::clone::Clone for ClosureBinder {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for ClosureBinder {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Default => ::core::fmt::Formatter::write_str(f, "Default"),
Self::For { span: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"For span", &__self_0),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ClosureBinder {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ClosureBinder::Default => 0u8.stable_hash(__hcx, __hasher),
ClosureBinder::For { span: ref __binding_0 } =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
ClosureBinder::Default => {}
ClosureBinder::For { span: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4160pub enum ClosureBinder {
4161 Default,
4163 For { span: Span },
4167}
4168
4169#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Mod<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Mod spans item_ids", &self.spans, &&self.item_ids)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Mod<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Mod<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<ModSpans>;
let _: ::core::clone::AssertParamIsClone<&'hir [ItemId]>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Mod<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Mod<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Mod { spans: ref __binding_0, item_ids: ref __binding_1 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4170pub struct Mod<'hir> {
4171 pub spans: ModSpans,
4172 pub item_ids: &'hir [ItemId],
4173}
4174
4175#[derive(#[automatically_derived]impl ::core::marker::Copy for ModSpans { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ModSpans {
}
#[automatically_derived]impl ::core::clone::Clone for ModSpans {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for ModSpans {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ModSpans inner_span inject_use_span", &self.inner_span,
&&self.inject_use_span)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ModSpans {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ModSpans {
inner_span: ref __binding_0,
inject_use_span: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4176pub struct ModSpans {
4177 pub inner_span: Span,
4181 pub inject_use_span: Span,
4182}
4183
4184#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for EnumDef<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"EnumDef variants", &&self.variants)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for EnumDef<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for EnumDef<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [Variant<'hir>]>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for EnumDef<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
EnumDef<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
EnumDef { variants: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4185pub struct EnumDef<'hir> {
4186 pub variants: &'hir [Variant<'hir>],
4187}
4188
4189#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Variant<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"Variant ident hir_id def_id data disr_expr span";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.ident, &self.hir_id, &self.def_id, &self.data,
&self.disr_expr, &&self.span];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Variant<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Variant<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<VariantData<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir AnonConst>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Variant<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Variant<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Variant {
ident: ref __binding_0,
hir_id: ref __binding_1,
def_id: ref __binding_2,
data: ref __binding_3,
disr_expr: ref __binding_4,
span: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{}
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4190pub struct Variant<'hir> {
4191 pub ident: Ident,
4193 #[stable_hash(ignore)]
4195 pub hir_id: HirId,
4196 pub def_id: LocalDefId,
4197 pub data: VariantData<'hir>,
4199 pub disr_expr: Option<&'hir AnonConst>,
4201 pub span: Span,
4203}
4204
4205#[derive(#[automatically_derived]impl<'hir> ::core::marker::Copy for UseTree<'hir> { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for UseTree<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for UseTree<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir UsePath<'hir>>;
let _: ::core::clone::AssertParamIsClone<UseKind<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::fmt::Debug for UseTree<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"UseTree prefix kind", &self.prefix, &&self.kind)
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
UseTree<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
UseTree { prefix: ref __binding_0, kind: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4206pub struct UseTree<'hir> {
4207 pub prefix: &'hir UsePath<'hir>,
4208 pub kind: UseKind<'hir>,
4209}
4210
4211impl UseTree<'_> {
4212 pub fn resolutions(&self) -> impl Iterator<Item = PerNS<Option<Res>>> {
4213 Box::new(std::iter::iter!(|| {
4214 match self.kind {
4215 UseKind::Glob => yield self.prefix.res,
4216 UseKind::Single(_) => yield self.prefix.res,
4217 UseKind::Nested { items } => {
4218 for (item, _, _) in items {
4219 for res in item.resolutions() {
4220 yield res;
4221 }
4222 }
4223 }
4224 }
4225 })())
4226 }
4227}
4228
4229#[derive(#[automatically_derived]impl<'hir> ::core::marker::Copy for UseKind<'hir> { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for UseKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for UseKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _:
::core::clone::AssertParamIsClone<&'hir [(UseTree<'hir>,
HirId, LocalDefId)]>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::fmt::Debug for UseKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Single(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Single", &__self_0),
Self::Glob => ::core::fmt::Formatter::write_str(f, "Glob"),
Self::Nested { items: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Nested items", &__self_0),
}
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
UseKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
UseKind::Single(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
UseKind::Glob => 1u8.stable_hash(__hcx, __hasher),
UseKind::Nested { items: ref __binding_0 } =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
UseKind::Single(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
UseKind::Glob => {}
UseKind::Nested { items: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4230pub enum UseKind<'hir> {
4231 Single(Ident),
4238
4239 Glob,
4241
4242 Nested { items: &'hir [(UseTree<'hir>, HirId, LocalDefId)] },
4244}
4245
4246#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TraitRef<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for TraitRef<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Path<'hir>>;
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::fmt::Debug for TraitRef<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TraitRef path hir_ref_id", &self.path, &&self.hir_ref_id)
}
}Debug, #[automatically_derived]impl<'hir> ::core::marker::Copy for TraitRef<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitRef<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitRef {
path: ref __binding_0, hir_ref_id: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{}
}
}
}
}
};StableHash)]
4253pub struct TraitRef<'hir> {
4254 pub path: &'hir Path<'hir>,
4255 #[stable_hash(ignore)]
4257 pub hir_ref_id: HirId,
4258}
4259
4260impl TraitRef<'_> {
4261 pub fn trait_def_id(&self) -> Option<DefId> {
4263 match self.path.res {
4264 Res::Def(DefKind::Trait | DefKind::TraitAlias, did) => Some(did),
4265 Res::Err => None,
4266 res => {
::core::panicking::panic_fmt(format_args!("{0:?} did not resolve to a trait or trait alias",
res));
}panic!("{res:?} did not resolve to a trait or trait alias"),
4267 }
4268 }
4269}
4270
4271#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for PolyTraitRef<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for PolyTraitRef<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<TraitBoundModifiers>;
let _: ::core::clone::AssertParamIsClone<TraitRef<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::fmt::Debug for PolyTraitRef<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"PolyTraitRef bound_generic_params modifiers trait_ref span",
&self.bound_generic_params, &self.modifiers, &self.trait_ref,
&&self.span)
}
}Debug, #[automatically_derived]impl<'hir> ::core::marker::Copy for PolyTraitRef<'hir>
{
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PolyTraitRef<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PolyTraitRef {
bound_generic_params: ref __binding_0,
modifiers: ref __binding_1,
trait_ref: ref __binding_2,
span: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4272pub struct PolyTraitRef<'hir> {
4273 pub bound_generic_params: &'hir [GenericParam<'hir>],
4275
4276 pub modifiers: TraitBoundModifiers,
4280
4281 pub trait_ref: TraitRef<'hir>,
4283
4284 pub span: Span,
4285}
4286
4287#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for FieldDef<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
"FieldDef span vis_span mut_restriction ident hir_id def_id ty safety default";
let values: &[&dyn ::core::fmt::Debug] =
&[&self.span, &self.vis_span, &self.mut_restriction, &self.ident,
&self.hir_id, &self.def_id, &self.ty, &self.safety,
&&self.default];
::core::fmt::Formatter::debug_struct_fields_finish(f, names, values)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for FieldDef<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for FieldDef<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir MutRestriction<'hir>>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<Safety>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir AnonConst>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for FieldDef<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
FieldDef<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FieldDef {
span: ref __binding_0,
vis_span: ref __binding_1,
mut_restriction: ref __binding_2,
ident: ref __binding_3,
hir_id: ref __binding_4,
def_id: ref __binding_5,
ty: ref __binding_6,
safety: ref __binding_7,
default: ref __binding_8 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{}
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
{ __binding_8.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4288pub struct FieldDef<'hir> {
4289 pub span: Span,
4290 pub vis_span: Span,
4291 pub mut_restriction: &'hir MutRestriction<'hir>,
4292 pub ident: Ident,
4293 #[stable_hash(ignore)]
4294 pub hir_id: HirId,
4295 pub def_id: LocalDefId,
4296 pub ty: &'hir Ty<'hir>,
4297 pub safety: Safety,
4298 pub default: Option<&'hir AnonConst>,
4299}
4300
4301impl FieldDef<'_> {
4302 pub fn is_positional(&self) -> bool {
4304 self.ident.as_str().as_bytes()[0].is_ascii_digit()
4305 }
4306}
4307
4308#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for VariantData<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Struct { fields: __self_0, recovered: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Struct fields recovered", __self_0, &__self_1),
Self::Tuple(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Tuple",
__self_0, __self_1, &__self_2),
Self::Unit(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Unit",
__self_0, &__self_1),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for VariantData<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for VariantData<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [FieldDef<'hir>]>;
let _: ::core::clone::AssertParamIsClone<ast::Recovered>;
let _: ::core::clone::AssertParamIsClone<&'hir [FieldDef<'hir>]>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for VariantData<'hir>
{
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
VariantData<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
VariantData::Struct {
fields: ref __binding_0, recovered: ref __binding_1 } =>
0u8.stable_hash(__hcx, __hasher),
VariantData::Tuple(ref __binding_0, ref __binding_1,
ref __binding_2) => 1u8.stable_hash(__hcx, __hasher),
VariantData::Unit(ref __binding_0, ref __binding_1) =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
VariantData::Struct {
fields: ref __binding_0, recovered: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
VariantData::Tuple(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{}
{ __binding_2.stable_hash(__hcx, __hasher); }
}
VariantData::Unit(ref __binding_0, ref __binding_1) => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4310pub enum VariantData<'hir> {
4311 Struct { fields: &'hir [FieldDef<'hir>], recovered: ast::Recovered },
4315 Tuple(&'hir [FieldDef<'hir>], #[stable_hash(ignore)] HirId, LocalDefId),
4319 Unit(#[stable_hash(ignore)] HirId, LocalDefId),
4323}
4324
4325impl<'hir> VariantData<'hir> {
4326 pub fn fields(&self) -> &'hir [FieldDef<'hir>] {
4328 match *self {
4329 VariantData::Struct { fields, .. } | VariantData::Tuple(fields, ..) => fields,
4330 _ => &[],
4331 }
4332 }
4333
4334 pub fn ctor(&self) -> Option<(CtorKind, HirId, LocalDefId)> {
4335 match *self {
4336 VariantData::Tuple(_, hir_id, def_id) => Some((CtorKind::Fn, hir_id, def_id)),
4337 VariantData::Unit(hir_id, def_id) => Some((CtorKind::Const, hir_id, def_id)),
4338 VariantData::Struct { .. } => None,
4339 }
4340 }
4341
4342 #[inline]
4343 pub fn ctor_kind(&self) -> Option<CtorKind> {
4344 self.ctor().map(|(kind, ..)| kind)
4345 }
4346
4347 #[inline]
4349 pub fn ctor_hir_id(&self) -> Option<HirId> {
4350 self.ctor().map(|(_, hir_id, _)| hir_id)
4351 }
4352
4353 #[inline]
4355 pub fn ctor_def_id(&self) -> Option<LocalDefId> {
4356 self.ctor().map(|(.., def_id)| def_id)
4357 }
4358}
4359
4360#[derive(#[automatically_derived]impl ::core::marker::Copy for ItemId { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ItemId {
}
#[automatically_derived]impl ::core::clone::Clone for ItemId {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<OwnerId>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for ItemId {
}
#[automatically_derived]impl ::core::cmp::PartialEq for ItemId {
#[inline]
fn eq(&self, other: &Self) -> bool { self.owner_id == other.owner_id }
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for ItemId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<OwnerId>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ItemId {
fn encode(&self, __encoder: &mut __E) {
let ItemId { owner_id: ref __binding_0 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ItemId {
fn decode(__decoder: &mut __D) -> Self {
ItemId {
owner_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]impl ::core::fmt::Debug for ItemId {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ItemId owner_id", &&self.owner_id)
}
}Debug, #[automatically_derived]impl ::core::hash::Hash for ItemId {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.owner_id, state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ItemId {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ItemId { owner_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4364pub struct ItemId {
4365 pub owner_id: OwnerId,
4366}
4367
4368impl ItemId {
4369 #[inline]
4370 pub fn hir_id(&self) -> HirId {
4371 HirId::make_owner(self.owner_id.def_id)
4373 }
4374}
4375
4376#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Item<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"Item owner_id kind span vis_span eii", &self.owner_id,
&self.kind, &self.span, &self.vis_span, &&self.eii)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Item<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Item<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<OwnerId>;
let _: ::core::clone::AssertParamIsClone<ItemKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Item<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Item<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Item {
owner_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2,
vis_span: ref __binding_3,
eii: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4385pub struct Item<'hir> {
4386 pub owner_id: OwnerId,
4387 pub kind: ItemKind<'hir>,
4388 pub span: Span,
4389 pub vis_span: Span,
4390 pub eii: bool,
4393}
4394
4395impl<'hir> Item<'hir> {
4396 #[inline]
4397 pub fn hir_id(&self) -> HirId {
4398 HirId::make_owner(self.owner_id.def_id)
4400 }
4401
4402 #[inline]
4403 pub fn item_id(&self) -> ItemId {
4404 ItemId { owner_id: self.owner_id }
4405 }
4406
4407 pub fn is_adt(&self) -> bool {
4410 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..) => true,
_ => false,
}matches!(self.kind, ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..))
4411 }
4412
4413 pub fn is_struct_or_union(&self) -> bool {
4415 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
ItemKind::Struct(..) | ItemKind::Union(..) => true,
_ => false,
}matches!(self.kind, ItemKind::Struct(..) | ItemKind::Union(..))
4416 }
4417
4418 #[track_caller]
pub fn expect_extern_crate(&self) -> (Option<Symbol>, Ident) {
let ItemKind::ExternCrate(s, ident) =
&self.kind else { expect_failed("expect_extern_crate", self) };
(*s, *ident)
}
#[track_caller]
pub fn expect_use(&self) -> UseTree<'hir> {
let ItemKind::Use(ut) =
&self.kind else { expect_failed("expect_use", self) };
*ut
}
#[track_caller]
pub fn expect_static(&self) -> (Mutability, Ident, &'hir Ty<'hir>, BodyId) {
let ItemKind::Static(mutbl, ident, ty, body) =
&self.kind else { expect_failed("expect_static", self) };
(*mutbl, *ident, ty, *body)
}
#[track_caller]
pub fn expect_const(&self)
-> (Ident, &'hir Generics<'hir>, &'hir Ty<'hir>, ConstItemRhs<'hir>) {
let ItemKind::Const(ident, generics, ty, rhs) =
&self.kind else { expect_failed("expect_const", self) };
(*ident, generics, ty, *rhs)
}
#[track_caller]
pub fn expect_fn(&self)
-> (Ident, &FnSig<'hir>, &'hir Generics<'hir>, BodyId) {
let ItemKind::Fn { ident, sig, generics, body, .. } =
&self.kind else { expect_failed("expect_fn", self) };
(*ident, sig, generics, *body)
}
#[track_caller]
pub fn expect_macro(&self) -> (Ident, &ast::MacroDef, MacroKinds) {
let ItemKind::Macro(ident, def, mk) =
&self.kind else { expect_failed("expect_macro", self) };
(*ident, def, *mk)
}
#[track_caller]
pub fn expect_mod(&self) -> (Ident, &'hir Mod<'hir>) {
let ItemKind::Mod(ident, m) =
&self.kind else { expect_failed("expect_mod", self) };
(*ident, m)
}
#[track_caller]
pub fn expect_foreign_mod(&self) -> (ExternAbi, &'hir [ForeignItemId]) {
let ItemKind::ForeignMod { abi, items } =
&self.kind else { expect_failed("expect_foreign_mod", self) };
(*abi, items)
}
#[track_caller]
pub fn expect_global_asm(&self) -> &'hir InlineAsm<'hir> {
let ItemKind::GlobalAsm { asm, .. } =
&self.kind else { expect_failed("expect_global_asm", self) };
asm
}
#[track_caller]
pub fn expect_ty_alias(&self)
-> (Ident, &'hir Generics<'hir>, &'hir Ty<'hir>) {
let ItemKind::TyAlias(ident, generics, ty) =
&self.kind else { expect_failed("expect_ty_alias", self) };
(*ident, generics, ty)
}
#[track_caller]
pub fn expect_enum(&self) -> (Ident, &'hir Generics<'hir>, &EnumDef<'hir>) {
let ItemKind::Enum(ident, generics, def) =
&self.kind else { expect_failed("expect_enum", self) };
(*ident, generics, def)
}
#[track_caller]
pub fn expect_struct(&self)
-> (Ident, &'hir Generics<'hir>, &VariantData<'hir>) {
let ItemKind::Struct(ident, generics, data) =
&self.kind else { expect_failed("expect_struct", self) };
(*ident, generics, data)
}
#[track_caller]
pub fn expect_union(&self)
-> (Ident, &'hir Generics<'hir>, &VariantData<'hir>) {
let ItemKind::Union(ident, generics, data) =
&self.kind else { expect_failed("expect_union", self) };
(*ident, generics, data)
}
#[track_caller]
pub fn expect_trait(&self)
->
(&'hir ImplRestriction<'hir>, Constness, IsAuto, Safety, Ident,
&'hir Generics<'hir>, GenericBounds<'hir>, &'hir [TraitItemId]) {
let ItemKind::Trait {
impl_restriction,
constness,
is_auto,
safety,
ident,
generics,
bounds,
items } = &self.kind else { expect_failed("expect_trait", self) };
(impl_restriction, *constness, *is_auto, *safety, *ident, generics,
bounds, items)
}
#[track_caller]
pub fn expect_trait_alias(&self)
-> (Constness, Ident, &'hir Generics<'hir>, GenericBounds<'hir>) {
let ItemKind::TraitAlias(constness, ident, generics, bounds) =
&self.kind else { expect_failed("expect_trait_alias", self) };
(*constness, *ident, generics, bounds)
}
#[track_caller]
pub fn expect_impl(&self) -> &Impl<'hir> {
let ItemKind::Impl(imp) =
&self.kind else { expect_failed("expect_impl", self) };
imp
}
#[track_caller]
pub fn expect_test_binder_constraints(&self)
-> (&'hir Generics<'hir>, &'hir TestBinderBody<'hir>) {
let ItemKind::TestBinderConstraints { generics, body } =
&self.kind else {
expect_failed("expect_test_binder_constraints", self)
};
(generics, body)
}expect_methods_self_kind! {
4419 expect_extern_crate, (Option<Symbol>, Ident),
4420 ItemKind::ExternCrate(s, ident), (*s, *ident);
4421
4422 expect_use, UseTree<'hir>, ItemKind::Use(ut), *ut;
4423
4424 expect_static, (Mutability, Ident, &'hir Ty<'hir>, BodyId),
4425 ItemKind::Static(mutbl, ident, ty, body), (*mutbl, *ident, ty, *body);
4426
4427 expect_const, (Ident, &'hir Generics<'hir>, &'hir Ty<'hir>, ConstItemRhs<'hir>),
4428 ItemKind::Const(ident, generics, ty, rhs), (*ident, generics, ty, *rhs);
4429
4430 expect_fn, (Ident, &FnSig<'hir>, &'hir Generics<'hir>, BodyId),
4431 ItemKind::Fn { ident, sig, generics, body, .. }, (*ident, sig, generics, *body);
4432
4433 expect_macro, (Ident, &ast::MacroDef, MacroKinds),
4434 ItemKind::Macro(ident, def, mk), (*ident, def, *mk);
4435
4436 expect_mod, (Ident, &'hir Mod<'hir>), ItemKind::Mod(ident, m), (*ident, m);
4437
4438 expect_foreign_mod, (ExternAbi, &'hir [ForeignItemId]),
4439 ItemKind::ForeignMod { abi, items }, (*abi, items);
4440
4441 expect_global_asm, &'hir InlineAsm<'hir>, ItemKind::GlobalAsm { asm, .. }, asm;
4442
4443 expect_ty_alias, (Ident, &'hir Generics<'hir>, &'hir Ty<'hir>),
4444 ItemKind::TyAlias(ident, generics, ty), (*ident, generics, ty);
4445
4446 expect_enum, (Ident, &'hir Generics<'hir>, &EnumDef<'hir>),
4447 ItemKind::Enum(ident, generics, def), (*ident, generics, def);
4448
4449 expect_struct, (Ident, &'hir Generics<'hir>, &VariantData<'hir>),
4450 ItemKind::Struct(ident, generics, data), (*ident, generics, data);
4451
4452 expect_union, (Ident, &'hir Generics<'hir>, &VariantData<'hir>),
4453 ItemKind::Union(ident, generics, data), (*ident, generics, data);
4454
4455 expect_trait,
4456 (
4457 &'hir ImplRestriction<'hir>,
4458 Constness,
4459 IsAuto,
4460 Safety,
4461 Ident,
4462 &'hir Generics<'hir>,
4463 GenericBounds<'hir>,
4464 &'hir [TraitItemId]
4465 ),
4466 ItemKind::Trait { impl_restriction, constness, is_auto, safety, ident, generics, bounds, items },
4467 (impl_restriction, *constness, *is_auto, *safety, *ident, generics, bounds, items);
4468
4469 expect_trait_alias, (Constness, Ident, &'hir Generics<'hir>, GenericBounds<'hir>),
4470 ItemKind::TraitAlias(constness, ident, generics, bounds), (*constness, *ident, generics, bounds);
4471
4472 expect_impl, &Impl<'hir>, ItemKind::Impl(imp), imp;
4473
4474 expect_test_binder_constraints, (&'hir Generics<'hir>, &'hir TestBinderBody<'hir>),
4475 ItemKind::TestBinderConstraints { generics, body }, (generics, body);
4476 }
4477}
4478
4479#[derive(#[automatically_derived]impl ::core::marker::Copy for Safety { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for Safety {
}
#[automatically_derived]impl ::core::clone::Clone for Safety {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for Safety {
}
#[automatically_derived]impl ::core::cmp::PartialEq for Safety {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for Safety { }Eq, #[automatically_derived]impl ::core::cmp::PartialOrd for Safety {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]impl ::core::cmp::Ord for Safety {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}Ord, #[automatically_derived]impl ::core::hash::Hash for Safety {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]impl ::core::fmt::Debug for Safety {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
Safety::Unsafe => "Unsafe",
Safety::Safe => "Safe",
})
}
}Debug)]
4480#[derive(const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Safety {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Safety::Unsafe => { 0usize }
Safety::Safe => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Safety {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { Safety::Unsafe }
1usize => { Safety::Safe }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Safety`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Safety {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Safety::Unsafe => 0u8.stable_hash(__hcx, __hasher),
Safety::Safe => 1u8.stable_hash(__hcx, __hasher),
}
match *self { Safety::Unsafe => {} Safety::Safe => {} }
}
}
};StableHash, #[automatically_derived]impl ::core::default::Default for Safety {
#[inline]
fn default() -> Self { Self::Unsafe }
}Default)]
4481pub enum Safety {
4482 #[default]
4487 Unsafe,
4488 Safe,
4489}
4490
4491impl Safety {
4492 pub fn prefix_str(self) -> &'static str {
4493 match self {
4494 Self::Unsafe => "unsafe ",
4495 Self::Safe => "",
4496 }
4497 }
4498
4499 #[inline]
4500 pub fn is_unsafe(self) -> bool {
4501 !self.is_safe()
4502 }
4503
4504 #[inline]
4505 pub fn is_safe(self) -> bool {
4506 match self {
4507 Self::Unsafe => false,
4508 Self::Safe => true,
4509 }
4510 }
4511}
4512
4513impl fmt::Display for Safety {
4514 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4515 f.write_str(match *self {
4516 Self::Unsafe => "unsafe",
4517 Self::Safe => "safe",
4518 })
4519 }
4520}
4521
4522#[derive(#[automatically_derived]impl ::core::marker::Copy for Constness { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for Constness {
}
#[automatically_derived]impl ::core::clone::Clone for Constness {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for Constness
{
}
#[automatically_derived]impl ::core::cmp::PartialEq for Constness {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Const { always: __self_0 }, Self::Const {
always: __arg1_0 }) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for Constness {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, #[automatically_derived]impl ::core::fmt::Debug for Constness {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Const { always: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Const always", &__self_0),
Self::NotConst =>
::core::fmt::Formatter::write_str(f, "NotConst"),
}
}
}Debug, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Constness {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Constness::Const { always: ref __binding_0 } => { 0usize }
Constness::NotConst => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
Constness::Const { always: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Constness::NotConst => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Constness {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
Constness::Const {
always: ::rustc_serialize::Decodable::decode(__decoder),
}
}
1usize => { Constness::NotConst }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Constness`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Constness {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Constness::Const { always: ref __binding_0 } =>
0u8.stable_hash(__hcx, __hasher),
Constness::NotConst => 1u8.stable_hash(__hcx, __hasher),
}
match *self {
Constness::Const { always: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Constness::NotConst => {}
}
}
}
};StableHash)]
4523pub enum Constness {
4524 Const { always: bool },
4525 NotConst,
4526}
4527
4528impl Default for Constness {
4531 fn default() -> Self {
4532 Self::Const { always: false }
4533 }
4534}
4535
4536impl fmt::Display for Constness {
4537 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4538 f.write_str(match *self {
4539 Self::Const { always: true } => "comptime",
4540 Self::Const { always: false } => "const",
4541 Self::NotConst => "non-const",
4542 })
4543 }
4544}
4545
4546#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
ImplRestriction<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ImplRestriction kind span", &self.kind, &&self.span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for ImplRestriction<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
ImplRestriction<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<RestrictionKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
ImplRestriction<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ImplRestriction<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ImplRestriction {
kind: ref __binding_0, span: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4547pub struct ImplRestriction<'hir> {
4548 pub kind: RestrictionKind<'hir>,
4549 pub span: Span,
4550}
4551
4552#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for MutRestriction<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"MutRestriction kind span", &self.kind, &&self.span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for MutRestriction<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
MutRestriction<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<RestrictionKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
MutRestriction<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
MutRestriction<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
MutRestriction {
kind: ref __binding_0, span: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4553pub struct MutRestriction<'hir> {
4554 pub kind: RestrictionKind<'hir>,
4555 pub span: Span,
4556}
4557
4558#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
RestrictionKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Unrestricted =>
::core::fmt::Formatter::write_str(f, "Unrestricted"),
Self::Restricted(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Restricted", &__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for RestrictionKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
RestrictionKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Path<'hir, DefId>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
RestrictionKind<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
RestrictionKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
RestrictionKind::Unrestricted =>
0u8.stable_hash(__hcx, __hasher),
RestrictionKind::Restricted(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
RestrictionKind::Unrestricted => {}
RestrictionKind::Restricted(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4559pub enum RestrictionKind<'hir> {
4560 Unrestricted,
4562 Restricted(&'hir Path<'hir, DefId>),
4566}
4567
4568#[derive(#[automatically_derived]impl ::core::marker::Copy for HeaderSafety { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for HeaderSafety {
}
#[automatically_derived]impl ::core::clone::Clone for HeaderSafety {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Safety>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for HeaderSafety {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::SafeTargetFeatures =>
::core::fmt::Formatter::write_str(f, "SafeTargetFeatures"),
Self::Normal(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Normal", &__self_0),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for HeaderSafety
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
HeaderSafety::SafeTargetFeatures =>
0u8.stable_hash(__hcx, __hasher),
HeaderSafety::Normal(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
HeaderSafety::SafeTargetFeatures => {}
HeaderSafety::Normal(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
HeaderSafety {
}
#[automatically_derived]impl ::core::cmp::PartialEq for HeaderSafety {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Normal(__self_0), Self::Normal(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for HeaderSafety {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Safety>;
}
}Eq)]
4573pub enum HeaderSafety {
4574 SafeTargetFeatures,
4580 Normal(Safety),
4581}
4582
4583impl From<Safety> for HeaderSafety {
4584 fn from(v: Safety) -> Self {
4585 Self::Normal(v)
4586 }
4587}
4588
4589#[derive(#[automatically_derived]impl ::core::marker::Copy for FnHeader { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for FnHeader {
}
#[automatically_derived]impl ::core::clone::Clone for FnHeader {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HeaderSafety>;
let _: ::core::clone::AssertParamIsClone<Constness>;
let _: ::core::clone::AssertParamIsClone<IsAsync>;
let _: ::core::clone::AssertParamIsClone<ExternAbi>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for FnHeader {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"FnHeader safety constness asyncness abi", &self.safety,
&self.constness, &self.asyncness, &&self.abi)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for FnHeader {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnHeader {
safety: ref __binding_0,
constness: ref __binding_1,
asyncness: ref __binding_2,
abi: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4590pub struct FnHeader {
4591 pub safety: HeaderSafety,
4592 pub constness: Constness,
4593 pub asyncness: IsAsync,
4594 pub abi: ExternAbi,
4595}
4596
4597impl FnHeader {
4598 pub fn is_async(&self) -> bool {
4599 #[allow(non_exhaustive_omitted_patterns)] match self.asyncness {
IsAsync::Async(_) => true,
_ => false,
}matches!(self.asyncness, IsAsync::Async(_))
4600 }
4601
4602 pub fn is_unsafe(&self) -> bool {
4603 self.safety().is_unsafe()
4604 }
4605
4606 pub fn is_safe(&self) -> bool {
4607 self.safety().is_safe()
4608 }
4609
4610 pub fn safety(&self) -> Safety {
4611 match self.safety {
4612 HeaderSafety::SafeTargetFeatures => Safety::Unsafe,
4613 HeaderSafety::Normal(safety) => safety,
4614 }
4615 }
4616}
4617
4618#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for TestBinderBody<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TestBinderBody span items", &self.span, &&self.items)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TestBinderBody<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
TestBinderBody<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _:
::core::clone::AssertParamIsClone<&'hir [TestBinderItem<'hir>]>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
TestBinderBody<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TestBinderBody<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TestBinderBody {
span: ref __binding_0, items: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4619pub struct TestBinderBody<'hir> {
4620 pub span: Span,
4621 pub items: &'hir [TestBinderItem<'hir>],
4622}
4623
4624#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for TestBinderItem<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Forall(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Forall", &__self_0),
Self::Exists(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Exists", &__self_0),
Self::RegionEquality { lhs: __self_0, rhs: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"RegionEquality lhs rhs", __self_0, &__self_1),
Self::Constraint(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Constraint", &__self_0),
Self::Predicate(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Predicate", &__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TestBinderItem<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
TestBinderItem<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<TestBinderForall<'hir>>;
let _: ::core::clone::AssertParamIsClone<TestBinderExists<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<TestBinderConstraint<'hir>>;
let _: ::core::clone::AssertParamIsClone<WherePredicate<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
TestBinderItem<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TestBinderItem<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TestBinderItem::Forall(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
TestBinderItem::Exists(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
TestBinderItem::RegionEquality {
lhs: ref __binding_0, rhs: ref __binding_1 } =>
2u8.stable_hash(__hcx, __hasher),
TestBinderItem::Constraint(ref __binding_0) =>
3u8.stable_hash(__hcx, __hasher),
TestBinderItem::Predicate(ref __binding_0) =>
4u8.stable_hash(__hcx, __hasher),
}
match *self {
TestBinderItem::Forall(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TestBinderItem::Exists(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TestBinderItem::RegionEquality {
lhs: ref __binding_0, rhs: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TestBinderItem::Constraint(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TestBinderItem::Predicate(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4625pub enum TestBinderItem<'hir> {
4626 Forall(TestBinderForall<'hir>),
4627 Exists(TestBinderExists<'hir>),
4628 RegionEquality {
4629 lhs: &'hir Lifetime,
4630 rhs: &'hir Lifetime,
4631 },
4632 Constraint(TestBinderConstraint<'hir>),
4634 Predicate(WherePredicate<'hir>),
4636}
4637#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
TestBinderForall<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"TestBinderForall span hir_id generics body assert_on_exit",
&self.span, &self.hir_id, &self.generics, &self.body,
&&self.assert_on_exit)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TestBinderForall<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
TestBinderForall<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TestBinderBody<'hir>>;
let _:
::core::clone::AssertParamIsClone<Option<&'hir TestBinderConstraint<'hir>>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
TestBinderForall<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TestBinderForall<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TestBinderForall {
span: ref __binding_0,
hir_id: ref __binding_1,
generics: ref __binding_2,
body: ref __binding_3,
assert_on_exit: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4638pub struct TestBinderForall<'hir> {
4639 pub span: Span,
4640 pub hir_id: HirId,
4641 pub generics: &'hir Generics<'hir>,
4642 pub body: &'hir TestBinderBody<'hir>,
4643 pub assert_on_exit: Option<&'hir TestBinderConstraint<'hir>>,
4644}
4645
4646#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
TestBinderExists<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"TestBinderExists span hir_id params body", &self.span,
&self.hir_id, &self.params, &&self.body)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TestBinderExists<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
TestBinderExists<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir TestBinderBody<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
TestBinderExists<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TestBinderExists<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TestBinderExists {
span: ref __binding_0,
hir_id: ref __binding_1,
params: ref __binding_2,
body: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4647pub struct TestBinderExists<'hir> {
4648 pub span: Span,
4649 pub hir_id: HirId,
4650 pub params: &'hir [GenericParam<'hir>],
4651 pub body: &'hir TestBinderBody<'hir>,
4652}
4653
4654#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
TestBinderConstraint<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::And { items: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"And items", &__self_0),
Self::Or { items: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Or items", &__self_0),
Self::Ambiguity { span: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Ambiguity span", &__self_0),
Self::Lifetime { lhs: __self_0, rhs: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Lifetime lhs rhs", __self_0, &__self_1),
Self::PlaceholderOutlives { lhs: __self_0, rhs: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"PlaceholderOutlives lhs rhs", __self_0, &__self_1),
Self::AliasOutlives { bound_type_constraint: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"AliasOutlives bound_type_constraint", &__self_0),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TestBinderConstraint<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
TestBinderConstraint<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _:
::core::clone::AssertParamIsClone<&'hir [TestBinderConstraint<'hir>]>;
let _:
::core::clone::AssertParamIsClone<&'hir [TestBinderConstraint<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _:
::core::clone::AssertParamIsClone<&'hir TestBinderBoundTypeConstraint<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
TestBinderConstraint<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TestBinderConstraint<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TestBinderConstraint::And { items: ref __binding_0 } =>
0u8.stable_hash(__hcx, __hasher),
TestBinderConstraint::Or { items: ref __binding_0 } =>
1u8.stable_hash(__hcx, __hasher),
TestBinderConstraint::Ambiguity { span: ref __binding_0 } =>
2u8.stable_hash(__hcx, __hasher),
TestBinderConstraint::Lifetime {
lhs: ref __binding_0, rhs: ref __binding_1 } =>
3u8.stable_hash(__hcx, __hasher),
TestBinderConstraint::PlaceholderOutlives {
lhs: ref __binding_0, rhs: ref __binding_1 } =>
4u8.stable_hash(__hcx, __hasher),
TestBinderConstraint::AliasOutlives {
bound_type_constraint: ref __binding_0 } =>
5u8.stable_hash(__hcx, __hasher),
}
match *self {
TestBinderConstraint::And { items: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TestBinderConstraint::Or { items: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TestBinderConstraint::Ambiguity { span: ref __binding_0 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TestBinderConstraint::Lifetime {
lhs: ref __binding_0, rhs: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TestBinderConstraint::PlaceholderOutlives {
lhs: ref __binding_0, rhs: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TestBinderConstraint::AliasOutlives {
bound_type_constraint: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4655pub enum TestBinderConstraint<'hir> {
4656 And { items: &'hir [TestBinderConstraint<'hir>] },
4657 Or { items: &'hir [TestBinderConstraint<'hir>] },
4658 Ambiguity { span: Span },
4659 Lifetime { lhs: &'hir Lifetime, rhs: &'hir Lifetime },
4660 PlaceholderOutlives { lhs: &'hir Ty<'hir>, rhs: &'hir Lifetime },
4661 AliasOutlives { bound_type_constraint: &'hir TestBinderBoundTypeConstraint<'hir> },
4662}
4663
4664#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
TestBinderBoundTypeConstraint<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"TestBinderBoundTypeConstraint span hir_id params lhs rhs",
&self.span, &self.hir_id, &self.params, &self.lhs, &&self.rhs)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TestBinderBoundTypeConstraint<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
TestBinderBoundTypeConstraint<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
TestBinderBoundTypeConstraint<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TestBinderBoundTypeConstraint<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TestBinderBoundTypeConstraint {
span: ref __binding_0,
hir_id: ref __binding_1,
params: ref __binding_2,
lhs: ref __binding_3,
rhs: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4665pub struct TestBinderBoundTypeConstraint<'hir> {
4666 pub span: Span,
4667 pub hir_id: HirId,
4668 pub params: &'hir [GenericParam<'hir>],
4669 pub lhs: &'hir Ty<'hir>,
4670 pub rhs: &'hir Lifetime,
4671}
4672
4673#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for ItemKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::ExternCrate(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ExternCrate", __self_0, &__self_1),
Self::Use(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Use",
&__self_0),
Self::Static(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_struct_field4_finish(f,
"Static", __self_0, __self_1, __self_2, &__self_3),
Self::Const(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_struct_field4_finish(f, "Const",
__self_0, __self_1, __self_2, &__self_3),
Self::Fn {
sig: __self_0,
ident: __self_1,
generics: __self_2,
body: __self_3,
has_body: __self_4 } =>
::core::fmt::Formatter::debug_struct_field5_finish(f,
"Fn sig ident generics body has_body", __self_0, __self_1,
__self_2, __self_3, &__self_4),
Self::Macro(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Macro",
__self_0, __self_1, &__self_2),
Self::Mod(__self_0, __self_1) =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Mod",
__self_0, &__self_1),
Self::ForeignMod { abi: __self_0, items: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ForeignMod abi items", __self_0, &__self_1),
Self::GlobalAsm { asm: __self_0, fake_body: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"GlobalAsm asm fake_body", __self_0, &__self_1),
Self::TyAlias(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"TyAlias", __self_0, __self_1, &__self_2),
Self::Enum(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Enum",
__self_0, __self_1, &__self_2),
Self::Struct(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Struct", __self_0, __self_1, &__self_2),
Self::Union(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Union",
__self_0, __self_1, &__self_2),
Self::Trait {
impl_restriction: __self_0,
constness: __self_1,
is_auto: __self_2,
safety: __self_3,
ident: __self_4,
generics: __self_5,
bounds: __self_6,
items: __self_7 } => {
let names: &'static _ =
"Trait impl_restriction constness is_auto safety ident generics bounds items";
let values: &[&dyn ::core::fmt::Debug] =
&[__self_0, __self_1, __self_2, __self_3, __self_4,
__self_5, __self_6, &__self_7];
::core::fmt::Formatter::debug_struct_fields_finish(f, names,
values)
}
Self::TraitAlias(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_struct_field4_finish(f,
"TraitAlias", __self_0, __self_1, __self_2, &__self_3),
Self::Impl(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Impl",
&__self_0),
Self::TestBinderConstraints { generics: __self_0, body: __self_1 }
=>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TestBinderConstraints generics body", __self_0, &__self_1),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for ItemKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for ItemKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<Symbol>>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<UseTree<'hir>>;
let _: ::core::clone::AssertParamIsClone<Mutability>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<ConstItemRhs<'hir>>;
let _: ::core::clone::AssertParamIsClone<FnSig<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<&'hir ast::MacroDef>;
let _: ::core::clone::AssertParamIsClone<MacroKinds>;
let _: ::core::clone::AssertParamIsClone<&'hir Mod<'hir>>;
let _: ::core::clone::AssertParamIsClone<ExternAbi>;
let _: ::core::clone::AssertParamIsClone<&'hir [ForeignItemId]>;
let _: ::core::clone::AssertParamIsClone<&'hir InlineAsm<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<EnumDef<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<VariantData<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<VariantData<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ImplRestriction<'hir>>;
let _: ::core::clone::AssertParamIsClone<Constness>;
let _: ::core::clone::AssertParamIsClone<IsAuto>;
let _: ::core::clone::AssertParamIsClone<Safety>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [TraitItemId]>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
let _: ::core::clone::AssertParamIsClone<Impl<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TestBinderBody<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for ItemKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ItemKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ItemKind::ExternCrate(ref __binding_0, ref __binding_1) =>
0u8.stable_hash(__hcx, __hasher),
ItemKind::Use(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
ItemKind::Static(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) =>
2u8.stable_hash(__hcx, __hasher),
ItemKind::Const(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) =>
3u8.stable_hash(__hcx, __hasher),
ItemKind::Fn {
sig: ref __binding_0,
ident: ref __binding_1,
generics: ref __binding_2,
body: ref __binding_3,
has_body: ref __binding_4 } =>
4u8.stable_hash(__hcx, __hasher),
ItemKind::Macro(ref __binding_0, ref __binding_1,
ref __binding_2) => 5u8.stable_hash(__hcx, __hasher),
ItemKind::Mod(ref __binding_0, ref __binding_1) =>
6u8.stable_hash(__hcx, __hasher),
ItemKind::ForeignMod {
abi: ref __binding_0, items: ref __binding_1 } =>
7u8.stable_hash(__hcx, __hasher),
ItemKind::GlobalAsm {
asm: ref __binding_0, fake_body: ref __binding_1 } =>
8u8.stable_hash(__hcx, __hasher),
ItemKind::TyAlias(ref __binding_0, ref __binding_1,
ref __binding_2) => 9u8.stable_hash(__hcx, __hasher),
ItemKind::Enum(ref __binding_0, ref __binding_1,
ref __binding_2) => 10u8.stable_hash(__hcx, __hasher),
ItemKind::Struct(ref __binding_0, ref __binding_1,
ref __binding_2) => 11u8.stable_hash(__hcx, __hasher),
ItemKind::Union(ref __binding_0, ref __binding_1,
ref __binding_2) => 12u8.stable_hash(__hcx, __hasher),
ItemKind::Trait {
impl_restriction: ref __binding_0,
constness: ref __binding_1,
is_auto: ref __binding_2,
safety: ref __binding_3,
ident: ref __binding_4,
generics: ref __binding_5,
bounds: ref __binding_6,
items: ref __binding_7 } =>
13u8.stable_hash(__hcx, __hasher),
ItemKind::TraitAlias(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) =>
14u8.stable_hash(__hcx, __hasher),
ItemKind::Impl(ref __binding_0) =>
15u8.stable_hash(__hcx, __hasher),
ItemKind::TestBinderConstraints {
generics: ref __binding_0, body: ref __binding_1 } =>
16u8.stable_hash(__hcx, __hasher),
}
match *self {
ItemKind::ExternCrate(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ItemKind::Use(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ItemKind::Static(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
ItemKind::Const(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
ItemKind::Fn {
sig: ref __binding_0,
ident: ref __binding_1,
generics: ref __binding_2,
body: ref __binding_3,
has_body: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
ItemKind::Macro(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ItemKind::Mod(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ItemKind::ForeignMod {
abi: ref __binding_0, items: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ItemKind::GlobalAsm {
asm: ref __binding_0, fake_body: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ItemKind::TyAlias(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ItemKind::Enum(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ItemKind::Struct(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ItemKind::Union(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ItemKind::Trait {
impl_restriction: ref __binding_0,
constness: ref __binding_1,
is_auto: ref __binding_2,
safety: ref __binding_3,
ident: ref __binding_4,
generics: ref __binding_5,
bounds: ref __binding_6,
items: ref __binding_7 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
}
ItemKind::TraitAlias(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
ItemKind::Impl(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ItemKind::TestBinderConstraints {
generics: ref __binding_0, body: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4674pub enum ItemKind<'hir> {
4675 ExternCrate(Option<Symbol>, Ident),
4679
4680 Use(UseTree<'hir>),
4686
4687 Static(Mutability, Ident, &'hir Ty<'hir>, BodyId),
4689 Const(Ident, &'hir Generics<'hir>, &'hir Ty<'hir>, ConstItemRhs<'hir>),
4691 Fn {
4693 sig: FnSig<'hir>,
4694 ident: Ident,
4695 generics: &'hir Generics<'hir>,
4696 body: BodyId,
4697 has_body: bool,
4701 },
4702 Macro(Ident, &'hir ast::MacroDef, MacroKinds),
4704 Mod(Ident, &'hir Mod<'hir>),
4706 ForeignMod {
4708 abi: ExternAbi,
4709 items: &'hir [ForeignItemId],
4710 },
4711 GlobalAsm {
4713 asm: &'hir InlineAsm<'hir>,
4714 fake_body: BodyId,
4720 },
4721 TyAlias(Ident, &'hir Generics<'hir>, &'hir Ty<'hir>),
4723 Enum(Ident, &'hir Generics<'hir>, EnumDef<'hir>),
4725 Struct(Ident, &'hir Generics<'hir>, VariantData<'hir>),
4727 Union(Ident, &'hir Generics<'hir>, VariantData<'hir>),
4729 Trait {
4731 impl_restriction: &'hir ImplRestriction<'hir>,
4732 constness: Constness,
4733 is_auto: IsAuto,
4734 safety: Safety,
4735 ident: Ident,
4736 generics: &'hir Generics<'hir>,
4737 bounds: GenericBounds<'hir>,
4738 items: &'hir [TraitItemId],
4739 },
4740 TraitAlias(Constness, Ident, &'hir Generics<'hir>, GenericBounds<'hir>),
4742
4743 Impl(Impl<'hir>),
4745
4746 TestBinderConstraints {
4747 generics: &'hir Generics<'hir>,
4748 body: &'hir TestBinderBody<'hir>,
4749 },
4750}
4751
4752#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for Impl<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"Impl generics of_trait self_ty items constness", &self.generics,
&self.of_trait, &self.self_ty, &self.items, &&self.constness)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Impl<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Impl<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _:
::core::clone::AssertParamIsClone<Option<&'hir TraitImplHeader<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [ImplItemId]>;
let _: ::core::clone::AssertParamIsClone<Constness>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for Impl<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Impl<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Impl {
generics: ref __binding_0,
of_trait: ref __binding_1,
self_ty: ref __binding_2,
items: ref __binding_3,
constness: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4757pub struct Impl<'hir> {
4758 pub generics: &'hir Generics<'hir>,
4759 pub of_trait: Option<&'hir TraitImplHeader<'hir>>,
4760 pub self_ty: &'hir Ty<'hir>,
4761 pub items: &'hir [ImplItemId],
4762 pub constness: Constness,
4763}
4764
4765#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
TraitImplHeader<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"TraitImplHeader safety polarity defaultness defaultness_span trait_ref",
&self.safety, &self.polarity, &self.defaultness,
&self.defaultness_span, &&self.trait_ref)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TraitImplHeader<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
TraitImplHeader<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Safety>;
let _: ::core::clone::AssertParamIsClone<ImplPolarity>;
let _: ::core::clone::AssertParamIsClone<Defaultness>;
let _: ::core::clone::AssertParamIsClone<Option<Span>>;
let _: ::core::clone::AssertParamIsClone<TraitRef<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
TraitImplHeader<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitImplHeader<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitImplHeader {
safety: ref __binding_0,
polarity: ref __binding_1,
defaultness: ref __binding_2,
defaultness_span: ref __binding_3,
trait_ref: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4766pub struct TraitImplHeader<'hir> {
4767 pub safety: Safety,
4768 pub polarity: ImplPolarity,
4769 pub defaultness: Defaultness,
4770 pub defaultness_span: Option<Span>,
4773 pub trait_ref: TraitRef<'hir>,
4774}
4775
4776impl ItemKind<'_> {
4777 pub fn ident(&self) -> Option<Ident> {
4778 match *self {
4779 ItemKind::ExternCrate(_, ident)
4780 | ItemKind::Use(UseTree { kind: UseKind::Single(ident), .. })
4781 | ItemKind::Static(_, ident, ..)
4782 | ItemKind::Const(ident, ..)
4783 | ItemKind::Fn { ident, .. }
4784 | ItemKind::Macro(ident, ..)
4785 | ItemKind::Mod(ident, ..)
4786 | ItemKind::TyAlias(ident, ..)
4787 | ItemKind::Enum(ident, ..)
4788 | ItemKind::Struct(ident, ..)
4789 | ItemKind::Union(ident, ..)
4790 | ItemKind::Trait { ident, .. }
4791 | ItemKind::TraitAlias(_, ident, ..) => Some(ident),
4792
4793 ItemKind::Use(UseTree { kind: UseKind::Glob | UseKind::Nested { .. }, .. })
4794 | ItemKind::ForeignMod { .. }
4795 | ItemKind::GlobalAsm { .. }
4796 | ItemKind::Impl(_)
4797 | ItemKind::TestBinderConstraints { .. } => None,
4798 }
4799 }
4800
4801 pub fn generics(&self) -> Option<&Generics<'_>> {
4802 Some(match self {
4803 ItemKind::Fn { generics, .. }
4804 | ItemKind::TyAlias(_, generics, _)
4805 | ItemKind::Const(_, generics, _, _)
4806 | ItemKind::Enum(_, generics, _)
4807 | ItemKind::Struct(_, generics, _)
4808 | ItemKind::Union(_, generics, _)
4809 | ItemKind::Trait { generics, .. }
4810 | ItemKind::TraitAlias(_, _, generics, _)
4811 | ItemKind::Impl(Impl { generics, .. })
4812 | ItemKind::TestBinderConstraints { generics, .. } => generics,
4813 _ => return None,
4814 })
4815 }
4816
4817 pub fn recovered(&self) -> bool {
4818 match self {
4819 ItemKind::Struct(
4820 _,
4821 _,
4822 VariantData::Struct { recovered: ast::Recovered::Yes(_), .. },
4823 ) => true,
4824 ItemKind::Union(
4825 _,
4826 _,
4827 VariantData::Struct { recovered: ast::Recovered::Yes(_), .. },
4828 ) => true,
4829 ItemKind::Enum(_, _, def) => def.variants.iter().any(|v| match v.data {
4830 VariantData::Struct { recovered: ast::Recovered::Yes(_), .. } => true,
4831 _ => false,
4832 }),
4833 _ => false,
4834 }
4835 }
4836}
4837
4838#[derive(#[automatically_derived]impl ::core::marker::Copy for ForeignItemId { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ForeignItemId {
}
#[automatically_derived]impl ::core::clone::Clone for ForeignItemId {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<OwnerId>;
*self
}
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
ForeignItemId {
}
#[automatically_derived]impl ::core::cmp::PartialEq for ForeignItemId {
#[inline]
fn eq(&self, other: &Self) -> bool { self.owner_id == other.owner_id }
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for ForeignItemId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<OwnerId>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ForeignItemId {
fn encode(&self, __encoder: &mut __E) {
let ForeignItemId { owner_id: ref __binding_0 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ForeignItemId {
fn decode(__decoder: &mut __D) -> Self {
ForeignItemId {
owner_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]impl ::core::fmt::Debug for ForeignItemId {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ForeignItemId owner_id", &&self.owner_id)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ForeignItemId {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ForeignItemId { owner_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4842pub struct ForeignItemId {
4843 pub owner_id: OwnerId,
4844}
4845
4846impl ForeignItemId {
4847 #[inline]
4848 pub fn hir_id(&self) -> HirId {
4849 HirId::make_owner(self.owner_id.def_id)
4851 }
4852}
4853
4854#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for ForeignItem<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"ForeignItem ident kind owner_id span vis_span", &self.ident,
&self.kind, &self.owner_id, &self.span, &&self.vis_span)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for ForeignItem<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for ForeignItem<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<ForeignItemKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<OwnerId>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for ForeignItem<'hir>
{
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ForeignItem<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ForeignItem {
ident: ref __binding_0,
kind: ref __binding_1,
owner_id: ref __binding_2,
span: ref __binding_3,
vis_span: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4855pub struct ForeignItem<'hir> {
4856 pub ident: Ident,
4857 pub kind: ForeignItemKind<'hir>,
4858 pub owner_id: OwnerId,
4859 pub span: Span,
4860 pub vis_span: Span,
4861}
4862
4863impl ForeignItem<'_> {
4864 #[inline]
4865 pub fn hir_id(&self) -> HirId {
4866 HirId::make_owner(self.owner_id.def_id)
4868 }
4869
4870 pub fn foreign_item_id(&self) -> ForeignItemId {
4871 ForeignItemId { owner_id: self.owner_id }
4872 }
4873}
4874
4875#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for
ForeignItemKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Fn(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Fn",
__self_0, __self_1, &__self_2),
Self::Static(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Static", __self_0, __self_1, &__self_2),
Self::Type => ::core::fmt::Formatter::write_str(f, "Type"),
}
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for ForeignItemKind<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
ForeignItemKind<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<FnSig<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Option<Ident>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<Mutability>;
let _: ::core::clone::AssertParamIsClone<Safety>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
ForeignItemKind<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ForeignItemKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ForeignItemKind::Fn(ref __binding_0, ref __binding_1,
ref __binding_2) => 0u8.stable_hash(__hcx, __hasher),
ForeignItemKind::Static(ref __binding_0, ref __binding_1,
ref __binding_2) => 1u8.stable_hash(__hcx, __hasher),
ForeignItemKind::Type => 2u8.stable_hash(__hcx, __hasher),
}
match *self {
ForeignItemKind::Fn(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ForeignItemKind::Static(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ForeignItemKind::Type => {}
}
}
}
};StableHash)]
4877pub enum ForeignItemKind<'hir> {
4878 Fn(FnSig<'hir>, &'hir [Option<Ident>], &'hir Generics<'hir>),
4885 Static(&'hir Ty<'hir>, Mutability, Safety),
4887 Type,
4889}
4890
4891#[derive(#[automatically_derived]impl ::core::fmt::Debug for Upvar {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "Upvar span",
&&self.span)
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for Upvar { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for Upvar {
}
#[automatically_derived]impl ::core::clone::Clone for Upvar {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Upvar {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Upvar { span: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4893pub struct Upvar {
4894 pub span: Span,
4896}
4897
4898#[derive(#[automatically_derived]impl<'hir> ::core::fmt::Debug for TraitCandidate<'hir>
{
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"TraitCandidate def_id import_ids lint_ambiguous", &self.def_id,
&self.import_ids, &&self.lint_ambiguous)
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for TraitCandidate<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for
TraitCandidate<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<DefId>;
let _: ::core::clone::AssertParamIsClone<&'hir [LocalDefId]>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::marker::Copy for
TraitCandidate<'hir> {
}Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitCandidate<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitCandidate {
def_id: ref __binding_0,
import_ids: ref __binding_1,
lint_ambiguous: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4902pub struct TraitCandidate<'hir> {
4903 pub def_id: DefId,
4904 pub import_ids: &'hir [LocalDefId],
4905 pub lint_ambiguous: bool,
4910}
4911
4912#[derive(#[automatically_derived]impl<'hir> ::core::marker::Copy for OwnerNode<'hir> {
}Copy, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for OwnerNode<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for OwnerNode<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Item<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ForeignItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TraitItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ImplItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Mod<'hir>>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::fmt::Debug for OwnerNode<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Item(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Item",
&__self_0),
Self::ForeignItem(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ForeignItem", &__self_0),
Self::TraitItem(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TraitItem", &__self_0),
Self::ImplItem(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ImplItem", &__self_0),
Self::Crate(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Crate",
&__self_0),
Self::Synthetic =>
::core::fmt::Formatter::write_str(f, "Synthetic"),
}
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
OwnerNode<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
OwnerNode::Item(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
OwnerNode::ForeignItem(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
OwnerNode::TraitItem(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
OwnerNode::ImplItem(ref __binding_0) =>
3u8.stable_hash(__hcx, __hasher),
OwnerNode::Crate(ref __binding_0) =>
4u8.stable_hash(__hcx, __hasher),
OwnerNode::Synthetic => 5u8.stable_hash(__hcx, __hasher),
}
match *self {
OwnerNode::Item(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
OwnerNode::ForeignItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
OwnerNode::TraitItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
OwnerNode::ImplItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
OwnerNode::Crate(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
OwnerNode::Synthetic => {}
}
}
}
};StableHash)]
4913pub enum OwnerNode<'hir> {
4914 Item(&'hir Item<'hir>),
4915 ForeignItem(&'hir ForeignItem<'hir>),
4916 TraitItem(&'hir TraitItem<'hir>),
4917 ImplItem(&'hir ImplItem<'hir>),
4918 Crate(&'hir Mod<'hir>),
4919 Synthetic,
4920}
4921
4922impl<'hir> OwnerNode<'hir> {
4923 pub fn span(&self) -> Span {
4924 match self {
4925 OwnerNode::Item(Item { span, .. })
4926 | OwnerNode::ForeignItem(ForeignItem { span, .. })
4927 | OwnerNode::ImplItem(ImplItem { span, .. })
4928 | OwnerNode::TraitItem(TraitItem { span, .. }) => *span,
4929 OwnerNode::Crate(Mod { spans: ModSpans { inner_span, .. }, .. }) => *inner_span,
4930 OwnerNode::Synthetic => ::core::panicking::unreachable_default_msg()unreachable!(),
4931 }
4932 }
4933
4934 pub fn fn_sig(self) -> Option<&'hir FnSig<'hir>> {
4935 match self {
4936 OwnerNode::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
4937 | OwnerNode::ImplItem(ImplItem { kind: ImplItemKind::Fn(fn_sig, _), .. })
4938 | OwnerNode::Item(Item { kind: ItemKind::Fn { sig: fn_sig, .. }, .. })
4939 | OwnerNode::ForeignItem(ForeignItem {
4940 kind: ForeignItemKind::Fn(fn_sig, _, _), ..
4941 }) => Some(fn_sig),
4942 _ => None,
4943 }
4944 }
4945
4946 pub fn fn_decl(self) -> Option<&'hir FnDecl<'hir>> {
4947 match self {
4948 OwnerNode::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
4949 | OwnerNode::ImplItem(ImplItem { kind: ImplItemKind::Fn(fn_sig, _), .. })
4950 | OwnerNode::Item(Item { kind: ItemKind::Fn { sig: fn_sig, .. }, .. })
4951 | OwnerNode::ForeignItem(ForeignItem {
4952 kind: ForeignItemKind::Fn(fn_sig, _, _), ..
4953 }) => Some(fn_sig.decl),
4954 _ => None,
4955 }
4956 }
4957
4958 pub fn body_id(&self) -> Option<BodyId> {
4959 match self {
4960 OwnerNode::Item(Item {
4961 kind:
4962 ItemKind::Static(_, _, _, body)
4963 | ItemKind::Const(.., ConstItemRhs::Body(body))
4964 | ItemKind::Fn { body, .. },
4965 ..
4966 })
4967 | OwnerNode::TraitItem(TraitItem {
4968 kind:
4969 TraitItemKind::Fn(_, TraitFn::Provided(body))
4970 | TraitItemKind::Const(_, Some(ConstItemRhs::Body(body))),
4971 ..
4972 })
4973 | OwnerNode::ImplItem(ImplItem {
4974 kind: ImplItemKind::Fn(_, body) | ImplItemKind::Const(_, ConstItemRhs::Body(body)),
4975 ..
4976 }) => Some(*body),
4977 _ => None,
4978 }
4979 }
4980
4981 pub fn generics(self) -> Option<&'hir Generics<'hir>> {
4982 Node::generics(self.into())
4983 }
4984
4985 pub fn def_id(self) -> OwnerId {
4986 match self {
4987 OwnerNode::Item(Item { owner_id, .. })
4988 | OwnerNode::TraitItem(TraitItem { owner_id, .. })
4989 | OwnerNode::ImplItem(ImplItem { owner_id, .. })
4990 | OwnerNode::ForeignItem(ForeignItem { owner_id, .. }) => *owner_id,
4991 OwnerNode::Crate(..) => rustc_hir_id::CRATE_HIR_ID.owner,
4992 OwnerNode::Synthetic => ::core::panicking::unreachable_default_msg()unreachable!(),
4993 }
4994 }
4995
4996 pub fn is_impl_block(&self) -> bool {
4998 #[allow(non_exhaustive_omitted_patterns)] match self {
OwnerNode::Item(Item { kind: ItemKind::Impl(_), .. }) => true,
_ => false,
}matches!(self, OwnerNode::Item(Item { kind: ItemKind::Impl(_), .. }))
4999 }
5000
5001 #[track_caller]
pub fn expect_item(&self) -> &'hir Item<'hir> {
let OwnerNode::Item(n) = self else { expect_failed("expect_item", self) };
n
}
#[track_caller]
pub fn expect_foreign_item(&self) -> &'hir ForeignItem<'hir> {
let OwnerNode::ForeignItem(n) =
self else { expect_failed("expect_foreign_item", self) };
n
}
#[track_caller]
pub fn expect_impl_item(&self) -> &'hir ImplItem<'hir> {
let OwnerNode::ImplItem(n) =
self else { expect_failed("expect_impl_item", self) };
n
}
#[track_caller]
pub fn expect_trait_item(&self) -> &'hir TraitItem<'hir> {
let OwnerNode::TraitItem(n) =
self else { expect_failed("expect_trait_item", self) };
n
}expect_methods_self! {
5002 expect_item, &'hir Item<'hir>, OwnerNode::Item(n), n;
5003 expect_foreign_item, &'hir ForeignItem<'hir>, OwnerNode::ForeignItem(n), n;
5004 expect_impl_item, &'hir ImplItem<'hir>, OwnerNode::ImplItem(n), n;
5005 expect_trait_item, &'hir TraitItem<'hir>, OwnerNode::TraitItem(n), n;
5006 }
5007}
5008
5009impl<'hir> From<&'hir Item<'hir>> for OwnerNode<'hir> {
5010 fn from(val: &'hir Item<'hir>) -> Self {
5011 OwnerNode::Item(val)
5012 }
5013}
5014
5015impl<'hir> From<&'hir ForeignItem<'hir>> for OwnerNode<'hir> {
5016 fn from(val: &'hir ForeignItem<'hir>) -> Self {
5017 OwnerNode::ForeignItem(val)
5018 }
5019}
5020
5021impl<'hir> From<&'hir ImplItem<'hir>> for OwnerNode<'hir> {
5022 fn from(val: &'hir ImplItem<'hir>) -> Self {
5023 OwnerNode::ImplItem(val)
5024 }
5025}
5026
5027impl<'hir> From<&'hir TraitItem<'hir>> for OwnerNode<'hir> {
5028 fn from(val: &'hir TraitItem<'hir>) -> Self {
5029 OwnerNode::TraitItem(val)
5030 }
5031}
5032
5033impl<'hir> From<OwnerNode<'hir>> for Node<'hir> {
5034 fn from(val: OwnerNode<'hir>) -> Self {
5035 match val {
5036 OwnerNode::Item(n) => Node::Item(n),
5037 OwnerNode::ForeignItem(n) => Node::ForeignItem(n),
5038 OwnerNode::ImplItem(n) => Node::ImplItem(n),
5039 OwnerNode::TraitItem(n) => Node::TraitItem(n),
5040 OwnerNode::Crate(n) => Node::Crate(n),
5041 OwnerNode::Synthetic => Node::Synthetic,
5042 }
5043 }
5044}
5045
5046#[derive(#[automatically_derived]impl<'hir> ::core::marker::Copy for Node<'hir> { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl<'hir>
::core::clone::TrivialClone for Node<'hir> {
}
#[automatically_derived]impl<'hir> ::core::clone::Clone for Node<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Param<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Item<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir UseTree<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ForeignItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TraitItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ImplItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Variant<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir FieldDef<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir AnonConst>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstBlock>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ExprField<'hir>>;
let _:
::core::clone::AssertParamIsClone<&'hir ConstArgExprField<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Stmt<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir PathSegment<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _:
::core::clone::AssertParamIsClone<&'hir AssocItemConstraint<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TraitRef<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir OpaqueTy<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TyPat<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir PatField<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir PatExpr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Arm<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Block<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir LetStmt<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir VariantData<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<&'hir GenericParam<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Mod<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir InferArg>;
let _: ::core::clone::AssertParamIsClone<&'hir WherePredicate<'hir>>;
let _:
::core::clone::AssertParamIsClone<&'hir PreciseCapturingNonLifetimeArg>;
let _:
::core::clone::AssertParamIsClone<&'hir TestBinderForall<'hir>>;
let _:
::core::clone::AssertParamIsClone<&'hir TestBinderExists<'hir>>;
let _:
::core::clone::AssertParamIsClone<&'hir TestBinderBoundTypeConstraint<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]impl<'hir> ::core::fmt::Debug for Node<'hir> {
#[inline]
#[rustc_trivial_field_reads]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Param(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Param",
&__self_0),
Self::Item(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Item",
&__self_0),
Self::NestedUseTree(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"NestedUseTree", &__self_0),
Self::ForeignItem(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ForeignItem", &__self_0),
Self::TraitItem(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TraitItem", &__self_0),
Self::ImplItem(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ImplItem", &__self_0),
Self::Variant(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Variant", &__self_0),
Self::Field(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Field",
&__self_0),
Self::AnonConst(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"AnonConst", &__self_0),
Self::ConstBlock(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ConstBlock", &__self_0),
Self::ConstArg(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ConstArg", &__self_0),
Self::Expr(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Expr",
&__self_0),
Self::ExprField(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ExprField", &__self_0),
Self::ConstArgExprField(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ConstArgExprField", &__self_0),
Self::Stmt(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Stmt",
&__self_0),
Self::PathSegment(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"PathSegment", &__self_0),
Self::Ty(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Ty",
&__self_0),
Self::AssocItemConstraint(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"AssocItemConstraint", &__self_0),
Self::TraitRef(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TraitRef", &__self_0),
Self::OpaqueTy(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"OpaqueTy", &__self_0),
Self::TyPat(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "TyPat",
&__self_0),
Self::Pat(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Pat",
&__self_0),
Self::PatField(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"PatField", &__self_0),
Self::PatExpr(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"PatExpr", &__self_0),
Self::Arm(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Arm",
&__self_0),
Self::Block(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Block",
&__self_0),
Self::LetStmt(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"LetStmt", &__self_0),
Self::Ctor(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Ctor",
&__self_0),
Self::Lifetime(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Lifetime", &__self_0),
Self::GenericParam(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"GenericParam", &__self_0),
Self::Crate(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Crate",
&__self_0),
Self::Infer(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Infer",
&__self_0),
Self::WherePredicate(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"WherePredicate", &__self_0),
Self::PreciseCapturingNonLifetimeArg(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"PreciseCapturingNonLifetimeArg", &__self_0),
Self::TestBinderForall(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TestBinderForall", &__self_0),
Self::TestBinderExists(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TestBinderExists", &__self_0),
Self::TestBinderBoundTypeConstraint(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TestBinderBoundTypeConstraint", &__self_0),
Self::Synthetic =>
::core::fmt::Formatter::write_str(f, "Synthetic"),
Self::Err(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Err",
&__self_0),
}
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Node<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Node::Param(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
Node::Item(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
Node::NestedUseTree(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
Node::ForeignItem(ref __binding_0) =>
3u8.stable_hash(__hcx, __hasher),
Node::TraitItem(ref __binding_0) =>
4u8.stable_hash(__hcx, __hasher),
Node::ImplItem(ref __binding_0) =>
5u8.stable_hash(__hcx, __hasher),
Node::Variant(ref __binding_0) =>
6u8.stable_hash(__hcx, __hasher),
Node::Field(ref __binding_0) =>
7u8.stable_hash(__hcx, __hasher),
Node::AnonConst(ref __binding_0) =>
8u8.stable_hash(__hcx, __hasher),
Node::ConstBlock(ref __binding_0) =>
9u8.stable_hash(__hcx, __hasher),
Node::ConstArg(ref __binding_0) =>
10u8.stable_hash(__hcx, __hasher),
Node::Expr(ref __binding_0) =>
11u8.stable_hash(__hcx, __hasher),
Node::ExprField(ref __binding_0) =>
12u8.stable_hash(__hcx, __hasher),
Node::ConstArgExprField(ref __binding_0) =>
13u8.stable_hash(__hcx, __hasher),
Node::Stmt(ref __binding_0) =>
14u8.stable_hash(__hcx, __hasher),
Node::PathSegment(ref __binding_0) =>
15u8.stable_hash(__hcx, __hasher),
Node::Ty(ref __binding_0) =>
16u8.stable_hash(__hcx, __hasher),
Node::AssocItemConstraint(ref __binding_0) =>
17u8.stable_hash(__hcx, __hasher),
Node::TraitRef(ref __binding_0) =>
18u8.stable_hash(__hcx, __hasher),
Node::OpaqueTy(ref __binding_0) =>
19u8.stable_hash(__hcx, __hasher),
Node::TyPat(ref __binding_0) =>
20u8.stable_hash(__hcx, __hasher),
Node::Pat(ref __binding_0) =>
21u8.stable_hash(__hcx, __hasher),
Node::PatField(ref __binding_0) =>
22u8.stable_hash(__hcx, __hasher),
Node::PatExpr(ref __binding_0) =>
23u8.stable_hash(__hcx, __hasher),
Node::Arm(ref __binding_0) =>
24u8.stable_hash(__hcx, __hasher),
Node::Block(ref __binding_0) =>
25u8.stable_hash(__hcx, __hasher),
Node::LetStmt(ref __binding_0) =>
26u8.stable_hash(__hcx, __hasher),
Node::Ctor(ref __binding_0) =>
27u8.stable_hash(__hcx, __hasher),
Node::Lifetime(ref __binding_0) =>
28u8.stable_hash(__hcx, __hasher),
Node::GenericParam(ref __binding_0) =>
29u8.stable_hash(__hcx, __hasher),
Node::Crate(ref __binding_0) =>
30u8.stable_hash(__hcx, __hasher),
Node::Infer(ref __binding_0) =>
31u8.stable_hash(__hcx, __hasher),
Node::WherePredicate(ref __binding_0) =>
32u8.stable_hash(__hcx, __hasher),
Node::PreciseCapturingNonLifetimeArg(ref __binding_0) =>
33u8.stable_hash(__hcx, __hasher),
Node::TestBinderForall(ref __binding_0) =>
34u8.stable_hash(__hcx, __hasher),
Node::TestBinderExists(ref __binding_0) =>
35u8.stable_hash(__hcx, __hasher),
Node::TestBinderBoundTypeConstraint(ref __binding_0) =>
36u8.stable_hash(__hcx, __hasher),
Node::Synthetic => 37u8.stable_hash(__hcx, __hasher),
Node::Err(ref __binding_0) =>
38u8.stable_hash(__hcx, __hasher),
}
match *self {
Node::Param(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Item(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::NestedUseTree(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ForeignItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TraitItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ImplItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Variant(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Field(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::AnonConst(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ConstBlock(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ConstArg(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Expr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ExprField(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ConstArgExprField(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Stmt(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::PathSegment(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Ty(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::AssocItemConstraint(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TraitRef(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::OpaqueTy(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TyPat(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Pat(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::PatField(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::PatExpr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Arm(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Block(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::LetStmt(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Ctor(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Lifetime(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::GenericParam(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Crate(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Infer(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::WherePredicate(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::PreciseCapturingNonLifetimeArg(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TestBinderForall(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TestBinderExists(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TestBinderBoundTypeConstraint(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Synthetic => {}
Node::Err(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
5047pub enum Node<'hir> {
5048 Param(&'hir Param<'hir>),
5049 Item(&'hir Item<'hir>),
5050 NestedUseTree(&'hir UseTree<'hir>),
5051 ForeignItem(&'hir ForeignItem<'hir>),
5052 TraitItem(&'hir TraitItem<'hir>),
5053 ImplItem(&'hir ImplItem<'hir>),
5054 Variant(&'hir Variant<'hir>),
5055 Field(&'hir FieldDef<'hir>),
5056 AnonConst(&'hir AnonConst),
5057 ConstBlock(&'hir ConstBlock),
5058 ConstArg(&'hir ConstArg<'hir>),
5059 Expr(&'hir Expr<'hir>),
5060 ExprField(&'hir ExprField<'hir>),
5061 ConstArgExprField(&'hir ConstArgExprField<'hir>),
5062 Stmt(&'hir Stmt<'hir>),
5063 PathSegment(&'hir PathSegment<'hir>),
5064 Ty(&'hir Ty<'hir>),
5065 AssocItemConstraint(&'hir AssocItemConstraint<'hir>),
5066 TraitRef(&'hir TraitRef<'hir>),
5067 OpaqueTy(&'hir OpaqueTy<'hir>),
5068 TyPat(&'hir TyPat<'hir>),
5069 Pat(&'hir Pat<'hir>),
5070 PatField(&'hir PatField<'hir>),
5071 PatExpr(&'hir PatExpr<'hir>),
5075 Arm(&'hir Arm<'hir>),
5076 Block(&'hir Block<'hir>),
5077 LetStmt(&'hir LetStmt<'hir>),
5078 Ctor(&'hir VariantData<'hir>),
5081 Lifetime(&'hir Lifetime),
5082 GenericParam(&'hir GenericParam<'hir>),
5083 Crate(&'hir Mod<'hir>),
5084 Infer(&'hir InferArg),
5085 WherePredicate(&'hir WherePredicate<'hir>),
5086 PreciseCapturingNonLifetimeArg(&'hir PreciseCapturingNonLifetimeArg),
5087 TestBinderForall(&'hir TestBinderForall<'hir>),
5088 TestBinderExists(&'hir TestBinderExists<'hir>),
5089 TestBinderBoundTypeConstraint(&'hir TestBinderBoundTypeConstraint<'hir>),
5090 Synthetic,
5092 Err(Span),
5093}
5094
5095impl<'hir> Node<'hir> {
5096 pub fn ident(&self) -> Option<Ident> {
5111 match self {
5112 Node::Item(item) => item.kind.ident(),
5113 Node::TraitItem(TraitItem { ident, .. })
5114 | Node::ImplItem(ImplItem { ident, .. })
5115 | Node::ForeignItem(ForeignItem { ident, .. })
5116 | Node::NestedUseTree(UseTree { kind: UseKind::Single(ident), .. })
5117 | Node::Field(FieldDef { ident, .. })
5118 | Node::Variant(Variant { ident, .. })
5119 | Node::PathSegment(PathSegment { ident, .. }) => Some(*ident),
5120 Node::Lifetime(lt) => Some(lt.ident),
5121 Node::GenericParam(p) => Some(p.name.ident()),
5122 Node::AssocItemConstraint(c) => Some(c.ident),
5123 Node::PatField(f) => Some(f.ident),
5124 Node::ExprField(f) => Some(f.ident),
5125 Node::ConstArgExprField(f) => Some(f.field),
5126 Node::PreciseCapturingNonLifetimeArg(a) => Some(a.ident),
5127 Node::Param(..)
5128 | Node::AnonConst(..)
5129 | Node::ConstBlock(..)
5130 | Node::ConstArg(..)
5131 | Node::Expr(..)
5132 | Node::Stmt(..)
5133 | Node::Block(..)
5134 | Node::Ctor(..)
5135 | Node::Pat(..)
5136 | Node::TyPat(..)
5137 | Node::PatExpr(..)
5138 | Node::Arm(..)
5139 | Node::LetStmt(..)
5140 | Node::Crate(..)
5141 | Node::Ty(..)
5142 | Node::TraitRef(..)
5143 | Node::OpaqueTy(..)
5144 | Node::NestedUseTree(_)
5145 | Node::Infer(..)
5146 | Node::WherePredicate(..)
5147 | Node::TestBinderForall(..)
5148 | Node::TestBinderExists(..)
5149 | Node::TestBinderBoundTypeConstraint(..)
5150 | Node::Synthetic
5151 | Node::Err(..) => None,
5152 }
5153 }
5154
5155 pub fn fn_decl(self) -> Option<&'hir FnDecl<'hir>> {
5156 match self {
5157 Node::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
5158 | Node::ImplItem(ImplItem { kind: ImplItemKind::Fn(fn_sig, _), .. })
5159 | Node::Item(Item { kind: ItemKind::Fn { sig: fn_sig, .. }, .. })
5160 | Node::ForeignItem(ForeignItem { kind: ForeignItemKind::Fn(fn_sig, _, _), .. }) => {
5161 Some(fn_sig.decl)
5162 }
5163 Node::Expr(Expr { kind: ExprKind::Closure(Closure { fn_decl, .. }), .. }) => {
5164 Some(fn_decl)
5165 }
5166 _ => None,
5167 }
5168 }
5169
5170 pub fn impl_block_of_trait(self, trait_def_id: DefId) -> Option<&'hir Impl<'hir>> {
5172 if let Node::Item(Item { kind: ItemKind::Impl(impl_block), .. }) = self
5173 && let Some(of_trait) = impl_block.of_trait
5174 && let Some(trait_id) = of_trait.trait_ref.trait_def_id()
5175 && trait_id == trait_def_id
5176 {
5177 Some(impl_block)
5178 } else {
5179 None
5180 }
5181 }
5182
5183 pub fn fn_sig(self) -> Option<&'hir FnSig<'hir>> {
5184 match self {
5185 Node::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
5186 | Node::ImplItem(ImplItem { kind: ImplItemKind::Fn(fn_sig, _), .. })
5187 | Node::Item(Item { kind: ItemKind::Fn { sig: fn_sig, .. }, .. })
5188 | Node::ForeignItem(ForeignItem { kind: ForeignItemKind::Fn(fn_sig, _, _), .. }) => {
5189 Some(fn_sig)
5190 }
5191 _ => None,
5192 }
5193 }
5194
5195 pub fn ty(self) -> Option<&'hir Ty<'hir>> {
5197 match self {
5198 Node::Item(it) => match it.kind {
5199 ItemKind::TyAlias(_, _, ty)
5200 | ItemKind::Static(_, _, ty, _)
5201 | ItemKind::Const(_, _, ty, _) => Some(ty),
5202 ItemKind::Impl(impl_item) => Some(&impl_item.self_ty),
5203 _ => None,
5204 },
5205 Node::TraitItem(it) => match it.kind {
5206 TraitItemKind::Const(ty, _) => Some(ty),
5207 TraitItemKind::Type(_, ty) => ty,
5208 _ => None,
5209 },
5210 Node::ImplItem(it) => match it.kind {
5211 ImplItemKind::Const(ty, _) => Some(ty),
5212 ImplItemKind::Type(ty) => Some(ty),
5213 _ => None,
5214 },
5215 Node::ForeignItem(it) => match it.kind {
5216 ForeignItemKind::Static(ty, ..) => Some(ty),
5217 _ => None,
5218 },
5219 Node::GenericParam(param) => match param.kind {
5220 GenericParamKind::Lifetime { .. } => None,
5221 GenericParamKind::Type { default, .. } => default,
5222 GenericParamKind::Const { ty, .. } => Some(ty),
5223 },
5224 Node::Field(f) => Some(f.ty),
5225 _ => None,
5226 }
5227 }
5228
5229 pub fn alias_ty(self) -> Option<&'hir Ty<'hir>> {
5230 match self {
5231 Node::Item(Item { kind: ItemKind::TyAlias(_, _, ty), .. }) => Some(ty),
5232 _ => None,
5233 }
5234 }
5235
5236 #[inline]
5237 pub fn associated_body(&self) -> Option<(LocalDefId, BodyId)> {
5238 match self {
5239 Node::Item(Item {
5240 owner_id,
5241 kind:
5242 ItemKind::Const(.., ConstItemRhs::Body(body))
5243 | ItemKind::Static(.., body)
5244 | ItemKind::Fn { body, .. },
5245 ..
5246 })
5247 | Node::TraitItem(TraitItem {
5248 owner_id,
5249 kind:
5250 TraitItemKind::Const(_, Some(ConstItemRhs::Body(body)))
5251 | TraitItemKind::Fn(_, TraitFn::Provided(body)),
5252 ..
5253 })
5254 | Node::ImplItem(ImplItem {
5255 owner_id,
5256 kind: ImplItemKind::Const(.., ConstItemRhs::Body(body)) | ImplItemKind::Fn(_, body),
5257 ..
5258 }) => Some((owner_id.def_id, *body)),
5259
5260 Node::Item(Item {
5261 owner_id, kind: ItemKind::GlobalAsm { asm: _, fake_body }, ..
5262 }) => Some((owner_id.def_id, *fake_body)),
5263
5264 Node::Expr(Expr { kind: ExprKind::Closure(Closure { def_id, body, .. }), .. }) => {
5265 Some((*def_id, *body))
5266 }
5267
5268 Node::AnonConst(constant) => Some((constant.def_id, constant.body)),
5269 Node::ConstBlock(constant) => Some((constant.def_id, constant.body)),
5270
5271 _ => None,
5272 }
5273 }
5274
5275 pub fn body_id(&self) -> Option<BodyId> {
5276 Some(self.associated_body()?.1)
5277 }
5278
5279 pub fn generics(self) -> Option<&'hir Generics<'hir>> {
5280 match self {
5281 Node::ForeignItem(ForeignItem {
5282 kind: ForeignItemKind::Fn(_, _, generics), ..
5283 })
5284 | Node::TraitItem(TraitItem { generics, .. })
5285 | Node::ImplItem(ImplItem { generics, .. }) => Some(generics),
5286 Node::Item(item) => item.kind.generics(),
5287 _ => None,
5288 }
5289 }
5290
5291 pub fn as_owner(self) -> Option<OwnerNode<'hir>> {
5292 match self {
5293 Node::Item(i) => Some(OwnerNode::Item(i)),
5294 Node::ForeignItem(i) => Some(OwnerNode::ForeignItem(i)),
5295 Node::TraitItem(i) => Some(OwnerNode::TraitItem(i)),
5296 Node::ImplItem(i) => Some(OwnerNode::ImplItem(i)),
5297 Node::Crate(i) => Some(OwnerNode::Crate(i)),
5298 Node::Synthetic => Some(OwnerNode::Synthetic),
5299 _ => None,
5300 }
5301 }
5302
5303 pub fn fn_kind(self) -> Option<FnKind<'hir>> {
5304 match self {
5305 Node::Item(i) => match i.kind {
5306 ItemKind::Fn { ident, sig, generics, .. } => {
5307 Some(FnKind::ItemFn(ident, generics, sig.header))
5308 }
5309 _ => None,
5310 },
5311 Node::TraitItem(ti) => match ti.kind {
5312 TraitItemKind::Fn(ref sig, _) => Some(FnKind::Method(ti.ident, sig)),
5313 _ => None,
5314 },
5315 Node::ImplItem(ii) => match ii.kind {
5316 ImplItemKind::Fn(ref sig, _) => Some(FnKind::Method(ii.ident, sig)),
5317 _ => None,
5318 },
5319 Node::Expr(e) => match e.kind {
5320 ExprKind::Closure { .. } => Some(FnKind::Closure),
5321 _ => None,
5322 },
5323 _ => None,
5324 }
5325 }
5326
5327 pub fn path(self) -> Option<&'hir QPath<'hir>> {
5329 match self {
5330 Node::Ty(Ty { kind: TyKind::Path(path), .. })
5331 | Node::Expr(Expr { kind: ExprKind::Path(path), .. })
5332 | Node::PatExpr(PatExpr { kind: PatExprKind::Path(path), .. }) => Some(path),
5333 _ => None,
5334 }
5335 }
5336
5337 #[track_caller]
pub fn expect_param(&self) -> &'hir Param<'hir> {
let Node::Param(n) = self else { expect_failed("expect_param", self) };
n
}
#[track_caller]
pub fn expect_item(&self) -> &'hir Item<'hir> {
let Node::Item(n) = self else { expect_failed("expect_item", self) };
n
}
#[track_caller]
pub fn expect_foreign_item(&self) -> &'hir ForeignItem<'hir> {
let Node::ForeignItem(n) =
self else { expect_failed("expect_foreign_item", self) };
n
}
#[track_caller]
pub fn expect_trait_item(&self) -> &'hir TraitItem<'hir> {
let Node::TraitItem(n) =
self else { expect_failed("expect_trait_item", self) };
n
}
#[track_caller]
pub fn expect_impl_item(&self) -> &'hir ImplItem<'hir> {
let Node::ImplItem(n) =
self else { expect_failed("expect_impl_item", self) };
n
}
#[track_caller]
pub fn expect_variant(&self) -> &'hir Variant<'hir> {
let Node::Variant(n) =
self else { expect_failed("expect_variant", self) };
n
}
#[track_caller]
pub fn expect_field(&self) -> &'hir FieldDef<'hir> {
let Node::Field(n) = self else { expect_failed("expect_field", self) };
n
}
#[track_caller]
pub fn expect_anon_const(&self) -> &'hir AnonConst {
let Node::AnonConst(n) =
self else { expect_failed("expect_anon_const", self) };
n
}
#[track_caller]
pub fn expect_inline_const(&self) -> &'hir ConstBlock {
let Node::ConstBlock(n) =
self else { expect_failed("expect_inline_const", self) };
n
}
#[track_caller]
pub fn expect_expr(&self) -> &'hir Expr<'hir> {
let Node::Expr(n) = self else { expect_failed("expect_expr", self) };
n
}
#[track_caller]
pub fn expect_expr_field(&self) -> &'hir ExprField<'hir> {
let Node::ExprField(n) =
self else { expect_failed("expect_expr_field", self) };
n
}
#[track_caller]
pub fn expect_stmt(&self) -> &'hir Stmt<'hir> {
let Node::Stmt(n) = self else { expect_failed("expect_stmt", self) };
n
}
#[track_caller]
pub fn expect_path_segment(&self) -> &'hir PathSegment<'hir> {
let Node::PathSegment(n) =
self else { expect_failed("expect_path_segment", self) };
n
}
#[track_caller]
pub fn expect_ty(&self) -> &'hir Ty<'hir> {
let Node::Ty(n) = self else { expect_failed("expect_ty", self) };
n
}
#[track_caller]
pub fn expect_assoc_item_constraint(&self)
-> &'hir AssocItemConstraint<'hir> {
let Node::AssocItemConstraint(n) =
self else { expect_failed("expect_assoc_item_constraint", self) };
n
}
#[track_caller]
pub fn expect_trait_ref(&self) -> &'hir TraitRef<'hir> {
let Node::TraitRef(n) =
self else { expect_failed("expect_trait_ref", self) };
n
}
#[track_caller]
pub fn expect_opaque_ty(&self) -> &'hir OpaqueTy<'hir> {
let Node::OpaqueTy(n) =
self else { expect_failed("expect_opaque_ty", self) };
n
}
#[track_caller]
pub fn expect_pat(&self) -> &'hir Pat<'hir> {
let Node::Pat(n) = self else { expect_failed("expect_pat", self) };
n
}
#[track_caller]
pub fn expect_pat_field(&self) -> &'hir PatField<'hir> {
let Node::PatField(n) =
self else { expect_failed("expect_pat_field", self) };
n
}
#[track_caller]
pub fn expect_arm(&self) -> &'hir Arm<'hir> {
let Node::Arm(n) = self else { expect_failed("expect_arm", self) };
n
}
#[track_caller]
pub fn expect_block(&self) -> &'hir Block<'hir> {
let Node::Block(n) = self else { expect_failed("expect_block", self) };
n
}
#[track_caller]
pub fn expect_let_stmt(&self) -> &'hir LetStmt<'hir> {
let Node::LetStmt(n) =
self else { expect_failed("expect_let_stmt", self) };
n
}
#[track_caller]
pub fn expect_ctor(&self) -> &'hir VariantData<'hir> {
let Node::Ctor(n) = self else { expect_failed("expect_ctor", self) };
n
}
#[track_caller]
pub fn expect_lifetime(&self) -> &'hir Lifetime {
let Node::Lifetime(n) =
self else { expect_failed("expect_lifetime", self) };
n
}
#[track_caller]
pub fn expect_generic_param(&self) -> &'hir GenericParam<'hir> {
let Node::GenericParam(n) =
self else { expect_failed("expect_generic_param", self) };
n
}
#[track_caller]
pub fn expect_crate(&self) -> &'hir Mod<'hir> {
let Node::Crate(n) = self else { expect_failed("expect_crate", self) };
n
}
#[track_caller]
pub fn expect_infer(&self) -> &'hir InferArg {
let Node::Infer(n) = self else { expect_failed("expect_infer", self) };
n
}
#[track_caller]
pub fn expect_closure(&self) -> &'hir Closure<'hir> {
let Node::Expr(Expr { kind: ExprKind::Closure(n), .. }) =
self else { expect_failed("expect_closure", self) };
n
}expect_methods_self! {
5338 expect_param, &'hir Param<'hir>, Node::Param(n), n;
5339 expect_item, &'hir Item<'hir>, Node::Item(n), n;
5340 expect_foreign_item, &'hir ForeignItem<'hir>, Node::ForeignItem(n), n;
5341 expect_trait_item, &'hir TraitItem<'hir>, Node::TraitItem(n), n;
5342 expect_impl_item, &'hir ImplItem<'hir>, Node::ImplItem(n), n;
5343 expect_variant, &'hir Variant<'hir>, Node::Variant(n), n;
5344 expect_field, &'hir FieldDef<'hir>, Node::Field(n), n;
5345 expect_anon_const, &'hir AnonConst, Node::AnonConst(n), n;
5346 expect_inline_const, &'hir ConstBlock, Node::ConstBlock(n), n;
5347 expect_expr, &'hir Expr<'hir>, Node::Expr(n), n;
5348 expect_expr_field, &'hir ExprField<'hir>, Node::ExprField(n), n;
5349 expect_stmt, &'hir Stmt<'hir>, Node::Stmt(n), n;
5350 expect_path_segment, &'hir PathSegment<'hir>, Node::PathSegment(n), n;
5351 expect_ty, &'hir Ty<'hir>, Node::Ty(n), n;
5352 expect_assoc_item_constraint, &'hir AssocItemConstraint<'hir>, Node::AssocItemConstraint(n), n;
5353 expect_trait_ref, &'hir TraitRef<'hir>, Node::TraitRef(n), n;
5354 expect_opaque_ty, &'hir OpaqueTy<'hir>, Node::OpaqueTy(n), n;
5355 expect_pat, &'hir Pat<'hir>, Node::Pat(n), n;
5356 expect_pat_field, &'hir PatField<'hir>, Node::PatField(n), n;
5357 expect_arm, &'hir Arm<'hir>, Node::Arm(n), n;
5358 expect_block, &'hir Block<'hir>, Node::Block(n), n;
5359 expect_let_stmt, &'hir LetStmt<'hir>, Node::LetStmt(n), n;
5360 expect_ctor, &'hir VariantData<'hir>, Node::Ctor(n), n;
5361 expect_lifetime, &'hir Lifetime, Node::Lifetime(n), n;
5362 expect_generic_param, &'hir GenericParam<'hir>, Node::GenericParam(n), n;
5363 expect_crate, &'hir Mod<'hir>, Node::Crate(n), n;
5364 expect_infer, &'hir InferArg, Node::Infer(n), n;
5365 expect_closure, &'hir Closure<'hir>, Node::Expr(Expr { kind: ExprKind::Closure(n), .. }), n;
5366 }
5367}
5368
5369#[cfg(target_pointer_width = "64")]
5371mod size_asserts {
5372 use rustc_data_structures::static_assert_size;
5373
5374 use super::*;
5375 const _: [(); 48] = [(); ::std::mem::size_of::<Block<'_>>()];static_assert_size!(Block<'_>, 48);
5377 const _: [(); 24] = [(); ::std::mem::size_of::<Body<'_>>()];static_assert_size!(Body<'_>, 24);
5378 const _: [(); 64] = [(); ::std::mem::size_of::<Expr<'_>>()];static_assert_size!(Expr<'_>, 64);
5379 const _: [(); 48] = [(); ::std::mem::size_of::<ExprKind<'_>>()];static_assert_size!(ExprKind<'_>, 48);
5380 const _: [(); 40] = [(); ::std::mem::size_of::<FnDecl<'_>>()];static_assert_size!(FnDecl<'_>, 40);
5381 const _: [(); 88] = [(); ::std::mem::size_of::<ForeignItem<'_>>()];static_assert_size!(ForeignItem<'_>, 88);
5382 const _: [(); 56] = [(); ::std::mem::size_of::<ForeignItemKind<'_>>()];static_assert_size!(ForeignItemKind<'_>, 56);
5383 const _: [(); 16] = [(); ::std::mem::size_of::<GenericArg<'_>>()];static_assert_size!(GenericArg<'_>, 16);
5384 const _: [(); 64] = [(); ::std::mem::size_of::<GenericBound<'_>>()];static_assert_size!(GenericBound<'_>, 64);
5385 const _: [(); 56] = [(); ::std::mem::size_of::<Generics<'_>>()];static_assert_size!(Generics<'_>, 56);
5386 const _: [(); 48] = [(); ::std::mem::size_of::<Impl<'_>>()];static_assert_size!(Impl<'_>, 48);
5387 const _: [(); 88] = [(); ::std::mem::size_of::<ImplItem<'_>>()];static_assert_size!(ImplItem<'_>, 88);
5388 const _: [(); 40] = [(); ::std::mem::size_of::<ImplItemKind<'_>>()];static_assert_size!(ImplItemKind<'_>, 40);
5389 const _: [(); 88] = [(); ::std::mem::size_of::<Item<'_>>()];static_assert_size!(Item<'_>, 88);
5390 const _: [(); 64] = [(); ::std::mem::size_of::<ItemKind<'_>>()];static_assert_size!(ItemKind<'_>, 64);
5391 const _: [(); 64] = [(); ::std::mem::size_of::<LetStmt<'_>>()];static_assert_size!(LetStmt<'_>, 64);
5392 const _: [(); 32] = [(); ::std::mem::size_of::<Param<'_>>()];static_assert_size!(Param<'_>, 32);
5393 const _: [(); 80] = [(); ::std::mem::size_of::<Pat<'_>>()];static_assert_size!(Pat<'_>, 80);
5394 const _: [(); 56] = [(); ::std::mem::size_of::<PatKind<'_>>()];static_assert_size!(PatKind<'_>, 56);
5395 const _: [(); 40] = [(); ::std::mem::size_of::<Path<'_>>()];static_assert_size!(Path<'_>, 40);
5396 const _: [(); 48] = [(); ::std::mem::size_of::<PathSegment<'_>>()];static_assert_size!(PathSegment<'_>, 48);
5397 const _: [(); 24] = [(); ::std::mem::size_of::<QPath<'_>>()];static_assert_size!(QPath<'_>, 24);
5398 const _: [(); 12] = [(); ::std::mem::size_of::<Res>()];static_assert_size!(Res, 12);
5399 const _: [(); 32] = [(); ::std::mem::size_of::<Stmt<'_>>()];static_assert_size!(Stmt<'_>, 32);
5400 const _: [(); 16] = [(); ::std::mem::size_of::<StmtKind<'_>>()];static_assert_size!(StmtKind<'_>, 16);
5401 const _: [(); 48] = [(); ::std::mem::size_of::<TraitImplHeader<'_>>()];static_assert_size!(TraitImplHeader<'_>, 48);
5402 const _: [(); 88] = [(); ::std::mem::size_of::<TraitItem<'_>>()];static_assert_size!(TraitItem<'_>, 88);
5403 const _: [(); 48] = [(); ::std::mem::size_of::<TraitItemKind<'_>>()];static_assert_size!(TraitItemKind<'_>, 48);
5404 const _: [(); 48] = [(); ::std::mem::size_of::<Ty<'_>>()];static_assert_size!(Ty<'_>, 48);
5405 const _: [(); 32] = [(); ::std::mem::size_of::<TyKind<'_>>()];static_assert_size!(TyKind<'_>, 32);
5406 }
5408
5409#[cfg(test)]
5410mod tests;