aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDmitry Petrashko <dmitry.petrashko@gmail.com>2014-11-27 15:32:29 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2014-12-16 13:14:59 +0100
commit6aa461385b97efbdc883cc056037633ddd6405a4 (patch)
tree796a16e8874ce0b7df54f273b5ecf3dff1f6d40b /src
parent9c8976ddc62a5d152adc3ffef92309aec8e292e7 (diff)
downloaddotty-6aa461385b97efbdc883cc056037633ddd6405a4.tar.gz
dotty-6aa461385b97efbdc883cc056037633ddd6405a4.tar.bz2
dotty-6aa461385b97efbdc883cc056037633ddd6405a4.zip
Move methods shared between Mixin and Backend to SymUtils.
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/transform/MixinOps.scala7
-rw-r--r--src/dotty/tools/dotc/transform/SymUtils.scala17
2 files changed, 20 insertions, 4 deletions
diff --git a/src/dotty/tools/dotc/transform/MixinOps.scala b/src/dotty/tools/dotc/transform/MixinOps.scala
index de15b045f..e6074323a 100644
--- a/src/dotty/tools/dotc/transform/MixinOps.scala
+++ b/src/dotty/tools/dotc/transform/MixinOps.scala
@@ -4,15 +4,14 @@ package transform
import core._
import Symbols._, Types._, Contexts._, SymDenotations._, DenotTransformers._, Flags._
import util.Positions._
+import SymUtils._
import StdNames._, NameOps._
class MixinOps(cls: ClassSymbol, thisTransform: DenotTransformer)(implicit ctx: Context) {
import ast.tpd._
- val superCls: Symbol = cls.classInfo.parents.head.symbol
- val mixins: List[ClassSymbol] =
- if (cls is Trait) Nil
- else cls.baseClasses.tail.takeWhile(_ ne superCls).reverse
+ val superCls: Symbol = cls.superClass
+ val mixins: List[ClassSymbol] = cls.mixins
def implementation(member: TermSymbol): TermSymbol =
member.copy(
diff --git a/src/dotty/tools/dotc/transform/SymUtils.scala b/src/dotty/tools/dotc/transform/SymUtils.scala
index 7d485f64c..127753737 100644
--- a/src/dotty/tools/dotc/transform/SymUtils.scala
+++ b/src/dotty/tools/dotc/transform/SymUtils.scala
@@ -24,6 +24,23 @@ object SymUtils {
class SymUtils(val self: Symbol) extends AnyVal {
import SymUtils._
+ def superClass(implicit ctx: Context) = {
+ val parents = self.asClass.classInfo.parents
+ if (parents.isEmpty) NoSymbol
+ else parents.head.symbol
+ }
+
+ /** All interfaces implemented by a class, except for those inherited through the superclass. */
+ def mixins(implicit ctx: Context) = {
+ val superCls = self.superClass
+ if (self is Trait) Nil
+ else {
+ val baseClasses = self.asClass.baseClasses
+ if (baseClasses.isEmpty) Nil
+ else baseClasses.tail.takeWhile(_ ne superCls).reverse
+ }
+ }
+
def isTypeTestOrCast(implicit ctx: Context): Boolean =
self == defn.Any_asInstanceOf || self == defn.Any_isInstanceOf