Skip to content

Commit 9997bc0

Browse files
authored
Make caps.Capability non-experimental (#23507)
Closes #22745. Make `scala.caps.Capability` non-experimental. The `Capability` trait can be used as a marker trait even outside of capture-checking. Only when capture checking is enabled, the trait carries a special meaning, marking each instance a top-level capability. Other definitions inside the `scala.caps` package (the package is already non-experimental) stays experimental and can only be used with `-experimental` or with capture-checking enabled (with an import or with the feature flag).
1 parent d860725 commit 9997bc0

File tree

4 files changed

+30
-15
lines changed

4 files changed

+30
-15
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2112,8 +2112,8 @@ class Definitions {
21122112
*/
21132113
@tu lazy val ccExperimental: Set[Symbol] = Set(
21142114
CapsModule, CapsModule.moduleClass, PureClass,
2115-
Caps_Capability, // TODO: Remove when Capability is stabilized
2116-
Caps_Classifier, Caps_SharedCapability, Caps_Control, Caps_ExclusiveCapability, Caps_Mutable, Caps_Read,
2115+
/* Caps_Classifier, Caps_SharedCapability, Caps_Control, -- already stable */
2116+
Caps_ExclusiveCapability, Caps_Mutable, Caps_Read,
21172117
RequiresCapabilityAnnot,
21182118
captureRoot, Caps_CapSet, Caps_ContainsTrait, Caps_ContainsModule, Caps_ContainsModule.moduleClass,
21192119
ConsumeAnnot, UseAnnot, ReserveAnnot,

library/src/scala/caps/package.scala

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,43 +22,58 @@ import annotation.{experimental, compileTimeOnly, retainsCap}
2222
* But even without capture checking, extending this trait can be useful for documenting the intended purpose
2323
* of a class.
2424
*
25-
* Capability has exactly two subtraits: Shared and Exclusive.
25+
* Capability has exactly two subtraits: [[SharedCapability Shared]] and [[ExclusiveCapability Exclusive]].
2626
*/
27-
@experimental
2827
sealed trait Capability extends Any
2928

3029
/** A marker trait for classifier capabilities that can appear in `.only`
3130
* qualifiers. Capability classes directly extending `Classifier` are treated
32-
* as classifier capbilities
31+
* as classifier capbilities.
32+
*
33+
* [[Classifier]] has a formal meaning when
34+
* [[scala.language.experimental.captureChecking Capture Checking]]
35+
* is turned on. It should not be used outside of capture checking.
3336
*/
34-
@experimental
3537
trait Classifier
3638

3739
/** The universal capture reference. */
3840
@experimental
3941
object cap extends Capability
4042

4143
/** Marker trait for capabilities that can be safely shared in a concurrent context.
44+
*
45+
* [[SharedCapability]] has a formal meaning when
46+
* [[scala.language.experimental.captureChecking Capture Checking]]
47+
* is turned on.
4248
* During separation checking, shared capabilities are not taken into account.
4349
*/
44-
@experimental
4550
trait SharedCapability extends Capability, Classifier
4651

4752
@experimental
4853
type Shared = SharedCapability
4954

50-
/** Marker trait for exclusive capabilities that are separation-checked
55+
/** Marker trait for capabilities that should only be used by one concurrent process
56+
* at a given time. For example, write-access to a shared mutable buffer.
57+
*
58+
* [[ExclusiveCapability]] has a formal meaning when
59+
* [[scala.language.experimental.captureChecking Capture Checking]]
60+
* is turned on.
61+
* During separation checking, exclusive usage of marked capabilities will be enforced.
5162
*/
5263
@experimental
5364
trait ExclusiveCapability extends Capability, Classifier
5465

5566
@experimental
5667
type Exclusive = ExclusiveCapability
5768

58-
/** Base trait for capabilities that capture some continuation or return point in
59-
* the stack. Examples are exceptions, labels, Async, CanThrow.
69+
/** Marker trait for capabilities that capture some continuation or return point in
70+
* the stack. Examples are exceptions, [[scala.util.boundary.Label labels]], [[scala.CanThrow CanThrow]]
71+
* or Async contexts.
72+
*
73+
* [[Control]] has a formal meaning when
74+
* [[scala.language.experimental.captureChecking Capture Checking]]
75+
* is turned on.
6076
*/
61-
@experimental
6277
trait Control extends SharedCapability, Classifier
6378

6479
/** Marker trait for classes with methods that require an exclusive reference. */

project/MiMaFilters.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ object MiMaFilters {
2828
ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.onlyCapability"),
2929
ProblemFilters.exclude[MissingFieldProblem]("scala.runtime.stdLibPatches.language#experimental.separationChecking"),
3030
ProblemFilters.exclude[MissingClassProblem]("scala.runtime.stdLibPatches.language$experimental$separationChecking$"),
31+
ProblemFilters.exclude[MissingClassProblem]("scala.caps.Capability"),
32+
ProblemFilters.exclude[MissingClassProblem]("scala.caps.Classifier"),
33+
ProblemFilters.exclude[MissingClassProblem]("scala.caps.SharedCapability"),
34+
ProblemFilters.exclude[MissingClassProblem]("scala.caps.Control"),
3135
),
3236

3337
// Additions since last LTS

tests/run-tasty-inspector/stdlibExperimentalDefinitions.scala

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,13 @@ val experimentalDefinitionInLibrary = Set(
3232
"scala.annotation.retainsCap",
3333
"scala.Pure",
3434
"scala.caps.CapSet",
35-
"scala.caps.Capability",
36-
"scala.caps.Classifier",
3735
"scala.caps.Contains",
3836
"scala.caps.Contains$",
3937
"scala.caps.Contains$.containsImpl",
4038
"scala.caps.Exists",
41-
"scala.caps.SharedCapability",
4239
"scala.caps.ExclusiveCapability",
4340
"scala.caps.Mutable",
4441
"scala.caps.Read",
45-
"scala.caps.Control",
4642
"scala.caps.consume",
4743
"scala.caps.internal",
4844
"scala.caps.internal$",

0 commit comments

Comments
 (0)