@@ -215,6 +215,46 @@ impl<'arena> Term<'arena> {
215215 | Term :: ConstMatch ( span, _, _, _) => * span,
216216 }
217217 }
218+
219+ pub fn contains_free ( & self , mut var : LocalVar ) -> bool {
220+ match self {
221+ Term :: RigidVar ( _, v) => * v == var,
222+ Term :: ItemVar ( _, _)
223+ | Term :: FlexibleVar ( _, _)
224+ | Term :: FlexibleInsertion ( _, _, _)
225+ | Term :: Universe ( _)
226+ | Term :: Prim ( _, _)
227+ | Term :: ConstLit ( _, _) => false ,
228+
229+ Term :: Ann ( _, term, r#type) => term. contains_free ( var) || r#type. contains_free ( var) ,
230+ Term :: Let ( _, _, r#type, def, body) => {
231+ r#type. contains_free ( var)
232+ || def. contains_free ( var)
233+ || body. contains_free ( var. prev ( ) )
234+ }
235+ Term :: FunType ( _, _, input_type, output_type) => {
236+ input_type. contains_free ( var) || output_type. contains_free ( var. prev ( ) )
237+ }
238+ Term :: FunLit ( _, _, body) => body. contains_free ( var. prev ( ) ) ,
239+ Term :: FunApp ( _, head, arg) => head. contains_free ( var) || arg. contains_free ( var) ,
240+ Term :: RecordType ( _, _, terms)
241+ | Term :: RecordLit ( _, _, terms)
242+ | Term :: FormatRecord ( _, _, terms)
243+ | Term :: FormatOverlap ( _, _, terms) => terms. iter ( ) . any ( |term| {
244+ let result = term. contains_free ( var) ;
245+ var = var. prev ( ) ;
246+ result
247+ } ) ,
248+ Term :: RecordProj ( _, term, _) => term. contains_free ( var) ,
249+ Term :: ArrayLit ( _, terms) => terms. iter ( ) . any ( |term| term. contains_free ( var) ) ,
250+ Term :: FormatCond ( _, _, t1, t2) => t1. contains_free ( var) || t2. contains_free ( var. prev ( ) ) ,
251+ Term :: ConstMatch ( _, scrut, branches, default) => {
252+ scrut. contains_free ( var)
253+ || branches. iter ( ) . any ( |( _, term) | term. contains_free ( var) )
254+ || default. map_or ( false , |term| term. contains_free ( var. prev ( ) ) )
255+ }
256+ }
257+ }
218258}
219259
220260macro_rules! def_prims {
@@ -623,45 +663,3 @@ mod tests {
623663 assert ! ( !std:: mem:: needs_drop:: <Term <' _>>( ) ) ;
624664 }
625665}
626-
627- impl < ' arena > Term < ' arena > {
628- pub fn contains_free ( & self , mut var : LocalVar ) -> bool {
629- match self {
630- Term :: RigidVar ( _, v) => * v == var,
631- Term :: ItemVar ( _, _)
632- | Term :: FlexibleVar ( _, _)
633- | Term :: FlexibleInsertion ( _, _, _)
634- | Term :: Universe ( _)
635- | Term :: Prim ( _, _)
636- | Term :: ConstLit ( _, _) => false ,
637-
638- Term :: Ann ( _, term, r#type) => term. contains_free ( var) || r#type. contains_free ( var) ,
639- Term :: Let ( _, _, r#type, def, body) => {
640- r#type. contains_free ( var)
641- || def. contains_free ( var)
642- || body. contains_free ( var. prev ( ) )
643- }
644- Term :: FunType ( _, _, input_type, output_type) => {
645- input_type. contains_free ( var) || output_type. contains_free ( var. prev ( ) )
646- }
647- Term :: FunLit ( _, _, body) => body. contains_free ( var. prev ( ) ) ,
648- Term :: FunApp ( _, head, arg) => head. contains_free ( var) || arg. contains_free ( var) ,
649- Term :: RecordType ( _, _, terms)
650- | Term :: RecordLit ( _, _, terms)
651- | Term :: FormatRecord ( _, _, terms)
652- | Term :: FormatOverlap ( _, _, terms) => terms. iter ( ) . any ( |term| {
653- let result = term. contains_free ( var) ;
654- var = var. prev ( ) ;
655- result
656- } ) ,
657- Term :: RecordProj ( _, term, _) => term. contains_free ( var) ,
658- Term :: ArrayLit ( _, terms) => terms. iter ( ) . any ( |term| term. contains_free ( var) ) ,
659- Term :: FormatCond ( _, _, t1, t2) => t1. contains_free ( var) || t2. contains_free ( var. prev ( ) ) ,
660- Term :: ConstMatch ( _, scrut, branches, default) => {
661- scrut. contains_free ( var)
662- || branches. iter ( ) . any ( |( _, term) | term. contains_free ( var) )
663- || default. map_or ( false , |term| term. contains_free ( var. prev ( ) ) )
664- }
665- }
666- }
667- }
0 commit comments