summaryrefslogtreecommitdiff
path: root/dhall_generator/src
diff options
context:
space:
mode:
authorNadrieril2019-03-16 23:21:51 +0100
committerNadrieril2019-03-16 23:21:51 +0100
commit05454ab9936514409e1b3c97e36f3fb476d532ba (patch)
tree9ce983a7d76f861b22a6b8dabb68f34a80db15ac /dhall_generator/src
parent0f33caf4c1ee4d1f95d6ac3a41b5cf2f8efa7b54 (diff)
Use Rc instead of Box in AST to allow structural sharing
Closes #29
Diffstat (limited to 'dhall_generator/src')
-rw-r--r--dhall_generator/src/lib.rs15
1 files changed, 8 insertions, 7 deletions
diff --git a/dhall_generator/src/lib.rs b/dhall_generator/src/lib.rs
index 1a74f4f..26be4c4 100644
--- a/dhall_generator/src/lib.rs
+++ b/dhall_generator/src/lib.rs
@@ -4,11 +4,12 @@ use dhall_core::*;
use proc_macro2::TokenStream;
use quote::quote;
use std::collections::BTreeMap;
+use std::rc::Rc;
#[proc_macro]
pub fn dhall_expr(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input_str = input.to_string();
- let expr: Box<Expr<X, Import>> = parser::parse_expr(&input_str).unwrap();
+ let expr: Rc<Expr<X, Import>> = parser::parse_expr(&input_str).unwrap();
let no_import =
|_: &Import| -> X { panic!("Don't use import in dhall!()") };
let expr = expr.map_embed(&no_import);
@@ -17,7 +18,7 @@ pub fn dhall_expr(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
}
// Returns an expression of type Expr<_, _>. Expects input variables
-// to be of type Box<Expr<_, _>> (future-proof for structural sharing).
+// to be of type Rc<Expr<_, _>>.
fn dhall_to_tokenstream(
expr: &Expr<X, X>,
ctx: &Context<Label, ()>,
@@ -77,7 +78,7 @@ fn dhall_to_tokenstream(
}
}
-// Returns an expression of type Box<Expr<_, _>>
+// Returns an expression of type Rc<Expr<_, _>>
fn dhall_to_tokenstream_bx(
expr: &Expr<X, X>,
ctx: &Context<Label, ()>,
@@ -97,7 +98,7 @@ fn dhall_to_tokenstream_bx(
// TODO: insert appropriate shifts ?
let v: TokenStream = s.parse().unwrap();
quote! { {
- let x: Box<Expr<_, _>> = #v.clone();
+ let x: Rc<Expr<_, _>> = #v.clone();
x
} }
}
@@ -125,7 +126,7 @@ fn label_to_tokenstream(l: &Label) -> TokenStream {
}
fn map_to_tokenstream(
- m: &BTreeMap<Label, Box<Expr<X, X>>>,
+ m: &BTreeMap<Label, Rc<Expr<X, X>>>,
ctx: &Context<Label, ()>,
) -> TokenStream {
let (keys, values): (Vec<TokenStream>, Vec<TokenStream>) = m
@@ -142,7 +143,7 @@ fn map_to_tokenstream(
}
fn option_to_tokenstream(
- e: &Option<Box<Expr<X, X>>>,
+ e: &Option<Rc<Expr<X, X>>>,
ctx: &Context<Label, ()>,
) -> TokenStream {
let e = e.as_ref().map(|x| dhall_to_tokenstream_bx(x, ctx));
@@ -153,7 +154,7 @@ fn option_to_tokenstream(
}
fn vec_to_tokenstream(
- e: &Vec<Box<Expr<X, X>>>,
+ e: &Vec<Rc<Expr<X, X>>>,
ctx: &Context<Label, ()>,
) -> TokenStream {
let e = e.iter().map(|x| dhall_to_tokenstream_bx(&**x, ctx));