diff options
author | Martin Odersky <odersky@gmail.com> | 2012-12-18 15:11:25 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2012-12-18 15:12:20 +0100 |
commit | 789d15e6d5d98880dd64c8b55b9c2456f020b46b (patch) | |
tree | eb5dff77ffca9a1267161c2ece36c0fab45de453 /src/dotty/tools/dotc/core/Denotations.scala | |
parent | 4481a057fb5906c002788642aaad34a6cf1124ef (diff) | |
download | dotty-789d15e6d5d98880dd64c8b55b9c2456f020b46b.tar.gz dotty-789d15e6d5d98880dd64c8b55b9c2456f020b46b.tar.bz2 dotty-789d15e6d5d98880dd64c8b55b9c2456f020b46b.zip |
(1) Moved logic from ClassDenotation to ClassInfoType. (2) Tweaks to other types. (3) FlagSet is now a value class.
Diffstat (limited to 'src/dotty/tools/dotc/core/Denotations.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/Denotations.scala | 194 |
1 files changed, 3 insertions, 191 deletions
diff --git a/src/dotty/tools/dotc/core/Denotations.scala b/src/dotty/tools/dotc/core/Denotations.scala index d7904d977..8126ad117 100644 --- a/src/dotty/tools/dotc/core/Denotations.scala +++ b/src/dotty/tools/dotc/core/Denotations.scala @@ -4,14 +4,10 @@ package core import Periods._, Contexts._, Symbols._, References._, Names._ import Types._, Flags._, Decorators._ import Scopes.Scope -import collection.immutable.BitSet import collection.mutable -import util.LRU8Cache trait Denotations { self: Context => - /** A set for hash consing superclass bitsets */ - private val uniqueBits = new util.HashSet[BitSet]("superbits", 1024) } @@ -39,9 +35,9 @@ object Denotations { def name: Name = ??? - def flags: Long = ??? + def flags: FlagSet = ??? - def setFlag(flag: Long): Unit = ??? + def setFlag(flag: FlagSet): Unit = ??? def tpe: Type = ??? @@ -77,8 +73,6 @@ object Denotations { /** is this symbol the result of an erroneous definition? */ def isError: Boolean = false - def asClass: ClassDenotation = ??? - def withType(tp: Type): Denotation = ??? } @@ -106,192 +100,10 @@ object Denotations { def newNameFilter: FingerPrint = new Array[Long](DefinedNamesWords) } - class ClassDenotation(val parents: List[Type], val decls: Scope, clazz: ClassSymbol) extends Denotation { - - import NameFilter._ - - private var memberCacheVar: LRU8Cache[Name, RefSet] = null - - private def memberCache: LRU8Cache[Name, RefSet] = { - if (memberCacheVar == null) memberCacheVar = new LRU8Cache - memberCacheVar - } - - def thisType: Type = ??? - - private var baseClassesVar: List[ClassSymbol] = null - private var superClassBitsVar: BitSet = null - - private def computeSuperClassBits(implicit ctx: Context): Unit = { - val seen = new mutable.BitSet - val locked = new mutable.BitSet - def addBaseClasses(bcs: List[ClassSymbol], to: List[ClassSymbol]) - : List[ClassSymbol] = bcs match { - case bc :: bcs1 => - val id = bc.superId - if (seen contains id) to - else if (locked contains id) throw new CyclicReference(clazz) - else { - locked += id - val bcs1added = addBaseClasses(bcs1, to) - seen += id - if (bcs1added eq bcs1) bcs else bc :: bcs1added - } - case _ => - to - } - def addParentBaseClasses(ps: List[Type], to: List[ClassSymbol]): List[ClassSymbol] = ps match { - case p :: ps1 => - addBaseClasses(p.baseClasses, addParentBaseClasses(ps1, to)) - case _ => - to - } - baseClassesVar = clazz :: addParentBaseClasses(parents, Nil) - superClassBitsVar = ctx.root.uniqueBits.findEntryOrUpdate(seen.toImmutable) - } - - def superClassBits(implicit ctx: Context): BitSet = { - if (superClassBitsVar == null) computeSuperClassBits - superClassBitsVar - } - - def baseClasses(implicit ctx: Context): List[ClassSymbol] = { - if (baseClassesVar == null) computeSuperClassBits - baseClassesVar - } - - /** Is this class a subclass of `clazz`? */ - final def isSubClass(clazz: ClassSymbol)(implicit ctx: Context): Boolean = { - superClassBits contains clazz.superId - } - - private var definedFingerPrintCache: FingerPrint = null - - private def computeDefinedFingerPrint(implicit ctx: Context): FingerPrint = { - var bits = newNameFilter - var e = decls.lastEntry - while (e != null) { - includeName(bits, name) - e = e.prev - } - var ps = parents - while (ps.nonEmpty) { - val parent = ps.head.typeSymbol.asClass.deref - includeFingerPrint(bits, parent.definedFingerPrint) - parent setFlag Frozen - ps = ps.tail - } - definedFingerPrintCache = bits - bits - } - - /** Enter a symbol in current scope. - * Note: We require that this does not happen after the first time - * someone does a findMember on a subclass. - */ - def enter(sym: Symbol)(implicit ctx: Context) = { - require((flags & Frozen) == 0) - decls enter sym - if (definedFingerPrintCache != null) - includeName(definedFingerPrintCache, sym.name) - if (memberCacheVar != null) - memberCache invalidate sym.name - } - - /** Delete symbol from current scope. - * Note: We require that this does not happen after the first time - * someone does a findMember on a subclass. - */ - def delete(sym: Symbol)(implicit ctx: Context) = { - require((flags & Frozen) == 0) - decls unlink sym - if (definedFingerPrintCache != null) - computeDefinedFingerPrint - if (memberCacheVar != null) - memberCache invalidate sym.name - } - - def definedFingerPrint(implicit ctx: Context): FingerPrint = { - val fp = definedFingerPrintCache - if (fp != null) fp else computeDefinedFingerPrint - } - - final def memberRefsNamed(name: Name)(implicit ctx: Context): RefSet = { - var refs: RefSet = memberCache lookup name - if (refs == null) { - if (containsName(definedFingerPrint, name)) { - val ownRefs = decls.refsNamed(name) - refs = ownRefs - var ps = parents - val ownType = thisType - while (ps.nonEmpty) { - val parentSym = ps.head.typeSymbol.asClass - val parent = parentSym.deref - refs = refs union - parent.memberRefsNamed(name) - .filterExcluded(Flags.Private) - .asSeenFrom(thisType, parentSym) - .filterDisjoint(ownRefs) - ps = ps.tail - } - } else { - refs = NoRef - } - memberCache enter (name, refs) - } - refs - } - - private var baseTypeCache: java.util.HashMap[UniqueType, Type] = null - - final def baseTypeOf(tp: Type)(implicit ctx: Context): Type = { - - def computeBaseTypeOf(tp: Type): Type = tp match { - case tp: NamedType => - val sym = tp.symbol - val bt = baseTypeOf(tp.info) - if (sym.isClass) bt.substThis(sym.asClass, tp.prefix) - else bt - case AppliedType(tycon, args) => - baseTypeOf(tycon).subst(tycon.typeParams, args) - case AndType(tp1, tp2) => - baseTypeOf(tp1) & baseTypeOf(tp2) - case OrType(tp1, tp2) => - baseTypeOf(tp1) | baseTypeOf(tp2) - case tp @ ClassInfoType(clazz) => - def reduce(bt: Type, ps: List[Type]): Type = ps match { - case p :: ps1 => reduce(bt & baseTypeOf(p), ps1) - case _ => bt - } - reduce(NoType, tp.parents) - case tp: TypeProxy => - baseTypeOf(tp.underlying) - } - - if (clazz.isStatic && clazz.typeParams.isEmpty) clazz.tpe - else tp match { - case tp: UniqueType => - if (baseTypeCache == null) - baseTypeCache = new java.util.HashMap[UniqueType, Type] - var basetp = baseTypeCache get tp - if (basetp == null) { - baseTypeCache.put(tp, NoType) - basetp = computeBaseTypeOf(tp) - baseTypeCache.put(tp, basetp) - } else if (basetp == NoType) { - throw new CyclicReference(clazz) - } - basetp - case _ => - computeBaseTypeOf(tp) - } - } - } - object NoDenotation extends Denotation { override def owner: Symbol = throw new AssertionError("NoDenotation.owner") override def name: Name = BootNameTable.newTermName("<none>") - override def flags: Long = 0 + override def flags = Flags.Empty override def tpe: Type = NoType override def info: Type = NoType } |