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