Skip to content

Commit d60bf45

Browse files
committed
CRs. Change logic to use definitions instead of show
1 parent 3c2b323 commit d60bf45

File tree

3 files changed

+40
-29
lines changed

3 files changed

+40
-29
lines changed

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

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,27 @@ trait JavadocAnchorCreator:
1111
import self.q.reflect._
1212

1313
private val javadocPrimitivesMap = Map(
14-
"scala.Int" -> "int",
15-
"scala.Float" -> "float",
16-
"scala.Double" -> "double",
17-
"scala.Long" -> "long",
18-
"scala.Byte" -> "byte",
19-
"scala.Boolean" -> "boolean",
20-
"scala.Char" -> "char",
21-
"scala.Short" -> "short",
22-
"<special-ops>.<FromJavaObject>" -> "java.lang.Object"
14+
defn.IntClass -> "int",
15+
defn.FloatClass -> "float",
16+
defn.DoubleClass -> "double",
17+
defn.LongClass -> "long",
18+
defn.ByteClass -> "byte",
19+
defn.BooleanClass -> "boolean",
20+
defn.CharClass -> "char",
21+
defn.ShortClass -> "short",
22+
defn.ObjectClass -> "java.lang.Object"
2323
)
2424

25-
private def transformPrimitiveType(s: String): String = javadocPrimitivesMap.getOrElse(s, s)
25+
private def transformPrimitiveType(tpe: TypeRepr): String = tpe.classSymbol
26+
.flatMap(javadocPrimitivesMap.get)
27+
.filter(_ => !tpe.typeSymbol.isTypeParam)
28+
.getOrElse(tpe.show)
2629

2730
private def transformType(tpe: TypeRepr): String = tpe.simplified match {
28-
case AppliedType(tpe, typeList) if tpe.show == "scala.Array" => transformType(typeList.head) + ":A"
29-
case AppliedType(tpe, typeList) if tpe.show == "scala.<repeated>" => transformType(typeList.head) + "..."
30-
case AppliedType(tpe, typeList) => transformPrimitiveType(tpe.show)
31-
case other => transformPrimitiveType(other.show)
31+
case AppliedType(tpe, typeList) if tpe.classSymbol.fold(false)(_ == defn.ArrayClass) => transformType(typeList.head) + ":A"
32+
case AppliedType(tpe, typeList) if tpe.classSymbol.fold(false)(_ == defn.RepeatedParamClass) => transformType(typeList.head) + "..."
33+
case AppliedType(tpe, typeList) => transformPrimitiveType(tpe)
34+
case other => transformPrimitiveType(other)
3235
}
3336

3437
def getJavadocType(s: TypeRepr) = transformType(s)

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,8 @@ trait PackageSupport:
88
import qctx.reflect._
99

1010
def parsePackage(pck: PackageClause): (String, Member) =
11-
val name = extractPackageName(pck.pid.show)
11+
val name = pck.symbol.fullName
1212
(name, Member(name, pck.symbol.dri, Kind.Package))
1313

1414
def parsePackageObject(pckObj: ClassDef): (String, Member) =
1515
pckObj.symbol.packageName -> parseClasslike(pckObj).withKind(Kind.Package)
16-
17-
private def extractPackageName(pidShowNoColor: String): String = {
18-
val pidSplit = pidShowNoColor.split("\\.")
19-
pidSplit.mkString("",".","")
20-
}

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

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,25 @@ package tasty
33

44
import scala.quoted._
55
import dotty.tools.scaladoc.util.Escape._
6+
import scala.collection.mutable.{ Map => MMap }
7+
import dotty.tools.io.AbstractFile
68

79
class SymOps[Q <: Quotes](val q: Q) extends JavadocAnchorCreator with Scaladoc2AnchorCreator:
810
import q.reflect._
911

1012
given Q = q
13+
14+
private val externalLinkCache: scala.collection.mutable.Map[AbstractFile, Option[ExternalDocLink]] = MMap()
15+
1116
extension (sym: Symbol)
1217
def packageName: String = (
1318
if (sym.isPackageDef) sym.fullName
1419
else sym.maybeOwner.packageName
1520
)
1621

22+
def packageNameSplitted: Seq[String] =
23+
sym.packageName.split('.').toList
24+
1725
def className: Option[String] =
1826
if (sym.isClassDef && !sym.flags.is(Flags.Package)) Some(
1927
Some(sym.maybeOwner).filter(s => s.exists).flatMap(_.className).fold("")(cn => cn + "$") + sym.name
@@ -110,11 +118,11 @@ class SymOps[Q <: Quotes](val q: Q) extends JavadocAnchorCreator with Scaladoc2A
110118
else termParamss(1).params(0)
111119
}
112120

113-
private def constructPath(location: String, anchor: Option[String], link: ExternalDocLink): String =
121+
private def constructPath(location: Seq[String], anchor: Option[String], link: ExternalDocLink): String =
114122
val extension = ".html"
115123
val docURL = link.documentationUrl.toString
116124
def constructPathForJavadoc: String =
117-
val l = "\\$+".r.replaceAllIn(location.replace(".","/"), _ => ".")
125+
val l = "\\$+".r.replaceAllIn(location.mkString("/"), _ => ".")
118126
val javadocAnchor = if anchor.isDefined then {
119127
val paramSigs = sym.paramSymss.flatten.map(_.tree).collect {
120128
case v: ValDef => v.tpt.tpe
@@ -125,15 +133,15 @@ class SymOps[Q <: Quotes](val q: Q) extends JavadocAnchorCreator with Scaladoc2A
125133

126134
//TODO #263: Add anchor support
127135
def constructPathForScaladoc2: String =
128-
val l = escapeUrl(location).replace(".", "/")
136+
val l = escapeUrl(location.mkString("/"))
129137
val scaladoc2Anchor = if anchor.isDefined then {
130138
"#" + getScaladoc2Type(sym.tree)
131139
} else ""
132140
docURL + l + extension + scaladoc2Anchor
133141

134142
// TODO Add tests for it!
135143
def constructPathForScaladoc3: String =
136-
val base = docURL + escapeUrl(location).replace(".", "/") + extension
144+
val base = docURL + escapeUrl(location.mkString("/")) + extension
137145
anchor.fold(base)(a => base + "#" + a)
138146

139147
link.kind match {
@@ -154,7 +162,7 @@ class SymOps[Q <: Quotes](val q: Q) extends JavadocAnchorCreator with Scaladoc2A
154162

155163
val className = sym.className
156164

157-
val location = className.fold(sym.packageName)(cn => s"${sym.packageName}.${cn}")
165+
val location = sym.packageNameSplitted ++ className
158166

159167
val anchor = sym.anchor
160168

@@ -163,13 +171,18 @@ class SymOps[Q <: Quotes](val q: Q) extends JavadocAnchorCreator with Scaladoc2A
163171
import dotty.tools.dotc
164172
given ctx: dotc.core.Contexts.Context = q.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx
165173
val csym = sym.asInstanceOf[dotc.core.Symbols.Symbol]
166-
Option(csym.associatedFile).map(_.path).flatMap( path =>
167-
dctx.externalDocumentationLinks.find(_.originRegexes.exists(r => r.matches(path)))
168-
).map(link => constructPath(location, anchor, link))
174+
val extLink = if externalLinkCache.contains(csym.associatedFile) then externalLinkCache(csym.associatedFile)
175+
else {
176+
val calculatedLink = Option(csym.associatedFile).map(_.path).flatMap( path =>
177+
dctx.externalDocumentationLinks.find(_.originRegexes.exists(r => r.matches(path))))
178+
externalLinkCache += (csym.associatedFile -> calculatedLink)
179+
calculatedLink
180+
}
181+
extLink.map(link => constructPath(location, anchor, link))
169182
}
170183

171184
DRI(
172-
location,
185+
location.mkString("."),
173186
anchor.getOrElse(""),
174187
externalLink = externalLink,
175188
// sym.show returns the same signature for def << = 1 and def >> = 2.

0 commit comments

Comments
 (0)