summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-11-01 13:02:24 -0700
committerPaul Phillips <paulp@improving.org>2012-11-02 00:08:34 -0700
commit14704da1b854e04d8e8de81eb7741757f33a2d13 (patch)
tree0405379630e8797e325b0aee8cd735d1ef3dfef8 /src
parentd7ed53f26d6466109cd5828008a8ba2026d95238 (diff)
downloadscala-14704da1b854e04d8e8de81eb7741757f33a2d13.tar.gz
scala-14704da1b854e04d8e8de81eb7741757f33a2d13.tar.bz2
scala-14704da1b854e04d8e8de81eb7741757f33a2d13.zip
Convenience method commonSymbolOwner.
Diffstat (limited to 'src')
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala18
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 =