Skip to content

Commit d97ba02

Browse files
committed
Exclude implicit class conversions in SemanticDB
Conversions generated for implicit classes were synthetic before, now they need to be excluded separately.
1 parent c98150f commit d97ba02

File tree

5 files changed

+30
-19
lines changed

5 files changed

+30
-19
lines changed

compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class ExtractSemanticDB extends Phase:
8080
|| sym.isLocalDummy
8181
|| sym.is(Synthetic)
8282
|| sym.isSetter
83+
|| sym.isOldStyleImplicitConversion(forImplicitClassOnly = true)
8384
|| excludeDefOrUse(sym)
8485

8586
private def excludeDefOrUse(sym: Symbol)(using Context): Boolean =
@@ -103,6 +104,7 @@ class ExtractSemanticDB extends Phase:
103104
private def excludeChildren(sym: Symbol)(using Context): Boolean =
104105
!sym.exists
105106
|| sym.is(Param) && sym.info.bounds.hi.isInstanceOf[Types.HKTypeLambda]
107+
|| sym.isOldStyleImplicitConversion(forImplicitClassOnly = true)
106108

107109
/** Uses of this symbol where the reference has given span should be excluded from semanticdb */
108110
private def excludeUse(qualifier: Option[Symbol], sym: Symbol)(using Context): Boolean =

compiler/src/dotty/tools/dotc/transform/SymUtils.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,19 @@ object SymUtils:
8787

8888
def isGenericProduct(using Context): Boolean = whyNotGenericProduct.isEmpty
8989

90+
/** Is this the an old style implicit conversion?
91+
* @param directOnly only consider explicitly written methods
92+
* @param forImplicitClassOnly only consider methods generated from implicit classes
93+
*/
94+
def isOldStyleImplicitConversion(directOnly: Boolean = false, forImplicitClassOnly: Boolean = false)(using Context): Boolean =
95+
self.is(Implicit) && self.info.stripPoly.match
96+
case mt @ MethodType(_ :: Nil) if !mt.isImplicitMethod =>
97+
if self.isCoDefinedGiven(mt.finalResultType.typeSymbol)
98+
then !directOnly
99+
else !forImplicitClassOnly
100+
case _ =>
101+
false
102+
90103
def useCompanionAsMirror(using Context): Boolean = self.linkedClass.exists && !self.is(Scala2x)
91104

92105
/** Is this a sealed class or trait for which a sum mirror is generated?

compiler/src/dotty/tools/dotc/typer/Checking.scala

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -861,23 +861,14 @@ trait Checking {
861861
/** If `sym` is an old-style implicit conversion, check that implicit conversions are enabled.
862862
* @pre sym.is(GivenOrImplicit)
863863
*/
864-
def checkImplicitConversionDefOK(sym: Symbol)(using Context): Unit = {
865-
def check(): Unit =
864+
def checkImplicitConversionDefOK(sym: Symbol)(using Context): Unit =
865+
if sym.isOldStyleImplicitConversion(directOnly = true) then
866866
checkFeature(
867867
nme.implicitConversions,
868868
i"Definition of implicit conversion $sym",
869869
ctx.owner.topLevelClass,
870870
sym.srcPos)
871871

872-
sym.info.stripPoly match {
873-
case mt @ MethodType(_ :: Nil)
874-
if !mt.isImplicitMethod && !sym.isCoDefinedGiven(mt.finalResultType.typeSymbol) =>
875-
// it's an old-style conversion
876-
check()
877-
case _ =>
878-
}
879-
}
880-
881872
/** If `tree` is an application of a new-style implicit conversion (using the apply
882873
* method of a `scala.Conversion` instance), check that implicit conversions are
883874
* enabled.

tests/semanticdb/expect/InventedNames.expect.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ given `* */*<-givens::InventedNames$package.`* *`.*/`: Long/*->scala::Long#*/ =
2222
given X with
2323
/*<-givens::InventedNames$package.given_X.*//*->givens::X#*/ def doX/*<-givens::InventedNames$package.given_X.doX().*/ = 7
2424

25-
given (using X/*->givens::X#*/): Y/*->givens::Y#*/ with
25+
/*->givens::InventedNames$package.given_Y().(x$1)*/given /*<-givens::InventedNames$package.given_Y().*/(using X/*->givens::X#*//*<-givens::InventedNames$package.given_Y().(x$1)*/): Y/*->givens::Y#*/ with
2626
def doY/*<-givens::InventedNames$package.given_Y#doY().*/ = "7"
2727

28-
given [T/*<-givens::InventedNames$package.given_Z_T#[T]*/]: Z/*->givens::Z#*/[T/*->givens::InventedNames$package.given_Z_T#[T]*/] with
28+
/*->givens::InventedNames$package.given_Z_T().[T]*/given /*<-givens::InventedNames$package.given_Z_T().*/[T/*<-givens::InventedNames$package.given_Z_T#[T]*//*<-givens::InventedNames$package.given_Z_T().[T]*/]: Z/*->givens::Z#*/[T/*->givens::InventedNames$package.given_Z_T#[T]*/] with
2929
def doZ/*<-givens::InventedNames$package.given_Z_T#doZ().*/: List/*->scala::package.List#*/[T/*->givens::InventedNames$package.given_Z_T#[T]*/] = Nil/*->scala::package.Nil.*/
3030

3131

tests/semanticdb/metac.expect

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ Schema => SemanticDB v4
362362
Uri => Classes.scala
363363
Text => empty
364364
Language => Scala
365-
Symbols => 109 entries
365+
Symbols => 108 entries
366366
Occurrences => 130 entries
367367

368368
Symbols:
@@ -467,7 +467,6 @@ classes/M.C5#`<init>`(). => primary ctor <init>
467467
classes/M.C5#`<init>`().(x) => param x
468468
classes/M.C5#x. => private[this] val method x
469469
classes/M.C5(). => final implicit method C5
470-
classes/M.C5().(x) => param x
471470
classes/N. => final object N
472471
classes/N.anonClass. => val method anonClass
473472
classes/N.anonFun. => val method anonFun
@@ -1546,7 +1545,7 @@ Schema => SemanticDB v4
15461545
Uri => ImplicitConversion.scala
15471546
Text => empty
15481547
Language => Scala
1549-
Symbols => 23 entries
1548+
Symbols => 21 entries
15501549
Occurrences => 62 entries
15511550

15521551
Symbols:
@@ -1570,8 +1569,6 @@ example/ImplicitConversion.newAny2stringadd#`<init>`(). => primary ctor <init>
15701569
example/ImplicitConversion.newAny2stringadd#`<init>`().(self) => param self
15711570
example/ImplicitConversion.newAny2stringadd#self. => private val method self
15721571
example/ImplicitConversion.newAny2stringadd(). => final implicit method newAny2stringadd
1573-
example/ImplicitConversion.newAny2stringadd().(self) => param self
1574-
example/ImplicitConversion.newAny2stringadd().[A] => typeparam A
15751572
example/ImplicitConversion.newAny2stringadd. => final object newAny2stringadd
15761573

15771574
Occurrences:
@@ -1744,7 +1741,7 @@ Uri => InventedNames.scala
17441741
Text => empty
17451742
Language => Scala
17461743
Symbols => 45 entries
1747-
Occurrences => 72 entries
1744+
Occurrences => 80 entries
17481745

17491746
Symbols:
17501747
givens/InventedNames$package. => final package object givens
@@ -1830,12 +1827,20 @@ Occurrences:
18301827
[21:6..22:0): <- givens/InventedNames$package.given_X.
18311828
[21:6..21:7): X -> givens/X#
18321829
[22:6..22:9): doX <- givens/InventedNames$package.given_X.doX().
1830+
[24:0..24:0): -> givens/InventedNames$package.given_Y#`<init>`().
1831+
[24:0..24:0): -> givens/InventedNames$package.given_Y().(x$1)
1832+
[24:6..24:6): <- givens/InventedNames$package.given_Y().
18331833
[24:13..24:13): <- givens/InventedNames$package.given_Y#`<init>`().
18341834
[24:13..24:14): X -> givens/X#
1835+
[24:13..24:13): <- givens/InventedNames$package.given_Y().(x$1)
18351836
[24:17..24:18): Y -> givens/Y#
18361837
[25:6..25:9): doY <- givens/InventedNames$package.given_Y#doY().
1838+
[27:0..27:0): -> givens/InventedNames$package.given_Z_T().[T]
1839+
[27:0..27:0): -> givens/InventedNames$package.given_Z_T#`<init>`().
1840+
[27:6..27:6): <- givens/InventedNames$package.given_Z_T().
18371841
[27:7..27:7): <- givens/InventedNames$package.given_Z_T#`<init>`().
18381842
[27:7..27:8): T <- givens/InventedNames$package.given_Z_T#[T]
1843+
[27:7..27:8): T <- givens/InventedNames$package.given_Z_T().[T]
18391844
[27:11..27:12): Z -> givens/Z#
18401845
[27:13..27:14): T -> givens/InventedNames$package.given_Z_T#[T]
18411846
[28:6..28:9): doZ <- givens/InventedNames$package.given_Z_T#doZ().

0 commit comments

Comments
 (0)