refactor: make microWacc.ArrayElem recursive rather than flat
This commit is contained in:
parent
62df2c2244
commit
85190ce174
@ -1,7 +1,5 @@
|
|||||||
package wacc
|
package wacc
|
||||||
|
|
||||||
import cats.data.NonEmptyList
|
|
||||||
|
|
||||||
object microWacc {
|
object microWacc {
|
||||||
import wacc.types._
|
import wacc.types._
|
||||||
|
|
||||||
@ -19,9 +17,7 @@ object microWacc {
|
|||||||
extends Expr(identTy)
|
extends Expr(identTy)
|
||||||
with CallTarget(identTy)
|
with CallTarget(identTy)
|
||||||
with LValue
|
with LValue
|
||||||
case class ArrayElem(value: LValue, indices: NonEmptyList[Expr])(ty: SemType)
|
case class ArrayElem(value: LValue, index: Expr)(ty: SemType) extends Expr(ty) with LValue
|
||||||
extends Expr(ty)
|
|
||||||
with LValue
|
|
||||||
|
|
||||||
// Operators
|
// Operators
|
||||||
case class UnaryOp(x: Expr, op: UnaryOperator)(ty: SemType) extends Expr(ty)
|
case class UnaryOp(x: Expr, op: UnaryOperator)(ty: SemType) extends Expr(ty)
|
||||||
|
@ -422,10 +422,15 @@ object typeChecker {
|
|||||||
}
|
}
|
||||||
(next, idxTyped)
|
(next, idxTyped)
|
||||||
}
|
}
|
||||||
microWacc.ArrayElem(
|
val firstArrayElem = microWacc.ArrayElem(
|
||||||
microWacc.Ident(id.v, id.uid)(arrayTy),
|
microWacc.Ident(id.v, id.uid)(arrayTy),
|
||||||
indicesTyped
|
indicesTyped.head
|
||||||
)(elemTy.satisfies(constraint, value.pos))
|
)(elemTy.satisfies(constraint, value.pos))
|
||||||
|
val arrayElem = indicesTyped.tail.foldLeft(firstArrayElem) { (acc, idx) =>
|
||||||
|
microWacc.ArrayElem(acc, idx)(KnownType.Array(acc.ty))
|
||||||
|
}
|
||||||
|
// Need to type-check the final arrayElem with the constraint
|
||||||
|
microWacc.ArrayElem(arrayElem.value, arrayElem.index)(elemTy.satisfies(constraint, value.pos))
|
||||||
case ast.Fst(elem) =>
|
case ast.Fst(elem) =>
|
||||||
val elemTyped = checkLValue(
|
val elemTyped = checkLValue(
|
||||||
elem,
|
elem,
|
||||||
@ -433,7 +438,7 @@ object typeChecker {
|
|||||||
)
|
)
|
||||||
microWacc.ArrayElem(
|
microWacc.ArrayElem(
|
||||||
elemTyped,
|
elemTyped,
|
||||||
NonEmptyList.of(microWacc.IntLiter(0))
|
microWacc.IntLiter(0)
|
||||||
)(elemTyped.ty match {
|
)(elemTyped.ty match {
|
||||||
case KnownType.Pair(left, _) =>
|
case KnownType.Pair(left, _) =>
|
||||||
left.satisfies(constraint, elem.pos)
|
left.satisfies(constraint, elem.pos)
|
||||||
@ -446,7 +451,7 @@ object typeChecker {
|
|||||||
)
|
)
|
||||||
microWacc.ArrayElem(
|
microWacc.ArrayElem(
|
||||||
elemTyped,
|
elemTyped,
|
||||||
NonEmptyList.of(microWacc.IntLiter(1))
|
microWacc.IntLiter(1)
|
||||||
)(elemTyped.ty match {
|
)(elemTyped.ty match {
|
||||||
case KnownType.Pair(_, right) =>
|
case KnownType.Pair(_, right) =>
|
||||||
right.satisfies(constraint, elem.pos)
|
right.satisfies(constraint, elem.pos)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user