flags.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 254 行

SCALA
254
字号
/* NSC -- new Scala compiler * Copyright 2005-2007 LAMP/EPFL * @author  Martin Odersky */// $Id: Flags.scala 14550 2008-04-08 10:54:54Z odersky $package scala.tools.nsc.symtabobject Flags extends Enumeration {  // modifiers  final val IMPLICIT      = 0x00000001  final val FINAL         = 0x00000002  final val PRIVATE       = 0x00000004  final val PROTECTED     = 0x00000008  final val SEALED        = 0x00000010  final val OVERRIDE      = 0x00000020  final val CASE          = 0x00000040  final val ABSTRACT      = 0x00000080    // abstract class, or used in conjunction                                          // with abstract override.                                          // Note difference to DEFERRED!  final val DEFERRED      = 0x00000100    // was `abstract' for members  final val METHOD        = 0x00000200    // a method  final val MODULE        = 0x00000400    // symbol is module or class implementing a module  final val INTERFACE     = 0x00000800    // symbol is an interface  final val MUTABLE       = 0x00001000    // symbol is a mutable variable.  final val PARAM         = 0x00002000    // symbol is a (value or type) parameter to a method  final val PACKAGE       = 0x00004000    // symbol is a java package  final val DEPRECATED    = 0x00008000    // symbol is deprecated.  final val COVARIANT     = 0x00010000    // symbol is a covariant type variable  final val CAPTURED      = 0x00010000    // variable is accessed from nested function.                                          // Set by LambdaLift  final val BYNAMEPARAM   = 0x00010000    // parameter is by name  final val CONTRAVARIANT = 0x00020000    // symbol is a contravariant type variable  final val LABEL         = 0x00020000    // method symbol is a label. Set by TailCall  final val INCONSTRUCTOR = 0x00020000    // class symbol is defined in this/superclass                                          // constructor.  final val ABSOVERRIDE   = 0x00040000    // combination of abstract & override  final val LOCAL         = 0x00080000    // symbol is local to current class.                                          // pre: PRIVATE or PROTECTED are also set  final val JAVA          = 0x00100000    // symbol was defined by a Java class  final val SYNTHETIC     = 0x00200000    // symbol is compiler-generated  final val STABLE        = 0x00400000    // functions that are assumed to be stable                                          // (typically, access methods for valdefs)                                          // or classes that do not contain abstract types.  final val STATIC        = 0x00800000    // static field, method or class  final val CASEACCESSOR  = 0x01000000    // symbol is a case parameter (or its accessor)  final val TRAIT         = 0x02000000    // symbol is a trait  final val BRIDGE        = 0x04000000    // function is a bridge method. Set by Erasure  final val ACCESSOR      = 0x08000000    // a value or variable accessor  final val SUPERACCESSOR = 0x10000000    // a super accessor  final val PARAMACCESSOR = 0x20000000    // for value definitions: is an access method                                          // for a final val parameter                                          // for parameters: is a val parameter  final val MODULEVAR     = 0x40000000    // for variables: is the variable caching a module value  final val SYNTHETICMETH = 0x40000000    // for methods: synthetic method, but without SYNTHETIC flag  final val MONOMORPHIC   = 0x40000000    // for type symbols: does not have type parameters  final val LAZY          = 0x80000000L   // symbol is a lazy val. can't have MUTABLE unless transformed by typer  final val IS_ERROR      = 0x100000000L  // symbol is an error symbol  final val OVERLOADED    = 0x200000000L  // symbol is overloaded  final val LIFTED        = 0x400000000L  // class has been lifted out to package level                                          // local value has been lifted out to class level                                          // todo: make LIFTED = latePRIVATE?  final val MIXEDIN       = 0x800000000L  // term member has been mixed in  final val EXISTENTIAL   = 0x800000000L  // type is an existential parameter or skolem  final val EXPANDEDNAME  = 0x1000000000L // name has been expanded with class suffix  final val IMPLCLASS     = 0x2000000000L // symbol is an implementation class  final val PRESUPER      = 0x2000000000L // value is evaluated before super call  final val TRANS_FLAG    = 0x4000000000L // transient flag guaranteed to be reset                                          // after each phase.  final val LOCKED        = 0x8000000000L // temporary flag to catch cyclic dependencies  final val InitialFlags  = 0x000000FFFFFFFFFFL // flags that are enabled from phase 1.  final val LateFlags     = 0x000FFF0000000000L // flags that override flags in 0xFFF.  final val AntiFlags     = 0x7FF0000000000000L // flags that cancel flags in 0x7FF  final val LateShift     = 40L  final val AntiShift     = 52L  // late flags (set by a transformer phase)  final val latePRIVATE   = (PRIVATE: Long) << LateShift  final val lateDEFERRED  = (DEFERRED: Long) << LateShift  final val lateINTERFACE = (INTERFACE: Long) << LateShift  final val lateMODULE    = (MODULE: Long) << LateShift  final val lateFINAL     = (FINAL: Long) << LateShift  final val lateMETHOD    = (METHOD: Long) << LateShift    final val notFINAL      = (FINAL: Long) << AntiShift  final val notPRIVATE    = (PRIVATE: Long) << AntiShift  final val notDEFERRED   = (DEFERRED: Long) << AntiShift  final val notPROTECTED  = (PROTECTED: Long) << AntiShift  final val notABSTRACT   = (ABSTRACT: Long) << AntiShift  final val notOVERRIDE   = (OVERRIDE: Long) << AntiShift  final val notMETHOD     = (METHOD: Long) << AntiShift  final val STATICMODULE  = lateMODULE  final val STATICMEMBER  = notOVERRIDE  // masks  /** This flags can be set when class or module symbol is first created. */  final val TopLevelCreationFlags: Long =    MODULE | PACKAGE | FINAL | JAVA  /** These modifiers can be set explicitly in source programs. */  final val ExplicitFlags: Long =    PRIVATE | PROTECTED | ABSTRACT | FINAL | SEALED |    OVERRIDE | CASE | IMPLICIT | ABSOVERRIDE | LAZY  /** These modifiers appear in TreePrinter output. */  final val PrintableFlags: Long =    ExplicitFlags | LOCAL | SYNTHETIC | STABLE | CASEACCESSOR |    ACCESSOR | SUPERACCESSOR | PARAMACCESSOR | BRIDGE | STATIC  final val FieldFlags: Long =    MUTABLE | CASEACCESSOR | PARAMACCESSOR | STATIC | FINAL | PRESUPER | LAZY  final val AccessFlags: Long   = PRIVATE | PROTECTED  final val VARIANCES     = COVARIANT | CONTRAVARIANT  final val ConstrFlags: Long   = JAVA  final val PickledFlags: Long  = 0xFFFFFFFFL  /** Module flags inherited by their module-class */  final val ModuleToClassFlags: Long = AccessFlags | MODULE | PACKAGE | CASE | SYNTHETIC  private def listToString(ss: List[String]): String =    ss.filter("" !=).mkString("", " ", "")  def flagsToString(flags: Long): String =    listToString(for (i <- List.range(0, 63)) yield flagToString(flags & (1L << i)))  def flagsToString(flags: Long, privateWithin: String): String = {    var f = flags    val pw =      if (privateWithin == "") {        if ((flags & (PRIVATE | LOCAL)) == (PRIVATE | LOCAL)) {          f = f & ~(PRIVATE | LOCAL)          "private[this]"        } else if ((flags & (PROTECTED | LOCAL)) == (PROTECTED | LOCAL)) {          f = f & ~(PROTECTED | LOCAL)          "protected[this]"        } else {          ""        }      } else if ((f & PROTECTED) != 0) {        f = f & ~PROTECTED        "protected[" + privateWithin + "]"      } else {        "private[" + privateWithin + "]"      }    listToString(List(flagsToString(f), pw))  }  private def flagToString(flag: Long): String = {    if (flag == IS_ERROR) "<is-error>"    else if (flag == OVERLOADED  ) "<overloaded>"    else if (flag == LIFTED      ) "<lifted>"    else if (flag == MIXEDIN     ) "<mixedin/existential>"    else if (flag == EXPANDEDNAME) "<expandedname>"    else if (flag == IMPLCLASS   ) "<presuper/implclass>"    else if (flag == TRANS_FLAG  ) "<trans-flag>"    else if (flag == LOCKED      ) "<locked>"    else if (flag == LAZY        ) "lazy"    else flag.asInstanceOf[Int] match {      case IMPLICIT      => "implicit"      case FINAL         => "final"      case PRIVATE       => "private"      case PROTECTED     => "protected"      case SEALED        => "sealed"      case OVERRIDE      => "override"      case CASE          => "case"      case ABSTRACT      => "abstract"      case DEFERRED      => "<deferred>"      case METHOD        => "<method>"      case MODULE        => "<module>"      case INTERFACE     => "<interface>"      case MUTABLE       => "<mutable>"      case PARAM         => "<param>"      case PACKAGE       => "<package>"      case DEPRECATED    => "<deprecated>"      case COVARIANT     => "<covariant/captured/byname>"      case CONTRAVARIANT => "<contravariant/label/inconstr>"      case ABSOVERRIDE   => "abstract override"      case LOCAL         => "<local>"      case JAVA          => "<java>"      case SYNTHETIC     => "<synthetic>"      case STABLE        => "<stable>"      case STATIC        => "<static>"      case CASEACCESSOR  => "<caseaccessor>"      case TRAIT         => "<trait>"      case BRIDGE        => "<bridge>"      case ACCESSOR      => "<accessor>"      case SUPERACCESSOR => "<superaccessor>"      case PARAMACCESSOR => "<paramaccessor>"      case _ => ""    }  }  class Flag(mods: Long) {    def isPrivate   = (mods & PRIVATE  ) != 0    def isProtected = (mods & PROTECTED) != 0    def isVariable  = (mods &   MUTABLE) != 0    def isPublic    = !isPrivate && !isProtected  }  case class FlagEnum(mask: Long) extends Val(maskToBit(mask), flagToString(mask))  val Implicit      = FlagEnum(IMPLICIT)  val Final         = FlagEnum(FINAL)  val Private       = FlagEnum(PRIVATE)  val Protected     = FlagEnum(PROTECTED)  val Sealed        = FlagEnum(SEALED)  val Override      = FlagEnum(OVERRIDE)  val Case          = FlagEnum(CASE)  val Abstract      = FlagEnum(ABSTRACT)  val Deferred      = FlagEnum(DEFERRED)  val Method        = FlagEnum(METHOD)  val Module        = FlagEnum(MODULE)  val Interface     = FlagEnum(INTERFACE)  val Mutable       = FlagEnum(MUTABLE)  val Param         = FlagEnum(PARAM)  val Package       = FlagEnum(PACKAGE)  val Deprecated    = FlagEnum(DEPRECATED)  val Covariant     = FlagEnum(COVARIANT)  val Contravariant = FlagEnum(CONTRAVARIANT)  val AbsOverride   = FlagEnum(ABSOVERRIDE)  val Local         = FlagEnum(LOCAL)   val Synthetic     = FlagEnum(SYNTHETIC)  val Stable        = FlagEnum(STABLE)   val CaseAccessor  = FlagEnum(CASEACCESSOR)    val Trait         = FlagEnum(TRAIT)  val Bridge        = FlagEnum(BRIDGE)    val Accessor      = FlagEnum(ACCESSOR)   val SuperAccessor = FlagEnum(SUPERACCESSOR)  val ParamAccessor = FlagEnum(PARAMACCESSOR)    val ModuleVar     = FlagEnum(MODULEVAR)}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?