@@ -1327,11 +1327,7 @@ object Parsers {
1327
1327
else if (ctx.settings.YkindProjector .value) {
1328
1328
val (newParams :+ newT, tparams) = replaceKindProjectorPlaceholders(params :+ t)
1329
1329
1330
- if (tparams.isEmpty) {
1331
- Function (params, t)
1332
- } else {
1333
- LambdaTypeTree (tparams, Function (newParams, newT))
1334
- }
1330
+ lambdaAbstract(tparams, Function (newParams, newT))
1335
1331
} else {
1336
1332
Function (params, t)
1337
1333
}
@@ -1424,16 +1420,22 @@ object Parsers {
1424
1420
}
1425
1421
}
1426
1422
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
+
1427
1429
/** Replaces kind-projector's `*` in a list of types arguments with synthetic names,
1428
1430
* returning the new argument list and the synthetic type definitions.
1429
1431
*/
1430
1432
private def replaceKindProjectorPlaceholders (params : List [Tree ]): (List [Tree ], List [TypeDef ]) = {
1431
1433
val tparams = new ListBuffer [TypeDef ]
1432
1434
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 )
1437
1439
Ident (name)
1438
1440
case other => other
1439
1441
}
@@ -1594,7 +1596,7 @@ object Parsers {
1594
1596
args match {
1595
1597
case List (Function (params, body)) =>
1596
1598
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 ))
1598
1600
}
1599
1601
if (typeDefs.length != params.length) fail()
1600
1602
else LambdaTypeTree (typeDefs, body)
@@ -1604,11 +1606,7 @@ object Parsers {
1604
1606
case _ =>
1605
1607
val (newArgs, tparams) = replaceKindProjectorPlaceholders(args)
1606
1608
1607
- if (tparams.isEmpty) {
1608
- AppliedTypeTree (applied, args)
1609
- } else {
1610
- LambdaTypeTree (tparams, AppliedTypeTree (applied, newArgs))
1611
- }
1609
+ lambdaAbstract(tparams, AppliedTypeTree (applied, newArgs))
1612
1610
}
1613
1611
1614
1612
} else {
0 commit comments