From 94e2c9413def4c6545cfe38ed7b8a5b44bdd6456 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Mon, 25 Feb 2013 12:49:37 +0100 Subject: Completed implementation of Flags Including translation from Scala 2.x flags. --- src/dotty/tools/dotc/core/Flags.scala | 262 +++++++++++++++++++--------------- 1 file changed, 144 insertions(+), 118 deletions(-) (limited to 'src/dotty/tools/dotc/core/Flags.scala') diff --git a/src/dotty/tools/dotc/core/Flags.scala b/src/dotty/tools/dotc/core/Flags.scala index bded3e822..31062247d 100644 --- a/src/dotty/tools/dotc/core/Flags.scala +++ b/src/dotty/tools/dotc/core/Flags.scala @@ -99,12 +99,20 @@ object Flags { private final val TYPES = 1 << TYPEindex private final val KINDFLAGS = TERMS | TYPES + private final val FirstFlag = 2 + private final val FirstNotPickledFlag = 48 private final val MaxFlag = 63 private var flagName = Array.fill(64, 2)("") private val kindIndices = Set(TERMindex, TYPEindex) + private def isDefinedAsFlag(idx: Int) = flagName(idx) exists (_.nonEmpty) + + private def flagRange(start: Int, end: Int) = + FlagSet((KINDFLAGS.toLong /: (start until end)) ((bits, idx) => + if (isDefinedAsFlag(idx)) bits | (1L << idx) else bits)) + /** The flag with given index between 2 and 63 which applies to terms. * Installs given name as the name of the flag. */ def termFlag(index: Int, name: String): FlagSet = { @@ -164,153 +172,165 @@ object Flags { final val Method = termFlag(7, "") /** Labeled with `abstract` modifier (an abstract class) */ - final val Abstract = typeFlag(8, "abstract") + final val Abstract = typeFlag(7, "abstract") + + /** A (term or type) parameter to a class or method */ + final val Param = commonFlag(8, "") + final val TermParam = Param.toTermFlags + final val TypeParam = Param.toTypeFlags + + /** Labeled with `implicit` modifier (implicit value) */ + final val Implicit = termFlag(9, "implicit") + + /** A trait */ + final val Trait = typeFlag(9, "") + + /** Labeled with `lazy` (a lazy val). */ + final val Lazy = termFlag(10, "lazy") /** A trait that has only abstract methods as members * (and therefore can be represented by a Java interface */ - final val Interface = typeFlag(9, "interface") + final val Interface = typeFlag(10, "interface") - /** A value or class implementing a module */ - final val Module = commonFlag(10, "module") - final val ModuleVal = Module.toTermFlags - final val ModuleClass = Module.toTypeFlags + /** A value or variable accessor (getter or setter) */ + final val Accessor = termFlag(11, "") - /** Labeled with `implicit` modifier (implicit value) */ - final val Implicit = termFlag(11, "implicit") + /** A covariant type variable */ + final val Covariant = typeFlag(11, "") - /** Labeled with `sealed` modifier (sealed class) */ - final val Sealed = typeFlag(12, "sealed") + /** A mutable var */ + final val Mutable = termFlag(12, "mutable") - /** A case class or its companion object */ - final val Case = commonFlag(13, "case") - final val CaseClass = Case.toTypeFlags - final val CaseVal = Case.toTermFlags + /** A contravariant type variable */ + final val Contravariant = typeFlag(12, "") - /** Labeled with `lazy` (a lazy val). */ - final val Lazy = termFlag(14, "lazy") + /** Symbol is local to current class (i.e. private[this] or protected[this] + * pre: Private or Protected are also set + */ + final val Local = commonFlag(13, "") - /** A mutable var */ - final val Mutable = termFlag(14, "mutable") + /** A field generated for a primary constructor parameter (no matter if it's a 'val' or not), + * or an accessor of such a field. + */ + final val ParamAccessor = commonFlag(14, "") - /** A (term or type) parameter to a class or method */ - final val Param = commonFlag(15, "") - final val TermParam = Param.toTermFlags - final val TypeParam = Param.toTypeFlags + /** A value or class implementing a module */ + final val Module = commonFlag(15, "module") + final val ModuleVal = Module.toTermFlags + final val ModuleClass = Module.toTypeFlags - /** A value or class representing a package */ + /** A value or class representing a package */ final val Package = commonFlag(16, "") final val PackageVal = Package.toTermFlags final val PackageClass = Package.toTypeFlags /** A package object or its module class */ - final val PackageObject = commonFlag(???, "package") + final val PackageObject = commonFlag(17, "package") final val PackageObjectVal = PackageObject.toTermFlags final val PackageObjectClass = PackageObject.toTypeFlags - /** A covariant type variable */ - final val Covariant = typeFlag(17, "") + /** A case class or its companion object */ + final val Case = commonFlag(17, "case") + final val CaseClass = Case.toTypeFlags + final val CaseVal = Case.toTermFlags - /** Method is a label. */ - final val Label = termFlag(18, "