Skip to content

Commit 9c66069

Browse files
committed
Bring back the restriction for requiring value parameters in poly function type definitions
1 parent 0af8397 commit 9c66069

File tree

2 files changed

+13
-36
lines changed

2 files changed

+13
-36
lines changed

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

-2
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

+13-34
Original file line numberDiff line numberDiff line change
@@ -3596,6 +3596,9 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
35963596
}
35973597
}
35983598

3599+
/** Push down the deferred evidence parameters up until the result type is not
3600+
* a method type, poly type or a function type
3601+
*/
35993602
private def pushDownDeferredEvidenceParams(tpe: Type, params: List[untpd.ValDef], span: Span)(using Context): Type = tpe.dealias match {
36003603
case tpe: MethodType =>
36013604
tpe.derivedLambdaType(tpe.paramNames, tpe.paramInfos, pushDownDeferredEvidenceParams(tpe.resultType, params, span))
@@ -3617,46 +3620,22 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
36173620
typed(ctxFunction).tpe
36183621
}
36193622

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

0 commit comments

Comments
 (0)