Skip to content

Commit 5efc249

Browse files
authored
Merge pull request #11394 from lampepfl/scaladoc/method-overloading
Scaladoc: Change to inherited members linking, add support for method overloading, fix bug with source link arg
2 parents 05c478b + c93187f commit 5efc249

File tree

7 files changed

+41
-22
lines changed

7 files changed

+41
-22
lines changed

project/Build.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1506,7 +1506,7 @@ object Build {
15061506
val scala3version = stdlibVersion(Bootstrapped)
15071507
// TODO add versions etc.
15081508
val srcManaged = s"out/bootstrap/stdlib-bootstrapped/scala-$baseVersion/src_managed/main/scala-library-src"
1509-
val sourceLinks = s"-source-links:$srcManaged=github://scala/scala/v$scala3version#src/library-source-links:github://lampepfl/dotty"
1509+
val sourceLinks = s"-source-links:$srcManaged=github://scala/scala/v$scala3version#src/library"
15101510
val revision = Seq("-revision", ref, "-project-version", projectVersion)
15111511
val cmd = Seq("-d", outDir, "-project", name, sourceLinks) ++ revision ++ params ++ targets
15121512
import _root_.scala.sys.process._

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,18 @@ case class Member(
157157
knownChildren: Seq[LinkToType] = Nil,
158158
companion: Option[DRI] = None,
159159
deprecated: Option[Annotation] = None,
160-
)
160+
):
161+
def needsOwnPage: Boolean =
162+
def properKind(kind: Kind): Boolean = kind match
163+
case Kind.Package => true
164+
case _ if kind.isInstanceOf[Classlike] => true
165+
case Kind.Given(inner, _, _) => properKind(inner)
166+
case Kind.EnumCase(inner) => properKind(inner)
167+
case _ => false
168+
169+
properKind(kind) &&
170+
origin == Origin.RegularlyDefined &&
171+
inheritedFrom.isEmpty
161172

162173
object Member:
163174
def unapply(v: Member): Option[(String, DRI, Visibility, Kind, Origin)] =

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

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,10 @@ class HtmlRenderer(rootPackage: Member, val members: Map[DRI, Member])(using ctx
2828
private val args = summon[DocContext].args
2929
val staticSite = summon[DocContext].staticSiteContext
3030

31-
val effectiveMembers = members.filter( (dri, member) => member.origin == Origin.RegularlyDefined && member.inheritedFrom.isEmpty)
32-
33-
private def needsOwnPage(member: Member): Boolean =
34-
def properKind(kind: Kind): Boolean = kind match
35-
case Kind.Package => true
36-
case _ if kind.isInstanceOf[Classlike] => true
37-
case Kind.Given(inner, _, _) => properKind(inner)
38-
case Kind.EnumCase(inner) => properKind(inner)
39-
case _ => false
40-
41-
properKind(member.kind) &&
42-
member.origin == Origin.RegularlyDefined &&
43-
member.inheritedFrom.isEmpty
31+
val effectiveMembers = members
4432

4533
private def memberPage(member: Member): Page =
46-
val childrenPages = member.members.filter(needsOwnPage)
34+
val childrenPages = member.members.filter(_.needsOwnPage)
4735
Page(Link(member.name, member.dri), member, childrenPages.map(memberPage))
4836

4937
val navigablePage: Page =

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
2929
case _ => Nil
3030

3131
def inheritedFrom(m: Member) = m.inheritedFrom match
32-
case Some(InheritedFrom(name, dri)) => tableRow("Inhertied from", signatureRenderer.renderLink(name, dri))
32+
case Some(InheritedFrom(name, dri)) => tableRow("Inherited from", signatureRenderer.renderLink(name, dri))
3333
case _ => Nil
3434

3535
def docAttributes(m: Member): Seq[AppliedTag] =
@@ -161,7 +161,7 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
161161
++ filterAttributes.map{ case (n, v) => Attr(s"data-f-$n") := v }
162162

163163
div(topLevelAttr:_*)(
164-
a(href:=link(member.dri).getOrElse("#"), cls := "documentableAnchor"),
164+
a(href := (if member.needsOwnPage then link(member.dri).getOrElse("#") else s"#${member.dri.anchor}"), cls := "documentableAnchor"),
165165
div(annotations(member)),
166166
div(cls := "header monospace")(memberSingnature(member)),
167167
div(cls := "docs")(

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,22 @@ trait ClassLikeSupport:
188188
}
189189

190190
private def parseInheritedMember(c: ClassDef)(s: Tree): Option[Member] =
191-
def inheritance = Some(InheritedFrom(s.symbol.owner.normalizedName, s.symbol.owner.dri))
191+
def inheritance = Some(InheritedFrom(s.symbol.owner.normalizedName, s.symbol.dri))
192192
processTreeOpt(s)(s match
193193
case c: ClassDef if c.symbol.shouldDocumentClasslike && !c.symbol.isGiven => Some(parseClasslike(c, signatureOnly = true))
194-
case other => parseMember(c)(other)
194+
case c: ClassDef if c.symbol.owner.memberMethod(c.name).exists(_.flags.is(Flags.Given)) => Some(parseGivenClasslike(c))
195+
case other => {
196+
val parsed = parseMember(c)(other)
197+
parsed.map(p =>
198+
val parentDRI = c.symbol.dri
199+
p.copy(
200+
dri = p.dri.copy(
201+
location = parentDRI.location,
202+
origin = parentDRI.origin
203+
)
204+
)
205+
)
206+
}
195207
).map(_.copy(inheritedFrom = inheritance))
196208

197209
extension (c: ClassDef)

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,15 @@ class SymOps[Q <: Quotes](val q: Q):
2121
else sym.maybeOwner.className
2222

2323
def anchor: Option[String] =
24-
if (!sym.isClassDef && !sym.isPackageDef) Some(sym.name)
24+
if (!sym.isClassDef && !sym.isPackageDef) {
25+
val params = sym.signature.paramSigs.map {
26+
case s: String => s
27+
case i: Int => i.toString
28+
}
29+
val result = sym.signature.resultSig
30+
val hash = ((params.mkString + result).hashCode % 4096).toHexString
31+
Some(s"${sym.name}-$hash")
32+
}
2533
else None
2634
//TODO: Retrieve string that will match scaladoc anchors
2735

scaladoc/test/dotty/tools/scaladoc/ExternalLocationProviderIntegrationTest.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class Scaladoc3ExternalLocationProviderIntegrationTest extends ExternalLocationP
3333
List(".*scala.*::scaladoc3::https://dotty.epfl.ch/api/"),
3434
List(
3535
"https://dotty.epfl.ch/api/scala/collection/immutable/Map.html",
36-
"https://dotty.epfl.ch/api/scala/Predef$.html#String",
36+
"https://dotty.epfl.ch/api/scala/Predef$.html#String-0",
3737
"https://dotty.epfl.ch/api/scala/util/matching/Regex$$Match.html"
3838
)
3939
)

0 commit comments

Comments
 (0)