summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@epfl.ch>2010-12-03 18:47:06 +0000
committerLukas Rytz <lukas.rytz@epfl.ch>2010-12-03 18:47:06 +0000
commite1a0866ce748ee1a228060f401dbb190d3caa8c3 (patch)
treecb5a6f9ad52bfa4d93d5c54674a412fdb40f16bb /src
parent627adab5dbddcef8bd57d2b40eaa6a6e40c06cab (diff)
downloadscala-e1a0866ce748ee1a228060f401dbb190d3caa8c3.tar.gz
scala-e1a0866ce748ee1a228060f401dbb190d3caa8c3.tar.bz2
scala-e1a0866ce748ee1a228060f401dbb190d3caa8c3.zip
close #4036, fix #2489.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index a36ba92c88..752931388d 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -2137,7 +2137,7 @@ trait Typers { self: Analyzer =>
def checkNoDoubleDefsAndAddSynthetics(stats: List[Tree]): List[Tree] = {
val scope = if (inBlock) context.scope else context.owner.info.decls
- val newStats = new ListBuffer[Tree]
+ var newStats = new ListBuffer[Tree]
var needsCheck = true
var moreToAdd = true
while (moreToAdd) {
@@ -2177,12 +2177,27 @@ trait Typers { self: Analyzer =>
}
if (newStats.isEmpty) stats
else {
- val (defaultGetters, others) = newStats.toList.partition {
- case DefDef(mods, _, _, _, _, _) => mods.hasDefaultFlag
+ // put default getters next to the method they belong to,
+ // same for companion objects. fixes #2489 and #4036.
+ def matches(stat: Tree, synt: Tree) = (stat, synt) match {
+ case (DefDef(_, statName, _, _, _, _), DefDef(mods, syntName, _, _, _, _)) =>
+ mods.hasDefaultFlag && syntName.toString.startsWith(statName.toString)
+
+ case (ClassDef(_, className, _, _), ModuleDef(_, moduleName, _)) =>
+ className.toTermName == moduleName
+
case _ => false
}
- // default getters first: see #2489
- defaultGetters ::: stats ::: others
+
+ def matching(stat: Tree): List[Tree] = {
+ val (pos, neg) = newStats.partition(synt => matches(stat, synt))
+ newStats = neg
+ pos.toList
+ }
+
+ (stats foldRight List[Tree]())((stat, res) => {
+ stat :: matching(stat) ::: res
+ }) ::: newStats.toList
}
}
val result = stats mapConserve (typedStat)