From a6c8d05214cf0722a8b72c0134fb78e357d31567 Mon Sep 17 00:00:00 2001 From: Rachel Yang Date: Wed, 11 Nov 2020 21:36:34 -0500 Subject: [PATCH] make +: within an object comprehension functional --- sjsonnet/src/sjsonnet/Evaluator.scala | 4 ++-- sjsonnet/src/sjsonnet/Expr.scala | 3 ++- sjsonnet/src/sjsonnet/Parser.scala | 4 ++-- sjsonnet/test/src/sjsonnet/EvaluatorTests.scala | 1 + 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/sjsonnet/src/sjsonnet/Evaluator.scala b/sjsonnet/src/sjsonnet/Evaluator.scala index c5339876..889bf9d9 100644 --- a/sjsonnet/src/sjsonnet/Evaluator.scala +++ b/sjsonnet/src/sjsonnet/Evaluator.scala @@ -465,7 +465,7 @@ class Evaluator(parseCache: collection.mutable.Map[String, fastparse.Parsed[(Exp } newSelf - case ObjBody.ObjComp(preLocals, key, value, postLocals, first, rest) => + case ObjBody.ObjComp(preLocals, key, value, plus, postLocals, first, rest) => lazy val compScope: ValScope = scope.extend( newSuper = None ) @@ -487,7 +487,7 @@ class Evaluator(parseCache: collection.mutable.Map[String, fastparse.Parsed[(Exp visitExpr(key)(s, implicitly) match { case Val.Str(k) => - builder += (k -> Val.Obj.Member(false, Visibility.Normal, (self: Val.Obj, sup: Option[Val.Obj], _, _) => + builder += (k -> Val.Obj.Member(plus, Visibility.Normal, (self: Val.Obj, sup: Option[Val.Obj], _, _) => visitExpr(value)( s.extend( newBindings, diff --git a/sjsonnet/src/sjsonnet/Expr.scala b/sjsonnet/src/sjsonnet/Expr.scala index 0f718312..2b1bb4d1 100644 --- a/sjsonnet/src/sjsonnet/Expr.scala +++ b/sjsonnet/src/sjsonnet/Expr.scala @@ -124,9 +124,10 @@ object Expr{ case class ObjComp(preLocals: Seq[Member.BindStmt], key: Expr, value: Expr, + plus: Boolean, postLocals: Seq[Member.BindStmt], first: ForSpec, rest: Seq[CompSpec]) extends ObjBody } -} \ No newline at end of file +} diff --git a/sjsonnet/src/sjsonnet/Parser.scala b/sjsonnet/src/sjsonnet/Parser.scala index 7a986fb1..31e1fe5d 100644 --- a/sjsonnet/src/sjsonnet/Parser.scala +++ b/sjsonnet/src/sjsonnet/Parser.scala @@ -287,7 +287,7 @@ object Parser{ val preLocals = exprs .takeWhile(_.isInstanceOf[Expr.Member.BindStmt]) .map(_.asInstanceOf[Expr.Member.BindStmt]) - val Expr.Member.Field(offset, Expr.FieldName.Dyn(lhs), _, None, Visibility.Normal, rhs) = + val Expr.Member.Field(offset, Expr.FieldName.Dyn(lhs), plus, None, Visibility.Normal, rhs) = exprs(preLocals.length) val postLocals = exprs.drop(preLocals.length+1).takeWhile(_.isInstanceOf[Expr.Member.BindStmt]) .map(_.asInstanceOf[Expr.Member.BindStmt]) @@ -303,7 +303,7 @@ object Parser{ Fail.opaque(s"""no duplicate field: "${lhs.asInstanceOf[Expr.Str].value}" """) case _ => // do nothing } - Expr.ObjBody.ObjComp(preLocals, lhs, rhs, postLocals, comps._1, comps._2) + Expr.ObjBody.ObjComp(preLocals, lhs, rhs, plus, postLocals, comps._1, comps._2) } def member[_: P]: P[Expr.Member] = P( objlocal | "assert" ~~ assertStmt | field ) diff --git a/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala b/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala index 12612625..83d84aed 100644 --- a/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala +++ b/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala @@ -327,6 +327,7 @@ object EvaluatorTests extends TestSuite{ eval("{ ['foo']+: x for x in []}", false) ==> ujson.Obj() eval("{ ['foo']+: x for x in [1]}", false) ==> ujson.Obj("foo" -> 1) + eval("{ ['foo']+: [x] for x in [1]} + { ['foo']+: [x] for x in [2]}", false) ==> ujson.Obj("foo" -> ujson.Arr(1,2)) } test("givenNoDuplicateFieldsInListComprehension1_expectSuccess") { eval("""{ ["bar"]: x for x in [-876.89]}""") ==> ujson.Obj("bar" -> -876.89)