Skip to content

Commit 041c7b2

Browse files
authored
Merge pull request #11674 from BarkingBad/scaladoc/intrinsic-definitions
Add documentation for intrinsic types
2 parents 422ffbc + a591808 commit 041c7b2

File tree

9 files changed

+436
-19
lines changed

9 files changed

+436
-19
lines changed

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 388 additions & 0 deletions
Large diffs are not rendered by default.

project/Build.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,7 @@ object Build {
784784
).mkString(File.pathSeparator),
785785
)
786786
},
787+
Compile / doc / scalacOptions += "-Ydocument-synthetic-types",
787788
scalacOptions -= "-Xfatal-warnings",
788789
ivyConfigurations += SourceDeps.hide,
789790
transitiveClassifiers := Seq("sources"),
@@ -1638,7 +1639,8 @@ object Build {
16381639
s"-source-links:" +
16391640
s"$stdLibRoot=github://scala/scala/v${stdlibVersion(Bootstrapped)}#src/library," +
16401641
s"docs=github://lampepfl/dotty/master#docs",
1641-
"-doc-root-content", docRootFile.toString
1642+
"-doc-root-content", docRootFile.toString,
1643+
"-Ydocument-synthetic-types"
16421644
)
16431645
))
16441646
}.evaluated,

scaladoc/src/dotty/tools/scaladoc/Scaladoc.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ object Scaladoc:
4242
socialLinks: List[SocialLinks] = Nil,
4343
identifiersToSkip: List[String] = Nil,
4444
regexesToSkip: List[String] = Nil,
45-
rootDocPath: Option[String] = None
45+
rootDocPath: Option[String] = None,
46+
documentSyntheticTypes: Boolean = false,
4647
)
4748

4849
def run(args: Array[String], rootContext: CompilerContext): Reporter =
@@ -171,7 +172,8 @@ object Scaladoc:
171172
socialLinksParsed,
172173
skipById.get ++ deprecatedSkipPackages.get,
173174
skipByRegex.get,
174-
docRootContent.nonDefault
175+
docRootContent.nonDefault,
176+
YdocumentSyntheticTypes.get
175177
)
176178
(Some(docArgs), newContext)
177179
}

scaladoc/src/dotty/tools/scaladoc/ScaladocSettings.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,8 @@ class ScaladocSettings extends SettingGroup with CommonScalaSettings:
5757
val docRootContent: Setting[String] =
5858
StringSetting("-doc-root-content", "path", "The file from which the root package documentation should be imported.", "")
5959

60+
val YdocumentSyntheticTypes: Setting[Boolean] =
61+
BooleanSetting("-Ydocument-synthetic-types", "Documents intrinsic types e. g. Any, Nothing. Setting is useful only for stdlib", false)
62+
6063
def scaladocSpecificSettings: Set[Setting[_]] =
6164
Set(sourceLinks, syntax, revision, externalDocumentationMappings, socialLinks, skipById, skipByRegex, deprecatedSkipPackages, docRootContent)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class DocRender(signatureRenderer: SignatureRenderer)(using DocContext):
4646
case 5 => h5(content)
4747
case 6 => h6(content)
4848
case Paragraph(text) => p(renderElement(text))
49-
case Code(data: String) => code(raw(data)) // TODO add classes
49+
case Code(data: String) => pre(code(raw(data))) // TODO add classes
5050
case HorizontalRule => hr
5151

5252
case UnorderedList(items) => ul(listItems(items))

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ trait ClassLikeSupport:
146146
Some(parseMethod(c, dd.symbol))
147147

148148
case td: TypeDef if !td.symbol.flags.is(Flags.Synthetic) && (!td.symbol.flags.is(Flags.Case) || !td.symbol.flags.is(Flags.Enum)) =>
149-
Some(parseTypeDef(c, td))
149+
Some(parseTypeDef(td))
150150

151151
case vd: ValDef if !isSyntheticField(vd.symbol)
152152
&& (!vd.symbol.flags.is(Flags.Case) || !vd.symbol.flags.is(Flags.Enum))
@@ -306,7 +306,7 @@ trait ClassLikeSupport:
306306

307307
val enumTypes = companion.membersToDocument.collect {
308308
case td: TypeDef if !td.symbol.flags.is(Flags.Synthetic) && td.symbol.flags.is(Flags.Enum) && td.symbol.flags.is(Flags.Case) => td
309-
}.toList.map(parseTypeDef(classDef, _))
309+
}.toList.map(parseTypeDef)
310310

311311
val enumNested = companion.membersToDocument.collect {
312312
case c: ClassDef if c.symbol.flags.is(Flags.Case) && c.symbol.flags.is(Flags.Enum) => processTree(c)(parseClasslike(c))
@@ -405,7 +405,7 @@ trait ClassLikeSupport:
405405
memberInfo.get(name).fold(argument.rhs.asSignature)(_.asSignature)
406406
)
407407

408-
def parseTypeDef(c: ClassDef, typeDef: TypeDef): Member =
408+
def parseTypeDef(typeDef: TypeDef): Member =
409409
def isTreeAbstract(typ: Tree): Boolean = typ match {
410410
case TypeBoundsTree(_, _) => true
411411
case LambdaTypeTree(params, body) => isTreeAbstract(body)

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,13 @@ class SymOps[Q <: Quotes](val q: Q) extends JavadocAnchorCreator with Scaladoc2A
160160
else if (sym.maybeOwner.isDefDef) Some(sym.owner)
161161
else None
162162

163-
val className = sym.className
163+
val (className, anchor) = if sym.fullName == "scala.AnyRef" then // hacking relocation for synthetic `type AnyRef`
164+
(Some("AnyRef"), None)
165+
else
166+
(sym.className, sym.anchor)
164167

165168
val location = sym.packageNameSplitted ++ className
166169

167-
val anchor = sym.anchor
168-
169170
val externalLink = {
170171
import q.reflect._
171172
import dotty.tools.dotc

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

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,27 @@ case class ScaladocTastyInspector()(using ctx: DocContext) extends DocTastyInspe
116116
topLevels ++= parser.parseRootTree(treeRoot)
117117
}
118118

119+
val defn = ctx.compilerContext.definitions
120+
121+
if ctx.args.documentSyntheticTypes then
122+
val intrinsicClassDefs = Seq(
123+
defn.AnyClass,
124+
defn.MatchableClass,
125+
defn.AnyKindClass,
126+
defn.AnyValClass,
127+
defn.NullClass,
128+
defn.NothingClass,
129+
defn.SingletonClass,
130+
defn.andType,
131+
defn.orType,
132+
).map { s =>
133+
"scala" -> s.asInstanceOf[parser.qctx.reflect.Symbol].tree.match {
134+
case cd: parser.qctx.reflect.ClassDef => parser.parseClasslike(cd)
135+
case td: parser.qctx.reflect.TypeDef => parser.parseTypeDef(td)
136+
}
137+
}
138+
topLevels ++= intrinsicClassDefs
139+
topLevels += mergeAnyRefAliasAndObject(parser)
119140

120141
def result(): (List[Member], Option[Comment]) =
121142
topLevels.clear()
@@ -134,6 +155,14 @@ case class ScaladocTastyInspector()(using ctx: DocContext) extends DocTastyInspe
134155
basePck.withMembers((basePck.members ++ rest).sortBy(_.name))
135156
}.toList -> rootDoc
136157

158+
def mergeAnyRefAliasAndObject(parser: TastyParser) =
159+
val defn = ctx.compilerContext.definitions
160+
val oM = parser.parseClasslike(defn.ObjectClass.asInstanceOf[parser.qctx.reflect.Symbol].tree.asInstanceOf[parser.qctx.reflect.ClassDef])
161+
val aM = parser.parseTypeDef(defn.AnyRefAlias.asInstanceOf[parser.qctx.reflect.Symbol].tree.asInstanceOf[parser.qctx.reflect.TypeDef])
162+
"scala" -> aM.copy(
163+
kind = oM.kind,
164+
members = oM.members
165+
)
137166
/** Parses a single Tasty compilation unit. */
138167
case class TastyParser(
139168
qctx: Quotes,
@@ -154,13 +183,6 @@ case class TastyParser(
154183
report.warning(throwableToString(e), tree.pos)
155184
None
156185

157-
def processSymbol[T](sym: Symbol)(op: => T): Option[T] = try Option(op) catch
158-
case t: Throwable =>
159-
try report.warning(throwableToString(t), sym.tree.pos) catch
160-
case _: Throwable =>
161-
report.warning(s"Failed to process ${sym.fullName}:\n${throwableToString(t)}")
162-
None
163-
164186
def parseRootTree(root: Tree): Seq[(String, Member)] =
165187
val docs = Seq.newBuilder[(String, Member)]
166188
object Traverser extends TreeTraverser:
@@ -186,4 +208,3 @@ case class TastyParser(
186208
e.printStackTrace()
187209

188210
docs.result()
189-

scaladoc/src/dotty/tools/scaladoc/util/html.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ object HTML:
8383
val ol = Tag("ol")
8484
val li = Tag("li")
8585
val code = Tag("code")
86-
86+
val pre = Tag("pre")
8787

8888
val cls = Attr("class")
8989
val href = Attr("href")

0 commit comments

Comments
 (0)