Skip to main content

nwnrs_nwscript/
hir.rs

1use std::{collections::BTreeMap, error::Error, fmt};
2
3use serde::{Deserialize, Serialize};
4
5use crate::{
6    AssignmentOp, BinaryOp, BlockStmt, BuiltinValue, Expr, ExprKind, FunctionDecl,
7    IncludeDirective, LangSpec, Literal, Script, SemanticModel, SemanticType, Stmt, StructDecl,
8    TypeSpec, UnaryOp,
9};
10
11/// One lowered HIR module ready for further compiler passes.
12#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirModule {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "HirModule",
            "includes", &self.includes, "structs", &self.structs, "globals",
            &self.globals, "functions", &&self.functions)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirModule {
    #[inline]
    fn clone(&self) -> HirModule {
        HirModule {
            includes: ::core::clone::Clone::clone(&self.includes),
            structs: ::core::clone::Clone::clone(&self.structs),
            globals: ::core::clone::Clone::clone(&self.globals),
            functions: ::core::clone::Clone::clone(&self.functions),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirModule {
    #[inline]
    fn eq(&self, other: &HirModule) -> bool {
        self.includes == other.includes && self.structs == other.structs &&
                self.globals == other.globals &&
            self.functions == other.functions
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirModule {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirModule", false as usize + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "includes", &self.includes)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "structs", &self.structs)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "globals", &self.globals)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "functions", &self.functions)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirModule {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "includes" => _serde::__private228::Ok(__Field::__field0),
                            "structs" => _serde::__private228::Ok(__Field::__field1),
                            "globals" => _serde::__private228::Ok(__Field::__field2),
                            "functions" => _serde::__private228::Ok(__Field::__field3),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"includes" => _serde::__private228::Ok(__Field::__field0),
                            b"structs" => _serde::__private228::Ok(__Field::__field1),
                            b"globals" => _serde::__private228::Ok(__Field::__field2),
                            b"functions" => _serde::__private228::Ok(__Field::__field3),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirModule>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirModule;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirModule")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<Vec<IncludeDirective>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirModule with 4 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Vec<HirStruct>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirModule with 4 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<Vec<HirGlobal>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirModule with 4 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<Vec<HirFunction>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct HirModule with 4 elements")),
                            };
                        _serde::__private228::Ok(HirModule {
                                includes: __field0,
                                structs: __field1,
                                globals: __field2,
                                functions: __field3,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<Vec<IncludeDirective>> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<Vec<HirStruct>> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<Vec<HirGlobal>> =
                            _serde::__private228::None;
                        let mut __field3:
                                _serde::__private228::Option<Vec<HirFunction>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("includes"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<IncludeDirective>>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("structs"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<HirStruct>>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("globals"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<HirGlobal>>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("functions"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<HirFunction>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("includes")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("structs")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("globals")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("functions")?,
                            };
                        _serde::__private228::Ok(HirModule {
                                includes: __field0,
                                structs: __field1,
                                globals: __field2,
                                functions: __field3,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["includes", "structs", "globals", "functions"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirModule", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirModule>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
13pub struct HirModule {
14    /// Top-level includes preserved from the source unit.
15    pub includes:  Vec<IncludeDirective>,
16    /// User-defined structures in source order.
17    pub structs:   Vec<HirStruct>,
18    /// Globals in source order.
19    pub globals:   Vec<HirGlobal>,
20    /// Functions in source order.
21    pub functions: Vec<HirFunction>,
22}
23
24/// One lowered structure definition.
25#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirStruct {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "HirStruct",
            "span", &self.span, "name", &self.name, "fields", &&self.fields)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirStruct {
    #[inline]
    fn clone(&self) -> HirStruct {
        HirStruct {
            span: ::core::clone::Clone::clone(&self.span),
            name: ::core::clone::Clone::clone(&self.name),
            fields: ::core::clone::Clone::clone(&self.fields),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirStruct {
    #[inline]
    fn eq(&self, other: &HirStruct) -> bool {
        self.span == other.span && self.name == other.name &&
            self.fields == other.fields
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for HirStruct {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<crate::Span>;
        let _: ::core::cmp::AssertParamIsEq<String>;
        let _: ::core::cmp::AssertParamIsEq<Vec<HirField>>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirStruct {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirStruct", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "fields", &self.fields)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirStruct {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "name" => _serde::__private228::Ok(__Field::__field1),
                            "fields" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"name" => _serde::__private228::Ok(__Field::__field1),
                            b"fields" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirStruct>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirStruct;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirStruct")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirStruct with 3 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirStruct with 3 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<Vec<HirField>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirStruct with 3 elements")),
                            };
                        _serde::__private228::Ok(HirStruct {
                                span: __field0,
                                name: __field1,
                                fields: __field2,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<Vec<HirField>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("name"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("fields"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<HirField>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("name")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("fields")?,
                            };
                        _serde::__private228::Ok(HirStruct {
                                span: __field0,
                                name: __field1,
                                fields: __field2,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["span", "name", "fields"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirStruct", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirStruct>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
26pub struct HirStruct {
27    /// Source span.
28    pub span:   crate::Span,
29    /// Structure name.
30    pub name:   String,
31    /// Fields in declaration order.
32    pub fields: Vec<HirField>,
33}
34
35/// One lowered structure field.
36#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirField {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "HirField",
            "name", &self.name, "ty", &&self.ty)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirField {
    #[inline]
    fn clone(&self) -> HirField {
        HirField {
            name: ::core::clone::Clone::clone(&self.name),
            ty: ::core::clone::Clone::clone(&self.ty),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirField {
    #[inline]
    fn eq(&self, other: &HirField) -> bool {
        self.name == other.name && self.ty == other.ty
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for HirField {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<String>;
        let _: ::core::cmp::AssertParamIsEq<SemanticType>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirField {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirField", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ty", &self.ty)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirField {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "name" => _serde::__private228::Ok(__Field::__field0),
                            "ty" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"name" => _serde::__private228::Ok(__Field::__field0),
                            b"ty" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirField>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirField;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirField")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirField with 2 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<SemanticType>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirField with 2 elements")),
                            };
                        _serde::__private228::Ok(HirField {
                                name: __field0,
                                ty: __field1,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<SemanticType> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("name"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("ty"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<SemanticType>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("name")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("ty")?,
                            };
                        _serde::__private228::Ok(HirField {
                                name: __field0,
                                ty: __field1,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] = &["name", "ty"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirField", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirField>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
37pub struct HirField {
38    /// Field name.
39    pub name: String,
40    /// Field type.
41    pub ty:   SemanticType,
42}
43
44/// One lowered global variable.
45#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirGlobal {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "HirGlobal",
            "span", &self.span, "name", &self.name, "ty", &self.ty,
            "is_const", &self.is_const, "initializer", &&self.initializer)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirGlobal {
    #[inline]
    fn clone(&self) -> HirGlobal {
        HirGlobal {
            span: ::core::clone::Clone::clone(&self.span),
            name: ::core::clone::Clone::clone(&self.name),
            ty: ::core::clone::Clone::clone(&self.ty),
            is_const: ::core::clone::Clone::clone(&self.is_const),
            initializer: ::core::clone::Clone::clone(&self.initializer),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirGlobal {
    #[inline]
    fn eq(&self, other: &HirGlobal) -> bool {
        self.is_const == other.is_const && self.span == other.span &&
                    self.name == other.name && self.ty == other.ty &&
            self.initializer == other.initializer
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirGlobal {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirGlobal", false as usize + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ty", &self.ty)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_const", &self.is_const)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "initializer", &self.initializer)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirGlobal {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            4u64 => _serde::__private228::Ok(__Field::__field4),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "name" => _serde::__private228::Ok(__Field::__field1),
                            "ty" => _serde::__private228::Ok(__Field::__field2),
                            "is_const" => _serde::__private228::Ok(__Field::__field3),
                            "initializer" =>
                                _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"name" => _serde::__private228::Ok(__Field::__field1),
                            b"ty" => _serde::__private228::Ok(__Field::__field2),
                            b"is_const" => _serde::__private228::Ok(__Field::__field3),
                            b"initializer" =>
                                _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirGlobal>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirGlobal;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirGlobal")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirGlobal with 5 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirGlobal with 5 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<SemanticType>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirGlobal with 5 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<bool>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct HirGlobal with 5 elements")),
                            };
                        let __field4 =
                            match _serde::de::SeqAccess::next_element::<Option<HirExpr>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(4usize,
                                                &"struct HirGlobal with 5 elements")),
                            };
                        _serde::__private228::Ok(HirGlobal {
                                span: __field0,
                                name: __field1,
                                ty: __field2,
                                is_const: __field3,
                                initializer: __field4,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<SemanticType> =
                            _serde::__private228::None;
                        let mut __field3: _serde::__private228::Option<bool> =
                            _serde::__private228::None;
                        let mut __field4:
                                _serde::__private228::Option<Option<HirExpr>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("name"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("ty"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<SemanticType>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("is_const"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<bool>(&mut __map)?);
                                }
                                __Field::__field4 => {
                                    if _serde::__private228::Option::is_some(&__field4) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("initializer"));
                                    }
                                    __field4 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Option<HirExpr>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("name")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("ty")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("is_const")?,
                            };
                        let __field4 =
                            match __field4 {
                                _serde::__private228::Some(__field4) => __field4,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("initializer")?,
                            };
                        _serde::__private228::Ok(HirGlobal {
                                span: __field0,
                                name: __field1,
                                ty: __field2,
                                is_const: __field3,
                                initializer: __field4,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["span", "name", "ty", "is_const", "initializer"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirGlobal", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirGlobal>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
46pub struct HirGlobal {
47    /// Source span.
48    pub span:        crate::Span,
49    /// Global name.
50    pub name:        String,
51    /// Global type.
52    pub ty:          SemanticType,
53    /// Whether the global is `const`.
54    pub is_const:    bool,
55    /// Optional initializer.
56    pub initializer: Option<HirExpr>,
57}
58
59/// One lowered function.
60#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirFunction {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["span", "name", "return_type", "parameters", "locals", "body",
                        "is_builtin"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.span, &self.name, &self.return_type, &self.parameters,
                        &self.locals, &self.body, &&self.is_builtin];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "HirFunction",
            names, values)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirFunction {
    #[inline]
    fn clone(&self) -> HirFunction {
        HirFunction {
            span: ::core::clone::Clone::clone(&self.span),
            name: ::core::clone::Clone::clone(&self.name),
            return_type: ::core::clone::Clone::clone(&self.return_type),
            parameters: ::core::clone::Clone::clone(&self.parameters),
            locals: ::core::clone::Clone::clone(&self.locals),
            body: ::core::clone::Clone::clone(&self.body),
            is_builtin: ::core::clone::Clone::clone(&self.is_builtin),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirFunction {
    #[inline]
    fn eq(&self, other: &HirFunction) -> bool {
        self.is_builtin == other.is_builtin && self.span == other.span &&
                            self.name == other.name &&
                        self.return_type == other.return_type &&
                    self.parameters == other.parameters &&
                self.locals == other.locals && self.body == other.body
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirFunction {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirFunction", false as usize + 1 + 1 + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "return_type", &self.return_type)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "parameters", &self.parameters)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "locals", &self.locals)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "body", &self.body)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_builtin", &self.is_builtin)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirFunction {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __field5,
                    __field6,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            4u64 => _serde::__private228::Ok(__Field::__field4),
                            5u64 => _serde::__private228::Ok(__Field::__field5),
                            6u64 => _serde::__private228::Ok(__Field::__field6),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "name" => _serde::__private228::Ok(__Field::__field1),
                            "return_type" =>
                                _serde::__private228::Ok(__Field::__field2),
                            "parameters" => _serde::__private228::Ok(__Field::__field3),
                            "locals" => _serde::__private228::Ok(__Field::__field4),
                            "body" => _serde::__private228::Ok(__Field::__field5),
                            "is_builtin" => _serde::__private228::Ok(__Field::__field6),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"name" => _serde::__private228::Ok(__Field::__field1),
                            b"return_type" =>
                                _serde::__private228::Ok(__Field::__field2),
                            b"parameters" =>
                                _serde::__private228::Ok(__Field::__field3),
                            b"locals" => _serde::__private228::Ok(__Field::__field4),
                            b"body" => _serde::__private228::Ok(__Field::__field5),
                            b"is_builtin" =>
                                _serde::__private228::Ok(__Field::__field6),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirFunction>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirFunction;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirFunction")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirFunction with 7 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirFunction with 7 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<SemanticType>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirFunction with 7 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<Vec<HirParameter>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct HirFunction with 7 elements")),
                            };
                        let __field4 =
                            match _serde::de::SeqAccess::next_element::<Vec<HirLocal>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(4usize,
                                                &"struct HirFunction with 7 elements")),
                            };
                        let __field5 =
                            match _serde::de::SeqAccess::next_element::<Option<HirBlock>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(5usize,
                                                &"struct HirFunction with 7 elements")),
                            };
                        let __field6 =
                            match _serde::de::SeqAccess::next_element::<bool>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(6usize,
                                                &"struct HirFunction with 7 elements")),
                            };
                        _serde::__private228::Ok(HirFunction {
                                span: __field0,
                                name: __field1,
                                return_type: __field2,
                                parameters: __field3,
                                locals: __field4,
                                body: __field5,
                                is_builtin: __field6,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<SemanticType> =
                            _serde::__private228::None;
                        let mut __field3:
                                _serde::__private228::Option<Vec<HirParameter>> =
                            _serde::__private228::None;
                        let mut __field4:
                                _serde::__private228::Option<Vec<HirLocal>> =
                            _serde::__private228::None;
                        let mut __field5:
                                _serde::__private228::Option<Option<HirBlock>> =
                            _serde::__private228::None;
                        let mut __field6: _serde::__private228::Option<bool> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("name"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("return_type"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<SemanticType>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("parameters"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<HirParameter>>(&mut __map)?);
                                }
                                __Field::__field4 => {
                                    if _serde::__private228::Option::is_some(&__field4) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("locals"));
                                    }
                                    __field4 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<HirLocal>>(&mut __map)?);
                                }
                                __Field::__field5 => {
                                    if _serde::__private228::Option::is_some(&__field5) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("body"));
                                    }
                                    __field5 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Option<HirBlock>>(&mut __map)?);
                                }
                                __Field::__field6 => {
                                    if _serde::__private228::Option::is_some(&__field6) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("is_builtin"));
                                    }
                                    __field6 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<bool>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("name")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("return_type")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("parameters")?,
                            };
                        let __field4 =
                            match __field4 {
                                _serde::__private228::Some(__field4) => __field4,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("locals")?,
                            };
                        let __field5 =
                            match __field5 {
                                _serde::__private228::Some(__field5) => __field5,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("body")?,
                            };
                        let __field6 =
                            match __field6 {
                                _serde::__private228::Some(__field6) => __field6,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("is_builtin")?,
                            };
                        _serde::__private228::Ok(HirFunction {
                                span: __field0,
                                name: __field1,
                                return_type: __field2,
                                parameters: __field3,
                                locals: __field4,
                                body: __field5,
                                is_builtin: __field6,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["span", "name", "return_type", "parameters", "locals",
                                "body", "is_builtin"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirFunction", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirFunction>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
61pub struct HirFunction {
62    /// Source span.
63    pub span:        crate::Span,
64    /// Function name.
65    pub name:        String,
66    /// Return type.
67    pub return_type: SemanticType,
68    /// Parameters in declaration order.
69    pub parameters:  Vec<HirParameter>,
70    /// All local slots, including parameters first.
71    pub locals:      Vec<HirLocal>,
72    /// Optional body for declarations vs implementations.
73    pub body:        Option<HirBlock>,
74    /// Whether the function came from the builtin langspec.
75    pub is_builtin:  bool,
76}
77
78/// One lowered function parameter.
79#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirParameter {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "HirParameter",
            "local", &self.local, "name", &self.name, "ty", &self.ty,
            "is_optional", &self.is_optional, "default", &&self.default)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirParameter {
    #[inline]
    fn clone(&self) -> HirParameter {
        HirParameter {
            local: ::core::clone::Clone::clone(&self.local),
            name: ::core::clone::Clone::clone(&self.name),
            ty: ::core::clone::Clone::clone(&self.ty),
            is_optional: ::core::clone::Clone::clone(&self.is_optional),
            default: ::core::clone::Clone::clone(&self.default),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirParameter {
    #[inline]
    fn eq(&self, other: &HirParameter) -> bool {
        self.is_optional == other.is_optional && self.local == other.local &&
                    self.name == other.name && self.ty == other.ty &&
            self.default == other.default
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirParameter {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirParameter", false as usize + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "local", &self.local)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ty", &self.ty)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_optional", &self.is_optional)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "default", &self.default)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirParameter {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            4u64 => _serde::__private228::Ok(__Field::__field4),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "local" => _serde::__private228::Ok(__Field::__field0),
                            "name" => _serde::__private228::Ok(__Field::__field1),
                            "ty" => _serde::__private228::Ok(__Field::__field2),
                            "is_optional" =>
                                _serde::__private228::Ok(__Field::__field3),
                            "default" => _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"local" => _serde::__private228::Ok(__Field::__field0),
                            b"name" => _serde::__private228::Ok(__Field::__field1),
                            b"ty" => _serde::__private228::Ok(__Field::__field2),
                            b"is_optional" =>
                                _serde::__private228::Ok(__Field::__field3),
                            b"default" => _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirParameter>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirParameter;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirParameter")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<HirLocalId>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirParameter with 5 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirParameter with 5 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<SemanticType>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirParameter with 5 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<bool>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct HirParameter with 5 elements")),
                            };
                        let __field4 =
                            match _serde::de::SeqAccess::next_element::<Option<HirExpr>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(4usize,
                                                &"struct HirParameter with 5 elements")),
                            };
                        _serde::__private228::Ok(HirParameter {
                                local: __field0,
                                name: __field1,
                                ty: __field2,
                                is_optional: __field3,
                                default: __field4,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<HirLocalId> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<SemanticType> =
                            _serde::__private228::None;
                        let mut __field3: _serde::__private228::Option<bool> =
                            _serde::__private228::None;
                        let mut __field4:
                                _serde::__private228::Option<Option<HirExpr>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("local"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<HirLocalId>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("name"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("ty"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<SemanticType>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("is_optional"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<bool>(&mut __map)?);
                                }
                                __Field::__field4 => {
                                    if _serde::__private228::Option::is_some(&__field4) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("default"));
                                    }
                                    __field4 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Option<HirExpr>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("local")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("name")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("ty")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("is_optional")?,
                            };
                        let __field4 =
                            match __field4 {
                                _serde::__private228::Some(__field4) => __field4,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("default")?,
                            };
                        _serde::__private228::Ok(HirParameter {
                                local: __field0,
                                name: __field1,
                                ty: __field2,
                                is_optional: __field3,
                                default: __field4,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["local", "name", "ty", "is_optional", "default"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirParameter", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirParameter>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
80pub struct HirParameter {
81    /// Local slot for this parameter.
82    pub local:       HirLocalId,
83    /// Parameter name.
84    pub name:        String,
85    /// Parameter type.
86    pub ty:          SemanticType,
87    /// Whether the parameter has a default value.
88    pub is_optional: bool,
89    /// Lowered default value for omitted trailing arguments.
90    pub default:     Option<HirExpr>,
91}
92
93/// One lowered local slot.
94#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirLocal {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "HirLocal",
            "id", &self.id, "name", &self.name, "ty", &self.ty, "kind",
            &&self.kind)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirLocal {
    #[inline]
    fn clone(&self) -> HirLocal {
        HirLocal {
            id: ::core::clone::Clone::clone(&self.id),
            name: ::core::clone::Clone::clone(&self.name),
            ty: ::core::clone::Clone::clone(&self.ty),
            kind: ::core::clone::Clone::clone(&self.kind),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirLocal {
    #[inline]
    fn eq(&self, other: &HirLocal) -> bool {
        self.id == other.id && self.name == other.name && self.ty == other.ty
            && self.kind == other.kind
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for HirLocal {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<HirLocalId>;
        let _: ::core::cmp::AssertParamIsEq<String>;
        let _: ::core::cmp::AssertParamIsEq<SemanticType>;
        let _: ::core::cmp::AssertParamIsEq<HirLocalKind>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirLocal {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirLocal", false as usize + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "id", &self.id)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ty", &self.ty)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "kind", &self.kind)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirLocal {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "id" => _serde::__private228::Ok(__Field::__field0),
                            "name" => _serde::__private228::Ok(__Field::__field1),
                            "ty" => _serde::__private228::Ok(__Field::__field2),
                            "kind" => _serde::__private228::Ok(__Field::__field3),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"id" => _serde::__private228::Ok(__Field::__field0),
                            b"name" => _serde::__private228::Ok(__Field::__field1),
                            b"ty" => _serde::__private228::Ok(__Field::__field2),
                            b"kind" => _serde::__private228::Ok(__Field::__field3),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirLocal>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirLocal;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirLocal")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<HirLocalId>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirLocal with 4 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirLocal with 4 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<SemanticType>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirLocal with 4 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<HirLocalKind>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct HirLocal with 4 elements")),
                            };
                        _serde::__private228::Ok(HirLocal {
                                id: __field0,
                                name: __field1,
                                ty: __field2,
                                kind: __field3,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<HirLocalId> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<SemanticType> =
                            _serde::__private228::None;
                        let mut __field3:
                                _serde::__private228::Option<HirLocalKind> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("id"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<HirLocalId>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("name"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("ty"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<SemanticType>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("kind"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<HirLocalKind>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("id")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("name")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("ty")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("kind")?,
                            };
                        _serde::__private228::Ok(HirLocal {
                                id: __field0,
                                name: __field1,
                                ty: __field2,
                                kind: __field3,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["id", "name", "ty", "kind"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirLocal", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirLocal>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
95pub struct HirLocal {
96    /// Stable local id within one function.
97    pub id:   HirLocalId,
98    /// Local name.
99    pub name: String,
100    /// Local type.
101    pub ty:   SemanticType,
102    /// Whether this slot is a parameter or a body-local.
103    pub kind: HirLocalKind,
104}
105
106/// One lowered local kind.
107#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirLocalKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                HirLocalKind::Parameter => "Parameter",
                HirLocalKind::Local => "Local",
            })
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirLocalKind {
    #[inline]
    fn clone(&self) -> HirLocalKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for HirLocalKind { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for HirLocalKind {
    #[inline]
    fn eq(&self, other: &HirLocalKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for HirLocalKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirLocalKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    HirLocalKind::Parameter =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "HirLocalKind", 0u32, "Parameter"),
                    HirLocalKind::Local =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "HirLocalKind", 1u32, "Local"),
                }
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirLocalKind {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "variant identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            _ =>
                                _serde::__private228::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
                                        &"variant index 0 <= i < 2")),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "Parameter" => _serde::__private228::Ok(__Field::__field0),
                            "Local" => _serde::__private228::Ok(__Field::__field1),
                            _ => {
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"Parameter" => _serde::__private228::Ok(__Field::__field0),
                            b"Local" => _serde::__private228::Ok(__Field::__field1),
                            _ => {
                                let __value =
                                    &_serde::__private228::from_utf8_lossy(__value);
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirLocalKind>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirLocalKind;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "enum HirLocalKind")
                    }
                    fn visit_enum<__A>(self, __data: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::EnumAccess<'de> {
                        match _serde::de::EnumAccess::variant(__data)? {
                            (__Field::__field0, __variant) => {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private228::Ok(HirLocalKind::Parameter)
                            }
                            (__Field::__field1, __variant) => {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private228::Ok(HirLocalKind::Local)
                            }
                        }
                    }
                }
                #[doc(hidden)]
                const VARIANTS: &'static [&'static str] =
                    &["Parameter", "Local"];
                _serde::Deserializer::deserialize_enum(__deserializer,
                    "HirLocalKind", VARIANTS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirLocalKind>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
108pub enum HirLocalKind {
109    /// One parameter slot.
110    Parameter,
111    /// One block-local slot.
112    Local,
113}
114
115/// One function-local identifier.
116#[derive(
117    #[automatically_derived]
impl ::core::fmt::Debug for HirLocalId {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "HirLocalId",
            &&self.0)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirLocalId {
    #[inline]
    fn clone(&self) -> HirLocalId {
        let _: ::core::clone::AssertParamIsClone<u32>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for HirLocalId { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for HirLocalId {
    #[inline]
    fn eq(&self, other: &HirLocalId) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for HirLocalId {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u32>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for HirLocalId {
    #[inline]
    fn partial_cmp(&self, other: &HirLocalId)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::cmp::PartialOrd::partial_cmp(&self.0, &other.0)
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for HirLocalId {
    #[inline]
    fn cmp(&self, other: &HirLocalId) -> ::core::cmp::Ordering {
        ::core::cmp::Ord::cmp(&self.0, &other.0)
    }
}Ord, #[automatically_derived]
impl ::core::hash::Hash for HirLocalId {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirLocalId {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "HirLocalId", &self.0)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirLocalId {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirLocalId>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirLocalId;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "tuple struct HirLocalId")
                    }
                    #[inline]
                    fn visit_newtype_struct<__E>(self, __e: __E)
                        -> _serde::__private228::Result<Self::Value, __E::Error>
                        where __E: _serde::Deserializer<'de> {
                        let __field0: u32 =
                            <u32 as _serde::Deserialize>::deserialize(__e)?;
                        _serde::__private228::Ok(HirLocalId(__field0))
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"tuple struct HirLocalId with 1 element")),
                            };
                        _serde::__private228::Ok(HirLocalId(__field0))
                    }
                }
                _serde::Deserializer::deserialize_newtype_struct(__deserializer,
                    "HirLocalId",
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirLocalId>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize, #[automatically_derived]
impl ::core::default::Default for HirLocalId {
    #[inline]
    fn default() -> HirLocalId {
        HirLocalId(::core::default::Default::default())
    }
}Default,
118)]
119pub struct HirLocalId(pub u32);
120
121/// One lowered block.
122#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirBlock {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "HirBlock",
            "span", &self.span, "statements", &&self.statements)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirBlock {
    #[inline]
    fn clone(&self) -> HirBlock {
        HirBlock {
            span: ::core::clone::Clone::clone(&self.span),
            statements: ::core::clone::Clone::clone(&self.statements),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirBlock {
    #[inline]
    fn eq(&self, other: &HirBlock) -> bool {
        self.span == other.span && self.statements == other.statements
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirBlock {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirBlock", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "statements", &self.statements)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirBlock {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "statements" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"statements" =>
                                _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirBlock>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirBlock;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirBlock")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirBlock with 2 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Vec<HirStmt>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirBlock with 2 elements")),
                            };
                        _serde::__private228::Ok(HirBlock {
                                span: __field0,
                                statements: __field1,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<Vec<HirStmt>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("statements"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<HirStmt>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("statements")?,
                            };
                        _serde::__private228::Ok(HirBlock {
                                span: __field0,
                                statements: __field1,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["span", "statements"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirBlock", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirBlock>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
123pub struct HirBlock {
124    /// Source span.
125    pub span:       crate::Span,
126    /// Lowered statements.
127    pub statements: Vec<HirStmt>,
128}
129
130/// One lowered statement.
131#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirStmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            HirStmt::Block(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Block",
                    &__self_0),
            HirStmt::Declare(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Declare", &__self_0),
            HirStmt::Expr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
                    &__self_0),
            HirStmt::If(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "If",
                    &__self_0),
            HirStmt::Switch(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Switch",
                    &__self_0),
            HirStmt::Return(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Return",
                    &__self_0),
            HirStmt::While(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "While",
                    &__self_0),
            HirStmt::DoWhile(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DoWhile", &__self_0),
            HirStmt::For(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "For",
                    &__self_0),
            HirStmt::Case(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Case",
                    &__self_0),
            HirStmt::Default(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Default", &__self_0),
            HirStmt::Break(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Break",
                    &__self_0),
            HirStmt::Continue(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Continue", &__self_0),
            HirStmt::Empty(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Empty",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirStmt {
    #[inline]
    fn clone(&self) -> HirStmt {
        match self {
            HirStmt::Block(__self_0) =>
                HirStmt::Block(::core::clone::Clone::clone(__self_0)),
            HirStmt::Declare(__self_0) =>
                HirStmt::Declare(::core::clone::Clone::clone(__self_0)),
            HirStmt::Expr(__self_0) =>
                HirStmt::Expr(::core::clone::Clone::clone(__self_0)),
            HirStmt::If(__self_0) =>
                HirStmt::If(::core::clone::Clone::clone(__self_0)),
            HirStmt::Switch(__self_0) =>
                HirStmt::Switch(::core::clone::Clone::clone(__self_0)),
            HirStmt::Return(__self_0) =>
                HirStmt::Return(::core::clone::Clone::clone(__self_0)),
            HirStmt::While(__self_0) =>
                HirStmt::While(::core::clone::Clone::clone(__self_0)),
            HirStmt::DoWhile(__self_0) =>
                HirStmt::DoWhile(::core::clone::Clone::clone(__self_0)),
            HirStmt::For(__self_0) =>
                HirStmt::For(::core::clone::Clone::clone(__self_0)),
            HirStmt::Case(__self_0) =>
                HirStmt::Case(::core::clone::Clone::clone(__self_0)),
            HirStmt::Default(__self_0) =>
                HirStmt::Default(::core::clone::Clone::clone(__self_0)),
            HirStmt::Break(__self_0) =>
                HirStmt::Break(::core::clone::Clone::clone(__self_0)),
            HirStmt::Continue(__self_0) =>
                HirStmt::Continue(::core::clone::Clone::clone(__self_0)),
            HirStmt::Empty(__self_0) =>
                HirStmt::Empty(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirStmt {
    #[inline]
    fn eq(&self, other: &HirStmt) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (HirStmt::Block(__self_0), HirStmt::Block(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::Declare(__self_0), HirStmt::Declare(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::Expr(__self_0), HirStmt::Expr(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::If(__self_0), HirStmt::If(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::Switch(__self_0), HirStmt::Switch(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::Return(__self_0), HirStmt::Return(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::While(__self_0), HirStmt::While(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::DoWhile(__self_0), HirStmt::DoWhile(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::For(__self_0), HirStmt::For(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::Case(__self_0), HirStmt::Case(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::Default(__self_0), HirStmt::Default(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::Break(__self_0), HirStmt::Break(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::Continue(__self_0), HirStmt::Continue(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (HirStmt::Empty(__self_0), HirStmt::Empty(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirStmt {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    HirStmt::Block(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 0u32, "Block", __field0),
                    HirStmt::Declare(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 1u32, "Declare", __field0),
                    HirStmt::Expr(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 2u32, "Expr", __field0),
                    HirStmt::If(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 3u32, "If", __field0),
                    HirStmt::Switch(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 4u32, "Switch", __field0),
                    HirStmt::Return(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 5u32, "Return", __field0),
                    HirStmt::While(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 6u32, "While", __field0),
                    HirStmt::DoWhile(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 7u32, "DoWhile", __field0),
                    HirStmt::For(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 8u32, "For", __field0),
                    HirStmt::Case(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 9u32, "Case", __field0),
                    HirStmt::Default(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 10u32, "Default", __field0),
                    HirStmt::Break(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 11u32, "Break", __field0),
                    HirStmt::Continue(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 12u32, "Continue", __field0),
                    HirStmt::Empty(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirStmt", 13u32, "Empty", __field0),
                }
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirStmt {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __field5,
                    __field6,
                    __field7,
                    __field8,
                    __field9,
                    __field10,
                    __field11,
                    __field12,
                    __field13,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "variant identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            4u64 => _serde::__private228::Ok(__Field::__field4),
                            5u64 => _serde::__private228::Ok(__Field::__field5),
                            6u64 => _serde::__private228::Ok(__Field::__field6),
                            7u64 => _serde::__private228::Ok(__Field::__field7),
                            8u64 => _serde::__private228::Ok(__Field::__field8),
                            9u64 => _serde::__private228::Ok(__Field::__field9),
                            10u64 => _serde::__private228::Ok(__Field::__field10),
                            11u64 => _serde::__private228::Ok(__Field::__field11),
                            12u64 => _serde::__private228::Ok(__Field::__field12),
                            13u64 => _serde::__private228::Ok(__Field::__field13),
                            _ =>
                                _serde::__private228::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
                                        &"variant index 0 <= i < 14")),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "Block" => _serde::__private228::Ok(__Field::__field0),
                            "Declare" => _serde::__private228::Ok(__Field::__field1),
                            "Expr" => _serde::__private228::Ok(__Field::__field2),
                            "If" => _serde::__private228::Ok(__Field::__field3),
                            "Switch" => _serde::__private228::Ok(__Field::__field4),
                            "Return" => _serde::__private228::Ok(__Field::__field5),
                            "While" => _serde::__private228::Ok(__Field::__field6),
                            "DoWhile" => _serde::__private228::Ok(__Field::__field7),
                            "For" => _serde::__private228::Ok(__Field::__field8),
                            "Case" => _serde::__private228::Ok(__Field::__field9),
                            "Default" => _serde::__private228::Ok(__Field::__field10),
                            "Break" => _serde::__private228::Ok(__Field::__field11),
                            "Continue" => _serde::__private228::Ok(__Field::__field12),
                            "Empty" => _serde::__private228::Ok(__Field::__field13),
                            _ => {
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"Block" => _serde::__private228::Ok(__Field::__field0),
                            b"Declare" => _serde::__private228::Ok(__Field::__field1),
                            b"Expr" => _serde::__private228::Ok(__Field::__field2),
                            b"If" => _serde::__private228::Ok(__Field::__field3),
                            b"Switch" => _serde::__private228::Ok(__Field::__field4),
                            b"Return" => _serde::__private228::Ok(__Field::__field5),
                            b"While" => _serde::__private228::Ok(__Field::__field6),
                            b"DoWhile" => _serde::__private228::Ok(__Field::__field7),
                            b"For" => _serde::__private228::Ok(__Field::__field8),
                            b"Case" => _serde::__private228::Ok(__Field::__field9),
                            b"Default" => _serde::__private228::Ok(__Field::__field10),
                            b"Break" => _serde::__private228::Ok(__Field::__field11),
                            b"Continue" => _serde::__private228::Ok(__Field::__field12),
                            b"Empty" => _serde::__private228::Ok(__Field::__field13),
                            _ => {
                                let __value =
                                    &_serde::__private228::from_utf8_lossy(__value);
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirStmt>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirStmt;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "enum HirStmt")
                    }
                    fn visit_enum<__A>(self, __data: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::EnumAccess<'de> {
                        match _serde::de::EnumAccess::variant(__data)? {
                            (__Field::__field0, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<Box<HirBlock>>(__variant),
                                    HirStmt::Block),
                            (__Field::__field1, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<Box<HirDeclareStmt>>(__variant),
                                    HirStmt::Declare),
                            (__Field::__field2, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<Box<HirExpr>>(__variant),
                                    HirStmt::Expr),
                            (__Field::__field3, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<Box<HirIfStmt>>(__variant),
                                    HirStmt::If),
                            (__Field::__field4, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<Box<HirSwitchStmt>>(__variant),
                                    HirStmt::Switch),
                            (__Field::__field5, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<Box<HirReturnStmt>>(__variant),
                                    HirStmt::Return),
                            (__Field::__field6, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<Box<HirWhileStmt>>(__variant),
                                    HirStmt::While),
                            (__Field::__field7, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<Box<HirDoWhileStmt>>(__variant),
                                    HirStmt::DoWhile),
                            (__Field::__field8, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<Box<HirForStmt>>(__variant),
                                    HirStmt::For),
                            (__Field::__field9, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<Box<HirExpr>>(__variant),
                                    HirStmt::Case),
                            (__Field::__field10, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<crate::Span>(__variant),
                                    HirStmt::Default),
                            (__Field::__field11, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<crate::Span>(__variant),
                                    HirStmt::Break),
                            (__Field::__field12, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<crate::Span>(__variant),
                                    HirStmt::Continue),
                            (__Field::__field13, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<crate::Span>(__variant),
                                    HirStmt::Empty),
                        }
                    }
                }
                #[doc(hidden)]
                const VARIANTS: &'static [&'static str] =
                    &["Block", "Declare", "Expr", "If", "Switch", "Return",
                                "While", "DoWhile", "For", "Case", "Default", "Break",
                                "Continue", "Empty"];
                _serde::Deserializer::deserialize_enum(__deserializer,
                    "HirStmt", VARIANTS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirStmt>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
132pub enum HirStmt {
133    /// One nested block.
134    Block(Box<HirBlock>),
135    /// One local declaration.
136    Declare(Box<HirDeclareStmt>),
137    /// One expression statement.
138    Expr(Box<HirExpr>),
139    /// One `if` statement.
140    If(Box<HirIfStmt>),
141    /// One `switch` statement.
142    Switch(Box<HirSwitchStmt>),
143    /// One `return` statement.
144    Return(Box<HirReturnStmt>),
145    /// One `while` statement.
146    While(Box<HirWhileStmt>),
147    /// One `do/while` statement.
148    DoWhile(Box<HirDoWhileStmt>),
149    /// One `for` statement.
150    For(Box<HirForStmt>),
151    /// One `case` label.
152    Case(Box<HirExpr>),
153    /// One `default` label.
154    Default(crate::Span),
155    /// One `break`.
156    Break(crate::Span),
157    /// One `continue`.
158    Continue(crate::Span),
159    /// One empty statement.
160    Empty(crate::Span),
161}
162
163/// One lowered declaration statement.
164#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirDeclareStmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "HirDeclareStmt", "span", &self.span, "ty", &self.ty,
            "declarators", &&self.declarators)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirDeclareStmt {
    #[inline]
    fn clone(&self) -> HirDeclareStmt {
        HirDeclareStmt {
            span: ::core::clone::Clone::clone(&self.span),
            ty: ::core::clone::Clone::clone(&self.ty),
            declarators: ::core::clone::Clone::clone(&self.declarators),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirDeclareStmt {
    #[inline]
    fn eq(&self, other: &HirDeclareStmt) -> bool {
        self.span == other.span && self.ty == other.ty &&
            self.declarators == other.declarators
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirDeclareStmt {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirDeclareStmt", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ty", &self.ty)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "declarators", &self.declarators)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirDeclareStmt {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "ty" => _serde::__private228::Ok(__Field::__field1),
                            "declarators" =>
                                _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"ty" => _serde::__private228::Ok(__Field::__field1),
                            b"declarators" =>
                                _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirDeclareStmt>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirDeclareStmt;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirDeclareStmt")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirDeclareStmt with 3 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<SemanticType>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirDeclareStmt with 3 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<Vec<HirDeclarator>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirDeclareStmt with 3 elements")),
                            };
                        _serde::__private228::Ok(HirDeclareStmt {
                                span: __field0,
                                ty: __field1,
                                declarators: __field2,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<SemanticType> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<Vec<HirDeclarator>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("ty"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<SemanticType>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("declarators"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<HirDeclarator>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("ty")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("declarators")?,
                            };
                        _serde::__private228::Ok(HirDeclareStmt {
                                span: __field0,
                                ty: __field1,
                                declarators: __field2,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["span", "ty", "declarators"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirDeclareStmt", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirDeclareStmt>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
165pub struct HirDeclareStmt {
166    /// Source span.
167    pub span:        crate::Span,
168    /// Declaration type.
169    pub ty:          SemanticType,
170    /// Declared locals in source order.
171    pub declarators: Vec<HirDeclarator>,
172}
173
174/// One lowered declared local.
175#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirDeclarator {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "HirDeclarator",
            "local", &self.local, "initializer", &&self.initializer)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirDeclarator {
    #[inline]
    fn clone(&self) -> HirDeclarator {
        HirDeclarator {
            local: ::core::clone::Clone::clone(&self.local),
            initializer: ::core::clone::Clone::clone(&self.initializer),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirDeclarator {
    #[inline]
    fn eq(&self, other: &HirDeclarator) -> bool {
        self.local == other.local && self.initializer == other.initializer
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirDeclarator {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirDeclarator", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "local", &self.local)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "initializer", &self.initializer)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirDeclarator {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "local" => _serde::__private228::Ok(__Field::__field0),
                            "initializer" =>
                                _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"local" => _serde::__private228::Ok(__Field::__field0),
                            b"initializer" =>
                                _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirDeclarator>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirDeclarator;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirDeclarator")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<HirLocalId>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirDeclarator with 2 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Option<HirExpr>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirDeclarator with 2 elements")),
                            };
                        _serde::__private228::Ok(HirDeclarator {
                                local: __field0,
                                initializer: __field1,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<HirLocalId> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<Option<HirExpr>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("local"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<HirLocalId>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("initializer"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Option<HirExpr>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("local")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("initializer")?,
                            };
                        _serde::__private228::Ok(HirDeclarator {
                                local: __field0,
                                initializer: __field1,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["local", "initializer"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirDeclarator", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirDeclarator>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
176pub struct HirDeclarator {
177    /// Local slot for the declared value.
178    pub local:       HirLocalId,
179    /// Optional initializer.
180    pub initializer: Option<HirExpr>,
181}
182
183/// One lowered `if`.
184#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirIfStmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "HirIfStmt",
            "span", &self.span, "condition", &self.condition, "then_branch",
            &self.then_branch, "else_branch", &&self.else_branch)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirIfStmt {
    #[inline]
    fn clone(&self) -> HirIfStmt {
        HirIfStmt {
            span: ::core::clone::Clone::clone(&self.span),
            condition: ::core::clone::Clone::clone(&self.condition),
            then_branch: ::core::clone::Clone::clone(&self.then_branch),
            else_branch: ::core::clone::Clone::clone(&self.else_branch),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirIfStmt {
    #[inline]
    fn eq(&self, other: &HirIfStmt) -> bool {
        self.span == other.span && self.condition == other.condition &&
                self.then_branch == other.then_branch &&
            self.else_branch == other.else_branch
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirIfStmt {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirIfStmt", false as usize + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "condition", &self.condition)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "then_branch", &self.then_branch)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "else_branch", &self.else_branch)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirIfStmt {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "condition" => _serde::__private228::Ok(__Field::__field1),
                            "then_branch" =>
                                _serde::__private228::Ok(__Field::__field2),
                            "else_branch" =>
                                _serde::__private228::Ok(__Field::__field3),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"condition" => _serde::__private228::Ok(__Field::__field1),
                            b"then_branch" =>
                                _serde::__private228::Ok(__Field::__field2),
                            b"else_branch" =>
                                _serde::__private228::Ok(__Field::__field3),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirIfStmt>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirIfStmt;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirIfStmt")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirIfStmt with 4 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<HirExpr>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirIfStmt with 4 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<Box<HirStmt>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirIfStmt with 4 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<Option<Box<HirStmt>>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct HirIfStmt with 4 elements")),
                            };
                        _serde::__private228::Ok(HirIfStmt {
                                span: __field0,
                                condition: __field1,
                                then_branch: __field2,
                                else_branch: __field3,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<HirExpr> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<Box<HirStmt>> =
                            _serde::__private228::None;
                        let mut __field3:
                                _serde::__private228::Option<Option<Box<HirStmt>>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("condition"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<HirExpr>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("then_branch"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirStmt>>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("else_branch"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Option<Box<HirStmt>>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("condition")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("then_branch")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("else_branch")?,
                            };
                        _serde::__private228::Ok(HirIfStmt {
                                span: __field0,
                                condition: __field1,
                                then_branch: __field2,
                                else_branch: __field3,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["span", "condition", "then_branch", "else_branch"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirIfStmt", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirIfStmt>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
185pub struct HirIfStmt {
186    /// Source span.
187    pub span:        crate::Span,
188    /// Condition.
189    pub condition:   HirExpr,
190    /// True branch.
191    pub then_branch: Box<HirStmt>,
192    /// Optional false branch.
193    pub else_branch: Option<Box<HirStmt>>,
194}
195
196/// One lowered `switch`.
197#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirSwitchStmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "HirSwitchStmt",
            "span", &self.span, "condition", &self.condition, "body",
            &&self.body)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirSwitchStmt {
    #[inline]
    fn clone(&self) -> HirSwitchStmt {
        HirSwitchStmt {
            span: ::core::clone::Clone::clone(&self.span),
            condition: ::core::clone::Clone::clone(&self.condition),
            body: ::core::clone::Clone::clone(&self.body),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirSwitchStmt {
    #[inline]
    fn eq(&self, other: &HirSwitchStmt) -> bool {
        self.span == other.span && self.condition == other.condition &&
            self.body == other.body
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirSwitchStmt {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirSwitchStmt", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "condition", &self.condition)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "body", &self.body)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirSwitchStmt {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "condition" => _serde::__private228::Ok(__Field::__field1),
                            "body" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"condition" => _serde::__private228::Ok(__Field::__field1),
                            b"body" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirSwitchStmt>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirSwitchStmt;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirSwitchStmt")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirSwitchStmt with 3 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<HirExpr>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirSwitchStmt with 3 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<Box<HirStmt>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirSwitchStmt with 3 elements")),
                            };
                        _serde::__private228::Ok(HirSwitchStmt {
                                span: __field0,
                                condition: __field1,
                                body: __field2,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<HirExpr> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<Box<HirStmt>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("condition"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<HirExpr>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("body"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirStmt>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("condition")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("body")?,
                            };
                        _serde::__private228::Ok(HirSwitchStmt {
                                span: __field0,
                                condition: __field1,
                                body: __field2,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["span", "condition", "body"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirSwitchStmt", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirSwitchStmt>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
198pub struct HirSwitchStmt {
199    /// Source span.
200    pub span:      crate::Span,
201    /// Switch condition.
202    pub condition: HirExpr,
203    /// Switch body.
204    pub body:      Box<HirStmt>,
205}
206
207/// One lowered `return`.
208#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirReturnStmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "HirReturnStmt",
            "span", &self.span, "value", &&self.value)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirReturnStmt {
    #[inline]
    fn clone(&self) -> HirReturnStmt {
        HirReturnStmt {
            span: ::core::clone::Clone::clone(&self.span),
            value: ::core::clone::Clone::clone(&self.value),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirReturnStmt {
    #[inline]
    fn eq(&self, other: &HirReturnStmt) -> bool {
        self.span == other.span && self.value == other.value
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirReturnStmt {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirReturnStmt", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "value", &self.value)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirReturnStmt {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "value" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"value" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirReturnStmt>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirReturnStmt;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirReturnStmt")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirReturnStmt with 2 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Option<HirExpr>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirReturnStmt with 2 elements")),
                            };
                        _serde::__private228::Ok(HirReturnStmt {
                                span: __field0,
                                value: __field1,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<Option<HirExpr>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("value"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Option<HirExpr>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("value")?,
                            };
                        _serde::__private228::Ok(HirReturnStmt {
                                span: __field0,
                                value: __field1,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] = &["span", "value"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirReturnStmt", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirReturnStmt>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
209pub struct HirReturnStmt {
210    /// Source span.
211    pub span:  crate::Span,
212    /// Optional return value.
213    pub value: Option<HirExpr>,
214}
215
216/// One lowered `while`.
217#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirWhileStmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "HirWhileStmt",
            "span", &self.span, "condition", &self.condition, "body",
            &&self.body)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirWhileStmt {
    #[inline]
    fn clone(&self) -> HirWhileStmt {
        HirWhileStmt {
            span: ::core::clone::Clone::clone(&self.span),
            condition: ::core::clone::Clone::clone(&self.condition),
            body: ::core::clone::Clone::clone(&self.body),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirWhileStmt {
    #[inline]
    fn eq(&self, other: &HirWhileStmt) -> bool {
        self.span == other.span && self.condition == other.condition &&
            self.body == other.body
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirWhileStmt {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirWhileStmt", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "condition", &self.condition)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "body", &self.body)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirWhileStmt {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "condition" => _serde::__private228::Ok(__Field::__field1),
                            "body" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"condition" => _serde::__private228::Ok(__Field::__field1),
                            b"body" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirWhileStmt>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirWhileStmt;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirWhileStmt")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirWhileStmt with 3 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<HirExpr>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirWhileStmt with 3 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<Box<HirStmt>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirWhileStmt with 3 elements")),
                            };
                        _serde::__private228::Ok(HirWhileStmt {
                                span: __field0,
                                condition: __field1,
                                body: __field2,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<HirExpr> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<Box<HirStmt>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("condition"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<HirExpr>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("body"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirStmt>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("condition")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("body")?,
                            };
                        _serde::__private228::Ok(HirWhileStmt {
                                span: __field0,
                                condition: __field1,
                                body: __field2,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["span", "condition", "body"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirWhileStmt", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirWhileStmt>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
218pub struct HirWhileStmt {
219    /// Source span.
220    pub span:      crate::Span,
221    /// Loop condition.
222    pub condition: HirExpr,
223    /// Loop body.
224    pub body:      Box<HirStmt>,
225}
226
227/// One lowered `do/while`.
228#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirDoWhileStmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "HirDoWhileStmt", "span", &self.span, "body", &self.body,
            "condition", &&self.condition)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirDoWhileStmt {
    #[inline]
    fn clone(&self) -> HirDoWhileStmt {
        HirDoWhileStmt {
            span: ::core::clone::Clone::clone(&self.span),
            body: ::core::clone::Clone::clone(&self.body),
            condition: ::core::clone::Clone::clone(&self.condition),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirDoWhileStmt {
    #[inline]
    fn eq(&self, other: &HirDoWhileStmt) -> bool {
        self.span == other.span && self.body == other.body &&
            self.condition == other.condition
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirDoWhileStmt {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirDoWhileStmt", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "body", &self.body)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "condition", &self.condition)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirDoWhileStmt {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "body" => _serde::__private228::Ok(__Field::__field1),
                            "condition" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"body" => _serde::__private228::Ok(__Field::__field1),
                            b"condition" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirDoWhileStmt>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirDoWhileStmt;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirDoWhileStmt")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirDoWhileStmt with 3 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Box<HirStmt>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirDoWhileStmt with 3 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<HirExpr>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirDoWhileStmt with 3 elements")),
                            };
                        _serde::__private228::Ok(HirDoWhileStmt {
                                span: __field0,
                                body: __field1,
                                condition: __field2,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<Box<HirStmt>> =
                            _serde::__private228::None;
                        let mut __field2: _serde::__private228::Option<HirExpr> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("body"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirStmt>>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("condition"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<HirExpr>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("body")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("condition")?,
                            };
                        _serde::__private228::Ok(HirDoWhileStmt {
                                span: __field0,
                                body: __field1,
                                condition: __field2,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["span", "body", "condition"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirDoWhileStmt", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirDoWhileStmt>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
229pub struct HirDoWhileStmt {
230    /// Source span.
231    pub span:      crate::Span,
232    /// Loop body.
233    pub body:      Box<HirStmt>,
234    /// Loop condition.
235    pub condition: HirExpr,
236}
237
238/// One lowered `for`.
239#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirForStmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "HirForStmt",
            "span", &self.span, "initializer", &self.initializer, "condition",
            &self.condition, "update", &self.update, "body", &&self.body)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirForStmt {
    #[inline]
    fn clone(&self) -> HirForStmt {
        HirForStmt {
            span: ::core::clone::Clone::clone(&self.span),
            initializer: ::core::clone::Clone::clone(&self.initializer),
            condition: ::core::clone::Clone::clone(&self.condition),
            update: ::core::clone::Clone::clone(&self.update),
            body: ::core::clone::Clone::clone(&self.body),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirForStmt {
    #[inline]
    fn eq(&self, other: &HirForStmt) -> bool {
        self.span == other.span && self.initializer == other.initializer &&
                    self.condition == other.condition &&
                self.update == other.update && self.body == other.body
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirForStmt {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirForStmt", false as usize + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "initializer", &self.initializer)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "condition", &self.condition)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "update", &self.update)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "body", &self.body)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirForStmt {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            4u64 => _serde::__private228::Ok(__Field::__field4),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "initializer" =>
                                _serde::__private228::Ok(__Field::__field1),
                            "condition" => _serde::__private228::Ok(__Field::__field2),
                            "update" => _serde::__private228::Ok(__Field::__field3),
                            "body" => _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"initializer" =>
                                _serde::__private228::Ok(__Field::__field1),
                            b"condition" => _serde::__private228::Ok(__Field::__field2),
                            b"update" => _serde::__private228::Ok(__Field::__field3),
                            b"body" => _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirForStmt>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirForStmt;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirForStmt")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirForStmt with 5 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Option<HirExpr>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirForStmt with 5 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<Option<HirExpr>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirForStmt with 5 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<Option<HirExpr>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct HirForStmt with 5 elements")),
                            };
                        let __field4 =
                            match _serde::de::SeqAccess::next_element::<Box<HirStmt>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(4usize,
                                                &"struct HirForStmt with 5 elements")),
                            };
                        _serde::__private228::Ok(HirForStmt {
                                span: __field0,
                                initializer: __field1,
                                condition: __field2,
                                update: __field3,
                                body: __field4,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<Option<HirExpr>> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<Option<HirExpr>> =
                            _serde::__private228::None;
                        let mut __field3:
                                _serde::__private228::Option<Option<HirExpr>> =
                            _serde::__private228::None;
                        let mut __field4:
                                _serde::__private228::Option<Box<HirStmt>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("initializer"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Option<HirExpr>>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("condition"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Option<HirExpr>>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("update"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Option<HirExpr>>(&mut __map)?);
                                }
                                __Field::__field4 => {
                                    if _serde::__private228::Option::is_some(&__field4) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("body"));
                                    }
                                    __field4 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirStmt>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("initializer")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("condition")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("update")?,
                            };
                        let __field4 =
                            match __field4 {
                                _serde::__private228::Some(__field4) => __field4,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("body")?,
                            };
                        _serde::__private228::Ok(HirForStmt {
                                span: __field0,
                                initializer: __field1,
                                condition: __field2,
                                update: __field3,
                                body: __field4,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["span", "initializer", "condition", "update", "body"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirForStmt", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirForStmt>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
240pub struct HirForStmt {
241    /// Source span.
242    pub span:        crate::Span,
243    /// Optional initializer expression.
244    pub initializer: Option<HirExpr>,
245    /// Optional condition expression.
246    pub condition:   Option<HirExpr>,
247    /// Optional update expression.
248    pub update:      Option<HirExpr>,
249    /// Loop body.
250    pub body:        Box<HirStmt>,
251}
252
253/// One lowered expression.
254#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirExpr {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "HirExpr",
            "span", &self.span, "ty", &self.ty, "kind", &&self.kind)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirExpr {
    #[inline]
    fn clone(&self) -> HirExpr {
        HirExpr {
            span: ::core::clone::Clone::clone(&self.span),
            ty: ::core::clone::Clone::clone(&self.ty),
            kind: ::core::clone::Clone::clone(&self.kind),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirExpr {
    #[inline]
    fn eq(&self, other: &HirExpr) -> bool {
        self.span == other.span && self.ty == other.ty &&
            self.kind == other.kind
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirExpr {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirExpr", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ty", &self.ty)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "kind", &self.kind)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirExpr {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "ty" => _serde::__private228::Ok(__Field::__field1),
                            "kind" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"ty" => _serde::__private228::Ok(__Field::__field1),
                            b"kind" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirExpr>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirExpr;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirExpr")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirExpr with 3 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<SemanticType>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirExpr with 3 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<HirExprKind>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct HirExpr with 3 elements")),
                            };
                        _serde::__private228::Ok(HirExpr {
                                span: __field0,
                                ty: __field1,
                                kind: __field2,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<SemanticType> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<HirExprKind> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("ty"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<SemanticType>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("kind"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<HirExprKind>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("ty")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("kind")?,
                            };
                        _serde::__private228::Ok(HirExpr {
                                span: __field0,
                                ty: __field1,
                                kind: __field2,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["span", "ty", "kind"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirExpr", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirExpr>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
255pub struct HirExpr {
256    /// Source span.
257    pub span: crate::Span,
258    /// Resolved expression type.
259    pub ty:   SemanticType,
260    /// Lowered expression kind.
261    pub kind: HirExprKind,
262}
263
264/// One lowered expression kind.
265#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirExprKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            HirExprKind::Literal(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Literal", &__self_0),
            HirExprKind::Value(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Value",
                    &__self_0),
            HirExprKind::Call { target: __self_0, arguments: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Call",
                    "target", __self_0, "arguments", &__self_1),
            HirExprKind::FieldAccess { base: __self_0, field: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "FieldAccess", "base", __self_0, "field", &__self_1),
            HirExprKind::Unary { op: __self_0, expr: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Unary",
                    "op", __self_0, "expr", &__self_1),
            HirExprKind::Binary {
                op: __self_0, left: __self_1, right: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Binary", "op", __self_0, "left", __self_1, "right",
                    &__self_2),
            HirExprKind::Conditional {
                condition: __self_0, when_true: __self_1, when_false: __self_2
                } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Conditional", "condition", __self_0, "when_true", __self_1,
                    "when_false", &__self_2),
            HirExprKind::Assignment {
                op: __self_0, left: __self_1, right: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Assignment", "op", __self_0, "left", __self_1, "right",
                    &__self_2),
        }
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirExprKind {
    #[inline]
    fn clone(&self) -> HirExprKind {
        match self {
            HirExprKind::Literal(__self_0) =>
                HirExprKind::Literal(::core::clone::Clone::clone(__self_0)),
            HirExprKind::Value(__self_0) =>
                HirExprKind::Value(::core::clone::Clone::clone(__self_0)),
            HirExprKind::Call { target: __self_0, arguments: __self_1 } =>
                HirExprKind::Call {
                    target: ::core::clone::Clone::clone(__self_0),
                    arguments: ::core::clone::Clone::clone(__self_1),
                },
            HirExprKind::FieldAccess { base: __self_0, field: __self_1 } =>
                HirExprKind::FieldAccess {
                    base: ::core::clone::Clone::clone(__self_0),
                    field: ::core::clone::Clone::clone(__self_1),
                },
            HirExprKind::Unary { op: __self_0, expr: __self_1 } =>
                HirExprKind::Unary {
                    op: ::core::clone::Clone::clone(__self_0),
                    expr: ::core::clone::Clone::clone(__self_1),
                },
            HirExprKind::Binary {
                op: __self_0, left: __self_1, right: __self_2 } =>
                HirExprKind::Binary {
                    op: ::core::clone::Clone::clone(__self_0),
                    left: ::core::clone::Clone::clone(__self_1),
                    right: ::core::clone::Clone::clone(__self_2),
                },
            HirExprKind::Conditional {
                condition: __self_0, when_true: __self_1, when_false: __self_2
                } =>
                HirExprKind::Conditional {
                    condition: ::core::clone::Clone::clone(__self_0),
                    when_true: ::core::clone::Clone::clone(__self_1),
                    when_false: ::core::clone::Clone::clone(__self_2),
                },
            HirExprKind::Assignment {
                op: __self_0, left: __self_1, right: __self_2 } =>
                HirExprKind::Assignment {
                    op: ::core::clone::Clone::clone(__self_0),
                    left: ::core::clone::Clone::clone(__self_1),
                    right: ::core::clone::Clone::clone(__self_2),
                },
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirExprKind {
    #[inline]
    fn eq(&self, other: &HirExprKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (HirExprKind::Literal(__self_0),
                    HirExprKind::Literal(__arg1_0)) => __self_0 == __arg1_0,
                (HirExprKind::Value(__self_0), HirExprKind::Value(__arg1_0))
                    => __self_0 == __arg1_0,
                (HirExprKind::Call { target: __self_0, arguments: __self_1 },
                    HirExprKind::Call { target: __arg1_0, arguments: __arg1_1 })
                    => __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (HirExprKind::FieldAccess { base: __self_0, field: __self_1 },
                    HirExprKind::FieldAccess { base: __arg1_0, field: __arg1_1
                    }) => __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (HirExprKind::Unary { op: __self_0, expr: __self_1 },
                    HirExprKind::Unary { op: __arg1_0, expr: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (HirExprKind::Binary {
                    op: __self_0, left: __self_1, right: __self_2 },
                    HirExprKind::Binary {
                    op: __arg1_0, left: __arg1_1, right: __arg1_2 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                (HirExprKind::Conditional {
                    condition: __self_0,
                    when_true: __self_1,
                    when_false: __self_2 }, HirExprKind::Conditional {
                    condition: __arg1_0,
                    when_true: __arg1_1,
                    when_false: __arg1_2 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                (HirExprKind::Assignment {
                    op: __self_0, left: __self_1, right: __self_2 },
                    HirExprKind::Assignment {
                    op: __arg1_0, left: __arg1_1, right: __arg1_2 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirExprKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    HirExprKind::Literal(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirExprKind", 0u32, "Literal", __field0),
                    HirExprKind::Value(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirExprKind", 1u32, "Value", __field0),
                    HirExprKind::Call { ref target, ref arguments } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "HirExprKind", 2u32, "Call", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "target", target)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "arguments", arguments)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    HirExprKind::FieldAccess { ref base, ref field } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "HirExprKind", 3u32, "FieldAccess", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "base", base)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "field", field)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    HirExprKind::Unary { ref op, ref expr } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "HirExprKind", 4u32, "Unary", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "op", op)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "expr", expr)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    HirExprKind::Binary { ref op, ref left, ref right } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "HirExprKind", 5u32, "Binary", 0 + 1 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "op", op)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "left", left)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "right", right)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    HirExprKind::Conditional {
                        ref condition, ref when_true, ref when_false } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "HirExprKind", 6u32, "Conditional", 0 + 1 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "condition", condition)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "when_true", when_true)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "when_false", when_false)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    HirExprKind::Assignment { ref op, ref left, ref right } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "HirExprKind", 7u32, "Assignment", 0 + 1 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "op", op)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "left", left)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "right", right)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirExprKind {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __field5,
                    __field6,
                    __field7,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "variant identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            4u64 => _serde::__private228::Ok(__Field::__field4),
                            5u64 => _serde::__private228::Ok(__Field::__field5),
                            6u64 => _serde::__private228::Ok(__Field::__field6),
                            7u64 => _serde::__private228::Ok(__Field::__field7),
                            _ =>
                                _serde::__private228::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
                                        &"variant index 0 <= i < 8")),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "Literal" => _serde::__private228::Ok(__Field::__field0),
                            "Value" => _serde::__private228::Ok(__Field::__field1),
                            "Call" => _serde::__private228::Ok(__Field::__field2),
                            "FieldAccess" =>
                                _serde::__private228::Ok(__Field::__field3),
                            "Unary" => _serde::__private228::Ok(__Field::__field4),
                            "Binary" => _serde::__private228::Ok(__Field::__field5),
                            "Conditional" =>
                                _serde::__private228::Ok(__Field::__field6),
                            "Assignment" => _serde::__private228::Ok(__Field::__field7),
                            _ => {
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"Literal" => _serde::__private228::Ok(__Field::__field0),
                            b"Value" => _serde::__private228::Ok(__Field::__field1),
                            b"Call" => _serde::__private228::Ok(__Field::__field2),
                            b"FieldAccess" =>
                                _serde::__private228::Ok(__Field::__field3),
                            b"Unary" => _serde::__private228::Ok(__Field::__field4),
                            b"Binary" => _serde::__private228::Ok(__Field::__field5),
                            b"Conditional" =>
                                _serde::__private228::Ok(__Field::__field6),
                            b"Assignment" =>
                                _serde::__private228::Ok(__Field::__field7),
                            _ => {
                                let __value =
                                    &_serde::__private228::from_utf8_lossy(__value);
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirExprKind>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirExprKind;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "enum HirExprKind")
                    }
                    fn visit_enum<__A>(self, __data: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::EnumAccess<'de> {
                        match _serde::de::EnumAccess::variant(__data)? {
                            (__Field::__field0, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<Literal>(__variant),
                                    HirExprKind::Literal),
                            (__Field::__field1, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<HirValueRef>(__variant),
                                    HirExprKind::Value),
                            (__Field::__field2, __variant) => {
                                #[allow(non_camel_case_types)]
                                #[doc(hidden)]
                                enum __Field { __field0, __field1, __ignore, }
                                #[doc(hidden)]
                                struct __FieldVisitor;
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                                    type Value = __Field;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "field identifier")
                                    }
                                    fn visit_u64<__E>(self, __value: u64)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            0u64 => _serde::__private228::Ok(__Field::__field0),
                                            1u64 => _serde::__private228::Ok(__Field::__field1),
                                            _ => _serde::__private228::Ok(__Field::__ignore),
                                        }
                                    }
                                    fn visit_str<__E>(self, __value: &str)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            "target" => _serde::__private228::Ok(__Field::__field0),
                                            "arguments" => _serde::__private228::Ok(__Field::__field1),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                    fn visit_bytes<__E>(self, __value: &[u8])
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            b"target" => _serde::__private228::Ok(__Field::__field0),
                                            b"arguments" => _serde::__private228::Ok(__Field::__field1),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                }
                                #[automatically_derived]
                                impl<'de> _serde::Deserialize<'de> for __Field {
                                    #[inline]
                                    fn deserialize<__D>(__deserializer: __D)
                                        -> _serde::__private228::Result<Self, __D::Error> where
                                        __D: _serde::Deserializer<'de> {
                                        _serde::Deserializer::deserialize_identifier(__deserializer,
                                            __FieldVisitor)
                                    }
                                }
                                #[doc(hidden)]
                                struct __Visitor<'de> {
                                    marker: _serde::__private228::PhantomData<HirExprKind>,
                                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                                }
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                                    type Value = HirExprKind;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "struct variant HirExprKind::Call")
                                    }
                                    #[inline]
                                    fn visit_seq<__A>(self, mut __seq: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::SeqAccess<'de> {
                                        let __field0 =
                                            match _serde::de::SeqAccess::next_element::<HirCallTarget>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                                &"struct variant HirExprKind::Call with 2 elements")),
                                            };
                                        let __field1 =
                                            match _serde::de::SeqAccess::next_element::<Vec<HirExpr>>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                                &"struct variant HirExprKind::Call with 2 elements")),
                                            };
                                        _serde::__private228::Ok(HirExprKind::Call {
                                                target: __field0,
                                                arguments: __field1,
                                            })
                                    }
                                    #[inline]
                                    fn visit_map<__A>(self, mut __map: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::MapAccess<'de> {
                                        let mut __field0:
                                                _serde::__private228::Option<HirCallTarget> =
                                            _serde::__private228::None;
                                        let mut __field1:
                                                _serde::__private228::Option<Vec<HirExpr>> =
                                            _serde::__private228::None;
                                        while let _serde::__private228::Some(__key) =
                                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                                            match __key {
                                                __Field::__field0 => {
                                                    if _serde::__private228::Option::is_some(&__field0) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("target"));
                                                    }
                                                    __field0 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<HirCallTarget>(&mut __map)?);
                                                }
                                                __Field::__field1 => {
                                                    if _serde::__private228::Option::is_some(&__field1) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("arguments"));
                                                    }
                                                    __field1 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<HirExpr>>(&mut __map)?);
                                                }
                                                _ => {
                                                    let _ =
                                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                                }
                                            }
                                        }
                                        let __field0 =
                                            match __field0 {
                                                _serde::__private228::Some(__field0) => __field0,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("target")?,
                                            };
                                        let __field1 =
                                            match __field1 {
                                                _serde::__private228::Some(__field1) => __field1,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("arguments")?,
                                            };
                                        _serde::__private228::Ok(HirExprKind::Call {
                                                target: __field0,
                                                arguments: __field1,
                                            })
                                    }
                                }
                                #[doc(hidden)]
                                const FIELDS: &'static [&'static str] =
                                    &["target", "arguments"];
                                _serde::de::VariantAccess::struct_variant(__variant, FIELDS,
                                    __Visitor {
                                        marker: _serde::__private228::PhantomData::<HirExprKind>,
                                        lifetime: _serde::__private228::PhantomData,
                                    })
                            }
                            (__Field::__field3, __variant) => {
                                #[allow(non_camel_case_types)]
                                #[doc(hidden)]
                                enum __Field { __field0, __field1, __ignore, }
                                #[doc(hidden)]
                                struct __FieldVisitor;
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                                    type Value = __Field;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "field identifier")
                                    }
                                    fn visit_u64<__E>(self, __value: u64)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            0u64 => _serde::__private228::Ok(__Field::__field0),
                                            1u64 => _serde::__private228::Ok(__Field::__field1),
                                            _ => _serde::__private228::Ok(__Field::__ignore),
                                        }
                                    }
                                    fn visit_str<__E>(self, __value: &str)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            "base" => _serde::__private228::Ok(__Field::__field0),
                                            "field" => _serde::__private228::Ok(__Field::__field1),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                    fn visit_bytes<__E>(self, __value: &[u8])
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            b"base" => _serde::__private228::Ok(__Field::__field0),
                                            b"field" => _serde::__private228::Ok(__Field::__field1),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                }
                                #[automatically_derived]
                                impl<'de> _serde::Deserialize<'de> for __Field {
                                    #[inline]
                                    fn deserialize<__D>(__deserializer: __D)
                                        -> _serde::__private228::Result<Self, __D::Error> where
                                        __D: _serde::Deserializer<'de> {
                                        _serde::Deserializer::deserialize_identifier(__deserializer,
                                            __FieldVisitor)
                                    }
                                }
                                #[doc(hidden)]
                                struct __Visitor<'de> {
                                    marker: _serde::__private228::PhantomData<HirExprKind>,
                                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                                }
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                                    type Value = HirExprKind;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "struct variant HirExprKind::FieldAccess")
                                    }
                                    #[inline]
                                    fn visit_seq<__A>(self, mut __seq: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::SeqAccess<'de> {
                                        let __field0 =
                                            match _serde::de::SeqAccess::next_element::<Box<HirExpr>>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                                &"struct variant HirExprKind::FieldAccess with 2 elements")),
                                            };
                                        let __field1 =
                                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                                &"struct variant HirExprKind::FieldAccess with 2 elements")),
                                            };
                                        _serde::__private228::Ok(HirExprKind::FieldAccess {
                                                base: __field0,
                                                field: __field1,
                                            })
                                    }
                                    #[inline]
                                    fn visit_map<__A>(self, mut __map: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::MapAccess<'de> {
                                        let mut __field0:
                                                _serde::__private228::Option<Box<HirExpr>> =
                                            _serde::__private228::None;
                                        let mut __field1: _serde::__private228::Option<String> =
                                            _serde::__private228::None;
                                        while let _serde::__private228::Some(__key) =
                                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                                            match __key {
                                                __Field::__field0 => {
                                                    if _serde::__private228::Option::is_some(&__field0) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("base"));
                                                    }
                                                    __field0 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirExpr>>(&mut __map)?);
                                                }
                                                __Field::__field1 => {
                                                    if _serde::__private228::Option::is_some(&__field1) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("field"));
                                                    }
                                                    __field1 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                                }
                                                _ => {
                                                    let _ =
                                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                                }
                                            }
                                        }
                                        let __field0 =
                                            match __field0 {
                                                _serde::__private228::Some(__field0) => __field0,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("base")?,
                                            };
                                        let __field1 =
                                            match __field1 {
                                                _serde::__private228::Some(__field1) => __field1,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("field")?,
                                            };
                                        _serde::__private228::Ok(HirExprKind::FieldAccess {
                                                base: __field0,
                                                field: __field1,
                                            })
                                    }
                                }
                                #[doc(hidden)]
                                const FIELDS: &'static [&'static str] = &["base", "field"];
                                _serde::de::VariantAccess::struct_variant(__variant, FIELDS,
                                    __Visitor {
                                        marker: _serde::__private228::PhantomData::<HirExprKind>,
                                        lifetime: _serde::__private228::PhantomData,
                                    })
                            }
                            (__Field::__field4, __variant) => {
                                #[allow(non_camel_case_types)]
                                #[doc(hidden)]
                                enum __Field { __field0, __field1, __ignore, }
                                #[doc(hidden)]
                                struct __FieldVisitor;
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                                    type Value = __Field;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "field identifier")
                                    }
                                    fn visit_u64<__E>(self, __value: u64)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            0u64 => _serde::__private228::Ok(__Field::__field0),
                                            1u64 => _serde::__private228::Ok(__Field::__field1),
                                            _ => _serde::__private228::Ok(__Field::__ignore),
                                        }
                                    }
                                    fn visit_str<__E>(self, __value: &str)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            "op" => _serde::__private228::Ok(__Field::__field0),
                                            "expr" => _serde::__private228::Ok(__Field::__field1),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                    fn visit_bytes<__E>(self, __value: &[u8])
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            b"op" => _serde::__private228::Ok(__Field::__field0),
                                            b"expr" => _serde::__private228::Ok(__Field::__field1),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                }
                                #[automatically_derived]
                                impl<'de> _serde::Deserialize<'de> for __Field {
                                    #[inline]
                                    fn deserialize<__D>(__deserializer: __D)
                                        -> _serde::__private228::Result<Self, __D::Error> where
                                        __D: _serde::Deserializer<'de> {
                                        _serde::Deserializer::deserialize_identifier(__deserializer,
                                            __FieldVisitor)
                                    }
                                }
                                #[doc(hidden)]
                                struct __Visitor<'de> {
                                    marker: _serde::__private228::PhantomData<HirExprKind>,
                                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                                }
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                                    type Value = HirExprKind;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "struct variant HirExprKind::Unary")
                                    }
                                    #[inline]
                                    fn visit_seq<__A>(self, mut __seq: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::SeqAccess<'de> {
                                        let __field0 =
                                            match _serde::de::SeqAccess::next_element::<UnaryOp>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                                &"struct variant HirExprKind::Unary with 2 elements")),
                                            };
                                        let __field1 =
                                            match _serde::de::SeqAccess::next_element::<Box<HirExpr>>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                                &"struct variant HirExprKind::Unary with 2 elements")),
                                            };
                                        _serde::__private228::Ok(HirExprKind::Unary {
                                                op: __field0,
                                                expr: __field1,
                                            })
                                    }
                                    #[inline]
                                    fn visit_map<__A>(self, mut __map: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::MapAccess<'de> {
                                        let mut __field0: _serde::__private228::Option<UnaryOp> =
                                            _serde::__private228::None;
                                        let mut __field1:
                                                _serde::__private228::Option<Box<HirExpr>> =
                                            _serde::__private228::None;
                                        while let _serde::__private228::Some(__key) =
                                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                                            match __key {
                                                __Field::__field0 => {
                                                    if _serde::__private228::Option::is_some(&__field0) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("op"));
                                                    }
                                                    __field0 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<UnaryOp>(&mut __map)?);
                                                }
                                                __Field::__field1 => {
                                                    if _serde::__private228::Option::is_some(&__field1) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("expr"));
                                                    }
                                                    __field1 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirExpr>>(&mut __map)?);
                                                }
                                                _ => {
                                                    let _ =
                                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                                }
                                            }
                                        }
                                        let __field0 =
                                            match __field0 {
                                                _serde::__private228::Some(__field0) => __field0,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("op")?,
                                            };
                                        let __field1 =
                                            match __field1 {
                                                _serde::__private228::Some(__field1) => __field1,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("expr")?,
                                            };
                                        _serde::__private228::Ok(HirExprKind::Unary {
                                                op: __field0,
                                                expr: __field1,
                                            })
                                    }
                                }
                                #[doc(hidden)]
                                const FIELDS: &'static [&'static str] = &["op", "expr"];
                                _serde::de::VariantAccess::struct_variant(__variant, FIELDS,
                                    __Visitor {
                                        marker: _serde::__private228::PhantomData::<HirExprKind>,
                                        lifetime: _serde::__private228::PhantomData,
                                    })
                            }
                            (__Field::__field5, __variant) => {
                                #[allow(non_camel_case_types)]
                                #[doc(hidden)]
                                enum __Field { __field0, __field1, __field2, __ignore, }
                                #[doc(hidden)]
                                struct __FieldVisitor;
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                                    type Value = __Field;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "field identifier")
                                    }
                                    fn visit_u64<__E>(self, __value: u64)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            0u64 => _serde::__private228::Ok(__Field::__field0),
                                            1u64 => _serde::__private228::Ok(__Field::__field1),
                                            2u64 => _serde::__private228::Ok(__Field::__field2),
                                            _ => _serde::__private228::Ok(__Field::__ignore),
                                        }
                                    }
                                    fn visit_str<__E>(self, __value: &str)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            "op" => _serde::__private228::Ok(__Field::__field0),
                                            "left" => _serde::__private228::Ok(__Field::__field1),
                                            "right" => _serde::__private228::Ok(__Field::__field2),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                    fn visit_bytes<__E>(self, __value: &[u8])
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            b"op" => _serde::__private228::Ok(__Field::__field0),
                                            b"left" => _serde::__private228::Ok(__Field::__field1),
                                            b"right" => _serde::__private228::Ok(__Field::__field2),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                }
                                #[automatically_derived]
                                impl<'de> _serde::Deserialize<'de> for __Field {
                                    #[inline]
                                    fn deserialize<__D>(__deserializer: __D)
                                        -> _serde::__private228::Result<Self, __D::Error> where
                                        __D: _serde::Deserializer<'de> {
                                        _serde::Deserializer::deserialize_identifier(__deserializer,
                                            __FieldVisitor)
                                    }
                                }
                                #[doc(hidden)]
                                struct __Visitor<'de> {
                                    marker: _serde::__private228::PhantomData<HirExprKind>,
                                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                                }
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                                    type Value = HirExprKind;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "struct variant HirExprKind::Binary")
                                    }
                                    #[inline]
                                    fn visit_seq<__A>(self, mut __seq: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::SeqAccess<'de> {
                                        let __field0 =
                                            match _serde::de::SeqAccess::next_element::<BinaryOp>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                                &"struct variant HirExprKind::Binary with 3 elements")),
                                            };
                                        let __field1 =
                                            match _serde::de::SeqAccess::next_element::<Box<HirExpr>>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                                &"struct variant HirExprKind::Binary with 3 elements")),
                                            };
                                        let __field2 =
                                            match _serde::de::SeqAccess::next_element::<Box<HirExpr>>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                                &"struct variant HirExprKind::Binary with 3 elements")),
                                            };
                                        _serde::__private228::Ok(HirExprKind::Binary {
                                                op: __field0,
                                                left: __field1,
                                                right: __field2,
                                            })
                                    }
                                    #[inline]
                                    fn visit_map<__A>(self, mut __map: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::MapAccess<'de> {
                                        let mut __field0: _serde::__private228::Option<BinaryOp> =
                                            _serde::__private228::None;
                                        let mut __field1:
                                                _serde::__private228::Option<Box<HirExpr>> =
                                            _serde::__private228::None;
                                        let mut __field2:
                                                _serde::__private228::Option<Box<HirExpr>> =
                                            _serde::__private228::None;
                                        while let _serde::__private228::Some(__key) =
                                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                                            match __key {
                                                __Field::__field0 => {
                                                    if _serde::__private228::Option::is_some(&__field0) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("op"));
                                                    }
                                                    __field0 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<BinaryOp>(&mut __map)?);
                                                }
                                                __Field::__field1 => {
                                                    if _serde::__private228::Option::is_some(&__field1) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("left"));
                                                    }
                                                    __field1 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirExpr>>(&mut __map)?);
                                                }
                                                __Field::__field2 => {
                                                    if _serde::__private228::Option::is_some(&__field2) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("right"));
                                                    }
                                                    __field2 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirExpr>>(&mut __map)?);
                                                }
                                                _ => {
                                                    let _ =
                                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                                }
                                            }
                                        }
                                        let __field0 =
                                            match __field0 {
                                                _serde::__private228::Some(__field0) => __field0,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("op")?,
                                            };
                                        let __field1 =
                                            match __field1 {
                                                _serde::__private228::Some(__field1) => __field1,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("left")?,
                                            };
                                        let __field2 =
                                            match __field2 {
                                                _serde::__private228::Some(__field2) => __field2,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("right")?,
                                            };
                                        _serde::__private228::Ok(HirExprKind::Binary {
                                                op: __field0,
                                                left: __field1,
                                                right: __field2,
                                            })
                                    }
                                }
                                #[doc(hidden)]
                                const FIELDS: &'static [&'static str] =
                                    &["op", "left", "right"];
                                _serde::de::VariantAccess::struct_variant(__variant, FIELDS,
                                    __Visitor {
                                        marker: _serde::__private228::PhantomData::<HirExprKind>,
                                        lifetime: _serde::__private228::PhantomData,
                                    })
                            }
                            (__Field::__field6, __variant) => {
                                #[allow(non_camel_case_types)]
                                #[doc(hidden)]
                                enum __Field { __field0, __field1, __field2, __ignore, }
                                #[doc(hidden)]
                                struct __FieldVisitor;
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                                    type Value = __Field;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "field identifier")
                                    }
                                    fn visit_u64<__E>(self, __value: u64)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            0u64 => _serde::__private228::Ok(__Field::__field0),
                                            1u64 => _serde::__private228::Ok(__Field::__field1),
                                            2u64 => _serde::__private228::Ok(__Field::__field2),
                                            _ => _serde::__private228::Ok(__Field::__ignore),
                                        }
                                    }
                                    fn visit_str<__E>(self, __value: &str)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            "condition" => _serde::__private228::Ok(__Field::__field0),
                                            "when_true" => _serde::__private228::Ok(__Field::__field1),
                                            "when_false" => _serde::__private228::Ok(__Field::__field2),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                    fn visit_bytes<__E>(self, __value: &[u8])
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            b"condition" => _serde::__private228::Ok(__Field::__field0),
                                            b"when_true" => _serde::__private228::Ok(__Field::__field1),
                                            b"when_false" =>
                                                _serde::__private228::Ok(__Field::__field2),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                }
                                #[automatically_derived]
                                impl<'de> _serde::Deserialize<'de> for __Field {
                                    #[inline]
                                    fn deserialize<__D>(__deserializer: __D)
                                        -> _serde::__private228::Result<Self, __D::Error> where
                                        __D: _serde::Deserializer<'de> {
                                        _serde::Deserializer::deserialize_identifier(__deserializer,
                                            __FieldVisitor)
                                    }
                                }
                                #[doc(hidden)]
                                struct __Visitor<'de> {
                                    marker: _serde::__private228::PhantomData<HirExprKind>,
                                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                                }
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                                    type Value = HirExprKind;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "struct variant HirExprKind::Conditional")
                                    }
                                    #[inline]
                                    fn visit_seq<__A>(self, mut __seq: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::SeqAccess<'de> {
                                        let __field0 =
                                            match _serde::de::SeqAccess::next_element::<Box<HirExpr>>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                                &"struct variant HirExprKind::Conditional with 3 elements")),
                                            };
                                        let __field1 =
                                            match _serde::de::SeqAccess::next_element::<Box<HirExpr>>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                                &"struct variant HirExprKind::Conditional with 3 elements")),
                                            };
                                        let __field2 =
                                            match _serde::de::SeqAccess::next_element::<Box<HirExpr>>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                                &"struct variant HirExprKind::Conditional with 3 elements")),
                                            };
                                        _serde::__private228::Ok(HirExprKind::Conditional {
                                                condition: __field0,
                                                when_true: __field1,
                                                when_false: __field2,
                                            })
                                    }
                                    #[inline]
                                    fn visit_map<__A>(self, mut __map: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::MapAccess<'de> {
                                        let mut __field0:
                                                _serde::__private228::Option<Box<HirExpr>> =
                                            _serde::__private228::None;
                                        let mut __field1:
                                                _serde::__private228::Option<Box<HirExpr>> =
                                            _serde::__private228::None;
                                        let mut __field2:
                                                _serde::__private228::Option<Box<HirExpr>> =
                                            _serde::__private228::None;
                                        while let _serde::__private228::Some(__key) =
                                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                                            match __key {
                                                __Field::__field0 => {
                                                    if _serde::__private228::Option::is_some(&__field0) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("condition"));
                                                    }
                                                    __field0 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirExpr>>(&mut __map)?);
                                                }
                                                __Field::__field1 => {
                                                    if _serde::__private228::Option::is_some(&__field1) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("when_true"));
                                                    }
                                                    __field1 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirExpr>>(&mut __map)?);
                                                }
                                                __Field::__field2 => {
                                                    if _serde::__private228::Option::is_some(&__field2) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("when_false"));
                                                    }
                                                    __field2 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirExpr>>(&mut __map)?);
                                                }
                                                _ => {
                                                    let _ =
                                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                                }
                                            }
                                        }
                                        let __field0 =
                                            match __field0 {
                                                _serde::__private228::Some(__field0) => __field0,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("condition")?,
                                            };
                                        let __field1 =
                                            match __field1 {
                                                _serde::__private228::Some(__field1) => __field1,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("when_true")?,
                                            };
                                        let __field2 =
                                            match __field2 {
                                                _serde::__private228::Some(__field2) => __field2,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("when_false")?,
                                            };
                                        _serde::__private228::Ok(HirExprKind::Conditional {
                                                condition: __field0,
                                                when_true: __field1,
                                                when_false: __field2,
                                            })
                                    }
                                }
                                #[doc(hidden)]
                                const FIELDS: &'static [&'static str] =
                                    &["condition", "when_true", "when_false"];
                                _serde::de::VariantAccess::struct_variant(__variant, FIELDS,
                                    __Visitor {
                                        marker: _serde::__private228::PhantomData::<HirExprKind>,
                                        lifetime: _serde::__private228::PhantomData,
                                    })
                            }
                            (__Field::__field7, __variant) => {
                                #[allow(non_camel_case_types)]
                                #[doc(hidden)]
                                enum __Field { __field0, __field1, __field2, __ignore, }
                                #[doc(hidden)]
                                struct __FieldVisitor;
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                                    type Value = __Field;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "field identifier")
                                    }
                                    fn visit_u64<__E>(self, __value: u64)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            0u64 => _serde::__private228::Ok(__Field::__field0),
                                            1u64 => _serde::__private228::Ok(__Field::__field1),
                                            2u64 => _serde::__private228::Ok(__Field::__field2),
                                            _ => _serde::__private228::Ok(__Field::__ignore),
                                        }
                                    }
                                    fn visit_str<__E>(self, __value: &str)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            "op" => _serde::__private228::Ok(__Field::__field0),
                                            "left" => _serde::__private228::Ok(__Field::__field1),
                                            "right" => _serde::__private228::Ok(__Field::__field2),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                    fn visit_bytes<__E>(self, __value: &[u8])
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            b"op" => _serde::__private228::Ok(__Field::__field0),
                                            b"left" => _serde::__private228::Ok(__Field::__field1),
                                            b"right" => _serde::__private228::Ok(__Field::__field2),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                }
                                #[automatically_derived]
                                impl<'de> _serde::Deserialize<'de> for __Field {
                                    #[inline]
                                    fn deserialize<__D>(__deserializer: __D)
                                        -> _serde::__private228::Result<Self, __D::Error> where
                                        __D: _serde::Deserializer<'de> {
                                        _serde::Deserializer::deserialize_identifier(__deserializer,
                                            __FieldVisitor)
                                    }
                                }
                                #[doc(hidden)]
                                struct __Visitor<'de> {
                                    marker: _serde::__private228::PhantomData<HirExprKind>,
                                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                                }
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                                    type Value = HirExprKind;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "struct variant HirExprKind::Assignment")
                                    }
                                    #[inline]
                                    fn visit_seq<__A>(self, mut __seq: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::SeqAccess<'de> {
                                        let __field0 =
                                            match _serde::de::SeqAccess::next_element::<AssignmentOp>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                                &"struct variant HirExprKind::Assignment with 3 elements")),
                                            };
                                        let __field1 =
                                            match _serde::de::SeqAccess::next_element::<Box<HirExpr>>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                                &"struct variant HirExprKind::Assignment with 3 elements")),
                                            };
                                        let __field2 =
                                            match _serde::de::SeqAccess::next_element::<Box<HirExpr>>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                                &"struct variant HirExprKind::Assignment with 3 elements")),
                                            };
                                        _serde::__private228::Ok(HirExprKind::Assignment {
                                                op: __field0,
                                                left: __field1,
                                                right: __field2,
                                            })
                                    }
                                    #[inline]
                                    fn visit_map<__A>(self, mut __map: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::MapAccess<'de> {
                                        let mut __field0:
                                                _serde::__private228::Option<AssignmentOp> =
                                            _serde::__private228::None;
                                        let mut __field1:
                                                _serde::__private228::Option<Box<HirExpr>> =
                                            _serde::__private228::None;
                                        let mut __field2:
                                                _serde::__private228::Option<Box<HirExpr>> =
                                            _serde::__private228::None;
                                        while let _serde::__private228::Some(__key) =
                                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                                            match __key {
                                                __Field::__field0 => {
                                                    if _serde::__private228::Option::is_some(&__field0) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("op"));
                                                    }
                                                    __field0 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<AssignmentOp>(&mut __map)?);
                                                }
                                                __Field::__field1 => {
                                                    if _serde::__private228::Option::is_some(&__field1) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("left"));
                                                    }
                                                    __field1 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirExpr>>(&mut __map)?);
                                                }
                                                __Field::__field2 => {
                                                    if _serde::__private228::Option::is_some(&__field2) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("right"));
                                                    }
                                                    __field2 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Box<HirExpr>>(&mut __map)?);
                                                }
                                                _ => {
                                                    let _ =
                                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                                }
                                            }
                                        }
                                        let __field0 =
                                            match __field0 {
                                                _serde::__private228::Some(__field0) => __field0,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("op")?,
                                            };
                                        let __field1 =
                                            match __field1 {
                                                _serde::__private228::Some(__field1) => __field1,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("left")?,
                                            };
                                        let __field2 =
                                            match __field2 {
                                                _serde::__private228::Some(__field2) => __field2,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("right")?,
                                            };
                                        _serde::__private228::Ok(HirExprKind::Assignment {
                                                op: __field0,
                                                left: __field1,
                                                right: __field2,
                                            })
                                    }
                                }
                                #[doc(hidden)]
                                const FIELDS: &'static [&'static str] =
                                    &["op", "left", "right"];
                                _serde::de::VariantAccess::struct_variant(__variant, FIELDS,
                                    __Visitor {
                                        marker: _serde::__private228::PhantomData::<HirExprKind>,
                                        lifetime: _serde::__private228::PhantomData,
                                    })
                            }
                        }
                    }
                }
                #[doc(hidden)]
                const VARIANTS: &'static [&'static str] =
                    &["Literal", "Value", "Call", "FieldAccess", "Unary",
                                "Binary", "Conditional", "Assignment"];
                _serde::Deserializer::deserialize_enum(__deserializer,
                    "HirExprKind", VARIANTS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirExprKind>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
266pub enum HirExprKind {
267    /// One literal constant.
268    Literal(Literal),
269    /// One resolved value reference.
270    Value(HirValueRef),
271    /// One direct function call.
272    Call {
273        /// Resolved target.
274        target:    HirCallTarget,
275        /// Lowered arguments.
276        arguments: Vec<HirExpr>,
277    },
278    /// One structure field access.
279    FieldAccess {
280        /// Resolved base value.
281        base:  Box<HirExpr>,
282        /// Field name.
283        field: String,
284    },
285    /// One unary expression.
286    Unary {
287        /// Operator.
288        op:   UnaryOp,
289        /// Operand.
290        expr: Box<HirExpr>,
291    },
292    /// One binary expression.
293    Binary {
294        /// Operator.
295        op:    BinaryOp,
296        /// Left operand.
297        left:  Box<HirExpr>,
298        /// Right operand.
299        right: Box<HirExpr>,
300    },
301    /// One conditional expression.
302    Conditional {
303        /// Condition.
304        condition:  Box<HirExpr>,
305        /// True branch.
306        when_true:  Box<HirExpr>,
307        /// False branch.
308        when_false: Box<HirExpr>,
309    },
310    /// One assignment expression.
311    Assignment {
312        /// Operator.
313        op:    AssignmentOp,
314        /// Left lvalue.
315        left:  Box<HirExpr>,
316        /// Right expression.
317        right: Box<HirExpr>,
318    },
319}
320
321/// One resolved value reference.
322#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirValueRef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            HirValueRef::Local(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Local",
                    &__self_0),
            HirValueRef::Global(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Global",
                    &__self_0),
            HirValueRef::ConstGlobal(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ConstGlobal", &__self_0),
            HirValueRef::BuiltinConstant(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "BuiltinConstant", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirValueRef {
    #[inline]
    fn clone(&self) -> HirValueRef {
        match self {
            HirValueRef::Local(__self_0) =>
                HirValueRef::Local(::core::clone::Clone::clone(__self_0)),
            HirValueRef::Global(__self_0) =>
                HirValueRef::Global(::core::clone::Clone::clone(__self_0)),
            HirValueRef::ConstGlobal(__self_0) =>
                HirValueRef::ConstGlobal(::core::clone::Clone::clone(__self_0)),
            HirValueRef::BuiltinConstant(__self_0) =>
                HirValueRef::BuiltinConstant(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirValueRef {
    #[inline]
    fn eq(&self, other: &HirValueRef) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (HirValueRef::Local(__self_0), HirValueRef::Local(__arg1_0))
                    => __self_0 == __arg1_0,
                (HirValueRef::Global(__self_0), HirValueRef::Global(__arg1_0))
                    => __self_0 == __arg1_0,
                (HirValueRef::ConstGlobal(__self_0),
                    HirValueRef::ConstGlobal(__arg1_0)) => __self_0 == __arg1_0,
                (HirValueRef::BuiltinConstant(__self_0),
                    HirValueRef::BuiltinConstant(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for HirValueRef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<HirLocalId>;
        let _: ::core::cmp::AssertParamIsEq<String>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirValueRef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    HirValueRef::Local(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirValueRef", 0u32, "Local", __field0),
                    HirValueRef::Global(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirValueRef", 1u32, "Global", __field0),
                    HirValueRef::ConstGlobal(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirValueRef", 2u32, "ConstGlobal", __field0),
                    HirValueRef::BuiltinConstant(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirValueRef", 3u32, "BuiltinConstant", __field0),
                }
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirValueRef {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __field3, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "variant identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            _ =>
                                _serde::__private228::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
                                        &"variant index 0 <= i < 4")),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "Local" => _serde::__private228::Ok(__Field::__field0),
                            "Global" => _serde::__private228::Ok(__Field::__field1),
                            "ConstGlobal" =>
                                _serde::__private228::Ok(__Field::__field2),
                            "BuiltinConstant" =>
                                _serde::__private228::Ok(__Field::__field3),
                            _ => {
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"Local" => _serde::__private228::Ok(__Field::__field0),
                            b"Global" => _serde::__private228::Ok(__Field::__field1),
                            b"ConstGlobal" =>
                                _serde::__private228::Ok(__Field::__field2),
                            b"BuiltinConstant" =>
                                _serde::__private228::Ok(__Field::__field3),
                            _ => {
                                let __value =
                                    &_serde::__private228::from_utf8_lossy(__value);
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirValueRef>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirValueRef;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "enum HirValueRef")
                    }
                    fn visit_enum<__A>(self, __data: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::EnumAccess<'de> {
                        match _serde::de::EnumAccess::variant(__data)? {
                            (__Field::__field0, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<HirLocalId>(__variant),
                                    HirValueRef::Local),
                            (__Field::__field1, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<String>(__variant),
                                    HirValueRef::Global),
                            (__Field::__field2, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<String>(__variant),
                                    HirValueRef::ConstGlobal),
                            (__Field::__field3, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<String>(__variant),
                                    HirValueRef::BuiltinConstant),
                        }
                    }
                }
                #[doc(hidden)]
                const VARIANTS: &'static [&'static str] =
                    &["Local", "Global", "ConstGlobal", "BuiltinConstant"];
                _serde::Deserializer::deserialize_enum(__deserializer,
                    "HirValueRef", VARIANTS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirValueRef>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
323pub enum HirValueRef {
324    /// One local or parameter slot.
325    Local(HirLocalId),
326    /// One mutable or non-const global.
327    Global(String),
328    /// One const global.
329    ConstGlobal(String),
330    /// One builtin constant from the langspec.
331    BuiltinConstant(String),
332}
333
334/// One resolved call target.
335#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirCallTarget {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            HirCallTarget::Function(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Function", &__self_0),
            HirCallTarget::Builtin(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Builtin", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirCallTarget {
    #[inline]
    fn clone(&self) -> HirCallTarget {
        match self {
            HirCallTarget::Function(__self_0) =>
                HirCallTarget::Function(::core::clone::Clone::clone(__self_0)),
            HirCallTarget::Builtin(__self_0) =>
                HirCallTarget::Builtin(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirCallTarget {
    #[inline]
    fn eq(&self, other: &HirCallTarget) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (HirCallTarget::Function(__self_0),
                    HirCallTarget::Function(__arg1_0)) => __self_0 == __arg1_0,
                (HirCallTarget::Builtin(__self_0),
                    HirCallTarget::Builtin(__arg1_0)) => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for HirCallTarget {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<String>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirCallTarget {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    HirCallTarget::Function(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirCallTarget", 0u32, "Function", __field0),
                    HirCallTarget::Builtin(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "HirCallTarget", 1u32, "Builtin", __field0),
                }
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirCallTarget {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "variant identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            _ =>
                                _serde::__private228::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
                                        &"variant index 0 <= i < 2")),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "Function" => _serde::__private228::Ok(__Field::__field0),
                            "Builtin" => _serde::__private228::Ok(__Field::__field1),
                            _ => {
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"Function" => _serde::__private228::Ok(__Field::__field0),
                            b"Builtin" => _serde::__private228::Ok(__Field::__field1),
                            _ => {
                                let __value =
                                    &_serde::__private228::from_utf8_lossy(__value);
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirCallTarget>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirCallTarget;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "enum HirCallTarget")
                    }
                    fn visit_enum<__A>(self, __data: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::EnumAccess<'de> {
                        match _serde::de::EnumAccess::variant(__data)? {
                            (__Field::__field0, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<String>(__variant),
                                    HirCallTarget::Function),
                            (__Field::__field1, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<String>(__variant),
                                    HirCallTarget::Builtin),
                        }
                    }
                }
                #[doc(hidden)]
                const VARIANTS: &'static [&'static str] =
                    &["Function", "Builtin"];
                _serde::Deserializer::deserialize_enum(__deserializer,
                    "HirCallTarget", VARIANTS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirCallTarget>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
336pub enum HirCallTarget {
337    /// One user-defined function.
338    Function(String),
339    /// One builtin function.
340    Builtin(String),
341}
342
343/// One HIR lowering failure.
344#[derive(#[automatically_derived]
impl ::core::fmt::Debug for HirLowerError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "HirLowerError",
            "span", &self.span, "message", &&self.message)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for HirLowerError {
    #[inline]
    fn clone(&self) -> HirLowerError {
        HirLowerError {
            span: ::core::clone::Clone::clone(&self.span),
            message: ::core::clone::Clone::clone(&self.message),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for HirLowerError {
    #[inline]
    fn eq(&self, other: &HirLowerError) -> bool {
        self.span == other.span && self.message == other.message
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for HirLowerError {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<crate::Span>;
        let _: ::core::cmp::AssertParamIsEq<String>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for HirLowerError {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "HirLowerError", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "span", &self.span)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "message", &self.message)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for HirLowerError {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "span" => _serde::__private228::Ok(__Field::__field0),
                            "message" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"span" => _serde::__private228::Ok(__Field::__field0),
                            b"message" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<HirLowerError>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = HirLowerError;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct HirLowerError")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<crate::Span>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct HirLowerError with 2 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct HirLowerError with 2 elements")),
                            };
                        _serde::__private228::Ok(HirLowerError {
                                span: __field0,
                                message: __field1,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<crate::Span> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("span"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<crate::Span>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("message"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("span")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("message")?,
                            };
                        _serde::__private228::Ok(HirLowerError {
                                span: __field0,
                                message: __field1,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] = &["span", "message"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "HirLowerError", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<HirLowerError>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
345pub struct HirLowerError {
346    /// Source span that triggered the failure.
347    pub span:    crate::Span,
348    /// Human-readable message.
349    pub message: String,
350}
351
352impl HirLowerError {
353    fn new(span: crate::Span, message: impl Into<String>) -> Self {
354        Self {
355            span,
356            message: message.into(),
357        }
358    }
359}
360
361impl fmt::Display for HirLowerError {
362    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
363        f.write_fmt(format_args!("{0}", self.message))write!(f, "{}", self.message)
364    }
365}
366
367impl Error for HirLowerError {}
368
369/// Lowers one semantically-valid script into typed HIR.
370///
371/// # Errors
372///
373/// Returns [`HirLowerError`] if the script cannot be lowered.
374pub fn lower_to_hir(
375    script: &Script,
376    semantic: &SemanticModel,
377    langspec: Option<&LangSpec>,
378) -> Result<HirModule, HirLowerError> {
379    HirLowerer::new(script, semantic, langspec).lower()
380}
381
382struct HirLowerer<'a> {
383    script:            &'a Script,
384    semantic:          &'a SemanticModel,
385    builtin_constants: BTreeMap<String, SemanticType>,
386}
387
388impl<'a> HirLowerer<'a> {
389    fn new(script: &'a Script, semantic: &'a SemanticModel, langspec: Option<&LangSpec>) -> Self {
390        let mut builtin_constants = BTreeMap::new();
391        if let Some(langspec) = langspec {
392            for constant in &langspec.constants {
393                if let Some(ty) = semantic_type_from_builtin_value(&constant.value) {
394                    builtin_constants.insert(constant.name.clone(), ty);
395                }
396            }
397        }
398
399        Self {
400            script,
401            semantic,
402            builtin_constants,
403        }
404    }
405
406    fn lower(self) -> Result<HirModule, HirLowerError> {
407        let mut includes = Vec::new();
408        let mut structs = Vec::new();
409        let mut globals = Vec::new();
410        let mut functions = Vec::new();
411
412        for item in &self.script.items {
413            match item {
414                crate::TopLevelItem::Include(include) => includes.push(include.clone()),
415                crate::TopLevelItem::Struct(definition) => {
416                    structs.push(self.lower_struct(definition)?);
417                }
418                crate::TopLevelItem::Global(declaration) => {
419                    globals.extend(self.lower_global_declaration(declaration)?);
420                }
421                crate::TopLevelItem::Function(function) => {
422                    functions.push(self.lower_function(function)?);
423                }
424            }
425        }
426
427        Ok(HirModule {
428            includes,
429            structs,
430            globals,
431            functions,
432        })
433    }
434
435    fn lower_struct(&self, definition: &StructDecl) -> Result<HirStruct, HirLowerError> {
436        let resolved = self
437            .semantic
438            .structs
439            .get(&definition.name)
440            .ok_or_else(|| HirLowerError::new(definition.span, "missing semantic struct"))?;
441        Ok(HirStruct {
442            span:   definition.span,
443            name:   resolved.name.clone(),
444            fields: resolved
445                .fields
446                .iter()
447                .map(|field| HirField {
448                    name: field.name.clone(),
449                    ty:   field.ty.clone(),
450                })
451                .collect(),
452        })
453    }
454
455    fn lower_global_declaration(
456        &self,
457        declaration: &crate::Declaration,
458    ) -> Result<Vec<HirGlobal>, HirLowerError> {
459        let mut globals = Vec::new();
460        for declarator in &declaration.declarators {
461            let resolved =
462                self.semantic.globals.get(&declarator.name).ok_or_else(|| {
463                    HirLowerError::new(declarator.span, "missing semantic global")
464                })?;
465            let initializer = declarator
466                .initializer
467                .as_ref()
468                .map(|initializer| {
469                    let mut ctx = FunctionLoweringContext::default();
470                    self.lower_expr(initializer, &mut ctx)
471                })
472                .transpose()?;
473            globals.push(HirGlobal {
474                span: declarator.span,
475                name: resolved.name.clone(),
476                ty: resolved.ty.clone(),
477                is_const: resolved.is_const,
478                initializer,
479            });
480        }
481        Ok(globals)
482    }
483
484    fn lower_function(&self, function: &FunctionDecl) -> Result<HirFunction, HirLowerError> {
485        let resolved = self
486            .semantic
487            .functions
488            .get(&function.name)
489            .ok_or_else(|| HirLowerError::new(function.span, "missing semantic function"))?;
490        let mut ctx = FunctionLoweringContext::default();
491        ctx.push_scope();
492        let mut parameters = Vec::new();
493        if true {
    match (&resolved.parameters.len(), &function.parameters.len()) {
        (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!(resolved.parameters.len(), function.parameters.len());
494
495        for (parameter, parsed) in resolved.parameters.iter().zip(&function.parameters) {
496            let local = ctx.push_local(&parsed.name, parameter.ty.clone(), HirLocalKind::Parameter);
497            let default = if let Some(default) = &parsed.default {
498                Some(self.lower_expr(default, &mut ctx)?)
499            } else {
500                parameter.default.as_ref().map(|literal| HirExpr {
501                    span: function.span,
502                    ty:   parameter.ty.clone(),
503                    kind: HirExprKind::Literal(literal.clone()),
504                })
505            };
506            parameters.push(HirParameter {
507                local,
508                name: parsed.name.clone(),
509                ty: parameter.ty.clone(),
510                is_optional: parameter.is_optional,
511                default,
512            });
513        }
514        ctx.push_scope();
515
516        let body = function
517            .body
518            .as_ref()
519            .map(|body| self.lower_block(body, &mut ctx, true))
520            .transpose()?;
521
522        Ok(HirFunction {
523            span: function.span,
524            name: resolved.name.clone(),
525            return_type: resolved.return_type.clone(),
526            parameters,
527            locals: ctx.locals,
528            body,
529            is_builtin: resolved.is_builtin,
530        })
531    }
532
533    fn lower_block(
534        &self,
535        block: &BlockStmt,
536        ctx: &mut FunctionLoweringContext,
537        is_function_body: bool,
538    ) -> Result<HirBlock, HirLowerError> {
539        if !is_function_body {
540            ctx.push_scope();
541        }
542
543        let mut statements = Vec::new();
544        for statement in &block.statements {
545            statements.push(self.lower_stmt(statement, ctx)?);
546        }
547
548        if !is_function_body {
549            ctx.pop_scope();
550        }
551
552        Ok(HirBlock {
553            span: block.span,
554            statements,
555        })
556    }
557
558    fn lower_stmt(
559        &self,
560        statement: &Stmt,
561        ctx: &mut FunctionLoweringContext,
562    ) -> Result<HirStmt, HirLowerError> {
563        match statement {
564            Stmt::Block(block) => Ok(HirStmt::Block(Box::new(
565                self.lower_block(block, ctx, false)?,
566            ))),
567            Stmt::Declaration(declaration) => {
568                let ty = lower_decl_type(&declaration.ty, self.semantic)?;
569                let mut declarators = Vec::new();
570                for declarator in &declaration.declarators {
571                    let initializer = declarator
572                        .initializer
573                        .as_ref()
574                        .map(|initializer| self.lower_expr(initializer, ctx))
575                        .transpose()?;
576                    let local = ctx.push_local(&declarator.name, ty.clone(), HirLocalKind::Local);
577                    declarators.push(HirDeclarator {
578                        local,
579                        initializer,
580                    });
581                }
582                Ok(HirStmt::Declare(Box::new(HirDeclareStmt {
583                    span: declaration.span,
584                    ty,
585                    declarators,
586                })))
587            }
588            Stmt::Expression(statement) => Ok(HirStmt::Expr(Box::new(
589                self.lower_expr(&statement.expr, ctx)?,
590            ))),
591            Stmt::If(statement) => Ok(HirStmt::If(Box::new(HirIfStmt {
592                span:        statement.span,
593                condition:   self.lower_expr(&statement.condition, ctx)?,
594                then_branch: Box::new(self.lower_stmt(&statement.then_branch, ctx)?),
595                else_branch: statement
596                    .else_branch
597                    .as_ref()
598                    .map(|branch| self.lower_stmt(branch, ctx).map(Box::new))
599                    .transpose()?,
600            }))),
601            Stmt::Switch(statement) => Ok(HirStmt::Switch(Box::new(HirSwitchStmt {
602                span:      statement.span,
603                condition: self.lower_expr(&statement.condition, ctx)?,
604                body:      Box::new(self.lower_stmt(&statement.body, ctx)?),
605            }))),
606            Stmt::Return(statement) => Ok(HirStmt::Return(Box::new(HirReturnStmt {
607                span:  statement.span,
608                value: statement
609                    .value
610                    .as_ref()
611                    .map(|value| self.lower_expr(value, ctx))
612                    .transpose()?,
613            }))),
614            Stmt::While(statement) => Ok(HirStmt::While(Box::new(HirWhileStmt {
615                span:      statement.span,
616                condition: self.lower_expr(&statement.condition, ctx)?,
617                body:      Box::new(self.lower_stmt(&statement.body, ctx)?),
618            }))),
619            Stmt::DoWhile(statement) => Ok(HirStmt::DoWhile(Box::new(HirDoWhileStmt {
620                span:      statement.span,
621                body:      Box::new(self.lower_stmt(&statement.body, ctx)?),
622                condition: self.lower_expr(&statement.condition, ctx)?,
623            }))),
624            Stmt::For(statement) => Ok(HirStmt::For(Box::new(HirForStmt {
625                span:        statement.span,
626                initializer: statement
627                    .initializer
628                    .as_ref()
629                    .map(|expr| self.lower_expr(expr, ctx))
630                    .transpose()?,
631                condition:   statement
632                    .condition
633                    .as_ref()
634                    .map(|expr| self.lower_expr(expr, ctx))
635                    .transpose()?,
636                update:      statement
637                    .update
638                    .as_ref()
639                    .map(|expr| self.lower_expr(expr, ctx))
640                    .transpose()?,
641                body:        Box::new(self.lower_stmt(&statement.body, ctx)?),
642            }))),
643            Stmt::Case(statement) => Ok(HirStmt::Case(Box::new(
644                self.lower_expr(&statement.value, ctx)?,
645            ))),
646            Stmt::Default(statement) => Ok(HirStmt::Default(statement.span)),
647            Stmt::Break(statement) => Ok(HirStmt::Break(statement.span)),
648            Stmt::Continue(statement) => Ok(HirStmt::Continue(statement.span)),
649            Stmt::Empty(statement) => Ok(HirStmt::Empty(statement.span)),
650        }
651    }
652
653    fn lower_expr(
654        &self,
655        expr: &Expr,
656        ctx: &mut FunctionLoweringContext,
657    ) -> Result<HirExpr, HirLowerError> {
658        let lowered = match &expr.kind {
659            ExprKind::Literal(literal) => HirExpr {
660                span: expr.span,
661                ty:   semantic_type_from_literal(literal),
662                kind: HirExprKind::Literal(literal.clone()),
663            },
664            ExprKind::Identifier(name) => {
665                if let Some(local) = ctx.lookup_local(name) {
666                    HirExpr {
667                        span: expr.span,
668                        ty:   local.ty.clone(),
669                        kind: HirExprKind::Value(HirValueRef::Local(local.id)),
670                    }
671                } else if let Some(global) = self.semantic.globals.get(name) {
672                    HirExpr {
673                        span: expr.span,
674                        ty:   global.ty.clone(),
675                        kind: HirExprKind::Value(if global.is_const {
676                            HirValueRef::ConstGlobal(name.clone())
677                        } else {
678                            HirValueRef::Global(name.clone())
679                        }),
680                    }
681                } else if let Some(ty) = self.builtin_constants.get(name) {
682                    HirExpr {
683                        span: expr.span,
684                        ty:   ty.clone(),
685                        kind: HirExprKind::Value(HirValueRef::BuiltinConstant(name.clone())),
686                    }
687                } else {
688                    return Err(HirLowerError::new(
689                        expr.span,
690                        ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("unresolved value reference {0:?}",
                name))
    })format!("unresolved value reference {name:?}"),
691                    ));
692                }
693            }
694            ExprKind::Call {
695                callee,
696                arguments,
697            } => {
698                let ExprKind::Identifier(name) = &callee.kind else {
699                    return Err(HirLowerError::new(
700                        callee.span,
701                        "HIR lowering only supports direct identifier calls",
702                    ));
703                };
704                let function = self.semantic.functions.get(name).ok_or_else(|| {
705                    HirLowerError::new(callee.span, "missing semantic call target")
706                })?;
707                HirExpr {
708                    span: expr.span,
709                    ty:   function.return_type.clone(),
710                    kind: HirExprKind::Call {
711                        target:    if function.is_builtin {
712                            HirCallTarget::Builtin(name.clone())
713                        } else {
714                            HirCallTarget::Function(name.clone())
715                        },
716                        arguments: arguments
717                            .iter()
718                            .map(|argument| self.lower_expr(argument, ctx))
719                            .collect::<Result<Vec<_>, _>>()?,
720                    },
721                }
722            }
723            ExprKind::FieldAccess {
724                base,
725                field,
726            } => {
727                let base = self.lower_expr(base, ctx)?;
728                let ty = field_result_type(&base.ty, field, self.semantic, expr.span)?;
729                HirExpr {
730                    span: expr.span,
731                    ty,
732                    kind: HirExprKind::FieldAccess {
733                        base:  Box::new(base),
734                        field: field.clone(),
735                    },
736                }
737            }
738            ExprKind::Unary {
739                op,
740                expr: inner,
741            } => {
742                let inner = self.lower_expr(inner, ctx)?;
743                let ty = unary_result_type(*op, &inner.ty, expr.span)?;
744                HirExpr {
745                    span: expr.span,
746                    ty,
747                    kind: HirExprKind::Unary {
748                        op:   *op,
749                        expr: Box::new(inner),
750                    },
751                }
752            }
753            ExprKind::Binary {
754                op,
755                left,
756                right,
757            } => {
758                let left = self.lower_expr(left, ctx)?;
759                let right = self.lower_expr(right, ctx)?;
760                let ty = binary_result_type(*op, &left.ty, &right.ty, expr.span)?;
761                HirExpr {
762                    span: expr.span,
763                    ty,
764                    kind: HirExprKind::Binary {
765                        op:    *op,
766                        left:  Box::new(left),
767                        right: Box::new(right),
768                    },
769                }
770            }
771            ExprKind::Conditional {
772                condition,
773                when_true,
774                when_false,
775            } => {
776                let condition = self.lower_expr(condition, ctx)?;
777                let when_true = self.lower_expr(when_true, ctx)?;
778                let when_false = self.lower_expr(when_false, ctx)?;
779                HirExpr {
780                    span: expr.span,
781                    ty:   when_true.ty.clone(),
782                    kind: HirExprKind::Conditional {
783                        condition:  Box::new(condition),
784                        when_true:  Box::new(when_true),
785                        when_false: Box::new(when_false),
786                    },
787                }
788            }
789            ExprKind::Assignment {
790                op,
791                left,
792                right,
793            } => {
794                let left = self.lower_expr(left, ctx)?;
795                let right = self.lower_expr(right, ctx)?;
796                HirExpr {
797                    span: expr.span,
798                    ty:   assignment_result_type(*op, &left.ty, &right.ty, expr.span)?,
799                    kind: HirExprKind::Assignment {
800                        op:    *op,
801                        left:  Box::new(left),
802                        right: Box::new(right),
803                    },
804                }
805            }
806        };
807
808        Ok(lowered)
809    }
810}
811
812#[derive(#[automatically_derived]
impl ::core::default::Default for FunctionLoweringContext {
    #[inline]
    fn default() -> FunctionLoweringContext {
        FunctionLoweringContext {
            locals: ::core::default::Default::default(),
            scopes: ::core::default::Default::default(),
        }
    }
}Default)]
813struct FunctionLoweringContext {
814    locals: Vec<HirLocal>,
815    scopes: Vec<BTreeMap<String, HirLocalBinding>>,
816}
817
818#[derive(#[automatically_derived]
impl ::core::clone::Clone for HirLocalBinding {
    #[inline]
    fn clone(&self) -> HirLocalBinding {
        HirLocalBinding {
            id: ::core::clone::Clone::clone(&self.id),
            ty: ::core::clone::Clone::clone(&self.ty),
        }
    }
}Clone)]
819struct HirLocalBinding {
820    id: HirLocalId,
821    ty: SemanticType,
822}
823
824impl FunctionLoweringContext {
825    fn push_scope(&mut self) {
826        self.scopes.push(BTreeMap::new());
827    }
828
829    fn pop_scope(&mut self) {
830        self.scopes.pop();
831    }
832
833    fn push_local(&mut self, name: &str, ty: SemanticType, kind: HirLocalKind) -> HirLocalId {
834        if self.scopes.is_empty() {
835            self.push_scope();
836        }
837
838        let id = HirLocalId(u32::try_from(self.locals.len()).ok().unwrap_or(u32::MAX));
839        self.locals.push(HirLocal {
840            id,
841            name: name.to_string(),
842            ty: ty.clone(),
843            kind,
844        });
845        if let Some(scope) = self.scopes.last_mut() {
846            scope.insert(
847                name.to_string(),
848                HirLocalBinding {
849                    id,
850                    ty,
851                },
852            );
853        }
854        id
855    }
856
857    fn lookup_local(&self, name: &str) -> Option<&HirLocalBinding> {
858        self.scopes.iter().rev().find_map(|scope| scope.get(name))
859    }
860}
861
862fn lower_decl_type(ty: &TypeSpec, semantic: &SemanticModel) -> Result<SemanticType, HirLowerError> {
863    match &ty.kind {
864        crate::TypeKind::Void => Ok(SemanticType::Void),
865        crate::TypeKind::Int => Ok(SemanticType::Int),
866        crate::TypeKind::Float => Ok(SemanticType::Float),
867        crate::TypeKind::String => Ok(SemanticType::String),
868        crate::TypeKind::Object => Ok(SemanticType::Object),
869        crate::TypeKind::Vector => Ok(SemanticType::Vector),
870        crate::TypeKind::Struct(name) => semantic
871            .structs
872            .contains_key(name)
873            .then(|| SemanticType::Struct(name.clone()))
874            .ok_or_else(|| HirLowerError::new(ty.span, "missing semantic struct type")),
875        crate::TypeKind::EngineStructure(name) => Ok(SemanticType::EngineStructure(name.clone())),
876    }
877}
878
879fn semantic_type_from_literal(literal: &Literal) -> SemanticType {
880    match literal {
881        Literal::Integer(_) | Literal::Magic(crate::MagicLiteral::Line) => SemanticType::Int,
882        Literal::Float(_) => SemanticType::Float,
883        Literal::String(_)
884        | Literal::Magic(
885            crate::MagicLiteral::Function
886            | crate::MagicLiteral::File
887            | crate::MagicLiteral::Date
888            | crate::MagicLiteral::Time,
889        ) => SemanticType::String,
890        Literal::ObjectSelf | Literal::ObjectInvalid => SemanticType::Object,
891        Literal::LocationInvalid => SemanticType::EngineStructure("location".to_string()),
892        Literal::Json(_) => SemanticType::EngineStructure("json".to_string()),
893        Literal::Vector(_) => SemanticType::Vector,
894    }
895}
896
897fn semantic_type_from_builtin_value(value: &BuiltinValue) -> Option<SemanticType> {
898    match value {
899        BuiltinValue::Int(_) => Some(SemanticType::Int),
900        BuiltinValue::Float(_) => Some(SemanticType::Float),
901        BuiltinValue::String(_) => Some(SemanticType::String),
902        BuiltinValue::ObjectId(_) | BuiltinValue::ObjectSelf | BuiltinValue::ObjectInvalid => {
903            Some(SemanticType::Object)
904        }
905        BuiltinValue::LocationInvalid => {
906            Some(SemanticType::EngineStructure("location".to_string()))
907        }
908        BuiltinValue::Json(_) => Some(SemanticType::EngineStructure("json".to_string())),
909        BuiltinValue::Vector(_) => Some(SemanticType::Vector),
910        BuiltinValue::Raw(_) => None,
911    }
912}
913
914fn unary_result_type(
915    op: UnaryOp,
916    operand: &SemanticType,
917    span: crate::Span,
918) -> Result<SemanticType, HirLowerError> {
919    match op {
920        UnaryOp::Negate => match operand {
921            SemanticType::Int | SemanticType::Float => Ok(operand.clone()),
922            _ => Err(HirLowerError::new(
923                span,
924                "negation requires an int or float operand",
925            )),
926        },
927        UnaryOp::OnesComplement
928        | UnaryOp::BooleanNot
929        | UnaryOp::PreIncrement
930        | UnaryOp::PreDecrement
931        | UnaryOp::PostIncrement
932        | UnaryOp::PostDecrement => Ok(SemanticType::Int),
933    }
934}
935
936fn binary_result_type(
937    op: BinaryOp,
938    left: &SemanticType,
939    right: &SemanticType,
940    span: crate::Span,
941) -> Result<SemanticType, HirLowerError> {
942    match op {
943        BinaryOp::LogicalAnd
944        | BinaryOp::LogicalOr
945        | BinaryOp::InclusiveOr
946        | BinaryOp::ExclusiveOr
947        | BinaryOp::BooleanAnd
948        | BinaryOp::ShiftLeft
949        | BinaryOp::ShiftRight
950        | BinaryOp::UnsignedShiftRight
951        | BinaryOp::Modulus
952            if left == &SemanticType::Int && right == &SemanticType::Int =>
953        {
954            Ok(SemanticType::Int)
955        }
956        BinaryOp::EqualEqual | BinaryOp::NotEqual
957            if left == right
958                && #[allow(non_exhaustive_omitted_patterns)] match left {
    SemanticType::Int | SemanticType::Float | SemanticType::String |
        SemanticType::Object | SemanticType::Vector | SemanticType::Struct(_)
        | SemanticType::EngineStructure(_) => true,
    _ => false,
}matches!(
959                    left,
960                    SemanticType::Int
961                        | SemanticType::Float
962                        | SemanticType::String
963                        | SemanticType::Object
964                        | SemanticType::Vector
965                        | SemanticType::Struct(_)
966                        | SemanticType::EngineStructure(_)
967                ) =>
968        {
969            Ok(SemanticType::Int)
970        }
971        BinaryOp::GreaterEqual
972        | BinaryOp::GreaterThan
973        | BinaryOp::LessThan
974        | BinaryOp::LessEqual
975            if #[allow(non_exhaustive_omitted_patterns)] match (left, right) {
    (SemanticType::Int, SemanticType::Int) |
        (SemanticType::Float, SemanticType::Float) => true,
    _ => false,
}matches!(
976                (left, right),
977                (SemanticType::Int, SemanticType::Int) | (SemanticType::Float, SemanticType::Float)
978            ) =>
979        {
980            Ok(SemanticType::Int)
981        }
982        BinaryOp::Add | BinaryOp::Subtract | BinaryOp::Multiply | BinaryOp::Divide => {
983            match (left, right) {
984                (SemanticType::Int, SemanticType::Int) => Ok(SemanticType::Int),
985                (SemanticType::Float, SemanticType::Int | SemanticType::Float)
986                | (SemanticType::Int, SemanticType::Float) => Ok(SemanticType::Float),
987                (SemanticType::String, SemanticType::String) if op == BinaryOp::Add => {
988                    Ok(SemanticType::String)
989                }
990                (SemanticType::Vector, SemanticType::Vector)
991                    if #[allow(non_exhaustive_omitted_patterns)] match op {
    BinaryOp::Add | BinaryOp::Subtract => true,
    _ => false,
}matches!(op, BinaryOp::Add | BinaryOp::Subtract) =>
992                {
993                    Ok(SemanticType::Vector)
994                }
995                (SemanticType::Vector, SemanticType::Float)
996                    if #[allow(non_exhaustive_omitted_patterns)] match op {
    BinaryOp::Multiply | BinaryOp::Divide => true,
    _ => false,
}matches!(op, BinaryOp::Multiply | BinaryOp::Divide) =>
997                {
998                    Ok(SemanticType::Vector)
999                }
1000                (SemanticType::Float, SemanticType::Vector) if op == BinaryOp::Multiply => {
1001                    Ok(SemanticType::Vector)
1002                }
1003                _ => Err(HirLowerError::new(
1004                    span,
1005                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("cannot lower binary operation {0:?} for {1:?} and {2:?}",
                op, left, right))
    })format!("cannot lower binary operation {op:?} for {left:?} and {right:?}"),
1006                )),
1007            }
1008        }
1009        _ => Err(HirLowerError::new(
1010            span,
1011            ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("cannot lower binary operation {0:?} for {1:?} and {2:?}",
                op, left, right))
    })format!("cannot lower binary operation {op:?} for {left:?} and {right:?}"),
1012        )),
1013    }
1014}
1015
1016fn assignment_result_type(
1017    op: AssignmentOp,
1018    left: &SemanticType,
1019    right: &SemanticType,
1020    span: crate::Span,
1021) -> Result<SemanticType, HirLowerError> {
1022    match op {
1023        AssignmentOp::Assign => Ok(left.clone()),
1024        AssignmentOp::AssignMinus => binary_result_type(BinaryOp::Subtract, left, right, span),
1025        AssignmentOp::AssignPlus => binary_result_type(BinaryOp::Add, left, right, span),
1026        AssignmentOp::AssignMultiply => binary_result_type(BinaryOp::Multiply, left, right, span),
1027        AssignmentOp::AssignDivide => binary_result_type(BinaryOp::Divide, left, right, span),
1028        AssignmentOp::AssignModulus => binary_result_type(BinaryOp::Modulus, left, right, span),
1029        AssignmentOp::AssignAnd => binary_result_type(BinaryOp::BooleanAnd, left, right, span),
1030        AssignmentOp::AssignXor => binary_result_type(BinaryOp::ExclusiveOr, left, right, span),
1031        AssignmentOp::AssignOr => binary_result_type(BinaryOp::InclusiveOr, left, right, span),
1032        AssignmentOp::AssignShiftLeft => binary_result_type(BinaryOp::ShiftLeft, left, right, span),
1033        AssignmentOp::AssignShiftRight => {
1034            binary_result_type(BinaryOp::ShiftRight, left, right, span)
1035        }
1036        AssignmentOp::AssignUnsignedShiftRight => {
1037            binary_result_type(BinaryOp::UnsignedShiftRight, left, right, span)
1038        }
1039    }
1040}
1041
1042fn field_result_type(
1043    base: &SemanticType,
1044    field: &str,
1045    semantic: &SemanticModel,
1046    span: crate::Span,
1047) -> Result<SemanticType, HirLowerError> {
1048    match base {
1049        SemanticType::Vector => match field {
1050            "x" | "y" | "z" => Ok(SemanticType::Float),
1051            _ => Err(HirLowerError::new(
1052                span,
1053                ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("field {0:?} does not exist on vector",
                field))
    })format!("field {field:?} does not exist on vector"),
1054            )),
1055        },
1056        SemanticType::Struct(name) => semantic
1057            .structs
1058            .get(name)
1059            .and_then(|structure| {
1060                structure
1061                    .fields
1062                    .iter()
1063                    .find(|candidate| candidate.name == field)
1064                    .map(|candidate| candidate.ty.clone())
1065            })
1066            .ok_or_else(|| {
1067                HirLowerError::new(
1068                    span,
1069                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("field {0:?} does not exist on structure {1:?}",
                field, name))
    })format!("field {field:?} does not exist on structure {name:?}"),
1070                )
1071            }),
1072        _ => Err(HirLowerError::new(
1073            span,
1074            "left side of field access must be a structure",
1075        )),
1076    }
1077}
1078
1079#[cfg(test)]
1080mod tests {
1081    use super::{HirCallTarget, HirExprKind, HirLocalKind, HirStmt, HirValueRef, lower_to_hir};
1082    use crate::{
1083        BuiltinConstant, BuiltinFunction, BuiltinParameter, BuiltinType, BuiltinValue, LangSpec,
1084        SourceId, analyze_script, parse_text,
1085    };
1086
1087    fn test_langspec() -> LangSpec {
1088        LangSpec {
1089            engine_num_structures: 3,
1090            engine_structures:     vec![
1091                "effect".to_string(),
1092                "location".to_string(),
1093                "json".to_string(),
1094            ],
1095            constants:             vec![
1096                BuiltinConstant {
1097                    name:  "TRUE".to_string(),
1098                    ty:    BuiltinType::Int,
1099                    value: BuiltinValue::Int(1),
1100                },
1101                BuiltinConstant {
1102                    name:  "OBJECT_INVALID".to_string(),
1103                    ty:    BuiltinType::Object,
1104                    value: BuiltinValue::ObjectInvalid,
1105                },
1106            ],
1107            functions:             vec![BuiltinFunction {
1108                name:        "DelayCommand".to_string(),
1109                return_type: BuiltinType::Void,
1110                parameters:  vec![
1111                    BuiltinParameter {
1112                        name:    "fSeconds".to_string(),
1113                        ty:      BuiltinType::Float,
1114                        default: None,
1115                    },
1116                    BuiltinParameter {
1117                        name:    "aAction".to_string(),
1118                        ty:      BuiltinType::Action,
1119                        default: None,
1120                    },
1121                ],
1122            }],
1123        }
1124    }
1125
1126    #[test]
1127    fn lowers_globals_and_locals_to_resolved_value_refs() -> Result<(), Box<dyn std::error::Error>>
1128    {
1129        let script = parse_text(
1130            SourceId::new(70),
1131            r#"
1132                int g = TRUE;
1133                void main() {
1134                    int x = g;
1135                    int y = x;
1136                }
1137            "#,
1138            Some(&test_langspec()),
1139        )?;
1140        let semantic = analyze_script(&script, Some(&test_langspec()))?;
1141        let hir = lower_to_hir(&script, &semantic, Some(&test_langspec()))?;
1142
1143        assert_eq!(hir.globals.len(), 1);
1144        match hir
1145            .globals
1146            .first()
1147            .and_then(|global| global.initializer.as_ref())
1148        {
1149            Some(initializer) => {
1150                assert_eq!(
1151                    initializer.kind,
1152                    HirExprKind::Value(HirValueRef::BuiltinConstant("TRUE".to_string()))
1153                );
1154            }
1155            None => return Err(std::io::Error::other("expected global initializer").into()),
1156        }
1157
1158        let main = hir
1159            .functions
1160            .iter()
1161            .find(|function| function.name == "main")
1162            .ok_or_else(|| std::io::Error::other("main should be lowered"))?;
1163        assert_eq!(main.locals.len(), 2);
1164        assert_eq!(
1165            main.locals.first().map(|local| local.kind),
1166            Some(HirLocalKind::Local)
1167        );
1168        assert_eq!(
1169            main.locals.get(1).map(|local| local.kind),
1170            Some(HirLocalKind::Local)
1171        );
1172
1173        let body = main
1174            .body
1175            .as_ref()
1176            .ok_or_else(|| std::io::Error::other("main should have a body"))?;
1177
1178        match body.statements.first() {
1179            Some(HirStmt::Declare(statement)) => match statement
1180                .declarators
1181                .first()
1182                .and_then(|declarator| declarator.initializer.as_ref())
1183            {
1184                Some(initializer) => {
1185                    assert_eq!(
1186                        initializer.kind,
1187                        HirExprKind::Value(HirValueRef::Global("g".to_string()))
1188                    );
1189                }
1190                None => return Err(std::io::Error::other("expected local initializer").into()),
1191            },
1192            other => {
1193                return Err(
1194                    std::io::Error::other(format!("expected declaration, got {other:?}")).into(),
1195                );
1196            }
1197        }
1198
1199        match body.statements.get(1) {
1200            Some(HirStmt::Declare(statement)) => match statement
1201                .declarators
1202                .first()
1203                .and_then(|declarator| declarator.initializer.as_ref())
1204            {
1205                Some(initializer) => {
1206                    let first_local = main
1207                        .locals
1208                        .first()
1209                        .ok_or_else(|| std::io::Error::other("missing first local"))?;
1210                    assert_eq!(
1211                        initializer.kind,
1212                        HirExprKind::Value(HirValueRef::Local(first_local.id))
1213                    );
1214                }
1215                None => return Err(std::io::Error::other("expected local initializer").into()),
1216            },
1217            other => {
1218                return Err(
1219                    std::io::Error::other(format!("expected declaration, got {other:?}")).into(),
1220                );
1221            }
1222        }
1223        Ok(())
1224    }
1225
1226    #[test]
1227    fn lowers_builtin_and_user_calls_to_explicit_targets() -> Result<(), Box<dyn std::error::Error>>
1228    {
1229        let script = parse_text(
1230            SourceId::new(71),
1231            r#"
1232                void helper() {}
1233                void main() {
1234                    helper();
1235                    DelayCommand(1.0, helper());
1236                }
1237            "#,
1238            Some(&test_langspec()),
1239        )?;
1240        let semantic = analyze_script(&script, Some(&test_langspec()))?;
1241        let hir = lower_to_hir(&script, &semantic, Some(&test_langspec()))?;
1242
1243        let main = hir
1244            .functions
1245            .iter()
1246            .find(|function| function.name == "main")
1247            .ok_or_else(|| std::io::Error::other("main should be lowered"))?;
1248        let body = main
1249            .body
1250            .as_ref()
1251            .ok_or_else(|| std::io::Error::other("main should have a body"))?;
1252
1253        match body.statements.first() {
1254            Some(HirStmt::Expr(expr)) => match &expr.kind {
1255                HirExprKind::Call {
1256                    target, ..
1257                } => {
1258                    assert_eq!(target, &HirCallTarget::Function("helper".to_string()));
1259                }
1260                other => {
1261                    return Err(std::io::Error::other(format!(
1262                        "expected direct call, got {other:?}"
1263                    ))
1264                    .into());
1265                }
1266            },
1267            other => {
1268                return Err(std::io::Error::other(format!(
1269                    "expected expression statement, got {other:?}"
1270                ))
1271                .into());
1272            }
1273        }
1274
1275        match body.statements.get(1) {
1276            Some(HirStmt::Expr(expr)) => match &expr.kind {
1277                HirExprKind::Call {
1278                    target,
1279                    arguments,
1280                } => {
1281                    assert_eq!(target, &HirCallTarget::Builtin("DelayCommand".to_string()));
1282                    assert_eq!(arguments.len(), 2);
1283                }
1284                other => {
1285                    return Err(std::io::Error::other(format!(
1286                        "expected builtin call, got {other:?}"
1287                    ))
1288                    .into());
1289                }
1290            },
1291            other => {
1292                return Err(std::io::Error::other(format!(
1293                    "expected expression statement, got {other:?}"
1294                ))
1295                .into());
1296            }
1297        }
1298        Ok(())
1299    }
1300
1301    #[test]
1302    fn lowers_function_body_locals_that_shadow_parameter_names()
1303    -> Result<(), Box<dyn std::error::Error>> {
1304        let script = parse_text(
1305            SourceId::new(72),
1306            r#"
1307                int helper(object oSpellTarget) {
1308                    object oSpellTarget = OBJECT_SELF;
1309                    return TRUE;
1310                }
1311                void main() {}
1312            "#,
1313            Some(&test_langspec()),
1314        )?;
1315        let semantic = analyze_script(&script, Some(&test_langspec()))?;
1316        let hir = lower_to_hir(&script, &semantic, Some(&test_langspec()))?;
1317
1318        let helper = hir
1319            .functions
1320            .iter()
1321            .find(|function| function.name == "helper")
1322            .ok_or_else(|| std::io::Error::other("helper should be lowered"))?;
1323        assert_eq!(helper.locals.len(), 2);
1324        assert_eq!(
1325            helper.locals.first().map(|local| local.kind),
1326            Some(HirLocalKind::Parameter)
1327        );
1328        assert_eq!(
1329            helper.locals.get(1).map(|local| local.kind),
1330            Some(HirLocalKind::Local)
1331        );
1332        Ok(())
1333    }
1334}