@@ -1327,11 +1327,7 @@ object Parsers {
13271327 else if (ctx.settings.YkindProjector .value) {
13281328 val (newParams :+ newT, tparams) = replaceKindProjectorPlaceholders(params :+ t)
13291329
1330- if (tparams.isEmpty) {
1331- Function (params, t)
1332- } else {
1333- LambdaTypeTree (tparams, Function (newParams, newT))
1334- }
1330+ lambdaAbstract(tparams, Function (newParams, newT))
13351331 } else {
13361332 Function (params, t)
13371333 }
@@ -1424,16 +1420,22 @@ object Parsers {
14241420 }
14251421 }
14261422
1423+ private def makeKindProjectorTypeDef (name : TypeName , span : Option [Span ]): TypeDef = {
1424+ val typeDef = TypeDef (name, TypeBoundsTree (EmptyTree , EmptyTree )).withFlags(Param )
1425+
1426+ span.fold(typeDef)(typeDef.withSpan)
1427+ }
1428+
14271429 /** Replaces kind-projector's `*` in a list of types arguments with synthetic names,
14281430 * returning the new argument list and the synthetic type definitions.
14291431 */
14301432 private def replaceKindProjectorPlaceholders (params : List [Tree ]): (List [Tree ], List [TypeDef ]) = {
14311433 val tparams = new ListBuffer [TypeDef ]
14321434
1433- val newParams = params.map {
1434- case Ident (tpnme.raw.STAR ) =>
1435- val name = tpnme.syntheticTypeParamName(tparams.length)
1436- tparams += TypeDef (name, TypeBoundsTree ( EmptyTree , EmptyTree ) )
1435+ val newParams = params.mapConserve {
1436+ case param @ Ident (tpnme.raw.STAR ) =>
1437+ val name = WildcardParamName .fresh().toTypeName
1438+ tparams += makeKindProjectorTypeDef (name, None )
14371439 Ident (name)
14381440 case other => other
14391441 }
@@ -1594,7 +1596,7 @@ object Parsers {
15941596 args match {
15951597 case List (Function (params, body)) =>
15961598 val typeDefs = params.collect {
1597- case Ident (name) => TypeDef (name.toTypeName, TypeBoundsTree ( EmptyTree , EmptyTree ))
1599+ case param @ Ident (name) => makeKindProjectorTypeDef (name.toTypeName, Some (param.span ))
15981600 }
15991601 if (typeDefs.length != params.length) fail()
16001602 else LambdaTypeTree (typeDefs, body)
@@ -1604,11 +1606,7 @@ object Parsers {
16041606 case _ =>
16051607 val (newArgs, tparams) = replaceKindProjectorPlaceholders(args)
16061608
1607- if (tparams.isEmpty) {
1608- AppliedTypeTree (applied, args)
1609- } else {
1610- LambdaTypeTree (tparams, AppliedTypeTree (applied, newArgs))
1611- }
1609+ lambdaAbstract(tparams, AppliedTypeTree (applied, newArgs))
16121610 }
16131611
16141612 } else {
0 commit comments