@@ -2,106 +2,46 @@ package scala.tools.nsc.tasty
2
2
3
3
/** Flags from TASTy with no equivalent in scalac
4
4
*/
5
- trait TastyFlags { self =>
6
- type TastyFlagSet
7
- type SingletonSets [_]
8
-
9
- val EmptyFlags : TastyFlagSet
10
- val Erased : TastyFlagSet
11
- val Internal : TastyFlagSet
12
- val Inline : TastyFlagSet
13
- val InlineProxy : TastyFlagSet
14
- val Opaque : TastyFlagSet
15
- val Scala2x : TastyFlagSet
16
- val Extension : TastyFlagSet
17
- val Given : TastyFlagSet
18
- val Exported : TastyFlagSet
19
- val NoInits : TastyFlagSet
20
-
21
- protected def union (as : TastyFlagSet , bs : TastyFlagSet ): TastyFlagSet
22
- protected def intersect (as : TastyFlagSet , bs : TastyFlagSet ): TastyFlagSet
23
- protected def equal (set : TastyFlagSet , other : TastyFlagSet ): Boolean
24
- protected def remove (set : TastyFlagSet , mask : TastyFlagSet ): TastyFlagSet
25
- protected def toSingletonSets (multiset : TastyFlagSet ): SingletonSets [TastyFlagSet ]
26
- protected def map [A ](set : SingletonSets [TastyFlagSet ], f : TastyFlagSet => A ): Iterable [A ]
27
- }
28
-
29
5
object TastyFlags {
30
6
31
- type TastyFlagSet = Live .TastyFlagSet
32
- type SingletonSets [T ] = Live .SingletonSets [T ]
33
-
34
- implicit final class TastyFlagSetAPI (private val flagset : TastyFlagSet ) extends AnyVal {
35
-
36
- def toSingletonSets : SingletonSets [TastyFlagSet ] = Live .toSingletonSets(flagset)
37
- def | (other : TastyFlagSet ): TastyFlagSet = Live .union(flagset, other)
38
- def & (mask : TastyFlagSet ): TastyFlagSet = Live .intersect(flagset, mask)
39
- def === (set : TastyFlagSet ): Boolean = Live .equal(flagset, set)
40
- def &~ (mask : TastyFlagSet ): TastyFlagSet = Live .remove(flagset, mask)
41
- def unary_! : Boolean = flagset === Live .EmptyFlags
42
- def is (mask : TastyFlagSet ): Boolean = (flagset & mask).hasFlags
7
+ val EmptyFlags : TastyFlagSet = TastyFlagSet (0 )
8
+ val Erased : TastyFlagSet = TastyFlagSet (1 << 0 )
9
+ val Internal : TastyFlagSet = TastyFlagSet (1 << 1 )
10
+ val Inline : TastyFlagSet = TastyFlagSet (1 << 2 )
11
+ val InlineProxy : TastyFlagSet = TastyFlagSet (1 << 3 )
12
+ val Opaque : TastyFlagSet = TastyFlagSet (1 << 4 )
13
+ val Scala2x : TastyFlagSet = TastyFlagSet (1 << 5 )
14
+ val Extension : TastyFlagSet = TastyFlagSet (1 << 6 )
15
+ val Given : TastyFlagSet = TastyFlagSet (1 << 7 )
16
+ val Exported : TastyFlagSet = TastyFlagSet (1 << 8 )
17
+ val NoInits : TastyFlagSet = TastyFlagSet (1 << 9 )
18
+
19
+ case class TastyFlagSet private [TastyFlags ](private val flags : Int ) extends AnyVal {
20
+ def toSingletonSets : SingletonSets = SingletonSets (flags)
21
+ def | (other : TastyFlagSet ): TastyFlagSet = TastyFlagSet (flags | other.flags)
22
+ def & (mask : TastyFlagSet ): TastyFlagSet = TastyFlagSet (flags & mask.flags)
23
+ def &~ (mask : TastyFlagSet ): TastyFlagSet = TastyFlagSet (flags & ~ mask.flags)
24
+ def unary_! : Boolean = this == EmptyFlags
25
+ def is (mask : TastyFlagSet ): Boolean = (this & mask).hasFlags
43
26
def is (mask : TastyFlagSet , butNot : TastyFlagSet ): Boolean = if (! butNot) is(mask) else is(mask) && not(butNot)
44
27
def not (mask : TastyFlagSet ): Boolean = ! is(mask)
45
- def hasFlags : Boolean = ! (! flagset)
46
- def except (mask : TastyFlagSet ): (Boolean , TastyFlagSet ) = (is(mask), flagset &~ mask)
47
-
48
- def show : String = {
49
- import Live ._
50
- if (! flagset) " EmptyFlags"
51
- else flagset.toSingletonSets.map {
52
- case f if f === Erased => " Erased"
53
- case f if f === Internal => " Internal"
54
- case f if f === Inline => " Inline"
55
- case f if f === InlineProxy => " InlineProxy"
56
- case f if f === Opaque => " Opaque"
57
- case f if f === Scala2x => " Scala2x"
58
- case f if f === Extension => " Extension"
59
- case f if f === Given => " Given"
60
- case f if f === Exported => " Exported"
61
- case f if f === NoInits => " NoInits"
62
- }.mkString(" | " )
63
- }
64
-
65
- }
66
-
67
- implicit final class SingletonSetsAPI (private val flagsets : SingletonSets [TastyFlagSet ]) extends AnyVal {
68
- def map [A ](f : TastyFlagSet => A ): Iterable [A ] = Live .map(flagsets, f)
28
+ def hasFlags : Boolean = ! (! this )
29
+ def except (mask : TastyFlagSet ): (Boolean , TastyFlagSet ) = is(mask) -> (this &~ mask)
69
30
}
70
31
71
- val Live : TastyFlags = new TastyFlags {
72
-
73
- type TastyFlagSet = Int
74
- type SingletonSets [X ] = X
75
-
76
- val EmptyFlags = 0
77
- val Erased = 1 << 0
78
- val Internal = 1 << 1
79
- val Inline = 1 << 2
80
- val InlineProxy = 1 << 3
81
- val Opaque = 1 << 4
82
- val Scala2x = 1 << 5
83
- val Extension = 1 << 6
84
- val Given = 1 << 7
85
- val Exported = 1 << 8
86
- val NoInits = 1 << 9
87
-
88
- final def union (a : TastyFlagSet , b : TastyFlagSet ) = a | b
89
- final def intersect (a : TastyFlagSet , b : TastyFlagSet ) = a & b
90
- final def equal (set : TastyFlagSet , other : TastyFlagSet ) = set == other
91
- final def remove (set : TastyFlagSet , mask : TastyFlagSet ) = set & ~ mask
92
- final def toSingletonSets (set : TastyFlagSet ) = set
93
-
94
- final def map [A ](set : SingletonSets [TastyFlagSet ], f : TastyFlagSet => A ) = {
32
+ case class SingletonSets private [TastyFlags ](private val set : Int ) extends AnyVal {
33
+ def map [A ](f : TastyFlagSet => A ): Iterable [A ] = {
95
34
val buf = Iterable .newBuilder[A ]
96
35
var i = 0
97
36
while (i <= 9 ) {
98
37
val flag = 1 << i
99
38
if ((flag & set) != 0 ) {
100
- buf += f(flag)
39
+ buf += f(TastyFlagSet ( flag) )
101
40
}
102
41
i += 1
103
42
}
104
43
buf.result
105
44
}
106
45
}
46
+
107
47
}
0 commit comments