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