summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2009-07-18 17:34:33 +0000
committerPaul Phillips <paulp@improving.org>2009-07-18 17:34:33 +0000
commitb70cf1f40b36ec686c68f514579d71a44d09a0a3 (patch)
tree93badc560b3011ad55efea4992a0f3c64e8a905c
parent1c56489b3e008ffb192443a1627df16f245a6c01 (diff)
downloadscala-b70cf1f40b36ec686c68f514579d71a44d09a0a3.tar.gz
scala-b70cf1f40b36ec686c68f514579d71a44d09a0a3.tar.bz2
scala-b70cf1f40b36ec686c68f514579d71a44d09a0a3.zip
Fix and test case for #1373.
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Symbols.scala20
-rw-r--r--test/files/run/bug1373.scala6
2 files changed, 24 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
index d5608dd334..b5b68a554d 100644
--- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
@@ -1044,8 +1044,24 @@ trait Symbols {
/** Return every accessor of a primary constructor parameter in this case class
*/
- final def caseFieldAccessors: List[Symbol] =
- info.decls.toList filter (sym => !(sym hasFlag PRIVATE) && sym.hasFlag(CASEACCESSOR))
+ final def caseFieldAccessors: List[Symbol] = {
+ val allAccessors = info.decls.toList filter (_ hasFlag CASEACCESSOR)
+
+ // if a case class has private fields, the accessors will come back in the wrong
+ // order unless we do some more work. See ticket #1373 and test bug1373.scala.
+ def findRightAccessor(cpa: Symbol) = {
+ val toFind = cpa.fullNameString + "$"
+ // def fail = throw new Error("Accessor for %s not found among %s".format(cpa.fullNameString, allAccessors))
+ def isRightAccessor(s: Symbol) =
+ if (s hasFlag ACCESSOR) s.accessed.id == cpa.id
+ else s.fullNameString startsWith toFind
+
+ if (cpa.isOuterAccessor || cpa.isOuterField) None
+ else allAccessors find isRightAccessor
+ }
+
+ constrParamAccessors map findRightAccessor flatten
+ }
final def constrParamAccessors: List[Symbol] =
info.decls.toList filter (sym => !sym.isMethod && sym.hasFlag(PARAMACCESSOR))
diff --git a/test/files/run/bug1373.scala b/test/files/run/bug1373.scala
new file mode 100644
index 0000000000..537421c788
--- /dev/null
+++ b/test/files/run/bug1373.scala
@@ -0,0 +1,6 @@
+// Testing whether case class params come back in the right order.
+object Test extends Application {
+ case class Foo(private val a: String, b: String, private val c: String, d: String, private val e: String)
+ val x = Foo("a", "b", "c", "d", "e")
+ assert(x.toString == """Foo(a,b,c,d,e)""")
+} \ No newline at end of file