Skip to content

Commit c69e850

Browse files
committed
Change syntax of cap parameters and members
`cap` is now a soft modifier and we abolish separate cap lists.
1 parent 38304c6 commit c69e850

18 files changed

+142
-170
lines changed

compiler/src/dotty/tools/dotc/ast/untpd.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
234234

235235
case class Tracked()(implicit @constructorOnly src: SourceFile) extends Mod(Flags.Tracked)
236236

237+
case class CaptureParam()(implicit @constructorOnly src: SourceFile) extends Mod(Flags.CaptureParam)
238+
237239
/** Used under pureFunctions to mark impure function types `A => B` in `FunctionWithMods` */
238240
case class Impure()(implicit @constructorOnly src: SourceFile) extends Mod(Flags.Impure)
239241
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,9 @@ object Flags {
380380
/** Tracked modifier for class parameter / a class with some tracked parameters */
381381
val (Tracked @ _, _, Dependent @ _) = newFlags(46, "tracked")
382382

383+
/** Cap modifier for capture-set parameters and capture-set members */
384+
val (_, _, CaptureParam @ _) = newFlags(47, "cap")
385+
383386
// ------------ Flags following this one are not pickled ----------------------------------
384387

385388
/** Symbol is not a member of its owner */

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 71 additions & 104 deletions
Large diffs are not rendered by default.

compiler/src/dotty/tools/dotc/parsing/Scanners.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1209,7 +1209,7 @@ object Scanners {
12091209

12101210
def isSoftModifier: Boolean =
12111211
token == IDENTIFIER
1212-
&& (softModifierNames.contains(name) || name == nme.erased && erasedEnabled || name == nme.tracked && trackedEnabled)
1212+
&& (softModifierNames.contains(name) || name == nme.erased && erasedEnabled || name == nme.tracked && trackedEnabled || name == nme.cap && Feature.ccEnabled)
12131213

12141214
def isSoftModifierInModifierPosition: Boolean =
12151215
isSoftModifier && inModifierPosition()
Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
import caps.*
22

3-
trait Abstract[X^]:
4-
cap C >: X
3+
trait Abstract[cap X]:
4+
cap type C >: {X}
55
// Don't test the return type using Unit, because it is a pure type.
66
def boom(): AnyRef^{C}
77

8-
class Concrete extends Abstract[CapSet^{}]:
9-
cap C = {}
8+
class Concrete extends Abstract[{}]:
9+
cap type C = {}
1010
// TODO: Why do we get error without the return type here?
1111
def boom(): AnyRef = new Object
1212

13-
class Concrete2 extends Abstract[CapSet^{}]:
14-
cap C = {}
13+
class Concrete2 extends Abstract[{}]:
14+
cap type C = {}
1515
def boom(): AnyRef^ = new Object // error
1616

17-
class Concrete3 extends Abstract[CapSet^{}]:
17+
class Concrete3 extends Abstract[{}]:
1818
def boom(): AnyRef = new Object
1919

20-
class Concrete4(a: AnyRef^) extends Abstract[CapSet^{a}]:
21-
cap C = {} // error
20+
class Concrete4(a: AnyRef^) extends Abstract[{a}]:
21+
cap type C = {} // error
2222
def boom(): AnyRef^{a} = a // error
2323

24-
class Concrete5(a: AnyRef^, b: AnyRef^) extends Abstract[CapSet^{a}]:
25-
cap C = a
24+
class Concrete5(a: AnyRef^, b: AnyRef^) extends Abstract[{a}]:
25+
cap type C = {a}
2626
def boom(): AnyRef^{b} = b // error
2727

28-
class Concrete6(a: AnyRef^, b: AnyRef^) extends Abstract[CapSet^{a}]:
28+
class Concrete6(a: AnyRef^, b: AnyRef^) extends Abstract[{a}]:
2929
def boom(): AnyRef^{b} = b // error
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
-- Error: tests/neg-custom-args/captures/capset-members2.scala:4:7 -----------------------------------------------------
2-
4 | cap C[T] // error
3-
| ^
4-
| 'cap' declarations cannot have type parameters
1+
-- Error: tests/neg-custom-args/captures/capset-members2.scala:4:12 ----------------------------------------------------
2+
4 | cap type C[T] // error
3+
| ^
4+
| 'cap type' declarations cannot have type parameters
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import caps.*
22

33
trait Foo:
4-
cap C[T] // error
4+
cap type C[T] // error
55

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
-- [E209] Syntax Error: tests/neg-custom-args/captures/capset-members3.scala:4:8 ---------------------------------------
2-
4 | cap C _ // error
3-
| ^
4-
| =, >:, or <: expected, but '_' found
1+
-- [E209] Syntax Error: tests/neg-custom-args/captures/capset-members3.scala:4:13 --------------------------------------
2+
4 | cap type C _ // error
3+
| ^
4+
| =, >:, or <: expected, but '_' found
55
|
66
| longer explanation available when compiling with `-explain`
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import caps.*
22

33
trait Foo:
4-
cap C _ // error
4+
cap type C _ // error
55

tests/pending/cap-paramlists8.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ def test =
77
val y: Any^ = ???
88
object O:
99
val z: Any^ = ???
10-
val baz3 = (i: Int) => [cap C, D <: C, E <: {C,x}] => () => [cap F >: {x,y} <: {C,E} : Ctx] => (x: Int) => 1
10+
val baz3 = (i: Int) => [cap C, cap D <: {C}, cap E <: {C,x}] => () => [cap F >: {x,y} <: {C,E} : Ctx] => (x: Int) => 1

0 commit comments

Comments
 (0)