@@ -19,7 +19,7 @@ use crate::{
1919
2020use crate :: {
2121 kind:: ArcKind ,
22- metadata:: { Comment , Metadata } ,
22+ metadata:: { BaseMetadata , Comment , Metadata } ,
2323 pos:: { self , BytePos , HasSpan , Span , Spanned } ,
2424 resolve:: remove_aliases_cow,
2525 symbol:: Symbol ,
@@ -78,7 +78,7 @@ impl<'a, T: ?Sized + IdentEnv> IdentEnv for &'a mut T {
7878
7979#[ derive( Eq , PartialEq , Debug , AstClone ) ]
8080pub struct InnerAstType < ' ast , Id > {
81- metadata : Option < Metadata > ,
81+ metadata : BaseMetadata < ' ast > ,
8282 typ : Spanned < Type < Id , AstType < ' ast , Id > > , BytePos > ,
8383}
8484
@@ -137,7 +137,7 @@ pub trait HasMetadata {
137137
138138impl < Id > HasMetadata for AstType < ' _ , Id > {
139139 fn metadata ( & self ) -> Option < & Metadata > {
140- self . _typ . metadata . as_ref ( )
140+ self . _typ . metadata . metadata . as_ref ( ) . map ( |m| & * * m )
141141 }
142142}
143143
@@ -148,7 +148,7 @@ impl<'ast, Id> AstType<'ast, Id> {
148148 ) -> Self {
149149 AstType {
150150 _typ : arena. alloc ( InnerAstType {
151- metadata : None ,
151+ metadata : Default :: default ( ) ,
152152 typ,
153153 } ) ,
154154 }
@@ -164,7 +164,7 @@ impl<'ast, Id> AstType<'ast, Id> {
164164 typ : Spanned < Type < Id , AstType < ' ast , Id > > , BytePos > ,
165165 ) -> Self
166166 where
167- T : Into < Option < Metadata > > ,
167+ T : Into < BaseMetadata < ' ast > > ,
168168 {
169169 AstType {
170170 _typ : arena. alloc ( InnerAstType {
@@ -176,7 +176,7 @@ impl<'ast, Id> AstType<'ast, Id> {
176176
177177 pub fn set_metadata < T > ( & mut self , metadata : T )
178178 where
179- T : Into < Option < Metadata > > ,
179+ T : Into < BaseMetadata < ' ast > > ,
180180 {
181181 self . _typ . metadata = metadata. into ( ) ;
182182 }
@@ -308,6 +308,10 @@ pub enum Pattern<'ast, Id> {
308308 Error ,
309309}
310310
311+ // Safeguard against growing Pattern
312+ #[ cfg( target_pointer_width = "64" ) ]
313+ const _: [ u8 ; 48 ] = [ 0 ; std:: mem:: size_of :: < Pattern < ' static , Symbol > > ( ) ] ;
314+
311315pub fn pattern_names < ' a , ' ast , Id > (
312316 fields : & ' a [ PatternField < ' ast , Id > ] ,
313317) -> impl Iterator < Item = & ' a Spanned < Id , BytePos > > + Captures < ' ast > {
@@ -355,10 +359,6 @@ pub fn pattern_types<'a, 'ast, Id>(
355359 } )
356360}
357361
358- // Safeguard against growing Pattern
359- #[ cfg( target_pointer_width = "64" ) ]
360- const _: [ u8 ; 48 ] = [ 0 ; std:: mem:: size_of :: < Pattern < ' static , Symbol > > ( ) ] ;
361-
362362impl < Id > Default for Pattern < ' _ , Id > {
363363 fn default ( ) -> Self {
364364 Pattern :: Error
@@ -393,8 +393,8 @@ pub type SpannedAlias<'ast, Id> = Spanned<AliasData<Id, AstType<'ast, Id>>, Byte
393393pub type SpannedAstType < ' ast , Id > = Spanned < Type < Id , AstType < ' ast , Id > > , BytePos > ;
394394
395395#[ derive( Eq , PartialEq , Debug , AstClone ) ]
396- pub struct ExprField < Id , E > {
397- pub metadata : Metadata ,
396+ pub struct ExprField < ' ast , Id , E > {
397+ pub metadata : BaseMetadata < ' ast > ,
398398 pub name : Spanned < Id , BytePos > ,
399399 pub value : Option < E > ,
400400}
@@ -447,8 +447,8 @@ pub enum Expr<'ast, Id> {
447447 /// Record construction
448448 Record {
449449 typ : ArcType < Id > ,
450- types : & ' ast mut [ ExprField < Id , ArcType < Id > > ] ,
451- exprs : & ' ast mut [ ExprField < Id , SpannedExpr < ' ast , Id > > ] ,
450+ types : & ' ast mut [ ExprField < ' ast , Id , ArcType < Id > > ] ,
451+ exprs : & ' ast mut [ ExprField < ' ast , Id , SpannedExpr < ' ast , Id > > ] ,
452452 base : Option < & ' ast mut SpannedExpr < ' ast , Id > > ,
453453 } ,
454454 /// Tuple construction
@@ -591,7 +591,7 @@ impl<'ast, Id> Expr<'ast, Id> {
591591
592592#[ derive( Eq , PartialEq , Debug , AstClone ) ]
593593pub struct TypeBinding < ' ast , Id > {
594- pub metadata : Metadata ,
594+ pub metadata : BaseMetadata < ' ast > ,
595595 pub name : Spanned < Id , BytePos > ,
596596 pub alias : SpannedAlias < ' ast , Id > ,
597597 pub finalized_alias : Option < Alias < Id , ArcType < Id > > > ,
@@ -680,7 +680,7 @@ impl<'a, 'ast, Id> IntoIterator for &'a mut ValueBindings<'ast, Id> {
680680
681681#[ derive( Eq , PartialEq , Debug , AstClone ) ]
682682pub struct ValueBinding < ' ast , Id > {
683- pub metadata : Metadata ,
683+ pub metadata : BaseMetadata < ' ast > ,
684684 pub name : SpannedPattern < ' ast , Id > ,
685685 pub typ : Option < AstType < ' ast , Id > > ,
686686 pub resolved_type : ArcType < Id > ,
@@ -1272,8 +1272,8 @@ impl_ast_arena! {
12721272 SpannedExpr <' ast, Id > => exprs,
12731273 SpannedPattern <' ast, Id > => patterns,
12741274 PatternField <' ast, Id > => pattern_field,
1275- ExprField <Id , ArcType <Id >> => expr_field_types,
1276- ExprField <Id , SpannedExpr <' ast, Id >> => expr_field_exprs,
1275+ ExprField <' ast , Id , ArcType <Id >> => expr_field_types,
1276+ ExprField <' ast , Id , SpannedExpr <' ast, Id >> => expr_field_exprs,
12771277 TypeBinding <' ast, Id > => type_bindings,
12781278 ValueBinding <' ast, Id > => value_bindings,
12791279 Do <' ast, Id > => do_exprs,
@@ -1284,6 +1284,7 @@ impl_ast_arena! {
12841284 Generic <Id > => generics,
12851285 Field <Id , AstType <' ast, Id >> => type_fields,
12861286 Field <Id , Alias <Id , AstType <' ast, Id >>> => type_type_fields,
1287+ Metadata => metadata,
12871288}
12881289
12891290pub struct RootExpr < Id : ' static > {
@@ -1494,7 +1495,8 @@ impl<'ast, Id, T> AstClone<'ast, Id> for PhantomData<T> {
14941495impl < ' ast , Id , T > AstClone < ' ast , Id > for Arc < [ crate :: types:: AliasData < Id , T > ] >
14951496where
14961497 Id : Clone + AstClone < ' ast , Id > ,
1497- T : AstClone < ' ast , Id > ,
1498+ T : AstClone < ' ast , Id > + TypePtr < Id = Id > ,
1499+ T :: Generics : AstClone < ' ast , Id > ,
14981500{
14991501 fn ast_clone ( & self , arena : ArenaRef < ' _ , ' ast , Id > ) -> Self {
15001502 Arc :: from ( self . iter ( ) . map ( |e| e. ast_clone ( arena) ) . collect :: < Vec < _ > > ( ) )
0 commit comments