Skip to content

Commit a4439d5

Browse files
committed
wip fix interface implementations
1 parent 094193d commit a4439d5

File tree

2 files changed

+25
-18
lines changed

2 files changed

+25
-18
lines changed

effekt/shared/src/main/scala/effekt/core/Mono.scala

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ object Mono extends Phase[CoreTransformed, CoreTransformed] {
1616
case ModuleDecl(path, includes, declarations, externs, definitions, exports) => {
1717
// Find constraints in the definitions
1818
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()
2424

2525
// Solve collected constraints
2626
val solution = solveConstraints(constraints)
27-
// println("Solved")
28-
// solution.foreach(println)
29-
// println()
27+
println("Solved")
28+
solution.foreach(println)
29+
println()
3030

3131
// Monomorphize existing definitions
3232
var monoNames: MonoNames = Map.empty
@@ -39,9 +39,9 @@ object Mono extends Phase[CoreTransformed, CoreTransformed] {
3939
var monoContext = MonoContext(solution, monoNames)
4040
val monoDecls = declarations flatMap (monomorphize(_)(using monoContext))
4141
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)))
4545
val newModuleDecl = ModuleDecl(path, includes, monoDecls, externs, monoDefs, exports)
4646
return Some(CoreTransformed(source, tree, mod, newModuleDecl))
4747
}
@@ -60,7 +60,7 @@ type Solution = Map[FunctionId, Set[Vector[TypeArg.Base]]]
6060
type MonoNames = Map[(FunctionId, Vector[TypeArg.Base]), FunctionId]
6161

6262
enum TypeArg {
63-
case Base(val tpe: Id)
63+
case Base(val tpe: Id, targs: List[TypeArg])
6464
case Var(funId: FunctionId, pos: Int)
6565
}
6666

@@ -89,14 +89,19 @@ def findConstraints(definition: Toplevel)(using ctx: MonoFindContext): Constrain
8989
case Toplevel.Val(id, tpe, binding) => ???
9090

9191
def findConstraints(declaration: Declaration)(using ctx: MonoFindContext): Constraints = declaration match
92-
case Data(id, List(), constructors) => List.empty
92+
// Maybe[T] { Just[](x: T) }
9393
case Data(id, tparams, constructors) =>
9494
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+
}
97102
case Interface(id, List(), properties) => List.empty
98103
case Interface(id, tparams, properties) =>
99-
tparams.zipWithIndex.foreach(ctx.extendTypingContext(_, _, id))
104+
// tparams.zipWithIndex.foreach(ctx.extendTypingContext(_, _, id))
100105
List.empty
101106

102107
def findConstraints(block: Block)(using ctx: MonoFindContext): Constraints = block match
@@ -147,12 +152,13 @@ def findConstraints(expr: Expr)(using ctx: MonoFindContext): Constraints = expr
147152
case PureApp(b, List(), vargs) => List.empty
148153
case ValueVar(id, annotatedType) => List.empty
149154
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
151157
case o => println(o); ???
152158

153159
def findId(vt: ValueType)(using ctx: MonoFindContext): TypeArg = vt match
154160
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)
156162
case ValueType.Var(name) => ctx.typingContext(name)
157163

158164
def solveConstraints(constraints: Constraints): Solution =

effekt/shared/src/main/scala/effekt/core/Transformer.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ object Transformer extends Phase[Typechecked, CoreTransformed] {
143143
}
144144
}.toList ++ exports.namespaces.values.flatMap(transform)
145145

146+
// Add tparams separately
146147
def transform(c: symbols.Constructor)(using Context): core.Constructor =
147148
core.Constructor(c, c.tparams, c.fields.map(f => core.Field(f, transform(f.returnType))))
148149

0 commit comments

Comments
 (0)