Skip to content

Commit b344ee0

Browse files
authored
Merge pull request #13910 from dotty-staging/scaladoc/backport-bugfixes-311
Backport Scaladoc bugfixes to 3.1.1
2 parents 9e7b57f + e38a04c commit b344ee0

File tree

17 files changed

+113
-94
lines changed

17 files changed

+113
-94
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package tests.externalStubs
2+
3+
trait \/
4+
5+
trait /\

scaladoc-testcases/src/tests/externalLocations/scaladoc2.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
package tests.externalScaladoc2
1+
package tests
2+
package externalScaladoc2
23

34
import scala.util.matching.*
5+
import externalStubs._
46

57
class Test {
68
def a: String = ???
@@ -10,5 +12,7 @@ class Test {
1012
def c: Regex.Match = ???
1113
}
1214

15+
class Test2 extends \/ with /\
16+
1317
abstract class MySeq[T] extends scala.collection.immutable.Seq[T]
1418

scaladoc-testcases/src/tests/externalLocations/scaladoc3.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
package tests.externalScaladoc3
1+
package tests
2+
package externalScaladoc3
23

34
import scala.util.matching.*
5+
import externalStubs._
46

57
class Test {
68
def a: String = ???
@@ -10,3 +12,5 @@ class Test {
1012
def c: Regex.Match = ???
1113
}
1214

15+
class Test2 extends \/ with /\
16+

scaladoc-testcases/src/tests/givenSignatures.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,19 @@ package givenSignatures
44

55
object Obj
66

7-
given Seq[String] = Nil
7+
given Seq[String] = Nil //expected: given given_Seq_String: Seq[String]
88

9-
given GivenType = GivenType()
9+
given GivenType = GivenType() //expected: given given_GivenType: GivenType
1010

1111
class GivenType
1212

1313
trait Ord[T]
1414

1515
given listOrd[T](using ord: Ord[T]): Ord[List[T]]
1616
= ???
17+
18+
trait Foo[A]
19+
20+
given listOrd: Foo[String] with { val i: Int = 1 } //expected: given listOrd: listOrd.type
21+
22+
trait Placeholder //expected: object listOrd extends Foo[String]

scaladoc-testcases/src/tests/inheritedMembers1.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ class A
1010
= ???
1111
object X
1212
trait Z
13-
given B with {}
13+
given B with { val x = 1 }//expected: given given_B: given_B.type
14+
trait Placeholder//expected: object given_B extends B
15+
16+
object Y extends Z
17+
1418
type I = Int
1519
/*<-*/extension (a: A) /*->*/def extension: String
1620
= ???
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package tests
2+
package slashMembers
3+
4+
class A
5+
6+
trait \/
7+
8+
trait /\

scaladoc/src/dotty/tools/scaladoc/ScaladocSettings.scala

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,8 @@ import dotty.tools.dotc.core.Contexts._
1818

1919
class ScaladocSettings extends SettingGroup with AllScalaSettings:
2020
val unsupportedSettings = Seq(
21-
// Options that we like to support
22-
extdirs, javabootclasspath, encoding,
2321
// Needed for plugin architecture
24-
plugin,disable,require, pluginsDir, pluginOptions,
25-
// we need support for sourcepath and sourceroot
26-
sourcepath, sourceroot
22+
plugin, disable, require, pluginsDir, pluginOptions,
2723
)
2824

2925

scaladoc/src/dotty/tools/scaladoc/api.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ enum Kind(val name: String):
6767
case Exported(m: Kind.Def) extends Kind("export")
6868
case Type(concreate: Boolean, opaque: Boolean, typeParams: Seq[TypeParameter])
6969
extends Kind("type") // should we handle opaque as modifier?
70-
case Given(kind: Def | Class, as: Option[Signature], conversion: Option[ImplicitConversion])
70+
case Given(kind: Def | Class | Val.type, as: Option[Signature], conversion: Option[ImplicitConversion])
7171
extends Kind("given") with ImplicitConversionProvider
7272
case Implicit(kind: Kind.Def | Kind.Val.type, conversion: Option[ImplicitConversion])
7373
extends Kind(kind.name) with ImplicitConversionProvider

scaladoc/src/dotty/tools/scaladoc/renderers/Locations.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import java.nio.file.Path
1313
import java.nio.file.Files
1414
import java.io.File
1515
import scala.util.matching._
16+
import dotty.tools.scaladoc.util.Escape._
1617

1718
val UnresolvedLocationLink = "#"
1819

scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala

Lines changed: 12 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,16 @@ trait ClassLikeSupport:
9797
val baseMember = mkMember(classDef.symbol, kindForClasslike(classDef), selfSignature)(
9898
modifiers = modifiers,
9999
graph = graph,
100-
deprecated = classDef.symbol.isDeprecated()
100+
deprecated = classDef.symbol.isDeprecated(),
101+
).copy(
102+
directParents = classDef.getParentsAsLinkToTypes,
103+
parents = supertypes,
101104
)
102105

103106
if summon[DocContext].args.generateInkuire then doInkuireStuff(classDef)
104107

105108
if signatureOnly then baseMember else baseMember.copy(
106109
members = classDef.extractPatchedMembers.sortBy(m => (m.name, m.kind.name)),
107-
directParents = classDef.getParentsAsLinkToTypes,
108-
parents = supertypes,
109110
selfType = selfType,
110111
companion = classDef.getCompanion
111112
)
@@ -144,15 +145,6 @@ trait ClassLikeSupport:
144145
)
145146
parseMethod(c, dd.symbol,specificKind = Kind.Extension(target, _))
146147
}
147-
// TODO check given methods?
148-
case dd: DefDef if !dd.symbol.isHiddenByVisibility && dd.symbol.isGiven && !dd.symbol.isArtifact =>
149-
Some(dd.symbol.owner.typeMember(dd.name))
150-
.filterNot(_.exists)
151-
.map { _ =>
152-
parseMethod(c, dd.symbol, specificKind =
153-
Kind.Given(_, getGivenInstance(dd), None)
154-
)
155-
}
156148

157149
case dd: DefDef if !dd.symbol.isHiddenByVisibility && dd.symbol.isExported && !dd.symbol.isArtifact =>
158150
val exportedTarget = dd.rhs.collect {
@@ -171,58 +163,25 @@ trait ClassLikeSupport:
171163
Some(parseMethod(c, dd.symbol, specificKind = Kind.Exported(_))
172164
.withOrigin(Origin.ExportedFrom(s"$instanceName.$functionName", dri)))
173165

174-
case dd: DefDef if !dd.symbol.isHiddenByVisibility && !dd.symbol.isGiven && !dd.symbol.isSyntheticFunc && !dd.symbol.isExtensionMethod && !dd.symbol.isArtifact =>
166+
case dd: DefDef if !dd.symbol.isHiddenByVisibility && !dd.symbol.isSyntheticFunc && !dd.symbol.isExtensionMethod && !dd.symbol.isArtifact =>
175167
Some(parseMethod(c, dd.symbol))
176168

177169
case td: TypeDef if !td.symbol.flags.is(Flags.Synthetic) && (!td.symbol.flags.is(Flags.Case) || !td.symbol.flags.is(Flags.Enum)) =>
178170
Some(parseTypeDef(td))
179171

180-
case vd: ValDef if !isSyntheticField(vd.symbol)
181-
&& (!vd.symbol.flags.is(Flags.Case) || !vd.symbol.flags.is(Flags.Enum))
182-
&& vd.symbol.isGiven =>
183-
val classDef = Some(vd.tpt.tpe).flatMap(_.classSymbol.map(_.tree.asInstanceOf[ClassDef]))
184-
Some(classDef.filter(_.symbol.flags.is(Flags.Module)).fold[Member](parseValDef(c, vd))(parseGivenClasslike(_)))
185-
186172
case vd: ValDef if !isSyntheticField(vd.symbol) && (!vd.symbol.flags.is(Flags.Case) || !vd.symbol.flags.is(Flags.Enum)) =>
187173
Some(parseValDef(c, vd))
188174

189-
case c: ClassDef if c.symbol.owner.methodMember(c.name).exists(_.flags.is(Flags.Given)) =>
190-
Some(parseGivenClasslike(c))
191-
192-
case c: ClassDef if c.symbol.shouldDocumentClasslike && !c.symbol.isGiven =>
175+
case c: ClassDef if c.symbol.shouldDocumentClasslike =>
193176
Some(parseClasslike(c))
194177

195178
case _ => None
196179
}
197180

198-
private def parseGivenClasslike(c: ClassDef): Member = {
199-
val parsedClasslike = parseClasslike(c)
200-
201-
val parentTpe = c.parents(0) match {
202-
case t: TypeTree => Some(t.tpe)
203-
case t: Term => Some(t.tpe)
204-
case _ => None
205-
}
206-
207-
val givenParents = parsedClasslike.directParents.headOption
208-
val cls: Kind.Class = parsedClasslike.kind match
209-
case Kind.Object => Kind.Class(Nil, Nil)
210-
case Kind.Trait(tps, args) => Kind.Class(tps, args)
211-
case cls: Kind.Class => cls
212-
case other =>
213-
report.warning("Unrecoginzed kind for given: $other", c.pos)
214-
Kind.Class(Nil, Nil)
215-
216-
parsedClasslike.withKind(
217-
Kind.Given(cls, givenParents.map(_.signature), parentTpe.flatMap(extractImplicitConversion))
218-
)
219-
}
220-
221181
private def parseInheritedMember(c: ClassDef)(s: Tree): Option[Member] =
222182
def inheritance = Some(InheritedFrom(s.symbol.owner.normalizedName, s.symbol.dri))
223183
processTreeOpt(s)(s match
224-
case c: ClassDef if c.symbol.shouldDocumentClasslike && !c.symbol.isGiven => Some(parseClasslike(c, signatureOnly = true))
225-
case c: ClassDef if c.symbol.owner.methodMember(c.name).exists(_.flags.is(Flags.Given)) => Some(parseGivenClasslike(c))
184+
case c: ClassDef if c.symbol.shouldDocumentClasslike => Some(parseClasslike(c, signatureOnly = true))
226185
case other => {
227186
val parsed = parseMember(c)(other)
228187
parsed.map(p =>
@@ -392,6 +351,7 @@ trait ClassLikeSupport:
392351
))
393352
case _ =>
394353
Kind.Implicit(basicKind, None)
354+
else if methodSymbol.flags.is(Flags.Given) then Kind.Given(basicKind, Some(method.returnTpt.tpe.asSignature), extractImplicitConversion(method.returnTpt.tpe))
395355
else specificKind(basicKind)
396356

397357
val origin = if !methodSymbol.isOverridden then Origin.RegularlyDefined else
@@ -463,10 +423,10 @@ trait ClassLikeSupport:
463423
def parseValDef(c: ClassDef, valDef: ValDef): Member =
464424
def defaultKind = if valDef.symbol.flags.is(Flags.Mutable) then Kind.Var else Kind.Val
465425
val memberInfo = unwrapMemberInfo(c, valDef.symbol)
466-
val kind = if valDef.symbol.flags.is(Flags.Implicit) then
467-
Kind.Implicit(Kind.Val, extractImplicitConversion(valDef.tpt.tpe))
468-
else if valDef.symbol.flags.is(Flags.Enum) then Kind.EnumCase(Kind.Val)
469-
else defaultKind
426+
val kind = if valDef.symbol.flags.is(Flags.Implicit) then Kind.Implicit(Kind.Val, extractImplicitConversion(valDef.tpt.tpe))
427+
else if valDef.symbol.flags.is(Flags.Given) then Kind.Given(Kind.Val, Some(memberInfo.res.asSignature), extractImplicitConversion(valDef.tpt.tpe))
428+
else if valDef.symbol.flags.is(Flags.Enum) then Kind.EnumCase(Kind.Val)
429+
else defaultKind
470430

471431
mkMember(valDef.symbol, kind, memberInfo.res.asSignature)(deprecated = valDef.symbol.isDeprecated())
472432

0 commit comments

Comments
 (0)