diff options
author | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2014-11-27 15:32:29 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2014-12-16 13:14:59 +0100 |
commit | 6aa461385b97efbdc883cc056037633ddd6405a4 (patch) | |
tree | 796a16e8874ce0b7df54f273b5ecf3dff1f6d40b /src | |
parent | 9c8976ddc62a5d152adc3ffef92309aec8e292e7 (diff) | |
download | dotty-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.scala | 7 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/SymUtils.scala | 17 |
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 |