difftreelog
feat support standalone super
in: master
3 files changed
crates/jrsonnet-evaluator/src/error.rsdiffbeforeafterboth24 NoTopLevelObjectFound,24 NoTopLevelObjectFound,25 #[error("self is only usable inside objects")]25 #[error("self is only usable inside objects")]26 CantUseSelfOutsideOfObject,26 CantUseSelfOutsideOfObject,27 #[error("super is only usable inside objects")]27 #[error("no super found")]28 CantUseSuperOutsideOfObject,28 NoSuperFound,292930 #[error("for loop can only iterate over arrays")]30 #[error("for loop can only iterate over arrays")]31 InComprehensionCanOnlyIterateOverArray,31 InComprehensionCanOnlyIterateOverArray,crates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth418 Literal(LiteralType::This) => {418 Literal(LiteralType::This) => {419 Val::Obj(context.this().clone().ok_or(CantUseSelfOutsideOfObject)?)419 Val::Obj(context.this().clone().ok_or(CantUseSelfOutsideOfObject)?)420 }420 }421 Literal(LiteralType::Super) => Val::Obj(422 context423 .super_obj()424 .clone()425 .ok_or(NoSuperFound)?426 .with_this(context.this().clone().unwrap()),427 ),421 Literal(LiteralType::Dollar) => {428 Literal(LiteralType::Dollar) => {422 Val::Obj(context.dollar().clone().ok_or(NoTopLevelObjectFound)?)429 Val::Obj(context.dollar().clone().ok_or(NoTopLevelObjectFound)?)423 }430 }434 || format!("variable <{}>", name),441 || format!("variable <{}>", name),435 || Ok(context.binding(name.clone())?.evaluate()?),442 || Ok(context.binding(name.clone())?.evaluate()?),436 )?,443 )?,437 Index(LocExpr(v, _), index) if matches!(&**v, Expr::Literal(LiteralType::Super)) => {438 let name = evaluate(context.clone(), index)?.try_cast_str("object index")?;439 context440 .super_obj()441 .clone()442 .expect("no super found")443 .get_raw(name, Some(&context.this().clone().expect("no this found")))?444 .expect("value not found")445 }446 Index(value, index) => {444 Index(value, index) => {447 match (evaluate(context.clone(), value)?, evaluate(context, index)?) {445 match (evaluate(context.clone(), value)?, evaluate(context, index)?) {448 (Val::Obj(v), Val::Str(s)) => {446 (Val::Obj(v), Val::Str(s)) => {620 import_location.pop();618 import_location.pop();621 Val::Str(with_state(|s| s.import_file_str(import_location, path))?)619 Val::Str(with_state(|s| s.import_file_str(import_location, path))?)622 }620 }623 Literal(LiteralType::Super) => throw!(StandaloneSuper),624 })621 })625}622}626623crates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth931 Ok(())931 Ok(())932 }932 }933934 #[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 }933952934 struct TestImportResolver(IStr);953 struct TestImportResolver(IStr);935 impl crate::import::ImportResolver for TestImportResolver {954 impl crate::import::ImportResolver for TestImportResolver {