Skip to content

Commit 994ee72

Browse files
committed
Change scaladoc to the new syntax
1 parent 484369e commit 994ee72

File tree

7 files changed

+46
-25
lines changed

7 files changed

+46
-25
lines changed

docs/_docs/reference/experimental/capture-checking/classes.md

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -325,10 +325,10 @@ def test(): Unit =
325325
```
326326
Here, the initialization of `D` accesses the capability `out`. Therefore, the function value `() => D()` has type `() ->{out} D`.
327327

328-
The capabilities accessed during initialization of a class can be declared in the class with a `uses_init` clause, like this:
328+
The capabilities accessed during initialization of a class can be declared in the class with a `uses` clause, where each accessed capability is followed by `initially`, like this:
329329

330330
```scala sc-compile-with:classes-external-context
331-
class D() uses_init out:
331+
class D() uses out initially:
332332
val str: String =
333333
out.println("str was initialized")
334334
"abc"
@@ -338,17 +338,33 @@ def test(): Unit =
338338
()
339339
//}
340340
```
341-
A `uses_init` clause must be given if a class that is visible in other compilation units accesses capabilities during initialization. Like for `uses` clauses, this is to support separate compilation where we need to know the use set of a class instance creation without analyzing the internals of the class.
341+
If a class uses a capability initially in its constructor and also retains it for further
342+
use in the created instance, the capability appears twice in the `uses` clause, once with `initially`
343+
and once without.
344+
345+
```scala sc-compile-with:classes-external-context
346+
class D() uses out initially, out:
347+
val str: String =
348+
out.println("str was initialized")
349+
"abc"
350+
def print() = out.println(str)
351+
//{
352+
def test(): Unit =
353+
val _: () ->{out} D^{out} = () => D()
354+
()
355+
//}
356+
```
357+
A `uses` clause must be given if a class that is visible in other compilation units accesses capabilities during initialization. Like for regular `uses` clauses, this is to support separate compilation where we need to know the use set of a class instance creation without analyzing the internals of the class.
342358

343359
**Syntax**
344360

345-
`uses` clauses come after `extends` and `derives` clauses. `uses_init` clauses come after `uses` clauses.
361+
A `uses` clause comes after `extends` and `derives` clauses.
346362

347363
```
348364
InheritClauses ::= [‘extends’ ConstrApps]
349365
[‘derives’ QualId {‘,’ QualId}]
350-
[‘uses’ CaptureRef {‘,’ CaptureRef}]
351-
[‘uses_init’ CaptureRef {‘,’ CaptureRef}]
366+
[‘uses’ UseRef {‘,’ UseRef}]
367+
UseRef ::= CaptureRef [‘initially’]
352368
```
353369

354370

scaladoc-testcases/src/tests/i25529.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class A extends SharedCapability:
1010
object ObjA extends ExclusiveCapability:
1111
val a: A^ = A()
1212

13-
object ObjB uses_init ObjA: //expected: object ObjB uses_init ObjA
13+
object ObjB uses ObjA initially: //expected: object ObjB uses ObjA initially
1414
val x = ObjA.a.f()
1515

1616
object ObjC uses ObjA: //expected: object ObjC uses ObjA

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ object Annotation:
100100
case class LinkParameter(name: Option[String] = None, dri: DRI, value: String) extends AnnotationParameter
101101
case class UnresolvedParameter(name: Option[String] = None, unresolvedText: String) extends AnnotationParameter
102102

103-
case class UsesClause(keyword: String, signature: Signature)
103+
case class UsesClause(signature: Signature)
104104

105105
case class TermParameterList(
106106
parameters: Seq[TermParameter],
@@ -167,7 +167,7 @@ case class Member(
167167
visibility: Visibility = Visibility.Unrestricted,
168168
modifiers: Seq[Modifier] = Nil,
169169
annotations: List[Annotation] = Nil,
170-
usesClauses: List[UsesClause] = Nil,
170+
usesClause: Option[UsesClause] = None,
171171
signature: Signature = Signature(),
172172
sources: Option[TastyMemberSource] = None,
173173
origin: Origin = Origin.RegularlyDefined,

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,20 @@ trait ClassLikeSupport:
7373
else if classDef.symbol.flags.is(Flags.Enum) then Kind.Enum(typeArgs, args)
7474
else Kind.Class(typeArgs, args)
7575

76-
private def usesClausesFor(classDef: ClassDef): List[UsesClause] =
77-
def clauseFrom(symbol: Symbol, keyword: String): Option[UsesClause] =
76+
private def usesClauseFor(classDef: ClassDef): Option[UsesClause] =
77+
def clauseFrom(symbol: Symbol, initially: Boolean): Option[SSignature] =
7878
for
7979
annot <- symbol.annotations.find(_.tpe.typeSymbol.isRetains)
8080
refs <- retainedCaptureRefs(annot)
8181
if refs.nonEmpty
82-
yield UsesClause(keyword, emitCaptureRefsSignature(using qctx)(refs)(using classDef, classDef.symbol))
82+
yield emitCaptureRefsSignature(using qctx)(refs, addInitially = initially)(using classDef, classDef.symbol)
8383

84-
if !ccEnabled then Nil
84+
if !ccEnabled then None
8585
else
86-
val uses = clauseFrom(classDef.symbol, "uses")
87-
val usesInit = clauseFrom(classDef.constructor.symbol, "uses_init")
88-
List(uses, usesInit).flatten
86+
val constrUses = clauseFrom(classDef.constructor.symbol, initially = true)
87+
val classUses = clauseFrom(classDef.symbol, initially = false)
88+
val allUses = constrUses.getOrElse(Nil) ++ classUses.getOrElse(Nil)
89+
Option.unless(allUses.isEmpty)(UsesClause(allUses))
8990

9091
def mkClass(classDef: ClassDef)(
9192
dri: DRI = classDef.symbol.dri,
@@ -151,7 +152,7 @@ trait ClassLikeSupport:
151152
).copy(
152153
directParents = classDef.getParentsAsLinkToTypes,
153154
parents = supertypes,
154-
usesClauses = usesClausesFor(classDef)
155+
usesClause = usesClauseFor(classDef)
155156
)
156157

157158
if summon[DocContext].args.generateInkuire then doInkuireStuff(classDef)
@@ -569,7 +570,7 @@ trait ClassLikeSupport:
569570
visibility = symbol.getVisibility(),
570571
modifiers = modifiers,
571572
annotations = symbol.getAnnotations(),
572-
usesClauses = Nil,
573+
usesClause = None,
573574
signature = signature,
574575
sources = symbol.source,
575576
origin = origin,

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -550,12 +550,16 @@ trait TypesSupport:
550550
case ThisType(_) => List(Keyword("this"))
551551
case t => inner(t, skipThisTypePrefix)(using skipTypeSuffix = true, inCC = Some(Nil))
552552

553-
protected def emitCaptureRefsSignature(using Quotes)(refs: List[reflect.TypeRepr], skipThisTypePrefix: Boolean = false)(using elideThis: reflect.ClassDef, originalOwner: reflect.Symbol): SSignature =
553+
protected def emitCaptureRefsSignature(using Quotes)(refs: List[reflect.TypeRepr], skipThisTypePrefix: Boolean = false, addInitially: Boolean = false)(using elideThis: reflect.ClassDef, originalOwner: reflect.Symbol): SSignature =
554554
refs match
555555
case Nil => Nil
556556
case _ =>
557+
def emitRef(ref: reflect.TypeRepr) =
558+
val csig = emitCapability(ref, skipThisTypePrefix)
559+
if addInitially then csig ++ List(plain(" "), Keyword("initially"))
560+
else csig
557561
refs
558-
.map(emitCapability(_, skipThisTypePrefix))
562+
.map(emitRef)
559563
.reduce((left, right) => left ++ (Plain(", ") :: right))
560564

561565
private def emitCaptureSet(using Quotes)(refs: List[reflect.TypeRepr], skipThisTypePrefix: Boolean, omitCap: Boolean = true)(using elideThis: reflect.ClassDef, originalOwner: reflect.Symbol): SSignature =

scaladoc/src/dotty/tools/scaladoc/translators/ScalaSignatureProvider.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class ScalaSignatureProvider:
6161
.typeParamList(kind.typeParams)
6262
.functionTermParameters(kind.argsLists)
6363
.parentsSignature(member)
64-
.usesClauses(member)
64+
.usesClause(member)
6565
)
6666

6767

scaladoc/src/dotty/tools/scaladoc/translators/ScalaSignatureUtils.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@ case class SignatureBuilder(content: Signature = Nil) extends ScalaSignatureUtil
6969
val extendPart = keyword(" extends ").signature(extendType.signature)
7070
withTypes.foldLeft(extendPart)((bdr2, tpe) => bdr2.keyword(", ").signature(tpe.signature))
7171

72-
def usesClauses(member: Member): SignatureBuilder =
73-
member.usesClauses.foldLeft(this) { (bdr, clause) =>
74-
bdr.keyword(s" ${clause.keyword} ").signature(clause.signature)
75-
}
72+
def usesClause(member: Member): SignatureBuilder =
73+
member.usesClause match
74+
case None => this
75+
case Some(clause) => keyword(" uses ").signature(clause.signature)
7676

7777
def modifiersAndVisibility(t: Member) =
7878
val (prefixMods, suffixMods) = t.modifiers.partition(_.prefix)

0 commit comments

Comments
 (0)