@@ -16,17 +16,17 @@ object Mono extends Phase[CoreTransformed, CoreTransformed] {
16
16
case ModuleDecl (path, includes, declarations, externs, definitions, exports) => {
17
17
// Find constraints in the definitions
18
18
val monoFindContext = MonoFindContext ()
19
- val constraints = findConstraints(definitions)(using monoFindContext)
20
- val declConstraints = declarations map (findConstraints(_)(using monoFindContext))
21
- // println("Constraints")
22
- // constraints.foreach(c => println(c))
23
- // println()
19
+ var constraints = findConstraints(definitions)(using monoFindContext)
20
+ constraints = constraints ++ declarations.flatMap (findConstraints(_)(using monoFindContext))
21
+ println(" Constraints" )
22
+ constraints.foreach(c => println(c))
23
+ println()
24
24
25
25
// Solve collected constraints
26
26
val solution = solveConstraints(constraints)
27
- // println("Solved")
28
- // solution.foreach(println)
29
- // println()
27
+ println(" Solved" )
28
+ solution.foreach(println)
29
+ println()
30
30
31
31
// Monomorphize existing definitions
32
32
var monoNames : MonoNames = Map .empty
@@ -39,9 +39,9 @@ object Mono extends Phase[CoreTransformed, CoreTransformed] {
39
39
var monoContext = MonoContext (solution, monoNames)
40
40
val monoDecls = declarations flatMap (monomorphize(_)(using monoContext))
41
41
val monoDefs = monomorphize(definitions)(using monoContext)
42
- // println(util.show(monoDecls ))
43
- // println()
44
- // println(util.show(monoDefs ))
42
+ monoDecls.foreach(decl => println(util.show(decl) ))
43
+ println()
44
+ monoDefs.foreach(defn => println(util.show(defn) ))
45
45
val newModuleDecl = ModuleDecl (path, includes, monoDecls, externs, monoDefs, exports)
46
46
return Some (CoreTransformed (source, tree, mod, newModuleDecl))
47
47
}
@@ -60,7 +60,7 @@ type Solution = Map[FunctionId, Set[Vector[TypeArg.Base]]]
60
60
type MonoNames = Map [(FunctionId , Vector [TypeArg .Base ]), FunctionId ]
61
61
62
62
enum TypeArg {
63
- case Base (val tpe : Id )
63
+ case Base (val tpe : Id , targs : List [ TypeArg ] )
64
64
case Var (funId : FunctionId , pos : Int )
65
65
}
66
66
@@ -89,14 +89,19 @@ def findConstraints(definition: Toplevel)(using ctx: MonoFindContext): Constrain
89
89
case Toplevel .Val (id, tpe, binding) => ???
90
90
91
91
def findConstraints (declaration : Declaration )(using ctx : MonoFindContext ): Constraints = declaration match
92
- case Data (id, List (), constructors) => List .empty
92
+ // Maybe[T] { Just[](x: T) }
93
93
case Data (id, tparams, constructors) =>
94
94
tparams.zipWithIndex.foreach(ctx.extendTypingContext(_, _, id))
95
- constructors.map((constr =>
96
- Constraint (((constr.fields map (_.tpe)) map findId).toVector, constr.id)))
95
+ constructors.map{ constr =>
96
+ val arity = tparams.size // + constr.tparams.size
97
+ val constructorArgs = (0 until arity).map(index =>
98
+ TypeArg .Var (constr.id, index) // Just.0
99
+ ).toVector // < Just.0 >
100
+ Constraint (constructorArgs, id) // < Just.0 > <: Maybe
101
+ }
97
102
case Interface (id, List (), properties) => List .empty
98
103
case Interface (id, tparams, properties) =>
99
- tparams.zipWithIndex.foreach(ctx.extendTypingContext(_, _, id))
104
+ // tparams.zipWithIndex.foreach(ctx.extendTypingContext(_, _, id))
100
105
List .empty
101
106
102
107
def findConstraints (block : Block )(using ctx : MonoFindContext ): Constraints = block match
@@ -147,12 +152,13 @@ def findConstraints(expr: Expr)(using ctx: MonoFindContext): Constraints = expr
147
152
case PureApp (b, List (), vargs) => List .empty
148
153
case ValueVar (id, annotatedType) => List .empty
149
154
case Literal (value, annotatedType) => List .empty
150
- case Make (data, tag, targs, vargs) => List (Constraint (data.targs.map(findId).toVector, data.name))
155
+ case Make (data, tag, targs, vargs) =>
156
+ List (Constraint (data.targs.map(findId).toVector, tag)) // <Int> <: Just
151
157
case o => println(o); ???
152
158
153
159
def findId (vt : ValueType )(using ctx : MonoFindContext ): TypeArg = vt match
154
160
case ValueType .Boxed (tpe, capt) => ???
155
- case ValueType .Data (name, targs) => TypeArg .Base (name)
161
+ case ValueType .Data (name, targs) => TypeArg .Base (name, targs map findId )
156
162
case ValueType .Var (name) => ctx.typingContext(name)
157
163
158
164
def solveConstraints (constraints : Constraints ): Solution =
0 commit comments