git.delta.rocks / jrsonnet / refs/commits / 11818aa7b735

difftreelog

feat(evaluator) use LocExpr

Лач2020-06-01parent: #c4387b3.patch.diff
in: master

2 files changed

modifiedcrates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
5};5};
6use closure::closure;6use closure::closure;
7use jsonnet_parser::{7use jsonnet_parser::{
8 ArgsDesc, BinaryOpType, BindSpec, Expr, FieldMember, LiteralType, Member, ObjBody, ParamsDesc,8 ArgsDesc, BinaryOpType, BindSpec, Expr, FieldMember, LiteralType, LocExpr, Member, ObjBody,
9 UnaryOpType, Visibility,9 ParamsDesc, UnaryOpType, Visibility,
10};10};
11use std::{11use std::{
40 }40 }
41}41}
4242
43pub fn evaluate_method(ctx: Context, expr: &Expr, arg_spec: ParamsDesc) -> Val {43pub fn evaluate_method(ctx: Context, expr: &LocExpr, arg_spec: ParamsDesc) -> Val {
44 Val::Func(FuncDesc {44 Val::Func(FuncDesc {
45 ctx,45 ctx,
46 params: arg_spec,46 params: arg_spec,
236 }236 }
237}237}
238238
239pub fn evaluate(context: Context, expr: &Expr) -> Val {239pub fn evaluate(context: Context, expr: &LocExpr) -> Val {
240 use Expr::*;240 use Expr::*;
241 let LocExpr(expr, _location) = expr;
241 match &*expr {242 match &**expr {
242 Literal(LiteralType::This) => Val::Obj(243 Literal(LiteralType::This) => Val::Obj(
243 context244 context
244 .this()245 .this()
260 }261 }
261 UnaryOp(o, v) => evaluate_unary_op(*o, &evaluate(context, v)),262 UnaryOp(o, v) => evaluate_unary_op(*o, &evaluate(context, v)),
262 Var(name) => Val::Lazy(context.binding(&name)).unwrap_if_lazy(),263 Var(name) => Val::Lazy(context.binding(&name)).unwrap_if_lazy(),
263 Index(box value, box index) => {264 Index(value, index) => {
264 match (265 match (
265 evaluate(context.clone(), value).unwrap_if_lazy(),266 evaluate(context.clone(), value).unwrap_if_lazy(),
266 evaluate(context.clone(), index),267 evaluate(context.clone(), index),
284 .unwrap_or_else(|| panic!("out of bounds"))285 .unwrap_or_else(|| panic!("out of bounds"))
285 .clone(),286 .clone(),
286 (Val::Str(s), Val::Num(n)) => {287 (Val::Str(s), Val::Num(n)) => {
287 Val::Str(s.chars().skip(n as usize - 1).take(1).collect())288 Val::Str(s.chars().skip(n as usize).take(1).collect())
288 }289 }
289 (v, i) => todo!("not implemented: {:?}[{:?}]", v, i.unwrap_if_lazy()),290 (v, i) => todo!("not implemented: {:?}[{:?}]", v, i.unwrap_if_lazy()),
290 }291 }
307 let context = context308 let context = context
308 .extend(new_bindings, None, None, None)309 .extend(new_bindings, None, None, None)
309 .into_future(future_context);310 .into_future(future_context);
310 evaluate(context, &*returned.clone())311 evaluate(context, &returned.clone())
311 }312 }
312 Obj(body) => Val::Obj(evaluate_object(context, body.clone())),313 Obj(body) => Val::Obj(evaluate_object(context, body.clone())),
313 Apply(box value, ArgsDesc(args)) => {314 Apply(value, ArgsDesc(args)) => {
314 let value = evaluate(context.clone(), value).unwrap_if_lazy();315 let value = evaluate(context.clone(), value).unwrap_if_lazy();
315 match value {316 match value {
316 // TODO: Capture context of application317 // TODO: Capture context of application
modifiedcrates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth
--- a/crates/jsonnet-evaluator/src/lib.rs
+++ b/crates/jsonnet-evaluator/src/lib.rs
@@ -29,7 +29,7 @@
 rc_fn_helper!(
 	FunctionDefault,
 	function_default,
-	dyn Fn(Context, Expr) -> Val
+	dyn Fn(Context, LocExpr) -> Val
 );
 
 #[cfg(test)]
@@ -39,21 +39,30 @@
 
 	macro_rules! eval {
 		($str: expr) => {
-			evaluate(Context::new(), &parse($str).unwrap())
+			evaluate(Context::new(), &parse($str, &ParserSettings {
+				loc_data: false,
+				file_name: "test.jsonnet".to_owned(),
+			}).unwrap())
 		};
 	}
 
 	macro_rules! eval_stdlib {
 		($str: expr) => {{
 			let std = "local std = ".to_owned() + jsonnet_stdlib::STDLIB_STR + ";";
-			evaluate(Context::new(), &parse(&(std + $str)).unwrap())
+			evaluate(Context::new(), &parse(&(std + $str), &ParserSettings {
+				loc_data: false,
+				file_name: "test.jsonnet".to_owned(),
+			}).unwrap())
 			}};
 	}
 
 	macro_rules! assert_eval {
 		($str: expr) => {
 			assert_eq!(
-				evaluate(Context::new(), &parse($str).unwrap()),
+				evaluate(Context::new(), &parse($str, &ParserSettings {
+					loc_data: false,
+					file_name: "test.jsonnet".to_owned(),
+				}).unwrap()),
 				Val::Literal(LiteralType::True)
 				)
 		};
@@ -61,7 +70,10 @@
 	macro_rules! assert_json {
 		($str: expr, $out: expr) => {
 			assert_eq!(
-				format!("{}", evaluate(Context::new(), &parse($str).unwrap())),
+				format!("{}", evaluate(Context::new(), &parse($str, &ParserSettings {
+					loc_data: false,
+					file_name: "test.jsonnet".to_owned(),
+				}).unwrap())),
 				$out
 				)
 		};
@@ -74,7 +86,10 @@
 	macro_rules! assert_eval_neg {
 		($str: expr) => {
 			assert_eq!(
-				evaluate(Context::new(), &parse($str).unwrap()),
+				evaluate(Context::new(), &parse($str, &ParserSettings {
+					loc_data: false,
+					file_name: "test.jsonnet".to_owned(),
+				}).unwrap()),
 				Val::Literal(LiteralType::False)
 				)
 		};