Skip to content

Commit a84a66a

Browse files
committed
Scaladoc: Option to fully disable capture checking
1 parent e26dc02 commit a84a66a

13 files changed

+40
-21
lines changed

project/Build.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3062,7 +3062,7 @@ object Build {
30623062
val overrideFunc = outputDirOverride.andThen(justAPI)
30633063

30643064
val config = Def.task {
3065-
overrideFunc(Scala3.value)
3065+
overrideFunc(Scala3.value) // .add(SuppressCC(true)) // <- turns off CC rendering completely
30663066
}
30673067

30683068
val writeAdditionalFiles = Def.task {

project/ScaladocGeneration.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ object ScaladocGeneration {
141141
def key: String = "-dynamic-side-menu"
142142
}
143143

144+
case class SuppressCC(value: Boolean) extends Arg[Boolean] {
145+
def key: String = "-suppressCC"
146+
}
147+
144148
import _root_.scala.reflect._
145149

146150
trait GenerationConfig {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ object Scaladoc:
4747
defaultTemplate: Option[String] = None,
4848
quickLinks: List[QuickLink] = List.empty,
4949
dynamicSideMenu: Boolean = false,
50+
suppressCC: Boolean = false, // suppress rendering anything related to experimental capture checking
5051
)
5152

5253
def run(args: Array[String], rootContext: CompilerContext): Reporter =
@@ -231,6 +232,7 @@ object Scaladoc:
231232
defaultTemplate.nonDefault,
232233
quickLinksParsed,
233234
dynamicSideMenu.get,
235+
suppressCC.get,
234236
)
235237
(Some(docArgs), newContext)
236238
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,5 +144,8 @@ class ScaladocSettings extends SettingGroup with AllScalaSettings:
144144
val dynamicSideMenu: Setting[Boolean] =
145145
BooleanSetting(RootSetting, "dynamic-side-menu", "Generate side menu via JS instead of embedding it in every html file", false)
146146

147+
val suppressCC: Setting[Boolean] =
148+
BooleanSetting(RootSetting, "suppressCC", "Suppress rendering anything related to experimental capture checking", false)
149+
147150
def scaladocSpecificSettings: Set[Setting[?]] =
148-
Set(sourceLinks, legacySourceLink, syntax, revision, externalDocumentationMappings, socialLinks, skipById, skipByRegex, deprecatedSkipPackages, docRootContent, snippetCompiler, generateInkuire, defaultTemplate, scastieConfiguration, quickLinks, dynamicSideMenu)
151+
Set(sourceLinks, legacySourceLink, syntax, revision, externalDocumentationMappings, socialLinks, skipById, skipByRegex, deprecatedSkipPackages, docRootContent, snippetCompiler, generateInkuire, defaultTemplate, scastieConfiguration, quickLinks, dynamicSideMenu, suppressCC)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
177177
cls := s"documentableName $depStyle",
178178
)
179179

180-
val signature: MemberSignature = signatureProvider.rawSignature(member)()
180+
val ctx = summon[DocContext]
181+
val signature: MemberSignature = signatureProvider.rawSignature(member)(!ctx.args.suppressCC)()
181182
val isSubtype = signature.suffix.exists {
182183
case Keyword(keyword) => keyword.contains("extends")
183184
case _ => false

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ trait Resources(using ctx: DocContext) extends Locations, Writer:
213213
val (res, pageName) = page.content match
214214
case m: Member if m.kind != Kind.RootPackage =>
215215
def processMember(member: Member, fqName: List[String]): Seq[(JSON, Seq[String])] =
216-
val signature: MemberSignature = signatureProvider.rawSignature(member)()
216+
val signature: MemberSignature = signatureProvider.rawSignature(member)(!ctx.args.suppressCC)()
217217
val sig = Signature(Plain(member.name)) ++ signature.suffix
218218
val descr = if member.kind == Kind.Package then "" else fqName.mkString(".")
219219
val extraDescr = member.docs.map(d => docPartRenderPlain(d.body)).getOrElse("")

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ trait BasicSupport:
4343
def getAnnotations(): List[Annotation] =
4444
// Custom annotations should be documented only if annotated by @java.lang.annotation.Documented
4545
// We allow also some special cases
46-
val fqNameAllowlist = Set(
46+
val fqNameAllowlist0 = Set(
4747
"scala.specialized",
4848
"scala.throws",
4949
"scala.transient",
@@ -54,9 +54,11 @@ trait BasicSupport:
5454
"scala.annotation.targetName",
5555
"scala.annotation.threadUnsafe",
5656
"scala.annotation.varargs",
57-
CaptureDefs.useAnnotFullName,
58-
CaptureDefs.consumeAnnotFullName,
5957
)
58+
val fqNameAllowlist =
59+
if ccEnabled then
60+
fqNameAllowlist0 + CaptureDefs.useAnnotFullName + CaptureDefs.consumeAnnotFullName
61+
else fqNameAllowlist0
6062
val documentedSymbol = summon[Quotes].reflect.Symbol.requiredClass("java.lang.annotation.Documented")
6163
val annotations = sym.annotations.filter { a =>
6264
a.tpe.typeSymbol.hasAnnotation(documentedSymbol) || fqNameAllowlist.contains(a.symbol.fullName)

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ trait ClassLikeSupport:
2121

2222
private given qctx.type = qctx
2323

24+
extension (symbol: Symbol) {
25+
def getExtraModifiers(): Seq[Modifier] =
26+
val mods = SymOps.getExtraModifiers(symbol)()
27+
if ccEnabled && symbol.flags.is(Flags.Mutable)then
28+
mods :+ Modifier.Update
29+
else
30+
mods
31+
}
32+
2433
private def bareClasslikeKind(using Quotes)(symbol: reflect.Symbol): Kind =
2534
import reflect._
2635
if symbol.flags.is(Flags.Module) then Kind.Object

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ trait PackageSupport:
1515

1616
def parsePackage(pck: PackageClause): (String, Member) =
1717
val name = pck.symbol.fullName
18-
ccFlag = false // FIXME: would be better if we had access to the tasty attribute
18+
ccFlag = false
1919
pck.stats.foreach {
2020
case CCImport() => ccFlag = true
2121
case _ =>

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ object SymOps:
100100
Flags.Case -> Modifier.Case,
101101
Flags.Opaque -> Modifier.Opaque,
102102
Flags.AbsOverride -> Modifier.AbsOverride,
103-
Flags.Mutable -> Modifier.Update, // under CC
104103
).collect {
105104
case (flag, mod) if sym.flags.is(flag) => mod
106105
}

0 commit comments

Comments
 (0)