@@ -3588,6 +3588,9 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
3588
3588
}
3589
3589
}
3590
3590
3591
+ /** Push down the deferred evidence parameters up until the result type is not
3592
+ * a method type, poly type or a function type
3593
+ */
3591
3594
private def pushDownDeferredEvidenceParams (tpe : Type , params : List [untpd.ValDef ], span : Span )(using Context ): Type = tpe.dealias match {
3592
3595
case tpe : MethodType =>
3593
3596
tpe.derivedLambdaType(tpe.paramNames, tpe.paramInfos, pushDownDeferredEvidenceParams(tpe.resultType, params, span))
@@ -3609,46 +3612,22 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
3609
3612
typed(ctxFunction).tpe
3610
3613
}
3611
3614
3612
- private def extractTopMethodTermParams (tpe : Type )(using Context ): (List [TermName ], List [Type ]) = tpe match {
3613
- case tpe : MethodType =>
3614
- tpe.paramNames -> tpe.paramInfos
3615
- case tpe : RefinedType if defn.isFunctionType(tpe.parent) =>
3616
- extractTopMethodTermParams(tpe.refinedInfo)
3617
- case _ =>
3618
- Nil -> Nil
3619
- }
3620
-
3621
- private def removeTopMethodTermParams (tpe : Type )(using Context ): Type = tpe match {
3622
- case tpe : MethodType =>
3623
- tpe.resultType
3624
- case tpe : RefinedType if defn.isFunctionType(tpe.parent) =>
3625
- tpe.derivedRefinedType(tpe.parent, tpe.refinedName, removeTopMethodTermParams(tpe.refinedInfo))
3626
- case tpe : AppliedType if defn.isFunctionType(tpe) =>
3627
- tpe.args.last
3628
- case _ =>
3629
- tpe
3630
- }
3631
-
3632
- private def healToPolyFunctionType (tree : Tree )(using Context ): Tree = tree match {
3633
- case defdef : DefDef if defdef.name == nme.apply && defdef.paramss.forall(_.forall(_.symbol.flags.is(TypeParam ))) && defdef.paramss.size == 1 =>
3634
- val (names, types) = extractTopMethodTermParams(defdef.tpt.tpe)
3635
- val newTpe = removeTopMethodTermParams(defdef.tpt.tpe)
3636
- val newParams = names.lazyZip(types).map((name, tpe) => SyntheticValDef (name, TypeTree (tpe), flags = SyntheticTermParam ))
3637
- val newDefDef = cpy.DefDef (defdef)(paramss = defdef.paramss ++ List (newParams), tpt = untpd.TypeTree (newTpe))
3638
- val nestedCtx = ctx.fresh.setNewTyperState()
3639
- typed(newDefDef)(using nestedCtx)
3640
- case _ => tree
3641
- }
3642
-
3615
+ /** If the tree has a `PolyFunctionApply` attachment, add the deferred
3616
+ * evidence parameters as the last argument list before the result type. This
3617
+ * follows aliases, so the following two types will be expanded to (up to the
3618
+ * context bound encoding):
3619
+ * type CmpWeak[X] = X => Boolean
3620
+ * type Comparer2Weak = [X: Ord] => X => CmpWeak[X]
3621
+ * ===>
3622
+ * type CmpWeak[X] = X => Boolean type Comparer2Weak = [X] => X => X ?=>
3623
+ * Ord[X] => Boolean
3624
+ */
3643
3625
private def addDeferredEvidenceParams (tree : Tree , pt : Type )(using Context ): (Tree , Type ) = {
3644
3626
tree.getAttachment(desugar.PolyFunctionApply ) match
3645
3627
case Some (params) if params.nonEmpty =>
3646
3628
tree.removeAttachment(desugar.PolyFunctionApply )
3647
3629
val tpe = pushDownDeferredEvidenceParams(tree.tpe, params, tree.span)
3648
3630
TypeTree (tpe).withSpan(tree.span) -> tpe
3649
- // case Some(params) if params.isEmpty =>
3650
- // println(s"tree: $tree")
3651
- // healToPolyFunctionType(tree) -> pt
3652
3631
case _ => tree -> pt
3653
3632
}
3654
3633
0 commit comments