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