Skip to content

Commit 91a2c1b

Browse files
committed
Automate publishing docs with intrincis types for stdlib
1 parent 35a4609 commit 91a2c1b

File tree

8 files changed

+462
-454
lines changed

8 files changed

+462
-454
lines changed

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

Lines changed: 0 additions & 414 deletions
This file was deleted.

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

Lines changed: 407 additions & 1 deletion
Large diffs are not rendered by default.

project/Build.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,7 @@ object Build {
790790
).mkString(File.pathSeparator),
791791
)
792792
},
793+
Compile / doc / scalacOptions += "-Ydocument-synthetic-types",
793794
scalacOptions -= "-Xfatal-warnings",
794795
ivyConfigurations += SourceDeps.hide,
795796
transitiveClassifiers := Seq("sources"),
@@ -1640,7 +1641,8 @@ object Build {
16401641
s"-source-links:" +
16411642
s"$stdLibRoot=github://scala/scala/v${stdlibVersion(Bootstrapped)}#src/library," +
16421643
s"docs=github://lampepfl/dotty/master#docs",
1643-
"-doc-root-content", docRootFile.toString
1644+
"-doc-root-content", docRootFile.toString,
1645+
"-Ydocument-synthetic-types"
16441646
)
16451647
))
16461648
}.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 in stdlib", true)
62+
6063
def scaladocSpecificSettings: Set[Setting[_]] =
6164
Set(sourceLinks, syntax, revision, externalDocumentationMappings, socialLinks, skipById, skipByRegex, deprecatedSkipPackages, docRootContent)

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/SyntheticSupport.scala

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,10 @@ trait SyntheticsSupport:
8383
import dotty.tools.dotc
8484
given dotc.core.Contexts.Context = qctx.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx
8585
val classdef = rdef.asInstanceOf[dotc.ast.tpd.TypeDef]
86-
classdef.symbol.info match
87-
case ci: dotc.core.Types.ClassInfo =>
88-
val ref = ci.appliedRef
89-
val baseTypes: List[(dotc.core.Symbols.Symbol, dotc.core.Types.Type)] =
90-
ref.baseClasses.map(b => b -> ref.baseType(b))
91-
baseTypes.asInstanceOf[List[(Symbol, TypeRepr)]]
92-
case _ =>
93-
List.empty
86+
val ref = classdef.symbol.info.asInstanceOf[dotc.core.Types.ClassInfo].appliedRef
87+
val baseTypes: List[(dotc.core.Symbols.Symbol, dotc.core.Types.Type)] =
88+
ref.baseClasses.map(b => b -> ref.baseType(b))
89+
baseTypes.asInstanceOf[List[(Symbol, TypeRepr)]]
9490
}
9591

9692
def hackExists(using Quotes)(rpos: qctx.reflect.Position) = {
@@ -102,9 +98,7 @@ trait SyntheticsSupport:
10298
pos.exists
10399
}
104100

105-
def getSupertypes(using Quotes)(c: ClassDef) = hackGetSupertypes(c) match
106-
case _ :: tail => tail
107-
case _ => List.empty
101+
def getSupertypes(using Quotes)(c: ClassDef) = hackGetSupertypes(c).tail
108102

109103
def typeForClass(c: ClassDef): TypeRepr =
110104
import qctx.reflect._

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

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -118,19 +118,25 @@ case class ScaladocTastyInspector()(using ctx: DocContext) extends DocTastyInspe
118118

119119
val defn = ctx.compilerContext.definitions
120120

121-
topLevels ++= Seq(
122-
defn.AnyClass,
123-
defn.MatchableClass,
124-
// defn.AnyRefAlias,
125-
defn.AnyKindClass,
126-
// defn.andType,
127-
// defn.orType,
128-
defn.AnyValClass,
129-
defn.NullClass,
130-
defn.NothingClass,
131-
defn.SingletonClass
132-
).map(s => "scala" -> parser.parseClasslike(s.asInstanceOf[parser.qctx.reflect.Symbol].tree.asInstanceOf[parser.qctx.reflect.ClassDef]))
133-
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)
134140

135141
def result(): (List[Member], Option[Comment]) =
136142
topLevels.clear()
@@ -149,6 +155,24 @@ case class ScaladocTastyInspector()(using ctx: DocContext) extends DocTastyInspe
149155
basePck.withMembers((basePck.members ++ rest).sortBy(_.name))
150156
}.toList -> rootDoc
151157

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" -> oM.copy(
163+
name = aM.name,
164+
// dri = aM.dri,
165+
signature = aM.signature,
166+
sources = aM.sources,
167+
origin = aM.origin,
168+
inheritedFrom = aM.inheritedFrom,
169+
graph = aM.graph,
170+
docs = aM.docs,
171+
directParents = aM.directParents,
172+
parents = aM.parents,
173+
knownChildren = aM.knownChildren,
174+
companion = aM.companion,
175+
)
152176
/** Parses a single Tasty compilation unit. */
153177
case class TastyParser(
154178
qctx: Quotes,
@@ -169,13 +193,6 @@ case class TastyParser(
169193
report.warning(throwableToString(e), tree.pos)
170194
None
171195

172-
// def processSymbol[T](sym: Symbol)(op: => T): Option[T] = try Option(op) catch
173-
// case t: Throwable =>
174-
// try report.warning(throwableToString(t), sym.tree.pos) catch
175-
// case _: Throwable =>
176-
// report.warning(s"Failed to process ${sym.fullName}:\n${throwableToString(t)}")
177-
// None
178-
179196
def parseRootTree(root: Tree): Seq[(String, Member)] =
180197
val docs = Seq.newBuilder[(String, Member)]
181198
object Traverser extends TreeTraverser:
@@ -201,5 +218,3 @@ case class TastyParser(
201218
e.printStackTrace()
202219

203220
docs.result()
204-
205-
// def parseClasslike(c: ClassDef): Member = parseClasslike(c)

0 commit comments

Comments
 (0)