aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/Mixin.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-05-29 11:29:24 +0200
committerMartin Odersky <odersky@gmail.com>2015-06-01 15:04:45 +0200
commit4f50e8fa5b48b5a931224d40b7c6fc0aed3da44b (patch)
tree8404038fb7206d11d87ee6969933043c15a846fc /src/dotty/tools/dotc/transform/Mixin.scala
parent31a7f6492729ad1ddf7f8e233a452a6ccd517af5 (diff)
downloaddotty-4f50e8fa5b48b5a931224d40b7c6fc0aed3da44b.tar.gz
dotty-4f50e8fa5b48b5a931224d40b7c6fc0aed3da44b.tar.bz2
dotty-4f50e8fa5b48b5a931224d40b7c6fc0aed3da44b.zip
Avoid referring to initial$x methods when implementing Scala2 traits
They don't exist for Scala2 traits. Instead we let the initializer be `_' and rely on trait setters (to be implemented) to initialize the field.
Diffstat (limited to 'src/dotty/tools/dotc/transform/Mixin.scala')
-rw-r--r--src/dotty/tools/dotc/transform/Mixin.scala17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/transform/Mixin.scala b/src/dotty/tools/dotc/transform/Mixin.scala
index d2e7943f8..8f19faf68 100644
--- a/src/dotty/tools/dotc/transform/Mixin.scala
+++ b/src/dotty/tools/dotc/transform/Mixin.scala
@@ -14,6 +14,7 @@ import DenotTransformers._
import StdNames._
import NameOps._
import Phases._
+import ast.untpd
import ast.Trees._
import collection.mutable
@@ -150,16 +151,20 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
ctx.atPhase(thisTransform) { implicit ctx => sym is Deferred }
def traitInits(mixin: ClassSymbol): List[Tree] =
- for (getter <- mixin.info.decls.filter(getr => getr.isGetter && !wasDeferred(getr)).toList)
- yield {
- // transformFollowing call is needed to make memoize & lazy vals run
- val rhs = transformFollowing(superRef(initializer(getter)).appliedToNone)
+ for (getter <- mixin.info.decls.filter(getr => getr.isGetter && !wasDeferred(getr)).toList) yield {
// isCurrent: getter is a member of implementing class
val isCurrent = getter.is(ExpandedName) || ctx.atPhase(thisTransform) { implicit ctx =>
cls.info.member(getter.name).suchThat(_.isGetter).symbol == getter
}
- if (isCurrent) transformFollowing(DefDef(implementation(getter.asTerm), rhs))
- else rhs
+ val isScala2x = mixin.is(Scala2x)
+ def default = Underscore(getter.info.resultType)
+ def initial = transformFollowing(superRef(initializer(getter)).appliedToNone)
+ if (isCurrent)
+ // transformFollowing call is needed to make memoize & lazy vals run
+ transformFollowing(
+ DefDef(implementation(getter.asTerm), if (isScala2x) default else initial))
+ else if (isScala2x) EmptyTree
+ else initial
}
def setters(mixin: ClassSymbol): List[Tree] =