Skip to content

Commit 25c6d0a

Browse files
committed
Reimplemented Modifer.
Couldn't live with a scala.Enumeration being a permanent fixture in the reflection library. Rolled it by hand.
1 parent 7e6b18e commit 25c6d0a

File tree

8 files changed

+94
-44
lines changed

8 files changed

+94
-44
lines changed

src/compiler/scala/reflect/internal/Flags.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ class Flags extends ModifierFlags {
466466
}
467467
protected final val rawFlagPickledOrder: Array[Long] = pickledListOrder.toArray
468468

469-
def flagOfModifier(mod: Modifier.Value): Long = mod match {
469+
def flagOfModifier(mod: Modifier): Long = mod match {
470470
case Modifier.`protected` => PROTECTED
471471
case Modifier.`private` => PRIVATE
472472
case Modifier.`override` => OVERRIDE
@@ -496,13 +496,13 @@ class Flags extends ModifierFlags {
496496
case Modifier.bynameParameter => BYNAMEPARAM
497497
}
498498

499-
def flagsOfModifiers(mods: List[Modifier.Value]): Long =
499+
def flagsOfModifiers(mods: List[Modifier]): Long =
500500
(mods :\ 0L) { (mod, curr) => curr | flagOfModifier(mod) }
501501

502-
def modifierOfFlag(flag: Long): Option[Modifier.Value] =
502+
def modifierOfFlag(flag: Long): Option[Modifier] =
503503
Modifier.values find { mod => flagOfModifier(mod) == flag }
504504

505-
def modifiersOfFlags(flags: Long): List[Modifier.Value] =
505+
def modifiersOfFlags(flags: Long): List[Modifier] =
506506
pickledListOrder map (mask => modifierOfFlag(flags & mask)) flatMap { mod => mod }
507507
}
508508

src/compiler/scala/reflect/internal/Symbols.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,12 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
103103
def pos = rawpos
104104
def setPos(pos: Position): this.type = { this.rawpos = pos; this }
105105

106-
override def hasModifier(mod: Modifier.Value) =
106+
override def hasModifier(mod: Modifier) =
107107
hasFlag(flagOfModifier(mod)) &&
108108
(!(mod == Modifier.bynameParameter) || isTerm) &&
109109
(!(mod == Modifier.covariant) || isType)
110110

111-
override def allModifiers: Set[Modifier.Value] =
111+
override def allModifiers: Set[Modifier] =
112112
Modifier.values filter hasModifier
113113

114114
// ------ creators -------------------------------------------------------------------

src/compiler/scala/reflect/internal/Trees.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ trait Trees extends api.Trees { self: SymbolTable =>
7272
def withPosition(flag: Long, position: Position) =
7373
copy() setPositions positions + (flag -> position)
7474

75-
override def hasModifier(mod: Modifier.Value) =
75+
override def hasModifier(mod: Modifier) =
7676
hasFlag(flagOfModifier(mod))
77-
override def allModifiers: Set[Modifier.Value] =
77+
override def allModifiers: Set[Modifier] =
7878
Modifier.values filter hasModifier
7979
override def mapAnnotations(f: List[Tree] => List[Tree]): Modifiers =
8080
Modifiers(flags, privateWithin, f(annotations)) setPositions positions
@@ -85,7 +85,7 @@ trait Trees extends api.Trees { self: SymbolTable =>
8585
def Modifiers(flags: Long, privateWithin: Name): Modifiers = Modifiers(flags, privateWithin, List())
8686
def Modifiers(flags: Long): Modifiers = Modifiers(flags, tpnme.EMPTY)
8787

88-
def Modifiers(mods: Set[Modifier.Value],
88+
def Modifiers(mods: Set[Modifier],
8989
privateWithin: Name,
9090
annotations: List[Tree]): Modifiers = {
9191
val flagSet = mods map flagOfModifier

src/compiler/scala/tools/nsc/ast/ReifyPrinters.scala

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,6 @@ trait ReifyPrinters { self: NodePrinters =>
1818
object reifiedNodeToString extends Function1[Tree, String] {
1919
def apply(tree: Tree): String = {
2020
import scala.reflect.api.Modifier
21-
import scala.reflect.api.Modifier._
22-
23-
def copypasteModifier(mod: Modifier.Value): String = mod match {
24-
case mod @ (
25-
`protected` | `private` | `override` |
26-
`abstract` | `final` | `sealed` |
27-
`implicit` | `lazy` | `macro` |
28-
`case` | `trait`) => "`" + mod.toString + "`"
29-
case mod => mod.toString
30-
}
3121

3222
// @PP: I fervently hope this is a test case or something, not anything being
3323
// depended upon. Of more fragile code I cannot conceive.
@@ -47,7 +37,7 @@ trait ReifyPrinters { self: NodePrinters =>
4737
val buf = new StringBuilder
4838

4939
val flags = m.group(1).toLong
50-
val s_flags = Flags.modifiersOfFlags(flags) map copypasteModifier mkString ", "
40+
val s_flags = Flags.modifiersOfFlags(flags) map (_.sourceString) mkString ", "
5141
if (s_flags != "")
5242
buf.append("Set(" + s_flags + ")")
5343

@@ -63,7 +53,7 @@ trait ReifyPrinters { self: NodePrinters =>
6353
})
6454
s = """setInternalFlags\((\d+)L\)""".r.replaceAllIn(s, m => {
6555
val flags = m.group(1).toLong
66-
val mods = Flags.modifiersOfFlags(flags) map copypasteModifier
56+
val mods = Flags.modifiersOfFlags(flags) map (_.sourceString)
6757
"setInternalFlags(flagsOfModifiers(List(" + mods.mkString(", ") + ")))"
6858
})
6959

Lines changed: 77 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,82 @@
11
package scala.reflect.api
22

3-
object Modifier extends Enumeration {
3+
import collection.{ immutable, mutable }
44

5-
val `protected`, `private`, `override`, `abstract`, `final`,
6-
`sealed`, `implicit`, `lazy`, `macro`, `case`, `trait`,
7-
deferred, interface, mutable, parameter, covariant, contravariant,
8-
preSuper, abstractOverride, local, java, static, caseAccessor,
9-
defaultParameter, defaultInit, paramAccessor, bynameParameter = Value
5+
sealed abstract class Modifier {
6+
def name: String
7+
def isKeyword: Boolean
8+
def sourceString: String = if (isKeyword) "`" + name + "`" else name
109

10+
override def equals(that: Any) = this eq that.asInstanceOf[AnyRef]
11+
override def hashCode = name.hashCode
12+
override def toString = name
13+
}
14+
final class SymbolModifier private (val name: String, val isKeyword: Boolean) extends Modifier {
15+
def this(name: String) = this(name, false)
16+
}
17+
final class SourceModifier private (val name: String) extends Modifier {
18+
def isKeyword = true
19+
}
20+
21+
object SymbolModifier {
22+
private val seen = mutable.ListBuffer[SymbolModifier]()
23+
private[api] def apply(name: String): SymbolModifier = {
24+
val mod = name match {
25+
case "case" | "trait" => new SymbolModifier(name, isKeyword = true)
26+
case _ => new SymbolModifier(name)
27+
}
28+
seen += mod
29+
mod
30+
}
31+
private[api] def all = seen.toList
32+
}
33+
object SourceModifier {
34+
private val seen = mutable.ListBuffer[SourceModifier]()
35+
private[api] def apply(name: String): SourceModifier = {
36+
val mod = new SourceModifier(name)
37+
seen += mod
38+
mod
39+
}
40+
private[api] def all = seen.toList
41+
}
42+
43+
object Modifier extends immutable.Set[Modifier] {
44+
val `abstract` = SourceModifier("abstract")
45+
val `final` = SourceModifier("final")
46+
val `implicit` = SourceModifier("implicit")
47+
val `lazy` = SourceModifier("lazy")
48+
val `macro` = SourceModifier("macro")
49+
val `override` = SourceModifier("override")
50+
val `private` = SourceModifier("private")
51+
val `protected` = SourceModifier("protected")
52+
val `sealed` = SourceModifier("sealed")
53+
54+
val `case` = SymbolModifier("case")
55+
val `trait` = SymbolModifier("trait")
56+
val abstractOverride = SymbolModifier("abstractOverride")
57+
val bynameParameter = SymbolModifier("bynameParameter")
58+
val caseAccessor = SymbolModifier("caseAccessor")
59+
val contravariant = SymbolModifier("contravariant")
60+
val covariant = SymbolModifier("covariant")
61+
val defaultInit = SymbolModifier("defaultInit")
62+
val defaultParameter = SymbolModifier("defaultParameter")
63+
val deferred = SymbolModifier("deferred")
64+
val interface = SymbolModifier("interface")
65+
val java = SymbolModifier("java")
66+
val local = SymbolModifier("local")
67+
val mutable = SymbolModifier("mutable")
68+
val paramAccessor = SymbolModifier("paramAccessor")
69+
val parameter = SymbolModifier("parameter")
70+
val preSuper = SymbolModifier("preSuper")
71+
val static = SymbolModifier("static")
72+
73+
val sourceModifiers: Set[SourceModifier] = SourceModifier.all.toSet
74+
val symbolModifiers: Set[SymbolModifier] = SymbolModifier.all.toSet
75+
val allModifiers: Set[Modifier] = sourceModifiers ++ symbolModifiers
76+
def values = allModifiers
77+
78+
def contains(key: Modifier) = allModifiers(key)
79+
def iterator = allModifiers.iterator
80+
def -(elem: Modifier) = allModifiers - elem
81+
def +(elem: Modifier) = allModifiers + elem
1182
}

src/library/scala/reflect/api/Symbols.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ trait Symbols { self: Universe =>
99

1010
/** The modifiers of this symbol
1111
*/
12-
def allModifiers: Set[Modifier.Value]
12+
def allModifiers: Set[Modifier]
1313

1414
/** Does this symbol have given modifier?
1515
*/
16-
def hasModifier(mod: Modifier.Value): Boolean
16+
def hasModifier(mod: Modifier): Boolean
1717

1818
/** The owner of this symbol. This is the symbol
1919
* that directly contains the current symbol's definition.

src/library/scala/reflect/api/TreePrinters.scala

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,6 @@ trait TreePrinters { self: Universe =>
3131
// emits more or less verbatim representation of the provided tree
3232
// todo. when LiftCode becomes a macro, throw this code away and use that macro
3333
class RawTreePrinter(out: PrintWriter) extends TreePrinter {
34-
import scala.reflect.api.Modifier
35-
import scala.reflect.api.Modifier._
36-
37-
def copypasteModifier(mod: Modifier.Value): String = mod match {
38-
case mod @ (
39-
`protected` | `private` | `override` |
40-
`abstract` | `final` | `sealed` |
41-
`implicit` | `lazy` | `macro` |
42-
`case` | `trait`) => "`" + mod.toString + "`"
43-
case mod => mod.toString
44-
}
4534

4635
def print(args: Any*): Unit = args foreach {
4736
case EmptyTree =>
@@ -77,7 +66,7 @@ trait TreePrinters { self: Universe =>
7766
print(")")
7867
case mods: Modifiers =>
7968
val parts = collection.mutable.ListBuffer[String]()
80-
parts += "Set(" + mods.allModifiers.map{copypasteModifier}.mkString(", ") + ")"
69+
parts += "Set(" + mods.allModifiers.map(_.sourceString).mkString(", ") + ")"
8170
parts += "newTypeName(\"" + mods.privateWithin.toString + "\")"
8271
parts += "List(" + mods.annotations.map{showRaw}.mkString(", ") + ")"
8372

src/library/scala/reflect/api/Trees.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ trait Trees { self: Universe =>
1616
type Modifiers <: AbsModifiers
1717

1818
abstract class AbsModifiers {
19-
def hasModifier(mod: Modifier.Value): Boolean
20-
def allModifiers: Set[Modifier.Value]
19+
def hasModifier(mod: Modifier): Boolean
20+
def allModifiers: Set[Modifier]
2121
def privateWithin: Name // default: EmptyTypeName
2222
def annotations: List[Tree] // default: List()
2323
def mapAnnotations(f: List[Tree] => List[Tree]): Modifiers
2424
}
2525

26-
def Modifiers(mods: Set[Modifier.Value] = Set(),
26+
def Modifiers(mods: Set[Modifier] = Set(),
2727
privateWithin: Name = EmptyTypeName,
2828
annotations: List[Tree] = List()): Modifiers
2929

0 commit comments

Comments
 (0)