diff options
author | Lukas Rytz <lukas.rytz@epfl.ch> | 2010-12-03 18:47:06 +0000 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@epfl.ch> | 2010-12-03 18:47:06 +0000 |
commit | e1a0866ce748ee1a228060f401dbb190d3caa8c3 (patch) | |
tree | cb5a6f9ad52bfa4d93d5c54674a412fdb40f16bb /src | |
parent | 627adab5dbddcef8bd57d2b40eaa6a6e40c06cab (diff) | |
download | scala-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.scala | 25 |
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) |