@@ -3596,6 +3596,9 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
3596
3596
}
3597
3597
}
3598
3598
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
+ */
3599
3602
private def pushDownDeferredEvidenceParams (tpe : Type , params : List [untpd.ValDef ], span : Span )(using Context ): Type = tpe.dealias match {
3600
3603
case tpe : MethodType =>
3601
3604
tpe.derivedLambdaType(tpe.paramNames, tpe.paramInfos, pushDownDeferredEvidenceParams(tpe.resultType, params, span))
@@ -3617,46 +3620,22 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
3617
3620
typed(ctxFunction).tpe
3618
3621
}
3619
3622
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
+ */
3651
3633
private def addDeferredEvidenceParams (tree : Tree , pt : Type )(using Context ): (Tree , Type ) = {
3652
3634
tree.getAttachment(desugar.PolyFunctionApply ) match
3653
3635
case Some (params) if params.nonEmpty =>
3654
3636
tree.removeAttachment(desugar.PolyFunctionApply )
3655
3637
val tpe = pushDownDeferredEvidenceParams(tree.tpe, params, tree.span)
3656
3638
TypeTree (tpe).withSpan(tree.span) -> tpe
3657
- // case Some(params) if params.isEmpty =>
3658
- // println(s"tree: $tree")
3659
- // healToPolyFunctionType(tree) -> pt
3660
3639
case _ => tree -> pt
3661
3640
}
3662
3641
0 commit comments