Skip to content

Commit 1ae8c01

Browse files
authored
Merge pull request #10955 from Philippus/align-opaque-type-aliases-code
Align Opaque Type Aliases code with docs
2 parents 3ff6678 + ca9f541 commit 1ae8c01

File tree

3 files changed

+40
-26
lines changed

3 files changed

+40
-26
lines changed

tests/neg/opaque-bounds.scala

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,20 @@ object Access {
1919
opaque type PermissionChoice = Int
2020
opaque type Permission <: Permissions & PermissionChoice = Int
2121

22-
extension (x: Permissions) def & (y: Permissions): Permissions = x & y
23-
extension (x: PermissionChoice) def | (y: PermissionChoice): PermissionChoice = x | y
24-
extension (x: Permissions) def is(y: Permissions) = (x & y) == y
25-
extension (x: Permissions) def isOneOf(y: PermissionChoice) = (x & y) != 0
22+
extension (x: Permissions)
23+
def & (y: Permissions): Permissions = x | y
24+
extension (x: PermissionChoice)
25+
def | (y: PermissionChoice): PermissionChoice = x | y
26+
extension (granted: Permissions)
27+
def is(required: Permissions) = (granted & required) == required
28+
extension (granted: Permissions)
29+
def isOneOf(required: PermissionChoice) = (granted & required) != 0
2630

2731
val NoPermission: Permission = 0
28-
val ReadOnly: Permission = 1
29-
val WriteOnly: Permission = 2
30-
val ReadWrite: Permissions = ReadOnly & WriteOnly
31-
val ReadOrWrite: PermissionChoice = ReadOnly | WriteOnly
32+
val Read: Permission = 1
33+
val Write: Permission = 2
34+
val ReadWrite: Permissions = Read | Write
35+
val ReadOrWrite: PermissionChoice = Read | Write
3236
}
3337

3438
object User {
@@ -39,7 +43,7 @@ object User {
3943
val p1: Permissions = ReadOrWrite // error
4044
val p2: PermissionChoice = ReadWrite // error
4145

42-
val x = Item(ReadOnly)
46+
val x = Item(Read)
4347

4448
assert( x.rights.is(ReadWrite) == false )
4549
assert( x.rights.isOneOf(ReadOrWrite) == true )

tests/neg/opaque.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ object logs {
4343
// This is the second way to unlift the logarithm type
4444
def toDouble: Double = math.exp(`this`)
4545
def +(that: Logarithm): Logarithm = Logarithm(math.exp(`this`) + math.exp(that))
46-
def *(that: Logarithm): Logarithm = Logarithm(`this` + that)
46+
def *(that: Logarithm): Logarithm = `this` + that
4747
}
4848
}
4949
}

tests/pos/reference/opaque.scala

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,10 @@ object Logarithms {
1212
}
1313

1414
// Extension methods define opaque types' public APIs
15-
extension (x: Logarithm) {
15+
extension (x: Logarithm)
1616
def toDouble: Double = math.exp(x)
1717
def + (y: Logarithm): Logarithm = Logarithm(math.exp(x) + math.exp(y))
18-
def * (y: Logarithm): Logarithm = Logarithm(x + y)
19-
}
18+
def * (y: Logarithm): Logarithm = x + y
2019
}
2120

2221
object LogTest {
@@ -36,31 +35,42 @@ object Access {
3635
opaque type PermissionChoice = Int
3736
opaque type Permission <: Permissions & PermissionChoice = Int
3837

39-
extension (x: Permissions) def & (y: Permissions): Permissions = x & y
40-
extension (x: PermissionChoice) def | (y: PermissionChoice): PermissionChoice = x | y
41-
extension (x: Permissions) def is(y: Permissions) = (x & y) == y
42-
extension (x: Permissions) def isOneOf(y: PermissionChoice) = (x & y) != 0
38+
extension (x: Permissions)
39+
def & (y: Permissions): Permissions = x | y
40+
extension (x: PermissionChoice)
41+
def | (y: PermissionChoice): PermissionChoice = x | y
42+
extension (granted: Permissions)
43+
def is(required: Permissions) = (granted & required) == required
44+
extension (granted: Permissions)
45+
def isOneOf(required: PermissionChoice) = (granted & required) != 0
4346

4447
val NoPermission: Permission = 0
45-
val ReadOnly: Permission = 1
46-
val WriteOnly: Permission = 2
47-
val ReadWrite: Permissions = ReadOnly & WriteOnly
48-
val ReadOrWrite: PermissionChoice = ReadOnly | WriteOnly
48+
val Read: Permission = 1
49+
val Write: Permission = 2
50+
val ReadWrite: Permissions = Read | Write
51+
val ReadOrWrite: PermissionChoice = Read | Write
4952
}
5053

5154
object User {
5255
import Access._
5356

5457
case class Item(rights: Permissions)
5558

56-
val x = Item(ReadOnly) // OK, since Permission <: Permissions
59+
val roItem = Item(Read) // OK, since Permission <: Permissions
60+
val rwItem = Item(ReadWrite)
61+
val noItem = Item(NoPermission)
5762

58-
assert( x.rights.is(ReadWrite) == false )
59-
assert( x.rights.isOneOf(ReadOrWrite) == true )
63+
assert( roItem.rights.is(ReadWrite) == false )
64+
assert( roItem.rights.isOneOf(ReadOrWrite) == true )
6065

61-
// Would be a type error:
62-
// assert( x.rights.isOneOf(ReadWrite) == true )
66+
assert( rwItem.rights.is(ReadWrite) == true )
67+
assert( rwItem.rights.isOneOf(ReadOrWrite) == true )
6368

69+
assert( noItem.rights.is(ReadWrite) == false )
70+
assert( noItem.rights.isOneOf(ReadOrWrite) == false )
71+
72+
// Would be a type error:
73+
// assert( roItem.rights.isOneOf(ReadWrite) == true )
6474
}
6575

6676
object o {

0 commit comments

Comments
 (0)