Skip to content

Commit ddaf1a7

Browse files
committed
Refactor signature provider
1 parent b5b8aa3 commit ddaf1a7

File tree

9 files changed

+194
-222
lines changed

9 files changed

+194
-222
lines changed

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,19 @@ enum Modifier(val name: String, val prefix: Boolean):
4747
case class ExtensionTarget(name: String, typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList], signature: Signature, dri: DRI, position: Long)
4848
case class ImplicitConversion(from: DRI, to: DRI)
4949
trait ImplicitConversionProvider { def conversion: Option[ImplicitConversion] }
50-
trait Classlike
50+
trait Classlike:
51+
def typeParams: Seq[TypeParameter] = Seq.empty
52+
def argsLists: Seq[ParametersList] = Seq.empty
5153

5254
enum Kind(val name: String):
5355
case RootPackage extends Kind("")
5456
case Package extends Kind("package")
55-
case Class(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList])
57+
case Class(override val typeParams: Seq[TypeParameter], override val argsLists: Seq[ParametersList])
5658
extends Kind("class") with Classlike
5759
case Object extends Kind("object") with Classlike
58-
case Trait(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList])
60+
case Trait(override val typeParams: Seq[TypeParameter], override val argsLists: Seq[ParametersList])
5961
extends Kind("trait") with Classlike
60-
case Enum(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList]) extends Kind("enum") with Classlike
62+
case Enum(override val typeParams: Seq[TypeParameter], override val argsLists: Seq[ParametersList]) extends Kind("enum") with Classlike
6163
case EnumCase(kind: Object.type | Kind.Type | Val.type | Class) extends Kind("case")
6264
case Def(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList])
6365
extends Kind("def")
@@ -124,12 +126,15 @@ sealed trait SignaturePart:
124126
val name: String
125127

126128
// TODO (longterm) properly represent signatures
129+
case class Name(override val name: String, dri: DRI) extends SignaturePart
127130
case class Type(override val name: String, dri: Option[DRI]) extends SignaturePart
128131
case class Keyword(override val name: String) extends SignaturePart
129132
case class Plain(override val name: String) extends SignaturePart
130133

131134
type Signature = List[SignaturePart]
132135

136+
case class MemberSignature(prefix: Signature, kind: Signature, name: Signature, suffix: Signature)
137+
133138
object Signature:
134139
def apply(names: (SignaturePart)*): Signature = names.toList
135140

@@ -242,6 +247,7 @@ extension (m: Module)
242247
extension (s: Signature)
243248
def getName: String =
244249
s.map {
250+
case Name(s, _) => s
245251
case Plain(s) => s
246252
case Type(s, _) => s
247253
case Keyword(s) => s

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

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import translators._
1313
class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) extends DocRender(signatureRenderer):
1414
import signatureRenderer._
1515

16+
val signatureProvider: ScalaSignatureProvider = ScalaSignatureProvider()
17+
1618
def doc(m: Member): Seq[AppliedTag] = m.docs.fold(Nil)(d => Seq(renderDocPart(d.body)))
1719

1820
def tableRow(name: String, content: TagArg) = Seq(dt(cls := "body-small")(name), dd(cls := "body-medium")(content))
@@ -136,19 +138,15 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
136138
val depStyle = if member.deprecated.isEmpty then "" else "deprecated"
137139
val nameClasses = Seq(
138140
cls := s"documentableName $depStyle",
139-
Attr("t") := "n"
140141
)
141142

142-
val rawBuilder = ScalaSignatureProvider.rawSignature(member, InlineSignatureBuilder())()
143-
val inlineBuilder = rawBuilder.asInstanceOf[InlineSignatureBuilder]
144-
val kind :: modifiersRevered = inlineBuilder.preName: @unchecked
145-
val signature = inlineBuilder.names.reverse
143+
val signature: MemberSignature = signatureProvider.rawSignature(member)()
146144
Seq(
147145
div(cls := "signature")(
148-
span(cls := "modifiers")(modifiersRevered.reverse.map(renderElement)),
149-
span(cls := "kind")(renderElement(kind)),
150-
renderLink(member.name, member.dri, nameClasses*),
151-
span(signature.map(renderElement))
146+
span(cls := "modifiers")(signature.prefix.map(renderElement(_))),
147+
span(cls := "kind")(signature.kind.map(renderElement(_))),
148+
signature.name.map(renderElement(_, nameClasses*)),
149+
span(signature.suffix.map(renderElement(_)))
152150
),
153151
)
154152

@@ -160,9 +158,9 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
160158
}
161159

162160
def annotations(member: Member) =
163-
val rawBuilder = InlineSignatureBuilder().annotationsBlock(member)
164-
val signatures = rawBuilder.asInstanceOf[InlineSignatureBuilder].names.reverse
165-
span(cls := "annotations monospace")(signatures.map(renderElement))
161+
val rawBuilder = SignatureBuilder().annotationsBlock(member)
162+
val signatures = rawBuilder.content
163+
span(cls := "annotations monospace")(signatures.map(renderElement(_)))
166164

167165
def member(member: Member) =
168166
val filterAttributes = FilterAttributes.attributesFor(member)
@@ -287,15 +285,15 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
287285
case _ => None
288286
}.collect {
289287
case (Some(on), members) =>
290-
val typeSig = InlineSignatureBuilder()
288+
val typeSig = SignatureBuilder()
291289
.keyword("extension ")
292290
.generics(on.typeParams)
293-
.asInstanceOf[InlineSignatureBuilder].names.reverse
294-
val argsSig = InlineSignatureBuilder()
291+
.content
292+
val argsSig = SignatureBuilder()
295293
.functionParameters(on.argsLists)
296-
.asInstanceOf[InlineSignatureBuilder].names.reverse
294+
.content
297295
val sig = typeSig ++ Signature(Plain(s"(${on.name}: ")) ++ on.signature ++ Signature(Plain(")")) ++ argsSig
298-
MGroup(span(cls := "groupHeader")(sig.map(renderElement)), members.sortBy(_.name).toSeq, on.name)
296+
MGroup(span(cls := "groupHeader")(sig.map(renderElement(_))), members.sortBy(_.name).toSeq, on.name)
299297
}.toSeq
300298

301299
div(cls := "membersList")(renderTabs(
@@ -360,13 +358,13 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
360358
def signatureList(list: Seq[LinkToType], className: String = ""): Seq[AppliedTag] =
361359
if list.isEmpty then Nil
362360
else Seq(div(cls := s"mono-small-inline $className")(list.map(link =>
363-
div(link.kind.name," ", link.signature.map(renderElement))
361+
div(link.kind.name," ", link.signature.map(renderElement(_)))
364362
)))
365363

366364
def selfTypeList(list: List[LinkToType]): Seq[AppliedTag] =
367365
if list.isEmpty then Nil
368366
else Seq(div(cls := "mono-small-inline") { list.map { link =>
369-
div(link.signature.map(renderElement))
367+
div(link.signature.map(renderElement(_)))
370368
}})
371369

372370
val supertypes = signatureList(m.parents, "supertypes")

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -183,12 +183,8 @@ trait Resources(using ctx: DocContext) extends Locations, Writer:
183183
val staticSiteOnlyResourcesPaths: Seq[String] = staticSiteOnlyResources.map(_.path)
184184

185185
def searchData(pages: Seq[Page]) =
186-
def flattenToText(signature: Signature): String =
187-
signature.map {
188-
case Type(name, dri) => name
189-
case Plain(s) => s
190-
case Keyword(s) => s
191-
}.mkString
186+
val signatureProvider = ScalaSignatureProvider()
187+
def flattenToText(signature: Signature): String = signature.getName
192188

193189
def mkEntry(dri: DRI, name: String, text: String, extensionTarget: String, descr: String, kind: String) = jsonObject(
194190
"l" -> jsonString(relativeInternalOrAbsoluteExternalPath(dri)),
@@ -209,8 +205,8 @@ trait Resources(using ctx: DocContext) extends Locations, Writer:
209205
val (res, pageName) = page.content match
210206
case m: Member if m.kind != Kind.RootPackage =>
211207
def processMember(member: Member, fqName: List[String]): Seq[(JSON, Seq[String])] =
212-
val signatureBuilder = ScalaSignatureProvider.rawSignature(member, InlineSignatureBuilder())().asInstanceOf[InlineSignatureBuilder]
213-
val sig = Signature(Plain(member.name)) ++ signatureBuilder.names.reverse
208+
val signature: MemberSignature = signatureProvider.rawSignature(member)()
209+
val sig = Signature(Plain(member.name)) ++ signature.suffix
214210
val descr = fqName.mkString(".")
215211
val entry = mkEntry(member.dri, member.name, flattenToText(sig), extensionTarget(member), descr, member.kind.name)
216212
val children = member

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ trait SignatureRenderer:
1515
def currentDri: DRI
1616
def link(dri: DRI): Option[String]
1717

18-
def renderElement(e: SignaturePart) = renderElementWith(e)
18+
def renderElement(e: SignaturePart, modifiers: AppliedAttr*) = renderElementWith(e, modifiers*)
1919

2020
def renderLink(name: String, dri: DRI, modifiers: AppliedAttr*) =
2121
renderLinkContent(name, dri, modifiers:_*)
@@ -29,6 +29,9 @@ trait SignatureRenderer:
2929
case _ => unresolvedLink(content, modifiers:_*)
3030

3131
def renderElementWith(e: SignaturePart, modifiers: AppliedAttr*) = e match
32+
case Name(name, dri) =>
33+
val attrs = Seq(Attr("t") := "n") ++ modifiers
34+
renderLink(name, dri, attrs*)
3235
case Type(name, Some(dri)) =>
3336
val attrs = Seq(Attr("t") := "t") ++ modifiers
3437
renderLink(name, dri, attrs:_*)

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,16 @@ trait ClassLikeSupport:
7070
case tree: ClassDef => tree
7171
case tt: TypeTree => unpackTreeToClassDef(tt.tpe.typeSymbol.tree)
7272

73+
def signatureWithName(s: dotty.tools.scaladoc.Signature): dotty.tools.scaladoc.Signature =
74+
s match
75+
case dotty.tools.scaladoc.Type(n, Some(dri)) :: tail => dotty.tools.scaladoc.Name(n, dri) :: tail
76+
case other => other
77+
7378
def getSupertypesGraph(link: LinkToType, to: Seq[Tree]): Seq[(LinkToType, LinkToType)] =
7479
to.flatMap { case tree =>
7580
val symbol = if tree.symbol.isClassConstructor then tree.symbol.owner else tree.symbol
76-
val superLink = LinkToType(tree.asSignature, symbol.dri, bareClasslikeKind(symbol))
81+
val signature = signatureWithName(tree.asSignature)
82+
val superLink = LinkToType(signature, symbol.dri, bareClasslikeKind(symbol))
7783
val nextTo = unpackTreeToClassDef(tree).parents
7884
if symbol.isHiddenByVisibility then getSupertypesGraph(link, nextTo)
7985
else Seq(link -> superLink) ++ getSupertypesGraph(superLink, nextTo)
@@ -83,14 +89,16 @@ trait ClassLikeSupport:
8389
.filterNot((s, t) => s.isHiddenByVisibility)
8490
.map {
8591
case (symbol, tpe) =>
86-
LinkToType(tpe.asSignature, symbol.dri, bareClasslikeKind(symbol))
92+
val signature = signatureWithName(tpe.asSignature)
93+
LinkToType(signature, symbol.dri, bareClasslikeKind(symbol))
8794
}
8895
val selfType = classDef.self.map { (valdef: ValDef) =>
8996
val symbol = valdef.symbol
9097
val tpe = valdef.tpt.tpe
91-
LinkToType(tpe.asSignature, symbol.dri, Kind.Type(false, false, Seq.empty))
98+
val signature = signatureWithName(tpe.asSignature)
99+
LinkToType(signature, symbol.dri, Kind.Type(false, false, Seq.empty))
92100
}
93-
val selfSignature: DSignature = typeForClass(classDef).asSignature
101+
val selfSignature: DSignature = signatureWithName(typeForClass(classDef).asSignature)
94102

95103
val graph = HierarchyGraph.withEdges(
96104
getSupertypesGraph(LinkToType(selfSignature, classDef.symbol.dri, bareClasslikeKind(classDef.symbol)), unpackTreeToClassDef(classDef).parents)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ object SymOps:
9898
Flags.Open -> Modifier.Open,
9999
Flags.Override -> Modifier.Override,
100100
Flags.Case -> Modifier.Case,
101+
Flags.Opaque -> Modifier.Opaque
101102
).collect {
102103
case (flag, mod) if sym.flags.is(flag) => mod
103104
}

scaladoc/src/dotty/tools/scaladoc/translators/FilterAttributes.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package translators
33

44
object FilterAttributes:
55
def attributesFor(m: Member): Map[String, String] =
6-
val base = visibity(m) ++ visibity(m) ++ origin(m) ++ keywords(m) ++ inheritedFrom(m)
6+
val base = visibity(m) ++ origin(m) ++ keywords(m) ++ inheritedFrom(m)
77
base.filter(_._2.nonEmpty)
88

99
private def keywords(m: Member): Map[String, String] =
10-
Map("keywords" -> m.modifiers.map(_.name).mkString(","))
10+
Map("keywords" -> m.modifiers.map(_.name).filter(_.nonEmpty).mkString(","))
1111

1212

1313
private def visibity(m: Member): Map[String, String] =

0 commit comments

Comments
 (0)