diff options
author | Paul Phillips <paulp@improving.org> | 2012-11-01 13:02:24 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-11-02 00:08:34 -0700 |
commit | 14704da1b854e04d8e8de81eb7741757f33a2d13 (patch) | |
tree | 0405379630e8797e325b0aee8cd735d1ef3dfef8 /src/reflect | |
parent | d7ed53f26d6466109cd5828008a8ba2026d95238 (diff) | |
download | scala-14704da1b854e04d8e8de81eb7741757f33a2d13.tar.gz scala-14704da1b854e04d8e8de81eb7741757f33a2d13.tar.bz2 scala-14704da1b854e04d8e8de81eb7741757f33a2d13.zip |
Convenience method commonSymbolOwner.
Diffstat (limited to 'src/reflect')
-rw-r--r-- | src/reflect/scala/reflect/internal/Symbols.scala | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala index 53a236fa3c..9a4b272d6c 100644 --- a/src/reflect/scala/reflect/internal/Symbols.scala +++ b/src/reflect/scala/reflect/internal/Symbols.scala @@ -45,6 +45,24 @@ trait Symbols extends api.Symbols { self: SymbolTable => m } + /** The deepest symbol which appears in the owner chains of all + * the given symbols. + */ + def commonSymbolOwner(syms: List[Symbol]): Symbol = { + def loop(owner: Symbol, rest: List[Symbol]): Symbol = rest match { + case Nil => owner + case x :: xs if x.ownerChain contains owner => loop(owner, xs) + case x :: xs if owner.ownerChain contains x => loop(x, xs) + case x :: xs => + x.ownerChain find (owner.ownerChain contains _) match { + case Some(common) => loop(common, xs) + case _ => NoSymbol + } + } + if (syms.isEmpty || (syms contains NoSymbol)) NoSymbol + else loop(syms.head.owner, syms.tail) + } + /** Create a new free term. Its owner is NoSymbol. */ def newFreeTermSymbol(name: TermName, value: => Any, flags: Long = 0L, origin: String): FreeTermSymbol = |