summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/symtab/Flags.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/scala/tools/nsc/symtab/Flags.scala')
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Flags.scala191
1 files changed, 191 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Flags.scala b/src/compiler/scala/tools/nsc/symtab/Flags.scala
new file mode 100644
index 0000000000..2627640d2e
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/symtab/Flags.scala
@@ -0,0 +1,191 @@
+/* NSC -- new scala compiler
+ * Copyright 2005 LAMP/EPFL
+ * @author Martin Odersky
+ */
+// $Id$
+package scala.tools.nsc.symtab;
+
+object Flags {
+
+ // 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 CONTRAVARIANT = 0x00020000; // symbol is a contravariant type variable
+ final val ABSOVERRIDE = 0x00040000; // combination of abstract & override
+ final val LOCAL = 0x00080000; // symbol is local to current class.
+ // pre: PRIVATE is 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)
+ 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 CAPTURED = 0x40000000; // variable is accessed from nested function. Set by LambdaLift
+ final val BYNAMEPARAM = 0x40000000; // parameter is by name
+
+ final val LABEL = 0x80000000L; // method symbol is a label. Set by TailCall
+ final val INCONSTRUCTOR = 0x80000000L; // class symbol is defined in this/superclass constructor.
+
+ 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; // member has been mixed in
+
+ final val EXPANDEDNAME = 0x1000000000L; // name has been expanded with class suffix
+ final val IMPLCLASS = 0x2000000000L; // symbol is an implementation class
+ 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 notPRIVATE = (PRIVATE: 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 =
+ MODULE | PACKAGE | FINAL | JAVA;
+
+ final val ExplicitFlags = // these modifiers can be set explicitly in source programs.
+ PRIVATE | PROTECTED | ABSTRACT | FINAL | SEALED | OVERRIDE | CASE | IMPLICIT | ABSOVERRIDE;
+
+ final val PrintableFlags = // these modifiers appear in TreePrinter output.
+ (ExplicitFlags | LOCAL | SYNTHETIC | STABLE | CASEACCESSOR | ACCESSOR |
+ SUPERACCESSOR | PARAMACCESSOR | BRIDGE | STATIC);
+
+ final val FieldFlags = MUTABLE | CASEACCESSOR | PARAMACCESSOR | STATIC | FINAL;
+
+ final val AccessFlags = PRIVATE | PROTECTED;
+ final val VARIANCES = COVARIANT | CONTRAVARIANT;
+ final val ConstrFlags = JAVA;
+ final val PickledFlags = 0xFFFFFFFF;
+
+ /** Module flags inherited by their module-class */
+ final val ModuleToClassFlags = AccessFlags | PACKAGE | CASE;
+
+ def flagsToString(flags: long, suffixes: List[Pair[long, String]]): String =
+ (for (val i <- List.range(0, 63)) yield {
+ var s = flagToString(flags & (1L << i));
+ suffixes.find(._1.==(i)) match {
+ case Some(Pair(i, suffix)) => s = s + "[" + suffix + "]"
+ case None =>
+ }
+ s
+ }).filter("" !=).mkString("", " ", "");
+
+ def flagsToString(flags: long): String = flagsToString(flags, List());
+
+ private def flagToString(flag: long): String = {
+ if (flag == LABEL) "<label>"
+ else if (flag == INTERFACE) "<interface>"
+ else if (flag == IS_ERROR) "<is-error>"
+ else if (flag == OVERLOADED) "<overloaded>"
+ else if (flag == LIFTED) "<lifted>"
+ else if (flag == TRANS_FLAG) "<trans-flag>"
+ else if (flag == MIXEDIN) "<mixedin>"
+ else if (flag == EXPANDEDNAME) "<expandedname>"
+ else if (flag == LOCKED) "<locked>"
+ else if (flag == STATICMODULE) "<staticobject>"
+ else if (flag == STATICMEMBER) "<staticmember>"
+ 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 TRAIT => "<trait>"
+ case MODULE => "<module>"
+
+ case MUTABLE => "<mutable>"
+ case PARAM => "<param>"
+ case PACKAGE => "<package>"
+ case DEPRECATED => "<deprecated>"
+
+ case COVARIANT => "<covariant>"
+ case CONTRAVARIANT => "<contravariant>"
+ case ABSOVERRIDE => "abstract override"
+ case LOCAL => "<local>"
+
+ case JAVA => "<java>"
+ case SYNTHETIC => "<synthetic>"
+ case STABLE => "<stable>"
+ case STATIC => "<static>"
+
+ case CASEACCESSOR => "<caseaccessor>"
+ case ACCESSOR => "<accessor>"
+
+ case SUPERACCESSOR => "<superaccessor>"
+ case PARAMACCESSOR => "<paramaccessor>"
+ case BRIDGE => "<bridge>"
+ case CAPTURED => "<captured>"
+
+ case _ => ""
+ }
+ }
+ class Flag(mods : int) {
+ def isPrivate = ((mods & PRIVATE ) != 0);
+ def isProtected = ((mods & PROTECTED) != 0);
+ def isVariable = ((mods & MUTABLE) != 0);
+ def isPublic = !isPrivate && !isProtected;
+ }
+}