Skip to content

Commit aa623f2

Browse files
committed
Fix implicit conversions extraction. Add testcases.
1 parent 4265f08 commit aa623f2

File tree

4 files changed

+52
-3
lines changed

4 files changed

+52
-3
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package tests
2+
3+
package implicitConversionsSources
4+
5+
class Methods:
6+
def shouldBeImplicitlyAdded1: String
7+
= ???
8+
val shouldBeImplicitlyAdded2: String
9+
= ???
10+
class ShouldBeImplicitlyAdded3
11+
type ShouldBeImplicitlyAdded4
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package tests
2+
3+
package implicitConversions2
4+
5+
import implicitConversionsSources.Methods
6+
7+
class OuterClass
8+
{
9+
implicit def conversionMethodWithOneParam(param: ClassWithConversionWithOneParam): Methods
10+
= ???
11+
12+
class ClassWithConversionWithOneParam
13+
14+
class ClassWithConversionWithProperType
15+
16+
object ClassWithConversionWithProperType
17+
{
18+
implicit def conversionMethodWithProperType: Conversion[ClassWithConversionWithProperType, Methods]
19+
= ???
20+
}
21+
22+
given conversionFromVal as Conversion[ClassWithConversionFromVal, Methods]
23+
{
24+
def apply(a: ClassWithConversionFromVal): Methods
25+
= ???
26+
}
27+
28+
class ClassWithConversionFromVal
29+
30+
}

scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ trait ClassLikeSupport:
9898
private val conversionSymbol = Symbol.requiredClass("scala.Conversion")
9999

100100
def extractImplicitConversion(tpe: TypeRepr): Option[ImplicitConversion] =
101-
if tpe.derivesFrom(conversionSymbol) then None
102-
else tpe.baseType(conversionSymbol) match
101+
if tpe.derivesFrom(conversionSymbol) then tpe.baseType(conversionSymbol) match
103102
case AppliedType(tpe, List(from: TypeRepr, to: TypeRepr)) =>
104103
Some(ImplicitConversion(from.typeSymbol.dri, to.typeSymbol.dri))
105104
case _ =>
106105
None
106+
else None
107107

108108
private def parseMember(s: Tree): Option[Member] = processTreeOpt(s)(s match
109109
case dd: DefDef if !dd.symbol.isHiddenByVisibility && !dd.symbol.isSyntheticFunc && dd.symbol.isExtensionMethod =>
@@ -147,6 +147,7 @@ trait ClassLikeSupport:
147147
val parsedClasslike = parseClasslike(c)
148148
val parentTpe = c.parents(0) match {
149149
case t: TypeTree => Some(t.tpe)
150+
case t: Term => Some(t.tpe)
150151
case _ => None
151152
}
152153
val modifiedClasslikeExtension = ClasslikeExtension.getFrom(parsedClasslike).map(_.copy(
@@ -261,6 +262,13 @@ trait ClassLikeSupport:
261262
else if methodSymbol.flags.is(Flags.Implicit) then extractImplicitConversion(method.returnTpt.tpe) match
262263
case Some(conversion) if paramLists.size == 0 || (paramLists.size == 1 && paramLists.head.size == 0) =>
263264
Kind.Implicit(Kind.Def, Some(conversion))
265+
case None if paramLists.size == 1 && paramLists(0).size == 1 =>
266+
Kind.Implicit(Kind.Def, Some(
267+
ImplicitConversion(
268+
paramLists(0)(0).tpt.tpe.typeSymbol.dri,
269+
method.returnTpt.tpe.typeSymbol.dri
270+
)
271+
))
264272
case _ =>
265273
Kind.Implicit(Kind.Def, None)
266274
else kind

scala3doc/src/dotty/dokka/transformers/ImplicitMembersExtensionTransformer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class ImplicitMembersExtensionTransformer(ctx: DokkaContext) extends Documentabl
4444
case Origin.InheritedFrom(_, _) => true
4545
case _ => false
4646
)
47-
newMembers.map(_.withOrigin(Origin.ImplicitlyAddedBy(owner.name, owner.dri)))
47+
newMembers.map(_.withOrigin(Origin.ImplicitlyAddedBy(m.name, m.dri)))
4848
}
4949
case _ =>
5050
Nil

0 commit comments

Comments
 (0)