Skip to content

Commit 341f643

Browse files
KacperFKorbanWojciechMazur
authored andcommitted
Bring back the restriction for requiring value parameters in poly function type definitions
[Cherry-picked 9c66069]
1 parent a679f11 commit 341f643

File tree

2 files changed

+13
-36
lines changed

2 files changed

+13
-36
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,6 @@ object desugar {
514514
case Nil =>
515515
params :: Nil
516516

517-
// TODO(kπ) is this enough? SHould this be a TreeTraverse-thing?
518517
def pushDownEvidenceParams(tree: Tree): Tree = tree match
519518
case Function(params, body) =>
520519
cpy.Function(tree)(params, pushDownEvidenceParams(body))
@@ -527,7 +526,6 @@ object desugar {
527526
makeContextualFunction(paramTpts, paramNames, tree, paramsErased).withSpan(tree.span)
528527

529528
if meth.hasAttachment(PolyFunctionApply) then
530-
// meth.removeAttachment(PolyFunctionApply)
531529
if ctx.mode.is(Mode.Type) then
532530
cpy.DefDef(meth)(tpt = meth.tpt.withAttachment(PolyFunctionApply, params))
533531
else

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3593,6 +3593,9 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
35933593
}
35943594
}
35953595

3596+
/** Push down the deferred evidence parameters up until the result type is not
3597+
* a method type, poly type or a function type
3598+
*/
35963599
private def pushDownDeferredEvidenceParams(tpe: Type, params: List[untpd.ValDef], span: Span)(using Context): Type = tpe.dealias match {
35973600
case tpe: MethodType =>
35983601
tpe.derivedLambdaType(tpe.paramNames, tpe.paramInfos, pushDownDeferredEvidenceParams(tpe.resultType, params, span))
@@ -3614,46 +3617,22 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
36143617
typed(ctxFunction).tpe
36153618
}
36163619

3617-
private def extractTopMethodTermParams(tpe: Type)(using Context): (List[TermName], List[Type]) = tpe match {
3618-
case tpe: MethodType =>
3619-
tpe.paramNames -> tpe.paramInfos
3620-
case tpe: RefinedType if defn.isFunctionType(tpe.parent) =>
3621-
extractTopMethodTermParams(tpe.refinedInfo)
3622-
case _ =>
3623-
Nil -> Nil
3624-
}
3625-
3626-
private def removeTopMethodTermParams(tpe: Type)(using Context): Type = tpe match {
3627-
case tpe: MethodType =>
3628-
tpe.resultType
3629-
case tpe: RefinedType if defn.isFunctionType(tpe.parent) =>
3630-
tpe.derivedRefinedType(tpe.parent, tpe.refinedName, removeTopMethodTermParams(tpe.refinedInfo))
3631-
case tpe: AppliedType if defn.isFunctionType(tpe) =>
3632-
tpe.args.last
3633-
case _ =>
3634-
tpe
3635-
}
3636-
3637-
private def healToPolyFunctionType(tree: Tree)(using Context): Tree = tree match {
3638-
case defdef: DefDef if defdef.name == nme.apply && defdef.paramss.forall(_.forall(_.symbol.flags.is(TypeParam))) && defdef.paramss.size == 1 =>
3639-
val (names, types) = extractTopMethodTermParams(defdef.tpt.tpe)
3640-
val newTpe = removeTopMethodTermParams(defdef.tpt.tpe)
3641-
val newParams = names.lazyZip(types).map((name, tpe) => SyntheticValDef(name, TypeTree(tpe), flags = SyntheticTermParam))
3642-
val newDefDef = cpy.DefDef(defdef)(paramss = defdef.paramss ++ List(newParams), tpt = untpd.TypeTree(newTpe))
3643-
val nestedCtx = ctx.fresh.setNewTyperState()
3644-
typed(newDefDef)(using nestedCtx)
3645-
case _ => tree
3646-
}
3647-
3620+
/** If the tree has a `PolyFunctionApply` attachment, add the deferred
3621+
* evidence parameters as the last argument list before the result type. This
3622+
* follows aliases, so the following two types will be expanded to (up to the
3623+
* context bound encoding):
3624+
* type CmpWeak[X] = X => Boolean
3625+
* type Comparer2Weak = [X: Ord] => X => CmpWeak[X]
3626+
* ===>
3627+
* type CmpWeak[X] = X => Boolean type Comparer2Weak = [X] => X => X ?=>
3628+
* Ord[X] => Boolean
3629+
*/
36483630
private def addDeferredEvidenceParams(tree: Tree, pt: Type)(using Context): (Tree, Type) = {
36493631
tree.getAttachment(desugar.PolyFunctionApply) match
36503632
case Some(params) if params.nonEmpty =>
36513633
tree.removeAttachment(desugar.PolyFunctionApply)
36523634
val tpe = pushDownDeferredEvidenceParams(tree.tpe, params, tree.span)
36533635
TypeTree(tpe).withSpan(tree.span) -> tpe
3654-
// case Some(params) if params.isEmpty =>
3655-
// println(s"tree: $tree")
3656-
// healToPolyFunctionType(tree) -> pt
36573636
case _ => tree -> pt
36583637
}
36593638

0 commit comments

Comments
 (0)