Skip to content

Commit 691ddfb

Browse files
committed
Change the way inherited symbols are linked
1 parent ce75188 commit 691ddfb

File tree

4 files changed

+30
-19
lines changed

4 files changed

+30
-19
lines changed

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)

0 commit comments

Comments
 (0)