Skip to content

Commit 446bcc1

Browse files
committed
Consolidate Term methods into single impl
1 parent 6c0db63 commit 446bcc1

File tree

1 file changed

+40
-42
lines changed

1 file changed

+40
-42
lines changed

fathom/src/core.rs

Lines changed: 40 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

220260
macro_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

Comments
 (0)