[meta] Legalization: remove spurious Option wrapping for type variables;

This commit is contained in:
Benjamin Bouvier
2019-07-04 17:36:49 +02:00
parent f1222dce10
commit 15d8b95e72

View File

@@ -187,15 +187,11 @@ fn build_derived_expr(tv: &TypeVar) -> String {
Some(base) => base, Some(base) => base,
None => { None => {
assert!(tv.name.starts_with("typeof_")); assert!(tv.name.starts_with("typeof_"));
return format!("Some({})", tv.name); return format!("{}", tv.name);
} }
}; };
let base_expr = build_derived_expr(&base.type_var); let base_expr = build_derived_expr(&base.type_var);
format!( format!("{}.{}()", base_expr, base.derived_func.name())
"{}.map(|t: crate::ir::Type| t.{}())",
base_expr,
base.derived_func.name()
)
} }
/// Emit rust code for the given check. /// Emit rust code for the given check.
@@ -225,29 +221,18 @@ fn emit_runtime_typecheck<'a, 'b>(
Constraint::Eq(tv1, tv2) => { Constraint::Eq(tv1, tv2) => {
fmtln!( fmtln!(
fmt, fmt,
"let predicate = predicate && match ({}, {}) {{", "let predicate = predicate && {} == {};",
build_derived_expr(tv1), build_derived_expr(tv1),
build_derived_expr(tv2) build_derived_expr(tv2)
); );
fmt.indent(|fmt| {
fmt.line("(Some(a), Some(b)) => a == b,");
fmt.comment("On overflow, constraint doesn\'t apply");
fmt.line("_ => false,");
});
fmtln!(fmt, "};");
} }
Constraint::WiderOrEq(tv1, tv2) => { Constraint::WiderOrEq(tv1, tv2) => {
fmtln!( fmtln!(
fmt, fmt,
"let predicate = predicate && match ({}, {}) {{", "let predicate = predicate && {}.wider_or_equal({});",
build_derived_expr(tv1), build_derived_expr(tv1),
build_derived_expr(tv2) build_derived_expr(tv2)
); );
fmt.indent(|fmt| {
fmt.line("(Some(a), Some(b)) => a.wider_or_equal(b),");
fmt.comment("On overflow, constraint doesn\'t apply");
fmt.line("_ => false,");
});
fmtln!(fmt, "};"); fmtln!(fmt, "};");
} }
} }