diff --git a/src/main/scala/inox/ast/Expressions.scala b/src/main/scala/inox/ast/Expressions.scala index 7049e7c655c1221fa32cfb1142448c9aedf1f382..08e25f437b895c788a86d1eaefe7048fa09451de 100644 --- a/src/main/scala/inox/ast/Expressions.scala +++ b/src/main/scala/inox/ast/Expressions.scala @@ -61,6 +61,7 @@ trait Expressions { self: Trees => /** Variable + * * @param id The identifier of this variable */ case class Variable(id: Identifier, tpe: Type) extends Expr with Terminal with VariableSymbol { @@ -245,13 +246,18 @@ trait Expressions { self: Trees => * [[purescala.Constructors#caseClassSelector purescala's constructor caseClassSelector]] */ case class CaseClassSelector(caseClass: Expr, selector: Identifier) extends Expr with CachingTyped { - protected def computeType(implicit s: Symbols): Type = caseClass.getType match { + + def classIndex(implicit s: Symbols) = caseClass.getType match { case ct: ClassType => ct.lookupClass match { case Some(tcd: TypedCaseClassDef) => - val index = tcd.cd.selectorID2Index(selector) - tcd.fieldsTypes(index) - case _ => Untyped + Some(tcd, tcd.cd.selectorID2Index(selector)) + case _ => None } + case _ => None + } + + protected def computeType(implicit s: Symbols): Type = classIndex match { + case Some((tcd, ind)) => tcd.fieldsTypes(ind) case _ => Untyped } } @@ -468,6 +474,15 @@ trait Expressions { self: Trees => /* Bit-vector operations */ + /** $encodingof `... | ...` $noteBitvector */ + case class BVOr(lhs: Expr, rhs: Expr) extends Expr with CachingTyped { + protected def computeType(implicit s: Symbols): Type = bitVectorType(lhs.getType, rhs.getType) + } + + /** $encodingof `... & ...` $noteBitvector */ + case class BVAnd(lhs: Expr, rhs: Expr) extends Expr with CachingTyped { + protected def computeType(implicit s: Symbols): Type = bitVectorType(lhs.getType, rhs.getType) + } /** $encodingof `... ^ ...` $noteBitvector */ case class BVXOr(lhs: Expr, rhs: Expr) extends Expr with CachingTyped { @@ -646,4 +661,11 @@ trait Expressions { self: Trees => case _ => Untyped } } + + case class MapUpdated(map: Expr, key: Expr, value: Expr) extends Expr with CachingTyped { + protected def computeType(implicit s: Symbols) = map.getType match { + case mt@MapType(from, to) => checkParamTypes(Seq(key.getType, value.getType), Seq(from, to), mt) + case _ => Untyped + } + } } diff --git a/src/main/scala/inox/ast/Extractors.scala b/src/main/scala/inox/ast/Extractors.scala index e7cd86bbdf47642c60a343dd753325fcf9f9cc8f..2f9ae2bca4e87cf0ec681350ad6fc119850480b4 100644 --- a/src/main/scala/inox/ast/Extractors.scala +++ b/src/main/scala/inox/ast/Extractors.scala @@ -70,6 +70,10 @@ trait Extractors { self: Trees => Some(Seq(t1, t2), (es: Seq[Expr]) => LessEquals(es(0), es(1))) case GreaterEquals(t1, t2) => Some(Seq(t1, t2), (es: Seq[Expr]) => GreaterEquals(es(0), es(1))) + case BVOr(t1, t2) => + Some(Seq(t1, t2), (es: Seq[Expr]) => BVOr(es(0), es(1))) + case BVAnd(t1, t2) => + Some(Seq(t1, t2), (es: Seq[Expr]) => BVAnd(es(0), es(1))) case BVXOr(t1, t2) => Some(Seq(t1, t2), (es: Seq[Expr]) => BVXOr(es(0), es(1))) case BVShiftLeft(t1, t2) => @@ -102,7 +106,9 @@ trait Extractors { self: Trees => Some(Seq(e1, e2), (es: Seq[Expr]) => BagUnion(es(0), es(1))) case BagDifference(e1, e2) => Some(Seq(e1, e2), (es: Seq[Expr]) => BagDifference(es(0), es(1))) - case mg @ MapApply(t1, t2) => + case MapUpdated(map, k, v) => + Some(Seq(map, k, v), (es: Seq[Expr]) => MapUpdated(es(0), es(1), es(2))) + case MapApply(t1, t2) => Some(Seq(t1, t2), (es: Seq[Expr]) => MapApply(es(0), es(1))) case Let(binder, e, body) => Some(Seq(e, body), (es: Seq[Expr]) => Let(binder, es(0), es(1)))