overridingpairs.scala

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

SCALA
142
字号
/* NSC -- new Scala compiler * Copyright 2005-2007 LAMP/EPFL * @author Martin Odersky */// $Id: OverridingPairs.scala 13220 2007-11-09 15:03:13Z odersky $package scala.tools.nsc.transformimport collection.mutable.HashMapimport symtab.Flags._import util.HashSet/** This abstract class ... * *  @author Martin Odersky *  @version 1.0 */abstract class OverridingPairs {  val global: Global  import global._  class Cursor(base: Symbol) {    private val self = base.thisType    protected def exclude(sym: Symbol): Boolean =       sym.isConstructor || sym.isPrivateLocal || sym.hasFlag(BRIDGE)    protected def parents: List[Type] = base.info.parents    protected def matches(sym1: Symbol, sym2: Symbol): Boolean =      sym1.isType || (self.memberType(sym1) matches self.memberType(sym2))    private type BitSet = Array[Int]    private def newBitSet(size: Int): BitSet = new Array((size + 31) >> 5)    private def include(bs: BitSet, n: Int) {      val nshifted = n >> 5      val nmask = 1 << (n & 31)      bs(nshifted) = bs(nshifted) | nmask    }    private def intersectionContainsElementLeq(bs1: BitSet, bs2: BitSet,                                               n: Int): Boolean =    {      val nshifted = n >> 5      val nmask = 1 << (n & 31);      ((List.range(0, nshifted) exists (i => (bs1(i) & bs2(i)) != 0)) ||       ((bs1(nshifted) & bs2(nshifted) & (nmask | nmask - 1)) != 0))    }    private val decls = newScope    { def fillDecls(bcs: List[Symbol], deferredflag: Int) {        if (!bcs.isEmpty) {          fillDecls(bcs.tail, deferredflag)          var e = bcs.head.info.decls.elems;          while (e ne null) {            if (e.sym.getFlag(DEFERRED) == deferredflag && !exclude(e.sym))              decls enter e.sym;            e = e.next          }        }      }      fillDecls(base.info.baseClasses, DEFERRED)      fillDecls(base.info.baseClasses, 0)    }    private val size = base.info.baseClasses.length    private val index = new HashMap[Symbol, Int]    { var i = 0      for (bc <- base.info.baseClasses) {        index(bc) = i        i += 1      }    }    private val subParents = new Array[BitSet](size)    { for (i <- List.range(0, size))        subParents(i) = new BitSet(size);      for (p <- parents) {        val pIndex = index(p.typeSymbol)        for (bc <- p.baseClasses) include(subParents(index(bc)), pIndex)      }    }    private def hasCommonParent(sym1: Symbol, sym2: Symbol) = {      //assert(index.get(sym1.owner) != None, "" + base + " " + sym1 + " " + sym1.owner);//DEBUG      //assert(index.get(sym2.owner) != None, "" + base + " " + sym2 + " " + sym2.owner);//DEBUG      val index1 = index(sym1.owner)      val index2 = index(sym2.owner)      val minindex = if (index1 < index2) index1 else index2      intersectionContainsElementLeq(subParents(index1), subParents(index2), minindex)    }    private val visited = new HashSet[ScopeEntry](256)    private var curEntry = decls.elems    private var nextEntry = curEntry    var overriding: Symbol = _    var overridden: Symbol = _    //@M: note that next is called once during object initialisation    def hasNext: Boolean = curEntry ne null    def next {      if (curEntry ne null) {        overriding = curEntry.sym        if (nextEntry ne null) {          do {            nextEntry = decls.lookupNextEntry(nextEntry);          } while ((nextEntry ne null) &&                   ((nextEntry.sym hasFlag PRIVATE) ||                    (overriding.owner == nextEntry.sym.owner) ||                    (!matches(overriding, nextEntry.sym)) ||                    (hasCommonParent(overriding, nextEntry.sym)) ||                    (exclude(overriding))))        }        if (nextEntry ne null) {          overridden = nextEntry.sym;          //Console.println("yield: " + overriding + overriding.locationString + " / " + overridden + overridden.locationString);//DEBUG          visited addEntry nextEntry        } else {          do {            curEntry = curEntry.next          } while ((curEntry ne null) && (visited contains curEntry));          nextEntry = curEntry          next        }      }    }    next //@M: ATTN! this method gets called during construction!  }}

⌨️ 快捷键说明

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