Skip to content

Commit 67451b1

Browse files
committed
Signature coloring
1 parent ed7e95f commit 67451b1

File tree

9 files changed

+187
-140
lines changed

9 files changed

+187
-140
lines changed

scaladoc/resources/dotty_res/styles/scalastyle.css

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ footer .mode {
672672
}
673673
.documentableElement .annotations {
674674
color: var(--grey600);
675-
margin-left: 10em;
675+
margin-left: 10.5em;
676676
display: none;
677677
}
678678

@@ -885,6 +885,35 @@ footer .socials {
885885
height: 8px;
886886
}
887887

888+
/* Signature coloring */
889+
890+
:root {
891+
--type-link: var(--blue500);
892+
--type: var(--grey700);
893+
--keyword: var(--red500);
894+
}
895+
896+
:root.theme-dark {
897+
--type-link: var(--blue400);
898+
--keyword: var(--red400);
899+
}
900+
901+
.signature *[t="t"]:not([href]) { /* Types without links */
902+
color: var(--type);
903+
}
904+
905+
.signature *[t="t"] { /* Types with links */
906+
color: var(--type-link);
907+
}
908+
909+
.signature *[t="k"] { /* Keywords */
910+
color: var(--keyword);
911+
}
912+
913+
.signature *:not[t] { /* Plain text */
914+
915+
}
916+
888917
/* Large Screens */
889918
@media(min-width: 1100px) {
890919
:root {

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

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ enum Kind(val name: String):
5757
case Trait(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList])
5858
extends Kind("trait") with Classlike
5959
case Enum(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList]) extends Kind("enum") with Classlike
60-
case EnumCase(kind: Object.type | Type | Val.type | Class) extends Kind("case")
60+
case EnumCase(kind: Object.type | Kind.Type | Val.type | Class) extends Kind("case")
6161
case Def(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList])
6262
extends Kind("def")
6363
case Extension(on: ExtensionTarget, m: Kind.Def) extends Kind("def")
@@ -117,15 +117,19 @@ case class TypeParameter(
117117
signature: Signature
118118
)
119119

120-
// TODO (longterm) properly represent signatures
121120
case class Link(name: String, dri: DRI)
122-
type Signature = Seq[String | Link]
123121

124-
object Signature:
125-
def apply(names: (String | Link)*): Signature = names // TO batter dotty shortcommings in union types
122+
sealed trait SignaturePart
126123

127-
extension (s: Signature)
128-
def join(a: Signature): Signature = s ++ a
124+
// TODO (longterm) properly represent signatures
125+
case class Type(name: String, dri: Option[DRI]) extends SignaturePart
126+
case class Keyword(name: String) extends SignaturePart
127+
case class Plain(txt: String) extends SignaturePart
128+
129+
type Signature = List[SignaturePart]
130+
131+
object Signature:
132+
def apply(names: (SignaturePart)*): Signature = names.toList
129133

130134
case class LinkToType(signature: Signature, dri: DRI, kind: Kind)
131135

@@ -230,8 +234,9 @@ extension (m: Module)
230234
extension (s: Signature)
231235
def getName: String =
232236
s.map {
233-
case s: String => s
234-
case l: Link => l.name
237+
case Plain(s) => s
238+
case Type(s, _) => s
239+
case Keyword(s) => s
235240
}.mkString
236241

237242
case class TastyMemberSource(path: java.nio.file.Path, lineNumber: Int)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,13 +280,13 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
280280
}.collect {
281281
case (Some(on), members) =>
282282
val typeSig = InlineSignatureBuilder()
283-
.text("extension ")
283+
.keyword("extension ")
284284
.generics(on.typeParams)
285285
.asInstanceOf[InlineSignatureBuilder].names.reverse
286286
val argsSig = InlineSignatureBuilder()
287287
.functionParameters(on.argsLists)
288288
.asInstanceOf[InlineSignatureBuilder].names.reverse
289-
val sig = typeSig ++ Signature(s"(${on.name}: ") ++ on.signature ++ Signature(")") ++ argsSig
289+
val sig = typeSig ++ Signature(Plain(s"(${on.name}: ")) ++ on.signature ++ Signature(Plain(")")) ++ argsSig
290290
MGroup(span(sig.map(renderElement)), members.sortBy(_.name).toSeq, on.name)
291291
}.toSeq
292292

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,9 @@ trait Resources(using ctx: DocContext) extends Locations, Writer:
127127
def searchData(pages: Seq[Page]) =
128128
def flattenToText(signature: Signature): String =
129129
signature.map {
130-
case Link(name, dri) => name
131-
case s: String => s
130+
case Type(name, dri) => name
131+
case Plain(s) => s
132+
case Keyword(s) => s
132133
}.mkString
133134

134135
def mkEntry(dri: DRI, name: String, text: String, descr: String, kind: String) = jsonObject(
@@ -145,7 +146,7 @@ trait Resources(using ctx: DocContext) extends Locations, Writer:
145146
val descr = m.dri.asFileLocation
146147
def processMember(member: Member): Seq[JSON] =
147148
val signatureBuilder = ScalaSignatureProvider.rawSignature(member, InlineSignatureBuilder()).asInstanceOf[InlineSignatureBuilder]
148-
val sig = Signature(member.kind.name, " ") ++ Seq(Link(member.name, member.dri)) ++ signatureBuilder.names.reverse
149+
val sig = Signature(Plain(s"${member.kind.name} "), Plain(member.name)) ++ signatureBuilder.names.reverse
149150
val entry = mkEntry(member.dri, member.name, flattenToText(sig), descr, member.kind.name)
150151
val children = member
151152
.membersBy(m => m.kind != Kind.Package && !m.kind.isInstanceOf[Classlike])

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

Lines changed: 8 additions & 5 deletions
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: String | (String, DRI) | Link) = renderElementWith(e)
18+
def renderElement(e: SignaturePart) = renderElementWith(e)
1919

2020
def renderLink(name: String, dri: DRI, modifiers: AppliedAttr*) =
2121
renderLinkContent(name, dri, modifiers:_*)
@@ -28,7 +28,10 @@ trait SignatureRenderer:
2828
case Some(link) => a(href := link, modifiers)(content)
2929
case _ => unresolvedLink(content, modifiers:_*)
3030

31-
def renderElementWith(e: String | (String, DRI) | Link, modifiers: AppliedAttr*) = e match
32-
case (name, dri) => renderLink(name, dri, modifiers:_*)
33-
case name: String => raw(name)
34-
case Link(name, dri) => renderLink(name, dri, modifiers:_*)
31+
def renderElementWith(e: SignaturePart, modifiers: AppliedAttr*) = e match
32+
case Type(name, Some(dri)) =>
33+
val attrs = Seq(Attr("t") := "t") ++ modifiers
34+
renderLink(name, dri, attrs:_*)
35+
case Type(name, None) => span(Attr("t") := "t")(name)
36+
case Keyword(name) => span(Attr("t") := "k")(name)
37+
case Plain(name) => raw(name)

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ trait ClassLikeSupport:
435435
val signature = contextBounds.get(name) match
436436
case None => boundsSignature
437437
case Some(contextBoundsSignature) =>
438-
boundsSignature ++ DSignature(" : ") ++ contextBoundsSignature
438+
boundsSignature ++ DSignature(Plain(" : ")) ++ contextBoundsSignature
439439

440440
TypeParameter(
441441
argument.symbol.getAnnotations(),
@@ -546,8 +546,8 @@ trait ClassLikeSupport:
546546
case Nil => Left((name, original))
547547
case typeParam :: _ =>
548548
val name = nameForRef(typeParam)
549-
val signature = Seq(s"([$name] =>> ") ++ original.asSignature ++ Seq(")")
550-
Right(name -> signature)
549+
val signature = Seq(Plain("(["), dotty.tools.scaladoc.Type(name, None), Plain("]"), Keyword(" =>> ")) ++ original.asSignature ++ Seq(Plain(")"))
550+
Right(name -> signature.toList)
551551
}
552552

553553
val newParams = notEvidences ++ paramsThatLookLikeContextBounds

0 commit comments

Comments
 (0)