summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-02-20 02:13:31 +0000
committerPaul Phillips <paulp@improving.org>2011-02-20 02:13:31 +0000
commit6a570deed1790889f7036a00c045c15217313587 (patch)
tree687167b722efdc8815dac76d435e033b4534919c
parentc3ebada7e6c604416656d47d3cd869bddd430932 (diff)
downloadscala-6a570deed1790889f7036a00c045c15217313587.tar.gz
scala-6a570deed1790889f7036a00c045c15217313587.tar.bz2
scala-6a570deed1790889f7036a00c045c15217313587.zip
Observed that some historical issues with packa...
Observed that some historical issues with package objects no longer seem so issuey. In the interests of keeping the arbitrary limitations to a minimum, re-enabled case classes in package objects (see #2130, #3437.) Closes #3437, review by odersky.
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala9
-rw-r--r--test/files/neg/t2130.check4
-rwxr-xr-xtest/files/neg/t2130.scala6
-rw-r--r--test/files/pos/bug2130-1.scala5
-rw-r--r--test/files/pos/bug2130-2.scala17
5 files changed, 24 insertions, 17 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 4d282a4e7d..649af74d43 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -1253,10 +1253,10 @@ trait Typers extends Modes {
c.initialize
val clazz = mdef.symbol.moduleClass
val maybeAddSerializable = (l: List[Tree]) =>
- if(linkedClass == NoSymbol || !linkedClass.isSerializable || clazz.isSerializable) l
+ if (linkedClass == NoSymbol || !linkedClass.isSerializable || clazz.isSerializable) l
else {
clazz.makeSerializable()
- l ::: List(TypeTree(SerializableClass.tpe))
+ l :+ TypeTree(SerializableClass.tpe)
}
val typedMods = removeAnnotations(mdef.mods)
assert(clazz != NoSymbol)
@@ -1264,11 +1264,6 @@ trait Typers extends Modes {
.typedTemplate(mdef.impl, maybeAddSerializable(parentTypes(mdef.impl)))
val impl2 = typerAddSyntheticMethods(impl1, clazz, context)
- if (mdef.name == nme.PACKAGEkw)
- for (m <- mdef.symbol.info.members)
- if (m.isCaseClass)
- context.error(if (m.pos.isDefined) m.pos else mdef.pos,
- "implementation restriction: "+mdef.symbol+" cannot contain case "+m)
treeCopy.ModuleDef(mdef, typedMods, mdef.name, impl2) setType NoType
}
diff --git a/test/files/neg/t2130.check b/test/files/neg/t2130.check
deleted file mode 100644
index 6d6902b121..0000000000
--- a/test/files/neg/t2130.check
+++ /dev/null
@@ -1,4 +0,0 @@
-t2130.scala:4: error: implementation restriction: package object foo cannot contain case class X
- case class X()
- ^
-one error found
diff --git a/test/files/neg/t2130.scala b/test/files/neg/t2130.scala
deleted file mode 100755
index 012698fd2a..0000000000
--- a/test/files/neg/t2130.scala
+++ /dev/null
@@ -1,6 +0,0 @@
-// for now we disallow case class in package objects
-package object foo {
-
- case class X()
-
-}
diff --git a/test/files/pos/bug2130-1.scala b/test/files/pos/bug2130-1.scala
new file mode 100644
index 0000000000..8dd61c4d30
--- /dev/null
+++ b/test/files/pos/bug2130-1.scala
@@ -0,0 +1,5 @@
+package foo
+
+package object bar {
+ case class Bippy(x: Int) { }
+}
diff --git a/test/files/pos/bug2130-2.scala b/test/files/pos/bug2130-2.scala
new file mode 100644
index 0000000000..1d0b33c3e5
--- /dev/null
+++ b/test/files/pos/bug2130-2.scala
@@ -0,0 +1,17 @@
+package foo
+
+package object bar {
+ class Bippy(x: Int) {
+ class Ding
+ object Ding
+ case class Dong(x: Float)
+ }
+ object Bippy {
+ class Dingus
+ object Dingus
+ case class Dongus(x: Float)
+
+ def apply(xs: Int*) = new Bippy(xs.sum)
+ def apply() = new Bippy(5)
+ }
+}