diff options
author | Paul Phillips <paulp@improving.org> | 2009-07-18 17:34:33 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2009-07-18 17:34:33 +0000 |
commit | b70cf1f40b36ec686c68f514579d71a44d09a0a3 (patch) | |
tree | 93badc560b3011ad55efea4992a0f3c64e8a905c | |
parent | 1c56489b3e008ffb192443a1627df16f245a6c01 (diff) | |
download | scala-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.scala | 20 | ||||
-rw-r--r-- | test/files/run/bug1373.scala | 6 |
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 |