git.delta.rocks / jrsonnet / refs/commits / 643b0073bda6

difftreelog

feat support standalone super

Yaroslav Bolyukin2021-02-20parent: #7b5cb9f.patch.diff
in: master

3 files changed

modifiedcrates/jrsonnet-evaluator/src/error.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/error.rs
+++ b/crates/jrsonnet-evaluator/src/error.rs
@@ -24,8 +24,8 @@
 	NoTopLevelObjectFound,
 	#[error("self is only usable inside objects")]
 	CantUseSelfOutsideOfObject,
-	#[error("super is only usable inside objects")]
-	CantUseSuperOutsideOfObject,
+	#[error("no super found")]
+	NoSuperFound,
 
 	#[error("for loop can only iterate over arrays")]
 	InComprehensionCanOnlyIterateOverArray,
modifiedcrates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/evaluate.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate.rs
@@ -418,6 +418,13 @@
 		Literal(LiteralType::This) => {
 			Val::Obj(context.this().clone().ok_or(CantUseSelfOutsideOfObject)?)
 		}
+		Literal(LiteralType::Super) => Val::Obj(
+			context
+				.super_obj()
+				.clone()
+				.ok_or(NoSuperFound)?
+				.with_this(context.this().clone().unwrap()),
+		),
 		Literal(LiteralType::Dollar) => {
 			Val::Obj(context.dollar().clone().ok_or(NoTopLevelObjectFound)?)
 		}
@@ -434,15 +441,6 @@
 			|| format!("variable <{}>", name),
 			|| Ok(context.binding(name.clone())?.evaluate()?),
 		)?,
-		Index(LocExpr(v, _), index) if matches!(&**v, Expr::Literal(LiteralType::Super)) => {
-			let name = evaluate(context.clone(), index)?.try_cast_str("object index")?;
-			context
-				.super_obj()
-				.clone()
-				.expect("no super found")
-				.get_raw(name, Some(&context.this().clone().expect("no this found")))?
-				.expect("value not found")
-		}
 		Index(value, index) => {
 			match (evaluate(context.clone(), value)?, evaluate(context, index)?) {
 				(Val::Obj(v), Val::Str(s)) => {
@@ -620,6 +618,5 @@
 			import_location.pop();
 			Val::Str(with_state(|s| s.import_file_str(import_location, path))?)
 		}
-		Literal(LiteralType::Super) => throw!(StandaloneSuper),
 	})
 }
modifiedcrates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth
931 Ok(())931 Ok(())
932 }932 }
933
934 #[test]
935 fn standalone_super() -> crate::error::Result<()> {
936 assert_eval!(
937 r#"
938 local obj = {
939 a: 1,
940 b: 2,
941 c: 3,
942 };
943 local test = obj + {
944 fields: std.objectFields(super),
945 d: 5,
946 };
947 test.fields == ['a', 'b', 'c']
948 "#
949 );
950 Ok(())
951 }
933952
934 struct TestImportResolver(IStr);953 struct TestImportResolver(IStr);
935 impl crate::import::ImportResolver for TestImportResolver {954 impl crate::import::ImportResolver for TestImportResolver {