Skip to content

Commit 45b35b3

Browse files
authored
Merge pull request #11838 from dotty-staging/fix-10927
Fix name generation for anonymous given of infix types.
2 parents 75f7cb3 + 87e03b2 commit 45b35b3

File tree

5 files changed

+55
-10
lines changed

5 files changed

+55
-10
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -999,12 +999,16 @@ object desugar {
999999
case tree: TypeDef => tree.name.toString
10001000
case tree: AppliedTypeTree if followArgs && tree.args.nonEmpty =>
10011001
s"${apply(x, tree.tpt)}_${extractArgs(tree.args)}"
1002+
case InfixOp(left, op, right) =>
1003+
if followArgs then s"${op.name}_${extractArgs(List(left, right))}"
1004+
else op.name.toString
10021005
case tree: LambdaTypeTree =>
10031006
apply(x, tree.body)
10041007
case tree: Tuple =>
10051008
extractArgs(tree.trees)
10061009
case tree: Function if tree.args.nonEmpty =>
1007-
if (followArgs) s"${extractArgs(tree.args)}_to_${apply("", tree.body)}" else "Function"
1010+
if followArgs then s"${extractArgs(tree.args)}_to_${apply("", tree.body)}"
1011+
else "Function"
10081012
case _ => foldOver(x, tree)
10091013
}
10101014
else x

tests/neg/i10927.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
trait Transition[From, To]
2+
3+
infix type ==>[From, To] = Transition[From, To]
4+
5+
type A = A.type
6+
object A
7+
8+
type B = B.type
9+
object B
10+
11+
type C = C.type
12+
object C
13+
14+
// Compiles
15+
given (A ==> B) = ???
16+
17+
// was Compile error
18+
given (A ==> C) = ???
19+
20+
given ==>[A, C] = ??? // error: double definition
21+
22+
given List[A ==> B] = ???
23+
given List[A ==> C] = ??? // error: double definition

tests/pos/i10927.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
trait Transition[From, To]
2+
3+
infix type ==>[From, To] = Transition[From, To]
4+
5+
type A = A.type
6+
object A
7+
8+
type B = B.type
9+
object B
10+
11+
type C = C.type
12+
object C
13+
14+
// Compiles
15+
given (A ==> B) = ???
16+
17+
// was Compile error
18+
given (A ==> C) = ???

tests/semanticdb/expect/Enums.expect.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ object Enums/*<-_empty_::Enums.*/:
4747
case Refl/*<-_empty_::Enums.`<:<`.Refl#*/[C/*<-_empty_::Enums.`<:<`.Refl#[C]*/]() extends (C/*->_empty_::Enums.`<:<`.Refl#[C]*/ <:</*->_empty_::Enums.`<:<`#*/ C/*->_empty_::Enums.`<:<`.Refl#[C]*/)
4848

4949
object <:</*<-_empty_::Enums.`<:<`.*/ :
50-
given [T]: (T/*<-_empty_::Enums.`<:<`.given_T().*//*<-_empty_::Enums.`<:<`.given_T().[T]*//*->_empty_::Enums.`<:<`.given_T().[T]*/ <:</*->_empty_::Enums.`<:<`#*/ T/*->_empty_::Enums.`<:<`.given_T().[T]*/) = Refl/*->_empty_::Enums.`<:<`.Refl.*//*->_empty_::Enums.`<:<`.Refl.apply().*/()
50+
given [T]: (T <:< T/*<-_empty_::Enums.`<:<`.`given_<:<_T_T`().*//*<-_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*//*->_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*//*->_empty_::Enums.`<:<`#*//*->_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*/) = Refl/*->_empty_::Enums.`<:<`.Refl.*//*->_empty_::Enums.`<:<`.Refl.apply().*/()
5151

5252
extension [A/*<-_empty_::Enums.unwrap().[A]*/, B/*<-_empty_::Enums.unwrap().[B]*/](opt/*<-_empty_::Enums.unwrap().(opt)*/: Option/*->scala::Option#*/[A/*->_empty_::Enums.unwrap().[A]*/]) def unwrap/*<-_empty_::Enums.unwrap().*/(using ev/*<-_empty_::Enums.unwrap().(ev)*/: A/*->_empty_::Enums.unwrap().[A]*/ <:</*->_empty_::Enums.`<:<`#*/ Option/*->scala::Option#*/[B/*->_empty_::Enums.unwrap().[B]*/]): Option/*->scala::Option#*/[B/*->_empty_::Enums.unwrap().[B]*/] = ev/*->_empty_::Enums.unwrap().(ev)*/ match
5353
case Refl/*->_empty_::Enums.`<:<`.Refl.*//*->_empty_::Enums.`<:<`.Refl.unapply().*/() => opt/*->_empty_::Enums.unwrap().(opt)*/.flatMap/*->scala::Option#flatMap().*/(identity/*->scala::Predef.identity().*//*->local0*/[Option/*->scala::Option#*/[B/*->_empty_::Enums.unwrap().[B]*/]])
5454

55-
val some1/*<-_empty_::Enums.some1.*/ = Some/*->scala::Some.*//*->scala::Some.apply().*/(Some/*->scala::Some.*//*->scala::Some.apply().*/(1)).unwrap/*->_empty_::Enums.unwrap().*//*->_empty_::Enums.`<:<`.given_T().*/
55+
val some1/*<-_empty_::Enums.some1.*/ = Some/*->scala::Some.*//*->scala::Some.apply().*/(Some/*->scala::Some.*//*->scala::Some.apply().*/(1)).unwrap/*->_empty_::Enums.unwrap().*//*->_empty_::Enums.`<:<`.`given_<:<_T_T`().*/
5656

5757
enum Planet/*<-_empty_::Enums.Planet#*/(mass/*<-_empty_::Enums.Planet#mass.*/: Double/*->scala::Double#*/, radius/*<-_empty_::Enums.Planet#radius.*/: Double/*->scala::Double#*/) extends Enum/*->java::lang::Enum#*/[Planet/*->_empty_::Enums.Planet#*/]/*->java::lang::Enum#`<init>`().*/:
5858
private final val G/*<-_empty_::Enums.Planet#G.*/ = 6.67300E-11

tests/semanticdb/metac.expect

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -840,10 +840,10 @@ _empty_/Enums.`<:<`.Refl.toString(). => method toString
840840
_empty_/Enums.`<:<`.Refl.unapply(). => method unapply
841841
_empty_/Enums.`<:<`.Refl.unapply().(x$1) => param x$1
842842
_empty_/Enums.`<:<`.Refl.unapply().[C] => typeparam C
843+
_empty_/Enums.`<:<`.`given_<:<_T_T`(). => final implicit method given_<:<_T_T
844+
_empty_/Enums.`<:<`.`given_<:<_T_T`().[T] => typeparam T
843845
_empty_/Enums.`<:<`.fromOrdinal(). => method fromOrdinal
844846
_empty_/Enums.`<:<`.fromOrdinal().(ordinal) => param ordinal
845-
_empty_/Enums.`<:<`.given_T(). => final implicit method given_T
846-
_empty_/Enums.`<:<`.given_T().[T] => typeparam T
847847
_empty_/Enums.some1. => val method some1
848848
_empty_/Enums.unwrap(). => method unwrap
849849
_empty_/Enums.unwrap().(ev) => implicit param ev
@@ -962,11 +962,11 @@ Occurrences:
962962
[46:34..46:35): C -> _empty_/Enums.`<:<`.Refl#[C]
963963
[46:35..46:35): -> _empty_/Enums.`<:<`#`<init>`().
964964
[48:9..48:12): <:< <- _empty_/Enums.`<:<`.
965-
[49:10..49:17): [T]: (T <- _empty_/Enums.`<:<`.given_T().
966-
[49:11..49:12): T <- _empty_/Enums.`<:<`.given_T().[T]
967-
[49:16..49:17): T -> _empty_/Enums.`<:<`.given_T().[T]
965+
[49:10..49:23): [T]: (T <:< T <- _empty_/Enums.`<:<`.`given_<:<_T_T`().
966+
[49:11..49:12): T <- _empty_/Enums.`<:<`.`given_<:<_T_T`().[T]
967+
[49:16..49:17): T -> _empty_/Enums.`<:<`.`given_<:<_T_T`().[T]
968968
[49:18..49:21): <:< -> _empty_/Enums.`<:<`#
969-
[49:22..49:23): T -> _empty_/Enums.`<:<`.given_T().[T]
969+
[49:22..49:23): T -> _empty_/Enums.`<:<`.`given_<:<_T_T`().[T]
970970
[49:27..49:31): Refl -> _empty_/Enums.`<:<`.Refl.
971971
[49:31..49:31): -> _empty_/Enums.`<:<`.Refl.apply().
972972
[51:13..51:14): A <- _empty_/Enums.unwrap().[A]
@@ -997,7 +997,7 @@ Occurrences:
997997
[54:19..54:23): Some -> scala/Some.
998998
[54:23..54:23): -> scala/Some.apply().
999999
[54:28..54:34): unwrap -> _empty_/Enums.unwrap().
1000-
[54:34..54:34): -> _empty_/Enums.`<:<`.given_T().
1000+
[54:34..54:34): -> _empty_/Enums.`<:<`.`given_<:<_T_T`().
10011001
[56:7..56:13): Planet <- _empty_/Enums.Planet#
10021002
[56:13..56:13): <- _empty_/Enums.Planet#`<init>`().
10031003
[56:14..56:18): mass <- _empty_/Enums.Planet#mass.

0 commit comments

Comments
 (0)