summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dhall/src/imports.rs4
-rw-r--r--dhall/src/main.rs2
-rw-r--r--dhall_core/src/core.rs17
-rw-r--r--dhall_core/src/printer.rs10
-rw-r--r--dhall_generator/src/dhall_expr.rs2
5 files changed, 20 insertions, 15 deletions
diff --git a/dhall/src/imports.rs b/dhall/src/imports.rs
index 8df4e97..96268ca 100644
--- a/dhall/src/imports.rs
+++ b/dhall/src/imports.rs
@@ -79,9 +79,9 @@ pub fn load_dhall_file(
let resolve = |import: &Import| -> Expr<X, X> {
resolve_import(import, &root).unwrap()
};
- expr.map_embed(&resolve).squash_embed()
+ expr.as_ref().map_embed(&resolve).squash_embed()
} else {
- panic_imports(&expr)
+ panic_imports(expr.as_ref())
};
Ok(expr)
}
diff --git a/dhall/src/main.rs b/dhall/src/main.rs
index eb2206b..77f558c 100644
--- a/dhall/src/main.rs
+++ b/dhall/src/main.rs
@@ -65,7 +65,7 @@ fn main() {
}
};
- let expr: SubExpr<_, _> = rc(imports::panic_imports(&expr));
+ let expr: SubExpr<_, _> = rc(imports::panic_imports(expr.as_ref()));
let type_expr = match typecheck::type_of(expr.clone()) {
Err(e) => {
diff --git a/dhall_core/src/core.rs b/dhall_core/src/core.rs
index 2d11068..3f01b55 100644
--- a/dhall_core/src/core.rs
+++ b/dhall_core/src/core.rs
@@ -305,30 +305,25 @@ impl<S: Clone, A: Clone> Expr<S, Expr<S, A>> {
}
impl<N, E> Clone for SubExpr<N, E> {
+ #[inline(always)]
fn clone(&self) -> Self {
SubExpr(Rc::clone(&self.0))
}
}
-impl<N, E> std::ops::Deref for SubExpr<N, E> {
- type Target = Rc<Expr<N, E>>;
+impl<N, E> SubExpr<N, E> {
#[inline(always)]
- fn deref(&self) -> &Self::Target {
- &self.0
+ pub fn as_ref(&self) -> &Expr<N, E> {
+ self.0.as_ref()
}
}
-// impl<N, E> SubExpr<N, E> {
-// pub fn as_ref(&self) -> &Expr<N, E> {
-// self.0.as_ref()
-// }
-// }
-
// Remains of a previous life, where everything was in Boxes
pub fn bx<N, E>(x: Expr<N, E>) -> SubExpr<N, E> {
SubExpr(Rc::new(x))
}
+// Should probably rename this too
pub fn rc<N, E>(x: Expr<N, E>) -> SubExpr<N, E> {
SubExpr(Rc::new(x))
}
@@ -414,7 +409,7 @@ where
ExprF::Note(_, e) => {
map_subexpr_rc_binder(e, map_expr, map_under_binder)
}
- _ => rc(map_subexpr(
+ e => rc(map_subexpr(
e,
map_expr,
|_| unreachable!(),
diff --git a/dhall_core/src/printer.rs b/dhall_core/src/printer.rs
index b7d7506..fb3b8e8 100644
--- a/dhall_core/src/printer.rs
+++ b/dhall_core/src/printer.rs
@@ -217,6 +217,16 @@ impl<S, A: Display> Expr<S, A> {
}
}
+impl<S, A: Display> SubExpr<S, A> {
+ fn fmt_phase(
+ &self,
+ f: &mut fmt::Formatter,
+ phase: PrintPhase,
+ ) -> Result<(), fmt::Error> {
+ self.0.as_ref().fmt_phase(f, phase)
+ }
+}
+
fn fmt_list<T, I, F>(
open: &str,
sep: &str,
diff --git a/dhall_generator/src/dhall_expr.rs b/dhall_generator/src/dhall_expr.rs
index c4b15e8..2e3adf7 100644
--- a/dhall_generator/src/dhall_expr.rs
+++ b/dhall_generator/src/dhall_expr.rs
@@ -10,7 +10,7 @@ pub fn dhall_expr(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let expr: SubExpr<X, Import> = parse_expr(&input_str).unwrap();
let no_import =
|_: &Import| -> X { panic!("Don't use import in dhall!()") };
- let expr = rc(expr.map_embed(&no_import));
+ let expr = rc(expr.as_ref().map_embed(&no_import));
let output = dhall_to_tokenstream_bx(&expr, &Context::new());
output.into()
}