summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan@lightbend.com>2016-12-21 11:24:03 -0800
committerGitHub <noreply@github.com>2016-12-21 11:24:03 -0800
commitc4dcc9948a996d36954f15065138557c254ea244 (patch)
tree93fe4619733f8147cf057c3ec7e798d791b91030 /src
parenta3135bf8578dee506c107b19ae7f8c1a70236a29 (diff)
parent34dad77513d08535adaf26989bd0cd84993ceab1 (diff)
downloadscala-c4dcc9948a996d36954f15065138557c254ea244.tar.gz
scala-c4dcc9948a996d36954f15065138557c254ea244.tar.bz2
scala-c4dcc9948a996d36954f15065138557c254ea244.zip
Merge pull request #5583 from lrytz/t10093
SI-10093 don't move member traits to constructor body in constructors
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/transform/Constructors.scala10
-rw-r--r--src/reflect/scala/reflect/internal/Flags.scala4
2 files changed, 8 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Constructors.scala b/src/compiler/scala/tools/nsc/transform/Constructors.scala
index 92823bafb2..231a3e4c64 100644
--- a/src/compiler/scala/tools/nsc/transform/Constructors.scala
+++ b/src/compiler/scala/tools/nsc/transform/Constructors.scala
@@ -462,7 +462,7 @@ abstract class Constructors extends Statics with Transform with TypingTransforme
// find and dissect primary constructor
private val (primaryConstr, _primaryConstrParams, primaryConstrBody) = stats collectFirst {
- case dd@DefDef(_, _, _, vps :: Nil, _, rhs: Block) if dd.symbol.isPrimaryConstructor || dd.symbol.isMixinConstructor => (dd, vps map (_.symbol), rhs)
+ case dd@DefDef(_, _, _, vps :: Nil, _, rhs: Block) if dd.symbol.isPrimaryConstructor => (dd, vps map (_.symbol), rhs)
} getOrElse {
abort("no constructor in template: impl = " + impl)
}
@@ -646,14 +646,14 @@ abstract class Constructors extends Statics with Transform with TypingTransforme
stat match {
// recurse on class definition, store in defBuf
- case _: ClassDef if !statSym.isInterface =>
- defBuf += new ConstructorTransformer(unit).transform(stat)
+ case _: ClassDef =>
+ if (statSym.isInterface) defBuf += stat
+ else defBuf += new ConstructorTransformer(unit).transform(stat)
// primary constructor is already tracked as `primaryConstr`
// non-primary constructors go to auxConstructorBuf
- // mixin constructors are suppressed (!?!?)
case _: DefDef if statSym.isConstructor =>
- if ((statSym ne primaryConstrSym) && !statSym.isMixinConstructor) auxConstructorBuf += stat
+ if (statSym ne primaryConstrSym) auxConstructorBuf += stat
// If a val needs a field, an empty valdef goes into the template.
// Except for lazy and ConstantTyped vals, the field is initialized by an assignment in:
diff --git a/src/reflect/scala/reflect/internal/Flags.scala b/src/reflect/scala/reflect/internal/Flags.scala
index a146f9aea5..8aa6b16e06 100644
--- a/src/reflect/scala/reflect/internal/Flags.scala
+++ b/src/reflect/scala/reflect/internal/Flags.scala
@@ -92,7 +92,9 @@ class ModifierFlags {
final val ABSTRACT = 1 << 3 // abstract class, or used in conjunction with abstract override.
// Note difference to DEFERRED!
final val DEFERRED = 1 << 4 // was `abstract' for members | trait is virtual
- final val INTERFACE = 1 << 7 // symbol is an interface (i.e. a trait which defines only abstract methods)
+ final val INTERFACE = 1 << 7 // symbol is an interface. the flag is set for:
+ // - scala-defined traits with only abstract methods or fields
+ // - any java-defined interface (even if it has default methods)
final val MUTABLE = 1 << 12 // symbol is a mutable variable.
final val PARAM = 1 << 13 // symbol is a (value or type) parameter to a method
final val MACRO = 1 << 15 // symbol is a macro definition