reformat messy code that rustfmt doesn't format
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				/ test (push) Successful in 9m17s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	/ test (push) Successful in 9m17s
				
			This commit is contained in:
		
							parent
							
								
									929e9f8b16
								
							
						
					
					
						commit
						8bd7fcfa27
					
				
					 14 changed files with 647 additions and 196 deletions
				
			
		|  | @ -85,7 +85,8 @@ macro_rules! impl_fold { | ||||||
|             $($field:ident: $field_ty:ty,)* |             $($field:ident: $field_ty:ty,)* | ||||||
|         } |         } | ||||||
|     ) => { |     ) => { | ||||||
|         impl<State: ?Sized + syn::fold::Fold, $($T,)*> $crate::fold::DoFold<State> for $Struct<$($T,)*> |         impl<State: ?Sized + syn::fold::Fold, $($T,)*> $crate::fold::DoFold<State> | ||||||
|  |             for $Struct<$($T,)*> | ||||||
|         where |         where | ||||||
|             $($T: $crate::fold::DoFold<State>,)* |             $($T: $crate::fold::DoFold<State>,)* | ||||||
|             $($where)* |             $($where)* | ||||||
|  | @ -107,7 +108,8 @@ macro_rules! impl_fold { | ||||||
|         ) |         ) | ||||||
|         $(where ($($where:tt)*))?; |         $(where ($($where:tt)*))?; | ||||||
|     ) => { |     ) => { | ||||||
|         impl<State: ?Sized + syn::fold::Fold, $($T,)*> $crate::fold::DoFold<State> for $Struct<$($T,)*> |         impl<State: ?Sized + syn::fold::Fold, $($T,)*> $crate::fold::DoFold<State> | ||||||
|  |             for $Struct<$($T,)*> | ||||||
|         where |         where | ||||||
|             $($T: $crate::fold::DoFold<State>,)* |             $($T: $crate::fold::DoFold<State>,)* | ||||||
|             $($where)* |             $($where)* | ||||||
|  | @ -133,7 +135,8 @@ macro_rules! impl_fold { | ||||||
|             ))?,)* |             ))?,)* | ||||||
|         } |         } | ||||||
|     ) => { |     ) => { | ||||||
|         impl<State: ?Sized + syn::fold::Fold, $($T,)*> $crate::fold::DoFold<State> for $Enum<$($T,)*> |         impl<State: ?Sized + syn::fold::Fold, $($T,)*> $crate::fold::DoFold<State> | ||||||
|  |             for $Enum<$($T,)*> | ||||||
|         where |         where | ||||||
|             $($T: $crate::fold::DoFold<State>,)* |             $($T: $crate::fold::DoFold<State>,)* | ||||||
|             $($where)* |             $($where)* | ||||||
|  |  | ||||||
|  | @ -504,7 +504,10 @@ macro_rules! options { | ||||||
|                     separator.to_tokens(tokens); |                     separator.to_tokens(tokens); | ||||||
|                     separator = Some(Default::default()); |                     separator = Some(Default::default()); | ||||||
|                     v.0.to_tokens(tokens); |                     v.0.to_tokens(tokens); | ||||||
|                     $(v.1.surround(tokens, |tokens| <$value as quote::ToTokens>::to_tokens(&v.2, tokens));)? |                     $(v.1.surround( | ||||||
|  |                         tokens, | ||||||
|  |                         |tokens| <$value as quote::ToTokens>::to_tokens(&v.2, tokens), | ||||||
|  |                     );)? | ||||||
|                 })* |                 })* | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -353,7 +353,10 @@ macro_rules! make_builder_method_enum { | ||||||
|                 })+ |                 })+ | ||||||
|                 Err(lookahead.error()) |                 Err(lookahead.error()) | ||||||
|             } |             } | ||||||
|             $vis fn parse_dot_prefixed(input: ParseStream, $($parse_arg: $parse_arg_ty),+) -> syn::Result<(Token![.], Self)> { |             $vis fn parse_dot_prefixed( | ||||||
|  |                 input: ParseStream, | ||||||
|  |                 $($parse_arg: $parse_arg_ty,)+ | ||||||
|  |             ) -> syn::Result<(Token![.], Self)> { | ||||||
|                 let dot = input.parse()?; |                 let dot = input.parse()?; | ||||||
|                 Ok((dot, Self::parse(input, $($parse_arg),+)?)) |                 Ok((dot, Self::parse(input, $($parse_arg),+)?)) | ||||||
|             } |             } | ||||||
|  | @ -1380,7 +1383,10 @@ impl Visitor { | ||||||
|             Sign::Plus => (false, value.magnitude().to_bytes_le()), |             Sign::Plus => (false, value.magnitude().to_bytes_le()), | ||||||
|         }; |         }; | ||||||
|         Some(parse_quote_spanned! {span=> |         Some(parse_quote_spanned! {span=> | ||||||
|             ::fayalite::int::make_int_literal::<#signed, #width>(#negative, &[#(#bytes,)*]).to_int_expr() |             ::fayalite::int::make_int_literal::<#signed, #width>( | ||||||
|  |                 #negative, | ||||||
|  |                 &[#(#bytes,)*], | ||||||
|  |             ).to_int_expr() | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
|     fn process_literal(&mut self, literal: ExprLit) -> Expr { |     fn process_literal(&mut self, literal: ExprLit) -> Expr { | ||||||
|  |  | ||||||
|  | @ -607,14 +607,18 @@ impl Visitor { | ||||||
|         ); |         ); | ||||||
|         parse_quote_spanned! {span=> |         parse_quote_spanned! {span=> | ||||||
|             { |             { | ||||||
|                 type __MatchTy<V> = <<V as ::fayalite::expr::ToExpr>::Type as ::fayalite::ty::Type>::MatchVariant; |                 type __MatchTy<V> = | ||||||
|  |                     <<V as ::fayalite::expr::ToExpr>::Type as ::fayalite::ty::Type>::MatchVariant; | ||||||
|                 let __match_expr = ::fayalite::expr::ToExpr::to_expr(&(#expr)); |                 let __match_expr = ::fayalite::expr::ToExpr::to_expr(&(#expr)); | ||||||
|                 ::fayalite::expr::check_match_expr(__match_expr, |__match_value, __infallible| { |                 ::fayalite::expr::check_match_expr(__match_expr, |__match_value, __infallible| { | ||||||
|                     #[allow(unused_variables)] |                     #[allow(unused_variables)] | ||||||
|                     #check_match |                     #check_match | ||||||
|                 }); |                 }); | ||||||
|                 for __match_variant in m.match_(__match_expr) { |                 for __match_variant in m.match_(__match_expr) { | ||||||
|                     let (__match_variant, __scope) = ::fayalite::ty::MatchVariantAndInactiveScope::match_activate_scope(__match_variant); |                     let (__match_variant, __scope) = | ||||||
|  |                         ::fayalite::ty::MatchVariantAndInactiveScope::match_activate_scope( | ||||||
|  |                             __match_variant, | ||||||
|  |                         ); | ||||||
|                     #match_token __match_variant { |                     #match_token __match_variant { | ||||||
|                         #(#arms)* |                         #(#arms)* | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|  | @ -187,10 +187,21 @@ impl ValueDeriveGenerics { | ||||||
|             let fixed_type_predicates = &mut fixed_type_generics.make_where_clause().predicates; |             let fixed_type_predicates = &mut fixed_type_generics.make_where_clause().predicates; | ||||||
|             for type_param in type_params { |             for type_param in type_params { | ||||||
|                 predicates.push(parse_quote! {#type_param: ::fayalite::ty::Value}); |                 predicates.push(parse_quote! {#type_param: ::fayalite::ty::Value}); | ||||||
|                 predicates.push(parse_quote! {<#type_param as ::fayalite::expr::ToExpr>::Type: ::fayalite::ty::Type<Value = #type_param>}); |                 predicates.push(parse_quote! { | ||||||
|  |                     <#type_param as ::fayalite::expr::ToExpr>::Type: | ||||||
|  |                         ::fayalite::ty::Type<Value = #type_param> | ||||||
|  |                 }); | ||||||
|                 fixed_type_predicates.push(parse_quote! {#type_param: ::fayalite::ty::Value}); |                 fixed_type_predicates.push(parse_quote! {#type_param: ::fayalite::ty::Value}); | ||||||
|                 fixed_type_predicates.push(parse_quote! {<#type_param as ::fayalite::expr::ToExpr>::Type: ::fayalite::ty::FixedType<Value = #type_param>}); |                 fixed_type_predicates.push(parse_quote! { | ||||||
|                 fixed_type_predicates.push(parse_quote! {<<#type_param as ::fayalite::expr::ToExpr>::Type as ::fayalite::ty::Type>::MaskType: ::fayalite::ty::FixedType}); |                     <#type_param as ::fayalite::expr::ToExpr>::Type: | ||||||
|  |                         ::fayalite::ty::FixedType<Value = #type_param> | ||||||
|  |                 }); | ||||||
|  |                 fixed_type_predicates.push(parse_quote! { | ||||||
|  |                     < | ||||||
|  |                         <#type_param as ::fayalite::expr::ToExpr>::Type | ||||||
|  |                         as ::fayalite::ty::Type | ||||||
|  |                     >::MaskType: ::fayalite::ty::FixedType | ||||||
|  |                 }); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         Self { |         Self { | ||||||
|  | @ -241,8 +252,10 @@ pub(crate) fn derive_clone_hash_eq_partialeq_for_struct<Name: ToTokens>( | ||||||
|             #[allow(unused_variables)] |             #[allow(unused_variables)] | ||||||
|             #[allow(clippy::nonminimal_bool)] |             #[allow(clippy::nonminimal_bool)] | ||||||
|             fn eq(&self, other: &Self) -> ::fayalite::__std::primitive::bool { |             fn eq(&self, other: &Self) -> ::fayalite::__std::primitive::bool { | ||||||
|                 true |                 true #(&& ::fayalite::__std::cmp::PartialEq::eq( | ||||||
|                 #(&& ::fayalite::__std::cmp::PartialEq::eq(&self.#field_names, &other.#field_names))* |                     &self.#field_names, | ||||||
|  |                     &other.#field_names, | ||||||
|  |                 ))* | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -543,8 +556,22 @@ impl ToTokens for BuilderWithFields { | ||||||
|             quote_spanned! {span=> |             quote_spanned! {span=> | ||||||
|                 #[automatically_derived] |                 #[automatically_derived] | ||||||
|                 #[allow(non_camel_case_types, dead_code)] |                 #[allow(non_camel_case_types, dead_code)] | ||||||
|                 impl<#phantom_type_param #(, #initial_type_params)* #(, #final_type_params)*> #struct_name<#phantom_type_param #(, #initial_type_params)*, () #(, #final_type_params)*> { |                 impl<#phantom_type_param #(, #initial_type_params)* #(, #final_type_params)*> | ||||||
|                     #vis fn #builder_field_name<#type_param>(self, #builder_field_name: #type_param) -> #struct_name<#phantom_type_param #(, #initial_type_params)*, #mapped_type #(, #final_type_params)*> |                     #struct_name< | ||||||
|  |                         #phantom_type_param, | ||||||
|  |                         #(#initial_type_params,)* | ||||||
|  |                         (), #(#final_type_params,)* | ||||||
|  |                     > | ||||||
|  |                 { | ||||||
|  |                     #vis fn #builder_field_name<#type_param>( | ||||||
|  |                         self, | ||||||
|  |                         #builder_field_name: #type_param, | ||||||
|  |                     ) -> #struct_name< | ||||||
|  |                             #phantom_type_param, | ||||||
|  |                             #(#initial_type_params,)* | ||||||
|  |                             #mapped_type, | ||||||
|  |                             #(#final_type_params,)* | ||||||
|  |                         > | ||||||
|                     #where_clause |                     #where_clause | ||||||
|                     { |                     { | ||||||
|                         let Self { |                         let Self { | ||||||
|  | @ -738,7 +765,8 @@ pub(crate) fn make_connect_impl( | ||||||
|     quote_spanned! {span=> |     quote_spanned! {span=> | ||||||
|         #[automatically_derived] |         #[automatically_derived] | ||||||
|         #[allow(non_camel_case_types)] |         #[allow(non_camel_case_types)] | ||||||
|         impl #impl_generics ::fayalite::ty::Connect<#ty_ident #rhs_type_generics> for #ty_ident #lhs_type_generics |         impl #impl_generics ::fayalite::ty::Connect<#ty_ident #rhs_type_generics> | ||||||
|  |             for #ty_ident #lhs_type_generics | ||||||
|         #where_clause |         #where_clause | ||||||
|         { |         { | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -323,7 +323,9 @@ impl ToTokens for ParsedEnum { | ||||||
|                     f.debug_struct(#debug_ident).finish() |                     f.debug_struct(#debug_ident).finish() | ||||||
|                 }, |                 }, | ||||||
|                 FieldsKind::Named(_) => quote! { |                 FieldsKind::Named(_) => quote! { | ||||||
|                     f.debug_struct(#debug_ident)#(.field(#field_name_strs, &self.#field_names))*.finish() |                     f.debug_struct(#debug_ident) | ||||||
|  |                         #(.field(#field_name_strs, &self.#field_names))* | ||||||
|  |                         .finish() | ||||||
|                 }, |                 }, | ||||||
|                 FieldsKind::Unnamed(_) => quote! { |                 FieldsKind::Unnamed(_) => quote! { | ||||||
|                     f.debug_tuple(#debug_ident)#(.field(&self.#field_names))*.finish() |                     f.debug_tuple(#debug_ident)#(.field(&self.#field_names))*.finish() | ||||||
|  | @ -332,17 +334,25 @@ impl ToTokens for ParsedEnum { | ||||||
|             let value_struct_ident = &value_struct.ident; |             let value_struct_ident = &value_struct.ident; | ||||||
|             quote! { |             quote! { | ||||||
|                 #[automatically_derived] |                 #[automatically_derived] | ||||||
|                 impl #fixed_type_impl_generics ::fayalite::__std::fmt::Debug for #value_struct_ident #fixed_type_type_generics |                 impl #fixed_type_impl_generics ::fayalite::__std::fmt::Debug | ||||||
|  |                     for #value_struct_ident #fixed_type_type_generics | ||||||
|                 #fixed_type_where_clause |                 #fixed_type_where_clause | ||||||
|                 { |                 { | ||||||
|                     fn fmt(&self, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result { |                     fn fmt( | ||||||
|  |                         &self, | ||||||
|  |                         f: &mut ::fayalite::__std::fmt::Formatter<'_>, | ||||||
|  |                     ) -> ::fayalite::__std::fmt::Result { | ||||||
|                         #debug_body |                         #debug_body | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }.to_tokens(tokens); |             } | ||||||
|             Some( |             .to_tokens(tokens); | ||||||
|                 parse_quote! { <#value_struct_ident #fixed_type_type_generics as ::fayalite::expr::ToExpr>::Type }, |             Some(parse_quote! { | ||||||
|             ) |                 < | ||||||
|  |                     #value_struct_ident #fixed_type_type_generics | ||||||
|  |                     as ::fayalite::expr::ToExpr | ||||||
|  |                 >::Type | ||||||
|  |             }) | ||||||
|         }; |         }; | ||||||
|         let type_struct_variants = Punctuated::from_iter(variants.iter().filter_map(|variant| { |         let type_struct_variants = Punctuated::from_iter(variants.iter().filter_map(|variant| { | ||||||
|             let VariantOptions {} = variant.options.body; |             let VariantOptions {} = variant.options.body; | ||||||
|  | @ -382,7 +392,9 @@ impl ToTokens for ParsedEnum { | ||||||
|         let non_empty_variant_name_strs = |         let non_empty_variant_name_strs = | ||||||
|             Vec::from_iter(non_empty_variant_names.iter().map(|v| v.to_string())); |             Vec::from_iter(non_empty_variant_names.iter().map(|v| v.to_string())); | ||||||
|         let debug_type_body = quote! { |         let debug_type_body = quote! { | ||||||
|             f.debug_struct(#type_struct_debug_ident)#(.field(#non_empty_variant_name_strs, &self.#non_empty_variant_names))*.finish() |             f.debug_struct(#type_struct_debug_ident) | ||||||
|  |                 #(.field(#non_empty_variant_name_strs, &self.#non_empty_variant_names))* | ||||||
|  |                 .finish() | ||||||
|         }; |         }; | ||||||
|         derive_clone_hash_eq_partialeq_for_struct( |         derive_clone_hash_eq_partialeq_for_struct( | ||||||
|             type_struct_ident, |             type_struct_ident, | ||||||
|  | @ -415,13 +427,18 @@ impl ToTokens for ParsedEnum { | ||||||
|                         parsed_struct, |                         parsed_struct, | ||||||
|                     } => { |                     } => { | ||||||
|                         let value_struct_ident = &value_struct.ident; |                         let value_struct_ident = &value_struct.ident; | ||||||
|                         let phantom_field_name = &parsed_struct.fields.last().expect("missing phantom field").name; |                         let phantom_field_name = &parsed_struct | ||||||
|  |                             .fields | ||||||
|  |                             .last() | ||||||
|  |                             .expect("missing phantom field") | ||||||
|  |                             .name; | ||||||
|                         let type_generics = fixed_type_type_generics.as_turbofish(); |                         let type_generics = fixed_type_type_generics.as_turbofish(); | ||||||
|                         quote! { |                         quote! { | ||||||
|                             ::fayalite::__std::option::Option::Some( |                             ::fayalite::__std::option::Option::Some( | ||||||
|                                 ::fayalite::ty::DynValueTrait::to_canonical_dyn( |                                 ::fayalite::ty::DynValueTrait::to_canonical_dyn( | ||||||
|                                     &#value_struct_ident #type_generics { |                                     &#value_struct_ident #type_generics { | ||||||
|                                         #(#field_names: ::fayalite::__std::clone::Clone::clone(#var_names),)* |                                         #(#field_names: | ||||||
|  |                                             ::fayalite::__std::clone::Clone::clone(#var_names),)* | ||||||
|                                         #phantom_field_name: ::fayalite::__std::marker::PhantomData, |                                         #phantom_field_name: ::fayalite::__std::marker::PhantomData, | ||||||
|                                     }, |                                     }, | ||||||
|                                 ), |                                 ), | ||||||
|  | @ -453,7 +470,10 @@ impl ToTokens for ParsedEnum { | ||||||
|                     }, |                     }, | ||||||
|                     |t| { |                     |t| { | ||||||
|                         parse_quote_spanned! {t.span()=> |                         parse_quote_spanned! {t.span()=> | ||||||
|                             ::fayalite::expr::Expr<<<#t as ::fayalite::expr::ToExpr>::Type as ::fayalite::ty::Type>::Value> |                             ::fayalite::expr::Expr<< | ||||||
|  |                                 <#t as ::fayalite::expr::ToExpr>::Type | ||||||
|  |                                 as ::fayalite::ty::Type | ||||||
|  |                             >::Value> | ||||||
|                         } |                         } | ||||||
|                     }, |                     }, | ||||||
|                     |t| { |                     |t| { | ||||||
|  | @ -549,7 +569,8 @@ impl ToTokens for ParsedEnum { | ||||||
|             }); |             }); | ||||||
|             if let Some(value_ty) = variant.value.value_ty() { |             if let Some(value_ty) = variant.value.value_ty() { | ||||||
|                 from_canonical_type_variant_lets.push(quote! { |                 from_canonical_type_variant_lets.push(quote! { | ||||||
|                     let #variant_var = #variant_var.from_canonical_type_helper_has_value(#variant_name_str); |                     let #variant_var = | ||||||
|  |                         #variant_var.from_canonical_type_helper_has_value(#variant_name_str); | ||||||
|                 }); |                 }); | ||||||
|                 non_empty_variant_vars.push(variant_var.clone()); |                 non_empty_variant_vars.push(variant_var.clone()); | ||||||
|                 enum_type_variants.push(quote! { |                 enum_type_variants.push(quote! { | ||||||
|  | @ -564,7 +585,9 @@ impl ToTokens for ParsedEnum { | ||||||
|                     ::fayalite::enum_::VariantType { |                     ::fayalite::enum_::VariantType { | ||||||
|                         name: ::fayalite::intern::Intern::intern(#variant_name_str), |                         name: ::fayalite::intern::Intern::intern(#variant_name_str), | ||||||
|                         ty: ::fayalite::__std::option::Option::Some( |                         ty: ::fayalite::__std::option::Option::Some( | ||||||
|                             ::fayalite::bundle::TypeHint::<<#value_ty as ::fayalite::expr::ToExpr>::Type>::intern_dyn(), |                             ::fayalite::bundle::TypeHint::< | ||||||
|  |                                 <#value_ty as ::fayalite::expr::ToExpr>::Type, | ||||||
|  |                             >::intern_dyn(), | ||||||
|                         ), |                         ), | ||||||
|                     } |                     } | ||||||
|                 }); |                 }); | ||||||
|  | @ -604,12 +627,14 @@ impl ToTokens for ParsedEnum { | ||||||
|                 } => quote! { |                 } => quote! { | ||||||
|                     #variant_index => { |                     #variant_index => { | ||||||
|                         let __variant_access = ::fayalite::expr::ToExpr::to_expr( |                         let __variant_access = ::fayalite::expr::ToExpr::to_expr( | ||||||
|                             &__variant_access.downcast_unchecked::< |                             &__variant_access.downcast_unchecked::<< | ||||||
|                                 <#ident #fixed_type_type_generics as ::fayalite::expr::ToExpr>::Type, |                                 #ident #fixed_type_type_generics | ||||||
|                             >(), |                                 as ::fayalite::expr::ToExpr | ||||||
|  |                             >::Type>(), | ||||||
|                         ); |                         ); | ||||||
|                         #match_enum_ident::#variant_name { |                         #match_enum_ident::#variant_name { | ||||||
|                             #(#match_enum_field_names: (*__variant_access).#match_enum_field_names,)* |                             #(#match_enum_field_names: | ||||||
|  |                                 (*__variant_access).#match_enum_field_names,)* | ||||||
|                         } |                         } | ||||||
|                     }, |                     }, | ||||||
|                 }, |                 }, | ||||||
|  | @ -634,7 +659,9 @@ impl ToTokens for ParsedEnum { | ||||||
|                 VariantValue::None => parse_quote! { |                 VariantValue::None => parse_quote! { | ||||||
|                     { |                     { | ||||||
|                         ::fayalite::expr::ToExpr::to_expr( |                         ::fayalite::expr::ToExpr::to_expr( | ||||||
|                             &::fayalite::expr::ops::EnumLiteral::<#type_struct_ident #fixed_type_type_generics>::new_unchecked( |                             &::fayalite::expr::ops::EnumLiteral::< | ||||||
|  |                                 #type_struct_ident #fixed_type_type_generics | ||||||
|  |                             >::new_unchecked( | ||||||
|                                 ::fayalite::__std::option::Option::None, |                                 ::fayalite::__std::option::Option::None, | ||||||
|                                 #variant_index, |                                 #variant_index, | ||||||
|                                 ::fayalite::ty::FixedType::fixed_type(), |                                 ::fayalite::ty::FixedType::fixed_type(), | ||||||
|  | @ -645,8 +672,12 @@ impl ToTokens for ParsedEnum { | ||||||
|                 VariantValue::Direct { value_type: _ } => parse_quote! { |                 VariantValue::Direct { value_type: _ } => parse_quote! { | ||||||
|                     { |                     { | ||||||
|                         ::fayalite::expr::ToExpr::to_expr( |                         ::fayalite::expr::ToExpr::to_expr( | ||||||
|                             &::fayalite::expr::ops::EnumLiteral::<#type_struct_ident #fixed_type_type_generics>::new_unchecked( |                             &::fayalite::expr::ops::EnumLiteral::< | ||||||
|                                 ::fayalite::__std::option::Option::Some(#(#builder_field_vars)*.to_canonical_dyn()), |                                 #type_struct_ident #fixed_type_type_generics | ||||||
|  |                             >::new_unchecked( | ||||||
|  |                                 ::fayalite::__std::option::Option::Some( | ||||||
|  |                                     #(#builder_field_vars)*.to_canonical_dyn(), | ||||||
|  |                                 ), | ||||||
|                                 #variant_index, |                                 #variant_index, | ||||||
|                                 ::fayalite::ty::FixedType::fixed_type(), |                                 ::fayalite::ty::FixedType::fixed_type(), | ||||||
|                             ), |                             ), | ||||||
|  | @ -666,11 +697,18 @@ impl ToTokens for ParsedEnum { | ||||||
|                     .. |                     .. | ||||||
|                 } => parse_quote! { |                 } => parse_quote! { | ||||||
|                     { |                     { | ||||||
|                         let __builder = <#field_type_struct_ident #fixed_type_type_generics as ::fayalite::bundle::BundleType>::builder(); |                         let __builder = < | ||||||
|  |                             #field_type_struct_ident #fixed_type_type_generics | ||||||
|  |                             as ::fayalite::bundle::BundleType | ||||||
|  |                         >::builder(); | ||||||
|                         #(let __builder = __builder.#builder_field_vars(#builder_field_vars);)* |                         #(let __builder = __builder.#builder_field_vars(#builder_field_vars);)* | ||||||
|                         ::fayalite::expr::ToExpr::to_expr( |                         ::fayalite::expr::ToExpr::to_expr( | ||||||
|                             &::fayalite::expr::ops::EnumLiteral::<#type_struct_ident #fixed_type_type_generics>::new_unchecked( |                             &::fayalite::expr::ops::EnumLiteral::< | ||||||
|                                 ::fayalite::__std::option::Option::Some(__builder.build().to_canonical_dyn()), |                                 #type_struct_ident #fixed_type_type_generics | ||||||
|  |                             >::new_unchecked( | ||||||
|  |                                 ::fayalite::__std::option::Option::Some( | ||||||
|  |                                     __builder.build().to_canonical_dyn(), | ||||||
|  |                                 ), | ||||||
|                                 #variant_index, |                                 #variant_index, | ||||||
|                                 ::fayalite::ty::FixedType::fixed_type(), |                                 ::fayalite::ty::FixedType::fixed_type(), | ||||||
|                             ), |                             ), | ||||||
|  | @ -728,10 +766,14 @@ impl ToTokens for ParsedEnum { | ||||||
|         let empty_builder_ty = builder.ty([], Some(&parse_quote! { Self }), false); |         let empty_builder_ty = builder.ty([], Some(&parse_quote! { Self }), false); | ||||||
|         quote! { |         quote! { | ||||||
|             #[automatically_derived] |             #[automatically_derived] | ||||||
|             impl #fixed_type_impl_generics ::fayalite::__std::fmt::Debug for #match_enum_ident #fixed_type_type_generics |             impl #fixed_type_impl_generics ::fayalite::__std::fmt::Debug | ||||||
|  |                 for #match_enum_ident #fixed_type_type_generics | ||||||
|             #fixed_type_where_clause |             #fixed_type_where_clause | ||||||
|             { |             { | ||||||
|                 fn fmt(&self, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result { |                 fn fmt( | ||||||
|  |                     &self, | ||||||
|  |                     f: &mut ::fayalite::__std::fmt::Formatter<'_>, | ||||||
|  |                 ) -> ::fayalite::__std::fmt::Result { | ||||||
|                     match *self { |                     match *self { | ||||||
|                         #(#match_enum_debug_arms)* |                         #(#match_enum_debug_arms)* | ||||||
|                     } |                     } | ||||||
|  | @ -739,7 +781,8 @@ impl ToTokens for ParsedEnum { | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             #[automatically_derived] |             #[automatically_derived] | ||||||
|             impl #fixed_type_impl_generics ::fayalite::ty::FixedType for #type_struct_ident #fixed_type_type_generics |             impl #fixed_type_impl_generics ::fayalite::ty::FixedType | ||||||
|  |                 for #type_struct_ident #fixed_type_type_generics | ||||||
|             #fixed_type_where_clause |             #fixed_type_where_clause | ||||||
|             { |             { | ||||||
|                 fn fixed_type() -> Self { |                 fn fixed_type() -> Self { | ||||||
|  | @ -760,16 +803,21 @@ impl ToTokens for ParsedEnum { | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             #[automatically_derived] |             #[automatically_derived] | ||||||
|             impl #fixed_type_impl_generics ::fayalite::__std::fmt::Debug for #type_struct_ident #fixed_type_type_generics |             impl #fixed_type_impl_generics ::fayalite::__std::fmt::Debug | ||||||
|  |                 for #type_struct_ident #fixed_type_type_generics | ||||||
|             #fixed_type_where_clause |             #fixed_type_where_clause | ||||||
|             { |             { | ||||||
|                 fn fmt(&self, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result { |                 fn fmt( | ||||||
|  |                     &self, | ||||||
|  |                     f: &mut ::fayalite::__std::fmt::Formatter<'_>, | ||||||
|  |                 ) -> ::fayalite::__std::fmt::Result { | ||||||
|                     #debug_type_body |                     #debug_type_body | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             #[automatically_derived] |             #[automatically_derived] | ||||||
|             impl #fixed_type_impl_generics ::fayalite::ty::Type for #type_struct_ident #fixed_type_type_generics |             impl #fixed_type_impl_generics ::fayalite::ty::Type | ||||||
|  |                 for #type_struct_ident #fixed_type_type_generics | ||||||
|             #fixed_type_where_clause |             #fixed_type_where_clause | ||||||
|             { |             { | ||||||
|                 type CanonicalType = ::fayalite::enum_::DynEnumType; |                 type CanonicalType = ::fayalite::enum_::DynEnumType; | ||||||
|  | @ -779,15 +827,20 @@ impl ToTokens for ParsedEnum { | ||||||
|                 type MaskValue = ::fayalite::int::UInt<1>; |                 type MaskValue = ::fayalite::int::UInt<1>; | ||||||
|                 type MatchVariant = #match_enum_ident #fixed_type_type_generics; |                 type MatchVariant = #match_enum_ident #fixed_type_type_generics; | ||||||
|                 type MatchActiveScope = ::fayalite::module::Scope; |                 type MatchActiveScope = ::fayalite::module::Scope; | ||||||
|                 type MatchVariantAndInactiveScope = ::fayalite::enum_::EnumMatchVariantAndInactiveScope<Self>; |                 type MatchVariantAndInactiveScope = | ||||||
|  |                     ::fayalite::enum_::EnumMatchVariantAndInactiveScope<Self>; | ||||||
|                 type MatchVariantsIter = ::fayalite::enum_::EnumMatchVariantsIter<Self>; |                 type MatchVariantsIter = ::fayalite::enum_::EnumMatchVariantsIter<Self>; | ||||||
|                 fn match_variants<IO: ::fayalite::bundle::BundleValue>( |                 fn match_variants<IO: ::fayalite::bundle::BundleValue>( | ||||||
|                     this: ::fayalite::expr::Expr<<Self as ::fayalite::ty::Type>::Value>, |                     this: ::fayalite::expr::Expr<<Self as ::fayalite::ty::Type>::Value>, | ||||||
|                     module_builder: &mut ::fayalite::module::ModuleBuilder<IO, ::fayalite::module::NormalModule>, |                     module_builder: &mut ::fayalite::module::ModuleBuilder< | ||||||
|  |                         IO, | ||||||
|  |                         ::fayalite::module::NormalModule, | ||||||
|  |                     >, | ||||||
|                     source_location: ::fayalite::source_location::SourceLocation, |                     source_location: ::fayalite::source_location::SourceLocation, | ||||||
|                 ) -> <Self as ::fayalite::ty::Type>::MatchVariantsIter |                 ) -> <Self as ::fayalite::ty::Type>::MatchVariantsIter | ||||||
|                 where |                 where | ||||||
|                     <IO as ::fayalite::expr::ToExpr>::Type: ::fayalite::bundle::BundleType<Value = IO>, |                     <IO as ::fayalite::expr::ToExpr>::Type: | ||||||
|  |                         ::fayalite::bundle::BundleType<Value = IO>, | ||||||
|                 { |                 { | ||||||
|                     module_builder.enum_match_variants_helper(this, source_location) |                     module_builder.enum_match_variants_helper(this, source_location) | ||||||
|                 } |                 } | ||||||
|  | @ -818,16 +871,22 @@ impl ToTokens for ParsedEnum { | ||||||
| 
 | 
 | ||||||
|             #[automatically_derived] |             #[automatically_derived] | ||||||
|             #[allow(clippy::init_numbered_fields)] |             #[allow(clippy::init_numbered_fields)] | ||||||
|             impl #fixed_type_impl_generics ::fayalite::enum_::EnumType for #type_struct_ident #fixed_type_type_generics |             impl #fixed_type_impl_generics ::fayalite::enum_::EnumType | ||||||
|  |                 for #type_struct_ident #fixed_type_type_generics | ||||||
|             #fixed_type_where_clause |             #fixed_type_where_clause | ||||||
|             { |             { | ||||||
|                 type Builder = #empty_builder_ty; |                 type Builder = #empty_builder_ty; | ||||||
|                 fn match_activate_scope( |                 fn match_activate_scope( | ||||||
|                     v: <Self as ::fayalite::ty::Type>::MatchVariantAndInactiveScope, |                     v: <Self as ::fayalite::ty::Type>::MatchVariantAndInactiveScope, | ||||||
|                 ) -> (<Self as ::fayalite::ty::Type>::MatchVariant, <Self as ::fayalite::ty::Type>::MatchActiveScope) { |                 ) -> ( | ||||||
|  |                     <Self as ::fayalite::ty::Type>::MatchVariant, | ||||||
|  |                     <Self as ::fayalite::ty::Type>::MatchActiveScope, | ||||||
|  |                 ) { | ||||||
|                     let (__variant_access, __scope) = v.activate(); |                     let (__variant_access, __scope) = v.activate(); | ||||||
|                     ( |                     ( | ||||||
|                         match ::fayalite::expr::ops::VariantAccess::variant_index(&*__variant_access) { |                         match ::fayalite::expr::ops::VariantAccess::variant_index( | ||||||
|  |                             &*__variant_access, | ||||||
|  |                         ) { | ||||||
|                             #(#match_enum_arms)* |                             #(#match_enum_arms)* | ||||||
|                             #variant_count.. => ::fayalite::__std::panic!("invalid variant index"), |                             #variant_count.. => ::fayalite::__std::panic!("invalid variant index"), | ||||||
|                         }, |                         }, | ||||||
|  | @ -837,7 +896,9 @@ impl ToTokens for ParsedEnum { | ||||||
|                 fn builder() -> <Self as ::fayalite::enum_::EnumType>::Builder { |                 fn builder() -> <Self as ::fayalite::enum_::EnumType>::Builder { | ||||||
|                     #empty_builder_ty::new() |                     #empty_builder_ty::new() | ||||||
|                 } |                 } | ||||||
|                 fn variants(&self) -> ::fayalite::intern::Interned<[::fayalite::enum_::VariantType<::fayalite::intern::Interned<dyn ::fayalite::ty::DynCanonicalType>>]> { |                 fn variants(&self) -> ::fayalite::intern::Interned<[::fayalite::enum_::VariantType< | ||||||
|  |                     ::fayalite::intern::Interned<dyn ::fayalite::ty::DynCanonicalType>, | ||||||
|  |                 >]> { | ||||||
|                     ::fayalite::intern::Intern::intern(&[#(#enum_type_variants,)*][..]) |                     ::fayalite::intern::Intern::intern(&[#(#enum_type_variants,)*][..]) | ||||||
|                 } |                 } | ||||||
|                 fn variants_hint() -> ::fayalite::enum_::VariantsHint { |                 fn variants_hint() -> ::fayalite::enum_::VariantsHint { | ||||||
|  | @ -846,7 +907,8 @@ impl ToTokens for ParsedEnum { | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             #[automatically_derived] |             #[automatically_derived] | ||||||
|             impl #fixed_type_impl_generics ::fayalite::expr::ToExpr for #target #fixed_type_type_generics |             impl #fixed_type_impl_generics ::fayalite::expr::ToExpr | ||||||
|  |                 for #target #fixed_type_type_generics | ||||||
|             #fixed_type_where_clause |             #fixed_type_where_clause | ||||||
|             { |             { | ||||||
|                 type Type = #type_struct_ident #fixed_type_type_generics; |                 type Type = #type_struct_ident #fixed_type_type_generics; | ||||||
|  | @ -859,10 +921,15 @@ impl ToTokens for ParsedEnum { | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             #[automatically_derived] |             #[automatically_derived] | ||||||
|             impl #fixed_type_impl_generics ::fayalite::ty::Value for #target #fixed_type_type_generics |             impl #fixed_type_impl_generics ::fayalite::ty::Value | ||||||
|  |                 for #target #fixed_type_type_generics | ||||||
|             #fixed_type_where_clause |             #fixed_type_where_clause | ||||||
|             { |             { | ||||||
|                 fn to_canonical(&self) -> <<Self as ::fayalite::expr::ToExpr>::Type as ::fayalite::ty::Type>::CanonicalValue { |                 fn to_canonical(&self) -> < | ||||||
|  |                         <Self as ::fayalite::expr::ToExpr>::Type | ||||||
|  |                         as ::fayalite::ty::Type | ||||||
|  |                     >::CanonicalValue | ||||||
|  |                 { | ||||||
|                     let __ty = ::fayalite::ty::Type::canonical(&::fayalite::expr::ToExpr::ty(self)); |                     let __ty = ::fayalite::ty::Type::canonical(&::fayalite::expr::ToExpr::ty(self)); | ||||||
|                     match self { |                     match self { | ||||||
|                         #(Self::#variant_names { #variant_field_pats } => { |                         #(Self::#variant_names { #variant_field_pats } => { | ||||||
|  | @ -877,7 +944,8 @@ impl ToTokens for ParsedEnum { | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             #[automatically_derived] |             #[automatically_derived] | ||||||
|             impl #fixed_type_impl_generics ::fayalite::enum_::EnumValue for #target #fixed_type_type_generics |             impl #fixed_type_impl_generics ::fayalite::enum_::EnumValue | ||||||
|  |                 for #target #fixed_type_type_generics | ||||||
|             #fixed_type_where_clause |             #fixed_type_where_clause | ||||||
|             { |             { | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  | @ -303,25 +303,35 @@ impl ParsedStruct { | ||||||
|                     f.debug_struct(#mask_value_debug_ident).finish() |                     f.debug_struct(#mask_value_debug_ident).finish() | ||||||
|                 }, |                 }, | ||||||
|                 FieldsKind::Named(_) => quote! { |                 FieldsKind::Named(_) => quote! { | ||||||
|                     f.debug_struct(#mask_value_debug_ident)#(.field(#unskipped_field_name_strs, &self.#unskipped_field_names))*.finish() |                     f.debug_struct(#mask_value_debug_ident) | ||||||
|  |                         #(.field(#unskipped_field_name_strs, &self.#unskipped_field_names))* | ||||||
|  |                         .finish() | ||||||
|                 }, |                 }, | ||||||
|                 FieldsKind::Unnamed(_) => quote! { |                 FieldsKind::Unnamed(_) => quote! { | ||||||
|                     f.debug_tuple(#mask_value_debug_ident)#(.field(&self.#unskipped_field_names))*.finish() |                     f.debug_tuple(#mask_value_debug_ident) | ||||||
|  |                         #(.field(&self.#unskipped_field_names))* | ||||||
|  |                         .finish() | ||||||
|                 }, |                 }, | ||||||
|             }; |             }; | ||||||
|             quote! { |             quote! { | ||||||
|                 #[automatically_derived] |                 #[automatically_derived] | ||||||
|                 impl #impl_generics ::fayalite::__std::fmt::Debug for #mask_value_ident #type_generics |                 impl #impl_generics ::fayalite::__std::fmt::Debug | ||||||
|  |                     for #mask_value_ident #type_generics | ||||||
|                 #where_clause |                 #where_clause | ||||||
|                 { |                 { | ||||||
|                     fn fmt(&self, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result { |                     fn fmt( | ||||||
|  |                         &self, | ||||||
|  |                         f: &mut ::fayalite::__std::fmt::Formatter<'_>, | ||||||
|  |                     ) -> ::fayalite::__std::fmt::Result { | ||||||
|                         #debug_mask_value_body |                         #debug_mask_value_body | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }.to_tokens(tokens); |             } | ||||||
|  |             .to_tokens(tokens); | ||||||
|             quote! { |             quote! { | ||||||
|                 #mask_type_ident { |                 #mask_type_ident { | ||||||
|                     #(#unskipped_field_names: ::fayalite::ty::Type::mask_type(&self.#unskipped_field_names),)* |                     #(#unskipped_field_names: | ||||||
|  |                         ::fayalite::ty::Type::mask_type(&self.#unskipped_field_names),)* | ||||||
|                     #(#phantom_data_field_name_slice: ::fayalite::__std::marker::PhantomData,)* |                     #(#phantom_data_field_name_slice: ::fayalite::__std::marker::PhantomData,)* | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  | @ -331,10 +341,14 @@ impl ParsedStruct { | ||||||
|                 f.debug_struct(#type_struct_debug_ident).finish() |                 f.debug_struct(#type_struct_debug_ident).finish() | ||||||
|             }, |             }, | ||||||
|             FieldsKind::Named(_) => quote! { |             FieldsKind::Named(_) => quote! { | ||||||
|                 f.debug_struct(#type_struct_debug_ident)#(.field(#unskipped_field_name_strs, &self.#unskipped_field_names))*.finish() |                 f.debug_struct(#type_struct_debug_ident) | ||||||
|  |                     #(.field(#unskipped_field_name_strs, &self.#unskipped_field_names))* | ||||||
|  |                     .finish() | ||||||
|             }, |             }, | ||||||
|             FieldsKind::Unnamed(_) => quote! { |             FieldsKind::Unnamed(_) => quote! { | ||||||
|                 f.debug_tuple(#type_struct_debug_ident)#(.field(&self.#unskipped_field_names))*.finish() |                 f.debug_tuple(#type_struct_debug_ident) | ||||||
|  |                     #(.field(&self.#unskipped_field_names))* | ||||||
|  |                     .finish() | ||||||
|             }, |             }, | ||||||
|         }; |         }; | ||||||
|         for the_struct_ident in [&type_struct_ident, match_variant_ident] |         for the_struct_ident in [&type_struct_ident, match_variant_ident] | ||||||
|  | @ -369,7 +383,8 @@ impl ParsedStruct { | ||||||
|                     fn fixed_type() -> Self { |                     fn fixed_type() -> Self { | ||||||
|                         Self { |                         Self { | ||||||
|                             #(#unskipped_field_names: ::fayalite::ty::FixedType::fixed_type(),)* |                             #(#unskipped_field_names: ::fayalite::ty::FixedType::fixed_type(),)* | ||||||
|                             #(#phantom_data_field_name_slice: ::fayalite::__std::marker::PhantomData,)* |                             #(#phantom_data_field_name_slice: | ||||||
|  |                                 ::fayalite::__std::marker::PhantomData,)* | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  | @ -393,24 +408,27 @@ impl ParsedStruct { | ||||||
|         let mut builder = Builder::new(builder_struct_ident.clone(), vis.clone()); |         let mut builder = Builder::new(builder_struct_ident.clone(), vis.clone()); | ||||||
|         for field in unskipped_fields.clone() { |         for field in unskipped_fields.clone() { | ||||||
|             builder.insert_field( |             builder.insert_field( | ||||||
|                     field.name.clone(), |                 field.name.clone(), | ||||||
|                     |v| { |                 |v| { | ||||||
|                         parse_quote_spanned! {v.span()=> |                     parse_quote_spanned! {v.span()=> | ||||||
|                             ::fayalite::expr::ToExpr::to_expr(&#v) |                         ::fayalite::expr::ToExpr::to_expr(&#v) | ||||||
|                         } |                     } | ||||||
|                     }, |                 }, | ||||||
|                     |t| { |                 |t| { | ||||||
|                         parse_quote_spanned! {t.span()=> |                     parse_quote_spanned! {t.span()=> | ||||||
|                             ::fayalite::expr::Expr<<<#t as ::fayalite::expr::ToExpr>::Type as ::fayalite::ty::Type>::Value> |                         ::fayalite::expr::Expr<< | ||||||
|                         } |                             <#t as ::fayalite::expr::ToExpr>::Type | ||||||
|                     }, |                             as ::fayalite::ty::Type | ||||||
|                     |t| { |                         >::Value> | ||||||
|                         parse_quote_spanned! {t.span()=> |                     } | ||||||
|                             where |                 }, | ||||||
|                                 #t: ::fayalite::expr::ToExpr, |                 |t| { | ||||||
|                         } |                     parse_quote_spanned! {t.span()=> | ||||||
|                     }, |                         where | ||||||
|                 ); |                             #t: ::fayalite::expr::ToExpr, | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  |             ); | ||||||
|         } |         } | ||||||
|         let builder = builder.finish_filling_in_fields(); |         let builder = builder.finish_filling_in_fields(); | ||||||
|         builder.to_tokens(tokens); |         builder.to_tokens(tokens); | ||||||
|  | @ -456,7 +474,8 @@ impl ParsedStruct { | ||||||
|                         )*][..]), |                         )*][..]), | ||||||
|                         #type_struct_ident { |                         #type_struct_ident { | ||||||
|                             #(#build_type_fields,)* |                             #(#build_type_fields,)* | ||||||
|                             #(#phantom_data_field_name_slice: ::fayalite::__std::marker::PhantomData,)* |                             #(#phantom_data_field_name_slice: | ||||||
|  |                                 ::fayalite::__std::marker::PhantomData,)* | ||||||
|                         }, |                         }, | ||||||
|                     ), |                     ), | ||||||
|                 ) |                 ) | ||||||
|  | @ -494,7 +513,10 @@ impl ParsedStruct { | ||||||
|             impl #impl_generics ::fayalite::__std::fmt::Debug for #type_struct_ident #type_generics |             impl #impl_generics ::fayalite::__std::fmt::Debug for #type_struct_ident #type_generics | ||||||
|             #where_clause |             #where_clause | ||||||
|             { |             { | ||||||
|                 fn fmt(&self, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result { |                 fn fmt( | ||||||
|  |                     &self, | ||||||
|  |                     f: &mut ::fayalite::__std::fmt::Formatter<'_>, | ||||||
|  |                 ) -> ::fayalite::__std::fmt::Result { | ||||||
|                     #debug_type_body |                     #debug_type_body | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  | @ -510,21 +532,32 @@ impl ParsedStruct { | ||||||
|                 type MaskValue = #mask_value_ident #type_generics; |                 type MaskValue = #mask_value_ident #type_generics; | ||||||
|                 type MatchVariant = #match_variant_ident #type_generics; |                 type MatchVariant = #match_variant_ident #type_generics; | ||||||
|                 type MatchActiveScope = (); |                 type MatchActiveScope = (); | ||||||
|                 type MatchVariantAndInactiveScope = ::fayalite::ty::MatchVariantWithoutScope<#match_variant_ident #type_generics>; |                 type MatchVariantAndInactiveScope = ::fayalite::ty::MatchVariantWithoutScope< | ||||||
|                 type MatchVariantsIter = ::fayalite::__std::iter::Once<<Self as ::fayalite::ty::Type>::MatchVariantAndInactiveScope>; |                     #match_variant_ident #type_generics, | ||||||
|  |                 >; | ||||||
|  |                 type MatchVariantsIter = ::fayalite::__std::iter::Once< | ||||||
|  |                     <Self as ::fayalite::ty::Type>::MatchVariantAndInactiveScope, | ||||||
|  |                 >; | ||||||
|                 #[allow(unused_variables)] |                 #[allow(unused_variables)] | ||||||
|                 fn match_variants<IO: ::fayalite::bundle::BundleValue>( |                 fn match_variants<IO: ::fayalite::bundle::BundleValue>( | ||||||
|                     this: ::fayalite::expr::Expr<<Self as ::fayalite::ty::Type>::Value>, |                     this: ::fayalite::expr::Expr<<Self as ::fayalite::ty::Type>::Value>, | ||||||
|                     module_builder: &mut ::fayalite::module::ModuleBuilder<IO, ::fayalite::module::NormalModule>, |                     module_builder: &mut ::fayalite::module::ModuleBuilder< | ||||||
|  |                         IO, | ||||||
|  |                         ::fayalite::module::NormalModule, | ||||||
|  |                     >, | ||||||
|                     source_location: ::fayalite::source_location::SourceLocation, |                     source_location: ::fayalite::source_location::SourceLocation, | ||||||
|                 ) -> <Self as ::fayalite::ty::Type>::MatchVariantsIter |                 ) -> <Self as ::fayalite::ty::Type>::MatchVariantsIter | ||||||
|                 where |                 where | ||||||
|                     <IO as ::fayalite::expr::ToExpr>::Type: ::fayalite::bundle::BundleType<Value = IO>, |                     <IO as ::fayalite::expr::ToExpr>::Type: | ||||||
|  |                         ::fayalite::bundle::BundleType<Value = IO>, | ||||||
|                 { |                 { | ||||||
|                     ::fayalite::__std::iter::once(::fayalite::ty::MatchVariantWithoutScope(#match_variant_ident { |                     ::fayalite::__std::iter::once(::fayalite::ty::MatchVariantWithoutScope( | ||||||
|                         #(#unskipped_field_names: this.field(#unskipped_field_name_strs),)* |                         #match_variant_ident { | ||||||
|                         #(#phantom_data_field_name_slice: ::fayalite::__std::marker::PhantomData,)* |                             #(#unskipped_field_names: this.field(#unskipped_field_name_strs),)* | ||||||
|                     })) |                             #(#phantom_data_field_name_slice: | ||||||
|  |                                 ::fayalite::__std::marker::PhantomData,)* | ||||||
|  |                         }, | ||||||
|  |                     )) | ||||||
|                 } |                 } | ||||||
|                 fn mask_type(&self) -> <Self as ::fayalite::ty::Type>::MaskType { |                 fn mask_type(&self) -> <Self as ::fayalite::ty::Type>::MaskType { | ||||||
|                     #mask_type_body |                     #mask_type_body | ||||||
|  | @ -540,11 +573,15 @@ impl ParsedStruct { | ||||||
|                     ::fayalite::ty::TypeEnum::BundleType(::fayalite::ty::Type::canonical(self)) |                     ::fayalite::ty::TypeEnum::BundleType(::fayalite::ty::Type::canonical(self)) | ||||||
|                 } |                 } | ||||||
|                 fn from_canonical_type(t: <Self as ::fayalite::ty::Type>::CanonicalType) -> Self { |                 fn from_canonical_type(t: <Self as ::fayalite::ty::Type>::CanonicalType) -> Self { | ||||||
|                     let [#(#unskipped_field_vars),*] = *::fayalite::bundle::BundleType::fields(&t) else { |                     let [#(#unskipped_field_vars),*] = *::fayalite::bundle::BundleType::fields(&t) | ||||||
|  |                     else { | ||||||
|                         ::fayalite::__std::panic!("wrong number of fields"); |                         ::fayalite::__std::panic!("wrong number of fields"); | ||||||
|                     }; |                     }; | ||||||
|                     Self { |                     Self { | ||||||
|                         #(#unskipped_field_names: #unskipped_field_vars.from_canonical_type_helper(#unskipped_field_name_strs, #unskipped_field_flips),)* |                         #(#unskipped_field_names: #unskipped_field_vars.from_canonical_type_helper( | ||||||
|  |                             #unskipped_field_name_strs, | ||||||
|  |                             #unskipped_field_flips, | ||||||
|  |                         ),)* | ||||||
|                         #(#phantom_data_field_name_slice: ::fayalite::__std::marker::PhantomData,)* |                         #(#phantom_data_field_name_slice: ::fayalite::__std::marker::PhantomData,)* | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  | @ -555,13 +592,16 @@ impl ParsedStruct { | ||||||
|             #where_clause |             #where_clause | ||||||
|             { |             { | ||||||
|                 #[allow(unused_variables)] |                 #[allow(unused_variables)] | ||||||
|                 fn expr_deref(this: &::fayalite::expr::Expr<<Self as ::fayalite::ty::Type>::Value>) -> &<Self as ::fayalite::ty::Type>::MatchVariant { |                 fn expr_deref(this: &::fayalite::expr::Expr<<Self as ::fayalite::ty::Type>::Value>) | ||||||
|                     ::fayalite::intern::Interned::<_>::into_inner(::fayalite::intern::Intern::intern_sized( |                     -> &<Self as ::fayalite::ty::Type>::MatchVariant | ||||||
|                         #match_variant_ident { |                 { | ||||||
|  |                     ::fayalite::intern::Interned::<_>::into_inner( | ||||||
|  |                         ::fayalite::intern::Intern::intern_sized(#match_variant_ident { | ||||||
|                             #(#unskipped_field_names: this.field(#unskipped_field_name_strs),)* |                             #(#unskipped_field_names: this.field(#unskipped_field_name_strs),)* | ||||||
|                             #(#phantom_data_field_name_slice: ::fayalite::__std::marker::PhantomData,)* |                             #(#phantom_data_field_name_slice: | ||||||
|                         } |                                 ::fayalite::__std::marker::PhantomData,)* | ||||||
|                     )) |                         }), | ||||||
|  |                     ) | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  | @ -573,12 +613,19 @@ impl ParsedStruct { | ||||||
|                 fn builder() -> <Self as ::fayalite::bundle::BundleType>::Builder { |                 fn builder() -> <Self as ::fayalite::bundle::BundleType>::Builder { | ||||||
|                     #empty_builder_ty::new() |                     #empty_builder_ty::new() | ||||||
|                 } |                 } | ||||||
|                 fn fields(&self) -> ::fayalite::intern::Interned<[::fayalite::bundle::FieldType<::fayalite::intern::Interned<dyn ::fayalite::ty::DynCanonicalType>>]> { |                 fn fields(&self) -> ::fayalite::intern::Interned< | ||||||
|  |                         [::fayalite::bundle::FieldType<::fayalite::intern::Interned< | ||||||
|  |                             dyn ::fayalite::ty::DynCanonicalType, | ||||||
|  |                         >>], | ||||||
|  |                     > | ||||||
|  |                 { | ||||||
|                     ::fayalite::intern::Intern::intern(&[#( |                     ::fayalite::intern::Intern::intern(&[#( | ||||||
|                         ::fayalite::bundle::FieldType { |                         ::fayalite::bundle::FieldType { | ||||||
|                             name: ::fayalite::intern::Intern::intern(#unskipped_field_name_strs), |                             name: ::fayalite::intern::Intern::intern(#unskipped_field_name_strs), | ||||||
|                             flipped: #unskipped_field_flips, |                             flipped: #unskipped_field_flips, | ||||||
|                             ty: ::fayalite::ty::DynType::canonical_dyn(&self.#unskipped_field_names), |                             ty: ::fayalite::ty::DynType::canonical_dyn( | ||||||
|  |                                 &self.#unskipped_field_names, | ||||||
|  |                             ), | ||||||
|                         }, |                         }, | ||||||
|                     )*][..]) |                     )*][..]) | ||||||
|                 } |                 } | ||||||
|  | @ -600,7 +647,9 @@ impl ParsedStruct { | ||||||
|                 type Type = #type_struct_ident #type_generics; |                 type Type = #type_struct_ident #type_generics; | ||||||
|                 fn ty(&self) -> <Self as ::fayalite::expr::ToExpr>::Type { |                 fn ty(&self) -> <Self as ::fayalite::expr::ToExpr>::Type { | ||||||
|                     #type_struct_ident { |                     #type_struct_ident { | ||||||
|                         #(#unskipped_field_names: ::fayalite::expr::ToExpr::ty(&self.#unskipped_field_names),)* |                         #(#unskipped_field_names: ::fayalite::expr::ToExpr::ty( | ||||||
|  |                             &self.#unskipped_field_names, | ||||||
|  |                         ),)* | ||||||
|                         #(#phantom_data_field_name_slice: ::fayalite::__std::marker::PhantomData,)* |                         #(#phantom_data_field_name_slice: ::fayalite::__std::marker::PhantomData,)* | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  | @ -613,10 +662,16 @@ impl ParsedStruct { | ||||||
|             impl #impl_generics ::fayalite::ty::Value for #target #type_generics |             impl #impl_generics ::fayalite::ty::Value for #target #type_generics | ||||||
|             #where_clause |             #where_clause | ||||||
|             { |             { | ||||||
|                 fn to_canonical(&self) -> <<Self as ::fayalite::expr::ToExpr>::Type as ::fayalite::ty::Type>::CanonicalValue { |                 fn to_canonical(&self) -> < | ||||||
|  |                         <Self as ::fayalite::expr::ToExpr>::Type | ||||||
|  |                         as ::fayalite::ty::Type | ||||||
|  |                     >::CanonicalValue | ||||||
|  |                 { | ||||||
|                     let ty = ::fayalite::ty::Type::canonical(&::fayalite::expr::ToExpr::ty(self)); |                     let ty = ::fayalite::ty::Type::canonical(&::fayalite::expr::ToExpr::ty(self)); | ||||||
|                     ::fayalite::bundle::DynBundle::new(ty, ::fayalite::__std::sync::Arc::new([ |                     ::fayalite::bundle::DynBundle::new(ty, ::fayalite::__std::sync::Arc::new([ | ||||||
|                         #(::fayalite::ty::DynValueTrait::to_canonical_dyn(&self.#unskipped_field_names),)* |                         #(::fayalite::ty::DynValueTrait::to_canonical_dyn( | ||||||
|  |                             &self.#unskipped_field_names, | ||||||
|  |                         ),)* | ||||||
|                     ])) |                     ])) | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  | @ -66,7 +66,12 @@ impl DefinitionState { | ||||||
|         let folder_fn_name = self.folder_fn_name(); |         let folder_fn_name = self.folder_fn_name(); | ||||||
|         let (impl_generics, type_generics, where_clause) = self.folder_generics.split_for_impl(); |         let (impl_generics, type_generics, where_clause) = self.folder_generics.split_for_impl(); | ||||||
|         quote! { |         quote! { | ||||||
|             fn #folder_fn_name #impl_generics(&mut self, v: #path #type_generics) -> Result<#path #type_generics, Self::Error> #where_clause { |             fn #folder_fn_name #impl_generics( | ||||||
|  |                 &mut self, | ||||||
|  |                 v: #path #type_generics, | ||||||
|  |             ) -> Result<#path #type_generics, Self::Error> | ||||||
|  |             #where_clause | ||||||
|  |             { | ||||||
|                 Fold::default_fold(v, self) |                 Fold::default_fold(v, self) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | @ -75,7 +80,12 @@ impl DefinitionState { | ||||||
|         let visitor_fn_name = self.visitor_fn_name(); |         let visitor_fn_name = self.visitor_fn_name(); | ||||||
|         let (impl_generics, type_generics, where_clause) = self.visitor_generics.split_for_impl(); |         let (impl_generics, type_generics, where_clause) = self.visitor_generics.split_for_impl(); | ||||||
|         quote! { |         quote! { | ||||||
|             fn #visitor_fn_name #impl_generics(&mut self, v: &#path #type_generics) -> Result<(), Self::Error> #where_clause { |             fn #visitor_fn_name #impl_generics( | ||||||
|  |                 &mut self, | ||||||
|  |                 v: &#path #type_generics, | ||||||
|  |             ) -> Result<(), Self::Error> | ||||||
|  |             #where_clause | ||||||
|  |             { | ||||||
|                 Visit::default_visit(v, self) |                 Visit::default_visit(v, self) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | @ -87,7 +97,9 @@ impl DefinitionState { | ||||||
|         quote! { |         quote! { | ||||||
|             #[automatically_derived] |             #[automatically_derived] | ||||||
|             #[allow(clippy::init_numbered_fields)] |             #[allow(clippy::init_numbered_fields)] | ||||||
|             impl #trait_impl_generics Fold<State> for #path #self_type_generics #trait_where_clause { |             impl #trait_impl_generics Fold<State> for #path #self_type_generics | ||||||
|  |             #trait_where_clause | ||||||
|  |             { | ||||||
|                 fn fold(self, state: &mut State) -> Result<Self, State::Error> { |                 fn fold(self, state: &mut State) -> Result<Self, State::Error> { | ||||||
|                     state.#folder_fn_name(self) |                     state.#folder_fn_name(self) | ||||||
|                 } |                 } | ||||||
|  | @ -103,7 +115,9 @@ impl DefinitionState { | ||||||
|         let (trait_impl_generics, _, trait_where_clause) = self.visit_generics.split_for_impl(); |         let (trait_impl_generics, _, trait_where_clause) = self.visit_generics.split_for_impl(); | ||||||
|         quote! { |         quote! { | ||||||
|             #[automatically_derived] |             #[automatically_derived] | ||||||
|             impl #trait_impl_generics Visit<State> for #path #self_type_generics #trait_where_clause { |             impl #trait_impl_generics Visit<State> for #path #self_type_generics | ||||||
|  |             #trait_where_clause | ||||||
|  |             { | ||||||
|                 fn visit(&self, state: &mut State) -> Result<(), State::Error> { |                 fn visit(&self, state: &mut State) -> Result<(), State::Error> { | ||||||
|                     state.#visitor_fn_name(self) |                     state.#visitor_fn_name(self) | ||||||
|                 } |                 } | ||||||
|  | @ -257,7 +271,13 @@ pub fn generate(ast: &ast::Definitions) -> syn::Result<String> { | ||||||
|                     } else { |                     } else { | ||||||
|                         let member = field_name.to_member(); |                         let member = field_name.to_member(); | ||||||
|                         if member.is_none() { |                         if member.is_none() { | ||||||
|                             return Err(syn::Error::new(Span::call_site(), format!("struct must have `$constructor` since it contains a non-plain field: {def_path:?} {field_name:?}"))); |                             return Err(syn::Error::new( | ||||||
|  |                                 Span::call_site(), | ||||||
|  |                                 format!( | ||||||
|  |                                     "struct must have `$constructor` since it contains a \ | ||||||
|  |                                     non-plain field: {def_path:?} {field_name:?}" | ||||||
|  |                                 ), | ||||||
|  |                             )); | ||||||
|                         } |                         } | ||||||
|                         member |                         member | ||||||
|                     }; |                     }; | ||||||
|  | @ -342,7 +362,8 @@ pub fn generate(ast: &ast::Definitions) -> syn::Result<String> { | ||||||
|                         Some(ast::Field::Visible) => { |                         Some(ast::Field::Visible) => { | ||||||
|                             state_unused = false; |                             state_unused = false; | ||||||
|                             fold_arm = quote! { |                             fold_arm = quote! { | ||||||
|                                 Self::#variant_name(v) => Fold::fold(v, state).map(Self::#variant_name), |                                 Self::#variant_name(v) => Fold::fold(v, state) | ||||||
|  |                                                             .map(Self::#variant_name), | ||||||
|                             }; |                             }; | ||||||
|                             visit_arm = quote! { |                             visit_arm = quote! { | ||||||
|                                 Self::#variant_name(v) => Visit::visit(v, state), |                                 Self::#variant_name(v) => Visit::visit(v, state), | ||||||
|  |  | ||||||
|  | @ -564,8 +564,18 @@ macro_rules! impl_tuple_builder { | ||||||
|             $(($after_Ts $after_fields $after_members))* |             $(($after_Ts $after_fields $after_members))* | ||||||
|         ]); |         ]); | ||||||
| 
 | 
 | ||||||
|         impl<Phantom, $($before_Ts,)* $($after_Ts,)*> $builder<Phantom, $($before_Ts,)* () $(, $after_Ts)*> { |         impl<Phantom, $($before_Ts,)* $($after_Ts,)*> $builder< | ||||||
|             pub fn $field<$T: ToExpr>(self, $field: $T) -> $builder<Phantom, $($before_Ts,)* Expr<<$T::Type as Type>::Value> $(, $after_Ts)*> { |             Phantom, | ||||||
|  |             $($before_Ts,)* | ||||||
|  |             (), | ||||||
|  |             $($after_Ts,)* | ||||||
|  |         > { | ||||||
|  |             pub fn $field<$T: ToExpr>(self, $field: $T) -> $builder< | ||||||
|  |                 Phantom, | ||||||
|  |                 $($before_Ts,)* | ||||||
|  |                 Expr<<$T::Type as Type>::Value>, | ||||||
|  |                 $($after_Ts,)* | ||||||
|  |             > { | ||||||
|                 let Self { |                 let Self { | ||||||
|                     $($before_fields,)* |                     $($before_fields,)* | ||||||
|                     $field: _, |                     $field: _, | ||||||
|  |  | ||||||
|  | @ -208,7 +208,8 @@ macro_rules! unary_op { | ||||||
|                 ).ty, |                 ).ty, | ||||||
|                 #[cache] |                 #[cache] | ||||||
|                 literal_bits: Result<Interned<BitSlice>, ()> = { |                 literal_bits: Result<Interned<BitSlice>, ()> = { | ||||||
|                     arg.to_literal_bits().map(|v| ops::$Op::$op($T::CanonicalValue::from_bit_slice(&v)).to_bits()) |                     arg.to_literal_bits() | ||||||
|  |                         .map(|v| ops::$Op::$op($T::CanonicalValue::from_bit_slice(&v)).to_bits()) | ||||||
|                 }, |                 }, | ||||||
| 
 | 
 | ||||||
|                 fn simulate(&self, sim_state: &mut SimState) -> _ { |                 fn simulate(&self, sim_state: &mut SimState) -> _ { | ||||||
|  | @ -242,7 +243,10 @@ unary_op! { | ||||||
|     #[method = not] |     #[method = not] | ||||||
|     impl<T> Not for _ |     impl<T> Not for _ | ||||||
|     where ( |     where ( | ||||||
|         T: IntTypeTrait<CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>>, |         T: IntTypeTrait< | ||||||
|  |             CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
|     ) |     ) | ||||||
|     { |     { | ||||||
|         fn expr_enum(&self) -> _ { |         fn expr_enum(&self) -> _ { | ||||||
|  | @ -262,7 +266,11 @@ unary_op! { | ||||||
|     #[method = neg] |     #[method = neg] | ||||||
|     impl<T> Neg for _ |     impl<T> Neg for _ | ||||||
|     where ( |     where ( | ||||||
|         T: IntTypeTrait<Signed = ConstBool<true>, CanonicalType = DynSIntType, CanonicalValue = DynSInt>, |         T: IntTypeTrait< | ||||||
|  |             Signed = ConstBool<true>, | ||||||
|  |             CanonicalType = DynSIntType, | ||||||
|  |             CanonicalValue = DynSInt, | ||||||
|  |         >, | ||||||
|     ) |     ) | ||||||
|     { |     { | ||||||
|         fn expr_enum(&self) -> _ { |         fn expr_enum(&self) -> _ { | ||||||
|  | @ -273,7 +281,12 @@ unary_op! { | ||||||
| 
 | 
 | ||||||
| macro_rules! binary_op { | macro_rules! binary_op { | ||||||
|     ( |     ( | ||||||
|         #[method = $op:ident, rhs_to_canonical_dyn = $rhs_to_canonical_dyn:ident, expr_enum_u = $expr_enum_u:ident, expr_enum_s = $expr_enum_s:ident] |         #[ | ||||||
|  |             method = $op:ident, | ||||||
|  |             rhs_to_canonical_dyn = $rhs_to_canonical_dyn:ident, | ||||||
|  |             expr_enum_u = $expr_enum_u:ident, | ||||||
|  |             expr_enum_s = $expr_enum_s:ident | ||||||
|  |         ] | ||||||
|         impl<$LhsType:ident, $RhsType:ident> $Op:ident for _ where $($where:tt)* |         impl<$LhsType:ident, $RhsType:ident> $Op:ident for _ where $($where:tt)* | ||||||
|     ) => { |     ) => { | ||||||
|         fixed_ary_op! { |         fixed_ary_op! { | ||||||
|  | @ -285,7 +298,10 @@ macro_rules! binary_op { | ||||||
|                 pub lhs: Expr<$LhsType::CanonicalValue>, |                 pub lhs: Expr<$LhsType::CanonicalValue>, | ||||||
|                 pub rhs: Expr<$RhsType::CanonicalValue>, |                 pub rhs: Expr<$RhsType::CanonicalValue>, | ||||||
|                 #[type] |                 #[type] | ||||||
|                 ty: <<Valueless<$LhsType> as ops::$Op<Valueless<$RhsType>>>::Output as ValuelessTr>::Type = ops::$Op::$op( |                 ty: < | ||||||
|  |                     <Valueless<$LhsType> as ops::$Op<Valueless<$RhsType>>>::Output | ||||||
|  |                     as ValuelessTr | ||||||
|  |                 >::Type = ops::$Op::$op( | ||||||
|                     Valueless::<$LhsType>::from_canonical(lhs.valueless()), |                     Valueless::<$LhsType>::from_canonical(lhs.valueless()), | ||||||
|                     Valueless::<$RhsType>::from_canonical(rhs.valueless()), |                     Valueless::<$RhsType>::from_canonical(rhs.valueless()), | ||||||
|                 ).ty, |                 ).ty, | ||||||
|  | @ -309,7 +325,8 @@ macro_rules! binary_op { | ||||||
|                 fn expr_enum(&self) -> _ { |                 fn expr_enum(&self) -> _ { | ||||||
|                     struct Tag; |                     struct Tag; | ||||||
|                     impl ConstBoolDispatchTag for Tag { |                     impl ConstBoolDispatchTag for Tag { | ||||||
|                         type Type<Select: GenericConstBool> = $Op<DynIntType<Select>, DynIntType<Select>>; |                         type Type<Select: GenericConstBool> = | ||||||
|  |                             $Op<DynIntType<Select>, DynIntType<Select>>; | ||||||
|                     } |                     } | ||||||
|                     match ConstBoolDispatch::new::<Tag, $LhsType::Signed>(self.canonical()) { |                     match ConstBoolDispatch::new::<Tag, $LhsType::Signed>(self.canonical()) { | ||||||
|                         ConstBoolDispatch::False(v) => ExprEnum::$expr_enum_u(v.intern_sized()), |                         ConstBoolDispatch::False(v) => ExprEnum::$expr_enum_u(v.intern_sized()), | ||||||
|  | @ -322,25 +339,45 @@ macro_rules! binary_op { | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         impl<Lhs: Value<Type = $LhsType>, $LhsType, $RhsType, Rhs: Value<Type = $RhsType>> ops::$Op<Expr<Rhs>> for Expr<Lhs> |         impl< | ||||||
|  |             Lhs: Value<Type = $LhsType>, | ||||||
|  |             $LhsType, | ||||||
|  |             $RhsType, | ||||||
|  |             Rhs: Value<Type = $RhsType>, | ||||||
|  |         > ops::$Op<Expr<Rhs>> for Expr<Lhs> | ||||||
|         where |         where | ||||||
|             $($where)* |             $($where)* | ||||||
|         { |         { | ||||||
|             type Output = Expr<<<Valueless<$LhsType> as ops::$Op<Valueless<$RhsType>>>::Output as ValuelessTr>::Value>; |             type Output = Expr<< | ||||||
|  |                 <Valueless<$LhsType> as ops::$Op<Valueless<$RhsType>>>::Output | ||||||
|  |                 as ValuelessTr | ||||||
|  |             >::Value>; | ||||||
| 
 | 
 | ||||||
|             fn $op(self, rhs: Expr<Rhs>) -> Self::Output { |             fn $op(self, rhs: Expr<Rhs>) -> Self::Output { | ||||||
|                 $Op::<$LhsType, $RhsType>::new_unchecked(self.canonical(), rhs.canonical()).to_expr() |                 $Op::<$LhsType, $RhsType>::new_unchecked(self.canonical(), rhs.canonical()) | ||||||
|  |                     .to_expr() | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         impl<Lhs: Value<Type = $LhsType>, $LhsType, $RhsType, Rhs: Value<Type = $RhsType>> ops::$Op<Rhs> for Expr<Lhs> |         impl< | ||||||
|  |             Lhs: Value<Type = $LhsType>, | ||||||
|  |             $LhsType, | ||||||
|  |             $RhsType, | ||||||
|  |             Rhs: Value<Type = $RhsType>, | ||||||
|  |         > ops::$Op<Rhs> for Expr<Lhs> | ||||||
|         where |         where | ||||||
|             $($where)* |             $($where)* | ||||||
|         { |         { | ||||||
|             type Output = Expr<<<Valueless<$LhsType> as ops::$Op<Valueless<$RhsType>>>::Output as ValuelessTr>::Value>; |             type Output = Expr<< | ||||||
|  |                 <Valueless<$LhsType> as ops::$Op<Valueless<$RhsType>>>::Output | ||||||
|  |                 as ValuelessTr | ||||||
|  |             >::Value>; | ||||||
| 
 | 
 | ||||||
|             fn $op(self, rhs: Rhs) -> Self::Output { |             fn $op(self, rhs: Rhs) -> Self::Output { | ||||||
|                 $Op::<$LhsType, $RhsType>::new_unchecked(self.canonical(), rhs.to_expr().canonical()).to_expr() |                 $Op::<$LhsType, $RhsType>::new_unchecked( | ||||||
|  |                     self.canonical(), | ||||||
|  |                     rhs.to_expr().canonical(), | ||||||
|  |                 ).to_expr() | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -348,78 +385,156 @@ macro_rules! binary_op { | ||||||
|         where |         where | ||||||
|             $($where)* |             $($where)* | ||||||
|         { |         { | ||||||
|             type Output = Expr<<<Valueless<$LhsType> as ops::$Op<Valueless<$RhsType>>>::Output as ValuelessTr>::Value>; |             type Output = Expr<< | ||||||
|  |                 <Valueless<$LhsType> as ops::$Op<Valueless<$RhsType>>>::Output | ||||||
|  |                 as ValuelessTr | ||||||
|  |             >::Value>; | ||||||
| 
 | 
 | ||||||
|             fn $op(self, rhs: Expr<Rhs>) -> Self::Output { |             fn $op(self, rhs: Expr<Rhs>) -> Self::Output { | ||||||
|                 $Op::<$LhsType, $RhsType>::new_unchecked(self.to_expr().canonical(), rhs.canonical()).to_expr() |                 $Op::<$LhsType, $RhsType>::new_unchecked( | ||||||
|  |                     self.to_expr().canonical(), | ||||||
|  |                     rhs.canonical(), | ||||||
|  |                 ).to_expr() | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| binary_op! { | binary_op! { | ||||||
|     #[method = bitand, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = BitAndU, expr_enum_s = BitAndS] |     #[ | ||||||
|  |         method = bitand, | ||||||
|  |         rhs_to_canonical_dyn = to_canonical_dyn, | ||||||
|  |         expr_enum_u = BitAndU, | ||||||
|  |         expr_enum_s = BitAndS | ||||||
|  |     ] | ||||||
|     impl<L, R> BitAnd for _ |     impl<L, R> BitAnd for _ | ||||||
|     where |     where | ||||||
|         L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, |         L: IntTypeTrait< | ||||||
|         R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>, |             CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
|  |         R: IntTypeTrait< | ||||||
|  |             Signed = L::Signed, | ||||||
|  |             CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| binary_op! { | binary_op! { | ||||||
|     #[method = bitor, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = BitOrU, expr_enum_s = BitOrS] |     #[ | ||||||
|  |         method = bitor, | ||||||
|  |         rhs_to_canonical_dyn = to_canonical_dyn, | ||||||
|  |         expr_enum_u = BitOrU, | ||||||
|  |         expr_enum_s = BitOrS | ||||||
|  |     ] | ||||||
|     impl<L, R> BitOr for _ |     impl<L, R> BitOr for _ | ||||||
|     where |     where | ||||||
|         L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, |         L: IntTypeTrait< | ||||||
|         R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>, |             CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
|  |         R: IntTypeTrait< | ||||||
|  |             Signed = L::Signed, | ||||||
|  |             CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| binary_op! { | binary_op! { | ||||||
|     #[method = bitxor, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = BitXorU, expr_enum_s = BitXorS] |     #[ | ||||||
|  |         method = bitxor, | ||||||
|  |         rhs_to_canonical_dyn = to_canonical_dyn, | ||||||
|  |         expr_enum_u = BitXorU, | ||||||
|  |         expr_enum_s = BitXorS | ||||||
|  |     ] | ||||||
|     impl<L, R> BitXor for _ |     impl<L, R> BitXor for _ | ||||||
|     where |     where | ||||||
|         L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, |         L: IntTypeTrait< | ||||||
|         R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>, |             CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
|  |         R: IntTypeTrait< | ||||||
|  |             Signed = L::Signed, | ||||||
|  |             CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| binary_op! { | binary_op! { | ||||||
|     #[method = add, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = AddU, expr_enum_s = AddS] |     #[method = add, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = AddU, expr_enum_s = AddS] | ||||||
|     impl<L, R> Add for _ |     impl<L, R> Add for _ | ||||||
|     where |     where | ||||||
|         L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, |         L: IntTypeTrait< | ||||||
|         R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>, |             CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
|  |         R: IntTypeTrait< | ||||||
|  |             Signed = L::Signed, | ||||||
|  |             CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| binary_op! { | binary_op! { | ||||||
|     #[method = sub, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = SubU, expr_enum_s = SubS] |     #[method = sub, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = SubU, expr_enum_s = SubS] | ||||||
|     impl<L, R> Sub for _ |     impl<L, R> Sub for _ | ||||||
|     where |     where | ||||||
|         L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, |         L: IntTypeTrait< | ||||||
|         R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>, |             CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
|  |         R: IntTypeTrait< | ||||||
|  |             Signed = L::Signed, | ||||||
|  |             CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| binary_op! { | binary_op! { | ||||||
|     #[method = mul, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = MulU, expr_enum_s = MulS] |     #[ | ||||||
|  |         method = mul, | ||||||
|  |         rhs_to_canonical_dyn = to_canonical_dyn, | ||||||
|  |         expr_enum_u = MulU, | ||||||
|  |         expr_enum_s = MulS | ||||||
|  |     ] | ||||||
|     impl<L, R> Mul for _ |     impl<L, R> Mul for _ | ||||||
|     where |     where | ||||||
|         L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, |         L: IntTypeTrait< | ||||||
|         R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>, |             CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
|  |         R: IntTypeTrait< | ||||||
|  |             Signed = L::Signed, | ||||||
|  |             CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| macro_rules! dyn_shift_op { | macro_rules! dyn_shift_op { | ||||||
|     ( |     ( | ||||||
|         #[method = $Op:ident::$op:ident, expr_enum_u = $expr_enum_u:ident, expr_enum_s = $expr_enum_s:ident] |         #[ | ||||||
|  |             method = $Op:ident::$op:ident, | ||||||
|  |             expr_enum_u = $expr_enum_u:ident, | ||||||
|  |             expr_enum_s = $expr_enum_s:ident | ||||||
|  |         ] | ||||||
|         impl $DynOp:ident |         impl $DynOp:ident | ||||||
|     ) => { |     ) => { | ||||||
|         fixed_ary_op! { |         fixed_ary_op! { | ||||||
|             pub struct $DynOp<LhsType,> |             pub struct $DynOp<LhsType,> | ||||||
|             where ( |             where ( | ||||||
|                 LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, |                 LhsType: IntTypeTrait< | ||||||
|  |                     CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                     CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 >, | ||||||
|             ) |             ) | ||||||
|             { |             { | ||||||
|                 pub lhs: Expr<LhsType::CanonicalValue>, |                 pub lhs: Expr<LhsType::CanonicalValue>, | ||||||
|                 pub rhs: Expr<DynUInt>, |                 pub rhs: Expr<DynUInt>, | ||||||
|                 #[type] |                 #[type] | ||||||
|                 ty: <<Valueless<LhsType> as ops::$Op<Valueless<DynUIntType>>>::Output as ValuelessTr>::Type = ops::$Op::$op( |                 ty: < | ||||||
|  |                     <Valueless<LhsType> as ops::$Op<Valueless<DynUIntType>>>::Output | ||||||
|  |                     as ValuelessTr | ||||||
|  |                 >::Type = ops::$Op::$op( | ||||||
|                     lhs.valueless(), |                     lhs.valueless(), | ||||||
|                     rhs.valueless(), |                     rhs.valueless(), | ||||||
|                 ).ty, |                 ).ty, | ||||||
|  | @ -456,12 +571,27 @@ macro_rules! dyn_shift_op { | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         impl<Lhs: Value<Type = LhsType>, LhsType, RhsType, Rhs: Value<Type = RhsType>> ops::$Op<Expr<Rhs>> for Expr<Lhs> |         impl< | ||||||
|  |             Lhs: Value<Type = LhsType>, | ||||||
|  |             LhsType, | ||||||
|  |             RhsType, | ||||||
|  |             Rhs: Value<Type = RhsType>, | ||||||
|  |         > ops::$Op<Expr<Rhs>> for Expr<Lhs> | ||||||
|         where |         where | ||||||
|             LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, |             LhsType: IntTypeTrait< | ||||||
|             RhsType: IntTypeTrait<Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>, |                 CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |             >, | ||||||
|  |             RhsType: IntTypeTrait< | ||||||
|  |                 Signed = ConstBool<false>, | ||||||
|  |                 CanonicalType = DynUIntType, | ||||||
|  |                 CanonicalValue = DynUInt, | ||||||
|  |             >, | ||||||
|         { |         { | ||||||
|             type Output = Expr<<<Valueless<LhsType> as ops::$Op<Valueless<RhsType>>>::Output as ValuelessTr>::Value>; |             type Output = Expr<< | ||||||
|  |                 <Valueless<LhsType> as ops::$Op<Valueless<RhsType>>>::Output | ||||||
|  |                 as ValuelessTr | ||||||
|  |             >::Value>; | ||||||
| 
 | 
 | ||||||
|             fn $op(self, rhs: Expr<Rhs>) -> Self::Output { |             fn $op(self, rhs: Expr<Rhs>) -> Self::Output { | ||||||
|                 $DynOp::<LhsType>::new_unchecked(self.canonical(), rhs.canonical()).to_expr() |                 $DynOp::<LhsType>::new_unchecked(self.canonical(), rhs.canonical()).to_expr() | ||||||
|  | @ -470,13 +600,23 @@ macro_rules! dyn_shift_op { | ||||||
| 
 | 
 | ||||||
|         impl<LhsType, RhsType, Rhs: Value<Type = RhsType>> ops::$Op<Expr<Rhs>> for IntValue<LhsType> |         impl<LhsType, RhsType, Rhs: Value<Type = RhsType>> ops::$Op<Expr<Rhs>> for IntValue<LhsType> | ||||||
|         where |         where | ||||||
|             LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, |             LhsType: IntTypeTrait< | ||||||
|             RhsType: IntTypeTrait<Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>, |                 CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |             >, | ||||||
|  |             RhsType: IntTypeTrait< | ||||||
|  |                 Signed = ConstBool<false>, | ||||||
|  |                 CanonicalType = DynUIntType, | ||||||
|  |                 CanonicalValue = DynUInt, | ||||||
|  |             >, | ||||||
|         { |         { | ||||||
|             type Output = Expr<<<Valueless<LhsType> as ops::$Op<Valueless<RhsType>>>::Output as ValuelessTr>::Value>; |             type Output = Expr<< | ||||||
|  |                 <Valueless<LhsType> as ops::$Op<Valueless<RhsType>>>::Output as ValuelessTr>::Value, | ||||||
|  |             >; | ||||||
| 
 | 
 | ||||||
|             fn $op(self, rhs: Expr<Rhs>) -> Self::Output { |             fn $op(self, rhs: Expr<Rhs>) -> Self::Output { | ||||||
|                 $DynOp::<LhsType>::new_unchecked(self.to_expr().canonical(), rhs.canonical()).to_expr() |                 $DynOp::<LhsType>::new_unchecked(self.to_expr().canonical(), rhs.canonical()) | ||||||
|  |                     .to_expr() | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
|  | @ -484,22 +624,27 @@ macro_rules! dyn_shift_op { | ||||||
| 
 | 
 | ||||||
| macro_rules! fixed_shift_op { | macro_rules! fixed_shift_op { | ||||||
|     ( |     ( | ||||||
|         #[method = $Op:ident::$op:ident, expr_enum_u = $expr_enum_u:ident, expr_enum_s = $expr_enum_s:ident] |         #[ | ||||||
|  |             method = $Op:ident::$op:ident, | ||||||
|  |             expr_enum_u = $expr_enum_u:ident, | ||||||
|  |             expr_enum_s = $expr_enum_s:ident | ||||||
|  |         ] | ||||||
|         impl $FixedOp:ident |         impl $FixedOp:ident | ||||||
|     ) => { |     ) => { | ||||||
|         fixed_ary_op! { |         fixed_ary_op! { | ||||||
|             pub struct $FixedOp<LhsType,> |             pub struct $FixedOp<LhsType,> | ||||||
|             where ( |             where ( | ||||||
|                 LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, |                 LhsType: IntTypeTrait< | ||||||
|  |                     CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                     CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 >, | ||||||
|             ) |             ) | ||||||
|             { |             { | ||||||
|                 pub lhs: Expr<LhsType::CanonicalValue>, |                 pub lhs: Expr<LhsType::CanonicalValue>, | ||||||
|                 pub rhs: usize, |                 pub rhs: usize, | ||||||
|                 #[type] |                 #[type] | ||||||
|                 ty: <<Valueless<LhsType> as ops::$Op<usize>>::Output as ValuelessTr>::Type = ops::$Op::$op( |                 ty: <<Valueless<LhsType> as ops::$Op<usize>>::Output as ValuelessTr>::Type = | ||||||
|                     lhs.valueless(), |                     ops::$Op::$op(lhs.valueless(), rhs).ty, | ||||||
|                     rhs, |  | ||||||
|                 ).ty, |  | ||||||
|                 #[cache] |                 #[cache] | ||||||
|                 literal_bits: Result<Interned<BitSlice>, ()> = { |                 literal_bits: Result<Interned<BitSlice>, ()> = { | ||||||
|                     lhs.to_literal_bits() |                     lhs.to_literal_bits() | ||||||
|  | @ -532,9 +677,13 @@ macro_rules! fixed_shift_op { | ||||||
| 
 | 
 | ||||||
|         impl<Lhs: Value<Type = LhsType>, LhsType> ops::$Op<usize> for Expr<Lhs> |         impl<Lhs: Value<Type = LhsType>, LhsType> ops::$Op<usize> for Expr<Lhs> | ||||||
|         where |         where | ||||||
|             LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, |             LhsType: IntTypeTrait< | ||||||
|  |                 CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |             >, | ||||||
|         { |         { | ||||||
|             type Output = Expr<<<Valueless<LhsType> as ops::$Op<usize>>::Output as ValuelessTr>::Value>; |             type Output = | ||||||
|  |                 Expr<<<Valueless<LhsType> as ops::$Op<usize>>::Output as ValuelessTr>::Value>; | ||||||
| 
 | 
 | ||||||
|             fn $op(self, rhs: usize) -> Self::Output { |             fn $op(self, rhs: usize) -> Self::Output { | ||||||
|                 $FixedOp::<LhsType>::new_unchecked(self.canonical(), rhs).to_expr() |                 $FixedOp::<LhsType>::new_unchecked(self.canonical(), rhs).to_expr() | ||||||
|  | @ -568,9 +717,21 @@ macro_rules! cmp_op { | ||||||
|         $(fixed_ary_op! { |         $(fixed_ary_op! { | ||||||
|             pub struct $CmpOp<LhsType, RhsType, Output,> |             pub struct $CmpOp<LhsType, RhsType, Output,> | ||||||
|             where ( |             where ( | ||||||
|                 LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, |                 LhsType: IntTypeTrait< | ||||||
|                 RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, |                     CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, | ||||||
|                 Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>, |                     CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 >, | ||||||
|  |                 RhsType: IntTypeTrait< | ||||||
|  |                     Signed = LhsType::Signed, | ||||||
|  |                     CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, | ||||||
|  |                     CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 >, | ||||||
|  |                 Output: FixedOrDynIntType< | ||||||
|  |                     1, | ||||||
|  |                     Signed = ConstBool<false>, | ||||||
|  |                     CanonicalType = DynUIntType, | ||||||
|  |                     CanonicalValue = DynUInt, | ||||||
|  |                 >, | ||||||
|             ) |             ) | ||||||
|             { |             { | ||||||
|                 pub lhs: Expr<LhsType::CanonicalValue>, |                 pub lhs: Expr<LhsType::CanonicalValue>, | ||||||
|  | @ -598,7 +759,8 @@ macro_rules! cmp_op { | ||||||
|                 fn expr_enum(&self) -> _ { |                 fn expr_enum(&self) -> _ { | ||||||
|                     struct Tag; |                     struct Tag; | ||||||
|                     impl ConstBoolDispatchTag for Tag { |                     impl ConstBoolDispatchTag for Tag { | ||||||
|                         type Type<Select: GenericConstBool> = $CmpOp<DynIntType<Select>, DynIntType<Select>, DynUIntType>; |                         type Type<Select: GenericConstBool> = | ||||||
|  |                             $CmpOp<DynIntType<Select>, DynIntType<Select>, DynUIntType>; | ||||||
|                     } |                     } | ||||||
|                     match ConstBoolDispatch::new::<Tag, LhsType::Signed>(self.canonical()) { |                     match ConstBoolDispatch::new::<Tag, LhsType::Signed>(self.canonical()) { | ||||||
|                         ConstBoolDispatch::False(v) => ExprEnum::$CmpOpU(v.intern_sized()), |                         ConstBoolDispatch::False(v) => ExprEnum::$CmpOpU(v.intern_sized()), | ||||||
|  | @ -612,15 +774,44 @@ macro_rules! cmp_op { | ||||||
|             } |             } | ||||||
|         })* |         })* | ||||||
| 
 | 
 | ||||||
|         impl<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Rhs: Value<Type = RhsType>, Lhs: Value<Type = LhsType>> IntCmp<Expr<Rhs>> for Expr<Lhs> { |         impl< | ||||||
|  |                 LhsType: IntTypeTrait< | ||||||
|  |                     CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                     CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 >, | ||||||
|  |                 RhsType: IntTypeTrait< | ||||||
|  |                     Signed = LhsType::Signed, | ||||||
|  |                     CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, | ||||||
|  |                     CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 >, | ||||||
|  |                 Rhs: Value<Type = RhsType>, | ||||||
|  |                 Lhs: Value<Type = LhsType>, | ||||||
|  |             > IntCmp<Expr<Rhs>> for Expr<Lhs> | ||||||
|  |         { | ||||||
|             type Output = Expr<UInt<1>>; |             type Output = Expr<UInt<1>>; | ||||||
| 
 | 
 | ||||||
|             $(fn $fn(self, rhs: Expr<Rhs>) -> Self::Output { |             $(fn $fn(self, rhs: Expr<Rhs>) -> Self::Output { | ||||||
|                 $CmpOp::<LhsType, RhsType, UIntType<1>>::new_unchecked(self.canonical(), rhs.canonical()).to_expr() |                 $CmpOp::<LhsType, RhsType, UIntType<1>>::new_unchecked( | ||||||
|  |                     self.canonical(), | ||||||
|  |                     rhs.canonical(), | ||||||
|  |                 ).to_expr() | ||||||
|             })* |             })* | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         impl<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Rhs: Value<Type = RhsType>, Lhs: Value<Type = LhsType>> IntCmp<Rhs> for Expr<Lhs> { |         impl< | ||||||
|  |                 LhsType: IntTypeTrait< | ||||||
|  |                     CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                     CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 >, | ||||||
|  |                 RhsType: IntTypeTrait< | ||||||
|  |                     Signed = LhsType::Signed, | ||||||
|  |                     CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, | ||||||
|  |                     CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 >, | ||||||
|  |                 Rhs: Value<Type = RhsType>, | ||||||
|  |                 Lhs: Value<Type = LhsType>, | ||||||
|  |             > IntCmp<Rhs> for Expr<Lhs> | ||||||
|  |         { | ||||||
|             type Output = Expr<UInt<1>>; |             type Output = Expr<UInt<1>>; | ||||||
| 
 | 
 | ||||||
|             $(fn $fn(self, rhs: Rhs) -> Self::Output { |             $(fn $fn(self, rhs: Rhs) -> Self::Output { | ||||||
|  | @ -628,7 +819,18 @@ macro_rules! cmp_op { | ||||||
|             })* |             })* | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         impl<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Rhs: Value<Type = RhsType>> IntCmp<Expr<Rhs>> for IntValue<LhsType> { |         impl< | ||||||
|  |             LhsType: IntTypeTrait< | ||||||
|  |                 CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>, | ||||||
|  |             >, | ||||||
|  |             RhsType: IntTypeTrait< | ||||||
|  |                 Signed = LhsType::Signed, | ||||||
|  |                 CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, | ||||||
|  |                 CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>, | ||||||
|  |             >, | ||||||
|  |             Rhs: Value<Type = RhsType>, | ||||||
|  |         > IntCmp<Expr<Rhs>> for IntValue<LhsType> { | ||||||
|             type Output = Expr<UInt<1>>; |             type Output = Expr<UInt<1>>; | ||||||
| 
 | 
 | ||||||
|             $(fn $fn(self, rhs: Expr<Rhs>) -> Self::Output { |             $(fn $fn(self, rhs: Expr<Rhs>) -> Self::Output { | ||||||
|  | @ -636,7 +838,10 @@ macro_rules! cmp_op { | ||||||
|             })* |             })* | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         impl<LhsType: IntTypeTrait, RhsType: IntTypeTrait<Signed = LhsType::Signed>> IntCmp<Valueless<RhsType>> for Valueless<LhsType> { |         impl< | ||||||
|  |             LhsType: IntTypeTrait, | ||||||
|  |             RhsType: IntTypeTrait<Signed = LhsType::Signed>, | ||||||
|  |         > IntCmp<Valueless<RhsType>> for Valueless<LhsType> { | ||||||
|             type Output = Valueless<UIntType<1>>; |             type Output = Valueless<UIntType<1>>; | ||||||
| 
 | 
 | ||||||
|             $(fn $fn(self, _rhs: Valueless<RhsType>) -> Self::Output { |             $(fn $fn(self, _rhs: Valueless<RhsType>) -> Self::Output { | ||||||
|  | @ -658,8 +863,14 @@ cmp_op! { | ||||||
| fixed_ary_op! { | fixed_ary_op! { | ||||||
|     pub struct CastInt<FromType, ToType,> |     pub struct CastInt<FromType, ToType,> | ||||||
|     where ( |     where ( | ||||||
|         FromType: IntTypeTrait<CanonicalType = DynIntType<<FromType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<FromType as IntTypeTrait>::Signed>>, |         FromType: IntTypeTrait< | ||||||
|         ToType: IntTypeTrait<CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>>, |             CanonicalType = DynIntType<<FromType as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<FromType as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
|  |         ToType: IntTypeTrait< | ||||||
|  |             CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
|     ) |     ) | ||||||
|     { |     { | ||||||
|         pub value: Expr<FromType::CanonicalValue>, |         pub value: Expr<FromType::CanonicalValue>, | ||||||
|  | @ -669,7 +880,8 @@ fixed_ary_op! { | ||||||
|         literal_bits: Result<Interned<BitSlice>, ()> = { |         literal_bits: Result<Interned<BitSlice>, ()> = { | ||||||
|             value.to_literal_bits().map(|literal_bits| { |             value.to_literal_bits().map(|literal_bits| { | ||||||
|                 let mut bits = literal_bits.to_bitvec(); |                 let mut bits = literal_bits.to_bitvec(); | ||||||
|                 let fill = FromType::Signed::VALUE && bits.len().checked_sub(1).map(|i| bits[i]).unwrap_or(false); |                 let fill = FromType::Signed::VALUE | ||||||
|  |                     && bits.len().checked_sub(1).map(|i| bits[i]).unwrap_or(false); | ||||||
|                 bits.resize(ty.width(), fill); |                 bits.resize(ty.width(), fill); | ||||||
|                 Intern::intern_owned(bits) |                 Intern::intern_owned(bits) | ||||||
|             }) |             }) | ||||||
|  | @ -689,13 +901,24 @@ fixed_ary_op! { | ||||||
|             } |             } | ||||||
|             struct Tag2<FromSigned: GenericConstBool>(FromSigned); |             struct Tag2<FromSigned: GenericConstBool>(FromSigned); | ||||||
|             impl<FromSigned: GenericConstBool> ConstBoolDispatchTag for Tag2<FromSigned> { |             impl<FromSigned: GenericConstBool> ConstBoolDispatchTag for Tag2<FromSigned> { | ||||||
|                 type Type<Select: GenericConstBool> = CastInt<DynIntType<FromSigned>, DynIntType<Select>>; |                 type Type<Select: GenericConstBool> = | ||||||
|  |                     CastInt<DynIntType<FromSigned>, DynIntType<Select>>; | ||||||
|             } |             } | ||||||
|             match ConstBoolDispatch::new::<Tag1, FromType::Signed>(ConstBoolDispatch::new::<Tag2<FromType::Signed>, ToType::Signed>(self.canonical())) { |             match ConstBoolDispatch::new::<Tag1, FromType::Signed>( | ||||||
|                 ConstBoolDispatch::False(ConstBoolDispatch::False(v)) => ExprEnum::CastUIntToUInt(v.intern_sized()), |                 ConstBoolDispatch::new::<Tag2<FromType::Signed>, ToType::Signed>(self.canonical()), | ||||||
|                 ConstBoolDispatch::False(ConstBoolDispatch::True(v)) => ExprEnum::CastUIntToSInt(v.intern_sized()), |             ) { | ||||||
|                 ConstBoolDispatch::True(ConstBoolDispatch::False(v)) => ExprEnum::CastSIntToUInt(v.intern_sized()), |                 ConstBoolDispatch::False(ConstBoolDispatch::False(v)) => { | ||||||
|                 ConstBoolDispatch::True(ConstBoolDispatch::True(v)) => ExprEnum::CastSIntToSInt(v.intern_sized()), |                     ExprEnum::CastUIntToUInt(v.intern_sized()) | ||||||
|  |                 } | ||||||
|  |                 ConstBoolDispatch::False(ConstBoolDispatch::True(v)) => { | ||||||
|  |                     ExprEnum::CastUIntToSInt(v.intern_sized()) | ||||||
|  |                 } | ||||||
|  |                 ConstBoolDispatch::True(ConstBoolDispatch::False(v)) => { | ||||||
|  |                     ExprEnum::CastSIntToUInt(v.intern_sized()) | ||||||
|  |                 } | ||||||
|  |                 ConstBoolDispatch::True(ConstBoolDispatch::True(v)) => { | ||||||
|  |                     ExprEnum::CastSIntToSInt(v.intern_sized()) | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -740,7 +963,10 @@ impl< | ||||||
| fixed_ary_op! { | fixed_ary_op! { | ||||||
|     pub struct Slice<Base,> |     pub struct Slice<Base,> | ||||||
|     where ( |     where ( | ||||||
|         Base: IntTypeTrait<CanonicalType = DynIntType<<Base as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<Base as IntTypeTrait>::Signed>>, |         Base: IntTypeTrait< | ||||||
|  |             CanonicalType = DynIntType<<Base as IntTypeTrait>::Signed>, | ||||||
|  |             CanonicalValue = DynInt<<Base as IntTypeTrait>::Signed>, | ||||||
|  |         >, | ||||||
|     ) |     ) | ||||||
|     { |     { | ||||||
|         pub base: Expr<Base::CanonicalValue>, |         pub base: Expr<Base::CanonicalValue>, | ||||||
|  | @ -890,7 +1116,12 @@ macro_rules! reduce_bit_op { | ||||||
|         fixed_ary_op! { |         fixed_ary_op! { | ||||||
|             pub struct $name<Output,> |             pub struct $name<Output,> | ||||||
|             where ( |             where ( | ||||||
|                 Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>, |                 Output: FixedOrDynIntType< | ||||||
|  |                     1, | ||||||
|  |                     Signed = ConstBool<false>, | ||||||
|  |                     CanonicalType = DynUIntType, | ||||||
|  |                     CanonicalValue = DynUInt, | ||||||
|  |                 >, | ||||||
|             ) |             ) | ||||||
|             { |             { | ||||||
|                 pub arg: Expr<DynUInt>, |                 pub arg: Expr<DynUInt>, | ||||||
|  |  | ||||||
|  | @ -2297,7 +2297,7 @@ pub struct TestBackend { | ||||||
|     pub files: BTreeMap<String, String>, |     pub files: BTreeMap<String, String>, | ||||||
|     pub error_after: Option<i64>, |     pub error_after: Option<i64>, | ||||||
|     #[doc(hidden)] |     #[doc(hidden)] | ||||||
|     /// #[non_exhaustive] except allowing struct update syntax
 |     /// `#[non_exhaustive]` except allowing struct update syntax
 | ||||||
|     pub __private: TestBackendPrivate, |     pub __private: TestBackendPrivate, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -92,7 +92,7 @@ pub struct BuilderModuleBody { | ||||||
|     memory_map: HashMap<ScopedNameId, Rc<RefCell<MemBuilderTarget>>>, |     memory_map: HashMap<ScopedNameId, Rc<RefCell<MemBuilderTarget>>>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// implicit name argument that's automatically provided by #[hdl] let
 | /// implicit name argument that's automatically provided by `#[hdl]` let
 | ||||||
| #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] | #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] | ||||||
| pub struct ImplicitName<'a>(pub &'a str); | pub struct ImplicitName<'a>(pub &'a str); | ||||||
| 
 | 
 | ||||||
|  | @ -225,7 +225,10 @@ impl<S: ModuleBuildingStatus> fmt::Debug for StmtMatch<S> { | ||||||
| 
 | 
 | ||||||
| macro_rules! wrapper_enum { | macro_rules! wrapper_enum { | ||||||
|     ( |     ( | ||||||
|         #[impl(($($T_impl:tt)*) $impl_self:ident: $impl_type:ty = $impl_self_expr:expr $(, ($($T_impls:tt)*) $impls_self:ident: $impls_type:ty = $impls_self_expr:expr)*)] |         #[impl(
 | ||||||
|  |             ($($T_impl:tt)*) $impl_self:ident: $impl_type:ty = $impl_self_expr:expr | ||||||
|  |             $(, ($($T_impls:tt)*) $impls_self:ident: $impls_type:ty = $impls_self_expr:expr)* | ||||||
|  |         )] | ||||||
|         #[to($($T_to:tt $to_types:ty),*)] |         #[to($($T_to:tt $to_types:ty),*)] | ||||||
|         $(#[$enum_meta:meta])* |         $(#[$enum_meta:meta])* | ||||||
|         $vis:vis enum $enum_name:ident<$T_enum:ident: $T_bound:ident = $T_enum_default:ident> { |         $vis:vis enum $enum_name:ident<$T_enum:ident: $T_bound:ident = $T_enum_default:ident> { | ||||||
|  | @ -356,7 +359,10 @@ pub struct StmtInstance<S: ModuleBuildingStatus = ModuleBuilt> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| wrapper_enum! { | wrapper_enum! { | ||||||
|     #[impl((<S: ModuleBuildingStatus>) self: StmtDeclaration<S> = self, (<S: ModuleBuildingStatus>) self: Stmt<S> = self.declaration()?)] |     #[impl(
 | ||||||
|  |         (<S: ModuleBuildingStatus>) self: StmtDeclaration<S> = self, | ||||||
|  |         (<S: ModuleBuildingStatus>) self: Stmt<S> = self.declaration()? | ||||||
|  |     )] | ||||||
|     #[to((<S: ModuleBuildingStatus>) StmtDeclaration<S>, (<S: ModuleBuildingStatus>) Stmt<S>)] |     #[to((<S: ModuleBuildingStatus>) StmtDeclaration<S>, (<S: ModuleBuildingStatus>) Stmt<S>)] | ||||||
|     #[derive(Clone, PartialEq, Eq, Hash)] |     #[derive(Clone, PartialEq, Eq, Hash)] | ||||||
|     pub enum StmtDeclaration<S: ModuleBuildingStatus = ModuleBuilt> { |     pub enum StmtDeclaration<S: ModuleBuildingStatus = ModuleBuilt> { | ||||||
|  | @ -1705,7 +1711,7 @@ impl<T: BundleValue> Module<T> | ||||||
| where | where | ||||||
|     T::Type: BundleType<Value = T>, |     T::Type: BundleType<Value = T>, | ||||||
| { | { | ||||||
|     /// you generally should use the #[hdl_module] proc-macro and [`ModuleBuilder`] instead
 |     /// you generally should use the [`#[hdl_module]`][`crate::hdl_module`] proc-macro and [`ModuleBuilder`] instead
 | ||||||
|     pub fn new_unchecked( |     pub fn new_unchecked( | ||||||
|         name_id: NameId, |         name_id: NameId, | ||||||
|         source_location: SourceLocation, |         source_location: SourceLocation, | ||||||
|  |  | ||||||
|  | @ -45,20 +45,34 @@ pub trait Visit<State: ?Sized + Visitor> { | ||||||
| 
 | 
 | ||||||
| macro_rules! impl_visit_fold { | macro_rules! impl_visit_fold { | ||||||
|     ( |     ( | ||||||
|         impl<$T:ident, $State:ident $(, const $Const:ident: $const_ty:ty)*> _ for $ty:ty $(where ($($where_tt:tt)*))? { |         impl<$T:ident, $State:ident $(, const $Const:ident: $const_ty:ty)*> _ for $ty:ty | ||||||
|             fn fold($($fold_args:tt)*) -> $fold_ret_ty:ty $fold_block:block |         $(where ($($where_tt:tt)*))? | ||||||
|             fn default_fold($($default_fold_args:tt)*) -> $default_fold_ret_ty:ty $default_fold_block:block |         { | ||||||
|             fn visit($($visit_args:tt)*) -> $visit_ret_ty:ty $visit_block:block |             fn fold($($fold_args:tt)*) -> $fold_ret_ty:ty | ||||||
|             fn default_visit($($default_visit_args:tt)*) -> $default_visit_ret_ty:ty $default_visit_block:block |             $fold_block:block | ||||||
|  |             fn default_fold($($default_fold_args:tt)*) -> $default_fold_ret_ty:ty | ||||||
|  |             $default_fold_block:block | ||||||
|  |             fn visit($($visit_args:tt)*) -> $visit_ret_ty:ty | ||||||
|  |             $visit_block:block | ||||||
|  |             fn default_visit($($default_visit_args:tt)*) -> $default_visit_ret_ty:ty | ||||||
|  |             $default_visit_block:block | ||||||
|         } |         } | ||||||
|     ) => { |     ) => { | ||||||
|         impl<$T: Fold<$State>, $State: ?Sized + Folder $(, const $Const: $const_ty)*> Fold<$State> for $ty |         impl< | ||||||
|  |             $T: Fold<$State>, | ||||||
|  |             $State: ?Sized + Folder, | ||||||
|  |             $(const $Const: $const_ty,)* | ||||||
|  |         > Fold<$State> for $ty | ||||||
|         $(where $($where_tt)*)? |         $(where $($where_tt)*)? | ||||||
|         { |         { | ||||||
|             fn fold($($fold_args)*) -> $fold_ret_ty $fold_block |             fn fold($($fold_args)*) -> $fold_ret_ty $fold_block | ||||||
|             fn default_fold($($default_fold_args)*) -> $default_fold_ret_ty $default_fold_block |             fn default_fold($($default_fold_args)*) -> $default_fold_ret_ty $default_fold_block | ||||||
|         } |         } | ||||||
|         impl<$T: Visit<$State>, $State: ?Sized + Visitor $(, const $Const: $const_ty)*> Visit<$State> for $ty |         impl< | ||||||
|  |             $T: Visit<$State>, | ||||||
|  |             $State: ?Sized + Visitor, | ||||||
|  |             $(const $Const: $const_ty,)* | ||||||
|  |         > Visit<$State> for $ty | ||||||
|         $(where $($where_tt)*)? |         $(where $($where_tt)*)? | ||||||
|         { |         { | ||||||
|             fn visit($($visit_args)*) -> $visit_ret_ty $visit_block |             fn visit($($visit_args)*) -> $visit_ret_ty $visit_block | ||||||
|  |  | ||||||
|  | @ -109,7 +109,9 @@ const FILE_PATTERNS: &[FilePattern] = &[ | ||||||
| ]; | ]; | ||||||
| 
 | 
 | ||||||
| thread_local! { | thread_local! { | ||||||
|     static NORMALIZE_FILES_FOR_TESTS: RefCell<Option<NormalizeFilesForTestsState>> = const { RefCell::new(None) }; |     static NORMALIZE_FILES_FOR_TESTS: RefCell<Option<NormalizeFilesForTestsState>> = const { | ||||||
|  |         RefCell::new(None) | ||||||
|  |     }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl From<&'_ panic::Location<'_>> for SourceLocation { | impl From<&'_ panic::Location<'_>> for SourceLocation { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue