Skip to content

Commit 822c65c

Browse files
committed
Address feedback from @smarter
1 parent 2bada90 commit 822c65c

File tree

2 files changed

+14
-16
lines changed

2 files changed

+14
-16
lines changed

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {

tests/neg-custom-args/kind-projector.check

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
-- Error: tests/neg-custom-args/kind-projector.scala:6:22 --------------------------------------------------------------
1010
6 |class Bar2 extends Foo[*] // error
1111
| ^
12-
| Type argument X0 has not the same kind as its bound <: [_$1] => Any
12+
| Type argument _$4 has not the same kind as its bound <: [_$1] => Any

0 commit comments

Comments
 (0)