Skip to content

Commit 7604540

Browse files
committed
Better array initialization in inbetween and newScala
1 parent c9dfe66 commit 7604540

2 files changed

Lines changed: 133 additions & 30 deletions

File tree

  • language
    • inbetween/src/main/scala/org/combinators/ep/language/inbetween/ffi
    • newScala/src/main/scala/org/combinators/ep/language/scala/ast/ffi

language/inbetween/src/main/scala/org/combinators/ep/language/inbetween/ffi/ArraysAST.scala

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,39 @@ trait ArraysAST extends OperatorExpressionOpsAST with ParametricPolymorphismAST
77
trait FinalTypes {
88
type Array <: arraysOps.Array
99
type CreateArrayExpression <: arraysOps.CreateArray
10+
type CreateArrayFromExpression <: arraysOps.CreateArrayFromExpression
11+
type CreateArrayWithDefaultValues <: arraysOps.CreateArrayWithDefaultValues
12+
type CreateArrayFromValues <: arraysOps.CreateArrayFromValues
1013
}
1114

1215
trait Array extends any.Type {
1316
def getSelfArrayType: arraysOpsFinalTypes.Array
1417
}
1518

1619
trait CreateArray extends any.Expression {
17-
def getSelfCreateArrayExpression: arraysOpsFinalTypes.Array
20+
def getSelfCreateArrayExpression: arraysOpsFinalTypes.CreateArrayExpression
21+
}
1822

19-
def elementType: any.Type
20-
def dimension: any.Expression
21-
def initialization: Either[any.Expression, Seq[any.Expression]]
23+
trait CreateArrayFromExpression extends CreateArray {
24+
def getSelfCreateArrayFromExpression: arraysOpsFinalTypes.CreateArrayFromExpression
25+
def expression: any.Expression
26+
def copy(expression: any.Expression = this.expression): CreateArrayFromExpression =
27+
arraysOpsFactory.createArrayFromExpression(expression)
28+
}
2229

23-
def copy(elementType: any.Type, dimension: any.Expression, initialization: Either[any.Expression, Seq[any.Expression]]) =
24-
arraysOpsFactory.createArray(elementType, dimension, initialization)
30+
trait CreateArrayWithDefaultValues extends CreateArray {
31+
def getSelfCreateArrayWithDefaultValues: arraysOpsFinalTypes.CreateArrayWithDefaultValues
32+
def tpe: any.Type
33+
def dimensions: Seq[any.Expression]
34+
def copy(tpe: any.Type = this.tpe, dimensions: Seq[any.Expression] = this.dimensions): CreateArrayWithDefaultValues =
35+
arraysOpsFactory.createArrayWithDefaultValues(tpe, dimensions)
36+
}
37+
38+
trait CreateArrayFromValues extends CreateArray {
39+
def getSelfCreateArrayFromValues: arraysOpsFinalTypes.CreateArrayFromValues
40+
def values: Seq[any.Expression]
41+
def copy(values: Seq[any.Expression] = this.values): CreateArrayFromValues =
42+
arraysOpsFactory.createArrayFromValues(values)
2543
}
2644

2745
trait GetArrayOp extends operatorExpressions.Operator
@@ -38,36 +56,30 @@ trait ArraysAST extends OperatorExpressionOpsAST with ParametricPolymorphismAST
3856
polymorphismFactory.typeApplication(array(), Seq(elementType))
3957
}
4058

41-
def createArray(elementType: any.Type, dimension: any.Expression, initialization: Either[any.Expression, Seq[any.Expression]]): CreateArray
59+
def createArrayFromExpression(expression: any.Expression): CreateArrayFromExpression
60+
61+
def createArrayWithDefaultValues(tpe: any.Type, dimensions: Seq[any.Expression]): CreateArrayWithDefaultValues
62+
63+
def createArrayFromValues(values: Seq[any.Expression]): CreateArrayFromValues
4264

4365
def createArray(tpe: any.Type, dimensions: Seq[any.Expression], contentSpec: Option[(Seq[Int], Seq[any.Expression])]): any.Expression = {
4466
contentSpec match {
4567
case Some((dims, values)) =>
4668
val initializers = dimensions.zip(dims).reverse.tail.foldLeft[(any.Type, Seq[any.Expression])]({
4769
val arrayTpe = array(tpe)
4870
val arrayExpr = values.grouped(dims.last).toSeq.map(subSeq =>
49-
arraysOpsFactory.createArray(tpe, dimensions.last, Right(subSeq)))
71+
arraysOpsFactory.createArrayFromValues(subSeq))
5072
(arrayTpe, arrayExpr)
5173
}) { case ((arrayTpe, inits), (dimension, dim)) =>
5274
val outerArrayTpe = arraysOpsFactory.array(arrayTpe)
53-
val outerArrayExpr = inits.grouped(dim).toSeq.map(subSeq =>
54-
arraysOpsFactory.createArray(arrayTpe, dimension, Right(subSeq)))
75+
val outerArrayExpr = inits.grouped(dim).toSeq.map(subSeq =>
76+
arraysOpsFactory.createArrayFromValues(subSeq))
5577
(outerArrayTpe, outerArrayExpr)
5678
}
5779

5880
initializers._2.head
5981

60-
case None =>
61-
val (_, arrayExpr) = dimensions.reverse.tail.foldLeft[(any.Type, arraysOps.CreateArray)]({
62-
val arrayTpe = arraysOpsFactory.array(tpe)
63-
val arrayExpr = arraysOpsFactory.createArray(tpe, dimensions.last, Left(null)) // TODO: null needs to be a default expression of type tpe
64-
(arrayTpe, arrayExpr)
65-
}) { case ((arrayTpe, innerInitializer), dimension) =>
66-
val outerArrayTpe = arraysOpsFactory.array(arrayTpe)
67-
val outerArrayExpr = arraysOpsFactory.createArray(arrayTpe, dimension, Left(innerInitializer))
68-
(outerArrayTpe, outerArrayExpr)
69-
}
70-
arrayExpr
82+
case None => createArrayWithDefaultValues(tpe, dimensions)
7183
}
7284
}
7385

@@ -81,6 +93,11 @@ trait ArraysAST extends OperatorExpressionOpsAST with ParametricPolymorphismAST
8193
operatorExpressionsFactory.ternaryExpression(getArrayOp(), ar, idx, value)
8294
def lengthArrayOp(ar: any.Expression): operatorExpressions.UnaryExpression =
8395
operatorExpressionsFactory.unaryExpression(lengthArrayOp(), ar)
96+
97+
implicit def convert(other: CreateArray): arraysOpsFinalTypes.CreateArrayExpression = other.getSelfCreateArrayExpression
98+
implicit def convert(other: CreateArrayFromExpression): arraysOpsFinalTypes.CreateArrayFromExpression = other.getSelfCreateArrayFromExpression
99+
implicit def convert(other: CreateArrayFromValues): arraysOpsFinalTypes.CreateArrayFromValues = other.getSelfCreateArrayFromValues
100+
implicit def convert(other: CreateArrayWithDefaultValues): arraysOpsFinalTypes.CreateArrayWithDefaultValues = other.getSelfCreateArrayWithDefaultValues
84101
}
85102
}
86103

language/newScala/src/main/scala/org/combinators/ep/language/scala/ast/ffi/ArraysAST.scala

Lines changed: 95 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,57 @@ trait ArraysAST extends InbetweenArraysAST {
77
self: OperatorExpressionsAST & BaseAST =>
88
object scalaArraysOps {
99
object arraysOpsOverride {
10+
trait FinalTypes extends arraysOps.FinalTypes {
11+
type Array <: arraysOpsOverride.Array
12+
type CreateArrayExpression <: arraysOpsOverride.CreateArray
13+
type CreateArrayFromExpression <: arraysOpsOverride.CreateArrayFromExpression
14+
type CreateArrayWithDefaultValues <: arraysOpsOverride.CreateArrayWithDefaultValues
15+
type CreateArrayFromValues <: arraysOpsOverride.CreateArrayFromValues
16+
}
1017

11-
trait CreateArray extends arraysOps.CreateArray with scalaBase.anyOverrides.Type {
18+
trait Array extends arraysOps.Array with scalaBase.anyOverrides.Type {
1219
override def toScala: String = "Array"
13-
14-
override def prefixRootPackage(rootPackageName: Seq[any.Name], excludedTypeNames: Set[Seq[any.Name]]): CreateArray =
20+
override def prefixRootPackage(rootPackageName: Seq[any.Name], excludedTypeNames: Set[Seq[any.Name]]): Array =
1521
this
22+
override def toImport: Seq[any.Import] = Seq.empty
23+
}
24+
25+
trait CreateArray extends arraysOps.CreateArray with scalaBase.anyOverrides.Expression {
26+
override def prefixRootPackage(rootPackageName: Seq[any.Name], excludedTypeNames: Set[Seq[any.Name]]): CreateArray
27+
}
28+
29+
trait CreateArrayFromExpression extends arraysOps.CreateArrayFromExpression with CreateArray {
30+
import factory._
31+
import arraysOpsFactory._
32+
override def toScala: String = expression.toScala
1633

17-
def toImport: Seq[any.Import] = Seq.empty
34+
override def prefixRootPackage(rootPackageName: Seq[any.Name], excludedTypeNames: Set[Seq[any.Name]]): CreateArrayFromExpression =
35+
arraysOpsFactory.convert(copy(expression = expression.prefixRootPackage(rootPackageName, excludedTypeNames)))
36+
37+
override def toImport: Seq[any.Import] = Seq.empty
1838
}
39+
40+
trait CreateArrayWithDefaultValues extends arraysOps.CreateArrayWithDefaultValues with CreateArray {
41+
import factory._
42+
import arraysOpsFactory.convert
43+
override def toScala: String = s"Array.ofDim[${tpe.toScala}](${dimensions.map(_.toScala).mkString(", ")})"
44+
override def prefixRootPackage(rootPackageName: scala.Seq[ArraysAST.this.any.Name], excludedTypeNames: _root_.scala.Predef.Set[scala.Seq[ArraysAST.this.any.Name]]): CreateArrayWithDefaultValues =
45+
copy(
46+
tpe = tpe.prefixRootPackage(rootPackageName, excludedTypeNames),
47+
dimensions = dimensions.map(_.prefixRootPackage(rootPackageName, excludedTypeNames))
48+
)
49+
}
50+
51+
trait CreateArrayFromValues extends arraysOps.CreateArrayFromValues with CreateArray {
52+
import factory._
53+
import arraysOpsFactory.convert
54+
55+
override def toScala: String = s"Array(${values.map(_.toScala).mkString(", ")})"
56+
override def prefixRootPackage(rootPackageName: scala.Seq[ArraysAST.this.any.Name], excludedTypeNames: _root_.scala.Predef.Set[scala.Seq[ArraysAST.this.any.Name]]): CreateArrayFromValues =
57+
copy(
58+
values = values.map(_.prefixRootPackage(rootPackageName, excludedTypeNames))
59+
)
60+
}
1961

2062
trait GetArrayOp extends arraysOps.GetArrayOp with scalaOperatorExpressions.operatorExpressionsOverrides.Operator with scalaOperatorExpressions.PostfixOperator {
2163
def operator: String = ".apply"
@@ -45,17 +87,61 @@ trait ArraysAST extends InbetweenArraysAST {
4587
}
4688
}
4789

48-
val arraysOpsFactory: scalaArraysOps.arraysOpsOverride.Factory
90+
override val arraysOpsFinalTypes: scalaArraysOps.arraysOpsOverride.FinalTypes
91+
override val arraysOpsFactory: scalaArraysOps.arraysOpsOverride.Factory
4992
}
5093

5194
trait FinalArraysAST extends ArraysAST { self: FinalOperatorExpressionsAST & FinalBaseAST =>
95+
object finalArraysFinalTypes {
96+
trait ArraysFinalTypes extends scalaArraysOps.arraysOpsOverride.FinalTypes {
97+
type Array = scalaArraysOps.arraysOpsOverride.Array
98+
type CreateArrayExpression = scalaArraysOps.arraysOpsOverride.CreateArray
99+
type CreateArrayFromExpression = scalaArraysOps.arraysOpsOverride.CreateArrayFromExpression
100+
type CreateArrayWithDefaultValues = scalaArraysOps.arraysOpsOverride.CreateArrayWithDefaultValues
101+
type CreateArrayFromValues = scalaArraysOps.arraysOpsOverride.CreateArrayFromValues
102+
}
103+
}
104+
override val arraysOpsFinalTypes: finalArraysFinalTypes.ArraysFinalTypes = new finalArraysFinalTypes.ArraysFinalTypes {}
105+
52106
object finalArraysFactoryTypes {
53107
trait FinalArraysFactory extends scalaArraysOps.arraysOpsOverride.Factory {
54-
def createArray(dimension:any.Expression): arraysOps.CreateArray = {
55-
case class CreateArray(dimension:any.Expression) extends scalaArraysOps.arraysOpsOverride.CreateArray {
56-
def getSelfType: scalaBase.anyOverrides.Type = this
108+
def array(): arraysOps.Array = {
109+
case class Array()
110+
extends scalaArraysOps.arraysOpsOverride.Array {
111+
override def getSelfArrayType: scalaArraysOps.arraysOpsOverride.Array = this
112+
override def getSelfType: scalaBase.anyOverrides.Type = this
113+
}
114+
Array()
115+
}
116+
117+
def createArrayFromExpression(expression: any.Expression): scalaArraysOps.arraysOpsOverride.CreateArrayFromExpression = {
118+
case class CreateArrayFromExpression(val expression: any.Expression)
119+
extends scalaArraysOps.arraysOpsOverride.CreateArrayFromExpression
120+
with finalBaseAST.anyOverrides.FinalExpression {
121+
override def getSelfCreateArrayExpression: arraysOpsFinalTypes.CreateArrayExpression = this
122+
override def getSelfCreateArrayFromExpression: arraysOpsFinalTypes.CreateArrayFromExpression = this
123+
}
124+
CreateArrayFromExpression(expression)
125+
}
126+
127+
def createArrayWithDefaultValues(tpe: any.Type, dimensions: Seq[any.Expression]): scalaArraysOps.arraysOpsOverride.CreateArrayWithDefaultValues = {
128+
case class CreateArrayWithDefaultValues(tpe: any.Type, dimensions: Seq[any.Expression])
129+
extends scalaArraysOps.arraysOpsOverride.CreateArrayWithDefaultValues
130+
with finalBaseAST.anyOverrides.FinalExpression {
131+
override def getSelfCreateArrayExpression: arraysOpsFinalTypes.CreateArrayExpression = this
132+
override def getSelfCreateArrayWithDefaultValues: arraysOpsFinalTypes.CreateArrayWithDefaultValues = this
133+
}
134+
CreateArrayWithDefaultValues(tpe, dimensions)
135+
}
136+
137+
def createArrayFromValues(values: Seq[any.Expression]): scalaArraysOps.arraysOpsOverride.CreateArrayFromValues = {
138+
case class CreateArrayFromValues(values: Seq[any.Expression])
139+
extends scalaArraysOps.arraysOpsOverride.CreateArrayFromValues
140+
with finalBaseAST.anyOverrides.FinalExpression {
141+
override def getSelfCreateArrayExpression: arraysOpsFinalTypes.CreateArrayExpression = this
142+
override def getSelfCreateArrayFromValues: arraysOpsFinalTypes.CreateArrayFromValues = this
57143
}
58-
CreateArray(dimension)
144+
CreateArrayFromValues(values)
59145
}
60146

61147
def getArrayOp(): arraysOps.GetArrayOp = {

0 commit comments

Comments
 (0)