Skip to content

Commit c77e38a

Browse files
oderskydwijnand
authored andcommitted
Exclude implicit class conversions in SemanticDB
Conversions generated for implicit classes were synthetic before, now they need to be excluded separately.
1 parent 20f6b01 commit c77e38a

File tree

5 files changed

+20
-13
lines changed

5 files changed

+20
-13
lines changed

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

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

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

106108
/** Uses of this symbol where the reference has given span should be excluded from semanticdb */
107109
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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ given X/*->givens::X#*/ with
2525
given (using X/*->givens::X#*/): 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+
given [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: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1678,7 +1678,7 @@ Uri => InventedNames.scala
16781678
Text => empty
16791679
Language => Scala
16801680
Symbols => 45 entries
1681-
Occurrences => 61 entries
1681+
Occurrences => 62 entries
16821682

16831683
Symbols:
16841684
givens/InventedNames$package. => final package object givens extends Object { self: givens.type => +24 decls }
@@ -1761,6 +1761,7 @@ Occurrences:
17611761
[24:17..24:18): Y -> givens/Y#
17621762
[25:6..25:9): doY <- givens/InventedNames$package.given_Y#doY().
17631763
[27:7..27:8): T <- givens/InventedNames$package.given_Z_T#[T]
1764+
[27:7..27:8): T <- givens/InventedNames$package.given_Z_T().[T]
17641765
[27:11..27:12): Z -> givens/Z#
17651766
[27:13..27:14): T -> givens/InventedNames$package.given_Z_T#[T]
17661767
[28:6..28:9): doZ <- givens/InventedNames$package.given_Z_T#doZ().

0 commit comments

Comments
 (0)