summaryrefslogtreecommitdiff
path: root/src/library/scala/reflect/api/Modifier.scala
blob: 1b67929e15008a10e24ebbfe4d3719a7d24ecedc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package scala.reflect.api

import collection.{ immutable, mutable }

abstract class Modifier private[api] () {
  def name: String
  def isKeyword: Boolean
  def sourceString: String = if (isKeyword) "`" + name + "`" else name

  override def equals(that: Any) = this eq that.asInstanceOf[AnyRef]
  override def hashCode = name.hashCode
  override def toString = name
}
final class SymbolModifier private (val name: String, val isKeyword: Boolean) extends Modifier {
  def this(name: String) = this(name, false)
}
final class SourceModifier private (val name: String) extends Modifier {
  def isKeyword = true
}

object SymbolModifier {
  private val seen = mutable.ListBuffer[SymbolModifier]()
  private[api] def apply(name: String): SymbolModifier = {
    val mod = name match {
      case "case" | "trait" => new SymbolModifier(name, isKeyword = true)
      case _                => new SymbolModifier(name)
    }
    seen += mod
    mod
  }
  private[api] def all = seen.toList
}
object SourceModifier {
  private val seen = mutable.ListBuffer[SourceModifier]()
  private[api] def apply(name: String): SourceModifier = {
    val mod = new SourceModifier(name)
    seen += mod
    mod
  }
  private[api] def all = seen.toList
}

object Modifier extends immutable.Set[Modifier] {
  val `abstract`       = SourceModifier("abstract")
  val `final`          = SourceModifier("final")
  val `implicit`       = SourceModifier("implicit")
  val `lazy`           = SourceModifier("lazy")
  val `macro`          = SourceModifier("macro")
  val `override`       = SourceModifier("override")
  val `private`        = SourceModifier("private")
  val `protected`      = SourceModifier("protected")
  val `sealed`         = SourceModifier("sealed")

  val `case`           = SymbolModifier("case")
  val `trait`          = SymbolModifier("trait")
  val abstractOverride = SymbolModifier("abstractOverride")
  val bynameParameter  = SymbolModifier("bynameParameter")
  val caseAccessor     = SymbolModifier("caseAccessor")
  val contravariant    = SymbolModifier("contravariant")
  val covariant        = SymbolModifier("covariant")
  val defaultInit      = SymbolModifier("defaultInit")
  val defaultParameter = SymbolModifier("defaultParameter")
  val deferred         = SymbolModifier("deferred")
  val interface        = SymbolModifier("interface")
  val java             = SymbolModifier("java")
  val local            = SymbolModifier("local")
  val mutable          = SymbolModifier("mutable")
  val paramAccessor    = SymbolModifier("paramAccessor")
  val parameter        = SymbolModifier("parameter")
  val preSuper         = SymbolModifier("preSuper")
  val static           = SymbolModifier("static")

  val sourceModifiers: Set[SourceModifier] = SourceModifier.all.toSet
  val symbolModifiers: Set[SymbolModifier] = SymbolModifier.all.toSet
  val allModifiers: Set[Modifier]          = sourceModifiers ++ symbolModifiers
  def values                               = allModifiers

  def contains(key: Modifier) = allModifiers(key)
  def iterator                = allModifiers.iterator
  def -(elem: Modifier)       = allModifiers - elem
  def +(elem: Modifier)       = allModifiers + elem
}