summaryrefslogtreecommitdiff
path: root/src/library/scala/annotation/elidable.scala
blob: ef8c20b43bbb40ffeac41119264ccd429077407d (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
83
/*                     __                                               *\
**     ________ ___   / /  ___     Scala API                            **
**    / __/ __// _ | / /  / _ |    (c) 2002-2010, LAMP/EPFL             **
**  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
** /____/\___/_/ |_/____/_/ | |                                         **
**                          |/                                          **
\*                                                                      */

package scala.annotation

import java.util.logging.Level

/** An annotation for methods for which invocations might
 *  be removed in the generated code.
 *
 *  Behavior is influenced by passing -Xelide-below <arg>
 *  to scalac.  Methods marked elidable will be omitted from
 *  generated code if the priority given the annotation is lower
 *  than to the command line argument.  Examples:
 *  {{{
 *  import annotation.elidable._
 *
 *    @elidable(WARNING) def foo = log("foo")
 *    @elidable(FINE) def bar = log("bar")
 *
 *  scalac -Xelide-below=1000
 *  }}}
 *  @since 2.8
 */
final class elidable(final val level: Int) extends annotation.StaticAnnotation {}

/** This useless appearing code was necessary to allow people to use
 *  named constants for the elidable annotation.  This is what it takes
 *  to convince the compiler to fold the constants: otherwise when it's
 *  time to check an elision level it's staring at a tree like
 *    (Select(Level, Select(FINEST, Apply(intValue, Nil))))
 *  instead of the number 300.
 *
 *  @since 2.8
 */
object elidable {
  /** The levels ALL and OFF are confusing in this context because the
   *  sentiment being expressed when using the annotation is at cross purposes
   *  with the one being expressed via -Xelide-below.  This confusion reaches
   *  its zenith at level OFF, where the annotation means "never elide this method"
   *  but -Xelide-below OFF is how you would say "elide everything possible."
   *
   *  With no simple remedy at hand, the issue is now at least documented,
   *  and aliases MAXIMUM and MINIMUM are offered.
   */
  final val ALL     = Int.MinValue  // Level.ALL.intValue()
  final val FINEST  = 300           // Level.FINEST.intValue()
  final val FINER   = 400           // Level.FINER.intValue()
  final val FINE    = 500           // Level.FINE.intValue()
  final val CONFIG  = 700           // Level.CONFIG.intValue()
  final val INFO    = 800           // Level.INFO.intValue()
  final val WARNING = 900           // Level.WARNING.intValue()
  final val SEVERE  = 1000          // Level.SEVERE.intValue()
  final val OFF     = Int.MaxValue  // Level.OFF.intValue()

  // a couple aliases for the confusing ALL and OFF
  final val MAXIMUM = OFF
  final val MINIMUM = ALL

  // and we can add a few of our own
  final val ASSERTION = 2000    // we should make this more granular

  // for command line parsing so we can use names or ints
  val byName: Map[String, Int] = Map(
    "FINEST" -> FINEST,
    "FINER" -> FINER,
    "FINE" -> FINE,
    "CONFIG" -> CONFIG,
    "INFO" -> INFO,
    "WARNING" -> WARNING,
    "SEVERE" -> SEVERE,
    "ASSERTION" -> ASSERTION,
    "ALL" -> ALL,
    "OFF" -> OFF,
    "MAXIMUM" -> MAXIMUM,
    "MINIMUM" -> MINIMUM
  )
}