Fix and test case for #1373.
git-svn-id: http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk@18344 5e8d7ff9-d8ef-0310-90f0-a4852d11357a
This commit is contained in:
parent
6571bdad12
commit
21ae844972
|
@ -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))
|
||||
|
|
|
@ -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)""")
|
||||
}
|
Loading…
Reference in New Issue