diff options
author | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-01-06 15:26:36 +0000 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-01-06 15:26:36 +0000 |
commit | 9245c6a701dac33284bc7151fa50677eb988913d (patch) | |
tree | 934ddec527f0830a22f19ad751c3a035611653b8 | |
parent | d66a76c1214cb0162931c32b9300f4c1a38b1099 (diff) | |
download | scala-9245c6a701dac33284bc7151fa50677eb988913d.tar.gz scala-9245c6a701dac33284bc7151fa50677eb988913d.tar.bz2 scala-9245c6a701dac33284bc7151fa50677eb988913d.zip |
Closes #2657, #2789. Review by dragos.
-rw-r--r-- | src/compiler/scala/tools/nsc/dependencies/Changes.scala | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/dependencies/Changes.scala b/src/compiler/scala/tools/nsc/dependencies/Changes.scala index a7953dfb9f..87e38d8909 100644 --- a/src/compiler/scala/tools/nsc/dependencies/Changes.scala +++ b/src/compiler/scala/tools/nsc/dependencies/Changes.scala @@ -21,7 +21,8 @@ abstract class Changes { /** Are the new modifiers more restrictive than the old ones? */ private def moreRestrictive(from: Long, to: Long): Boolean = ((((to & PRIVATE) != 0L) && (from & PRIVATE) == 0L) - || (((to & PROTECTED) != 0L) && (from & PROTECTED) == 0L)) + || (((to & PROTECTED) != 0L) && (from & PROTECTED) == 0L)) || + ((from & IMPLICIT) != (to & IMPLICIT)) /** An entity in source code, either a class or a member definition. * Name is fully-qualified. @@ -38,6 +39,8 @@ abstract class Changes { private def sameSymbol(sym1: Symbol, sym2: Symbol): Boolean = sym1.fullNameString == sym2.fullNameString + private def sameFlags(sym1: Symbol, sym2: Symbol): Boolean = + sym1.flags == sym2.flags private def sameType(tp1: Type, tp2: Type) = { def typeOf(tp: Type): String = tp.toString + "[" + tp.getClass + "]" @@ -88,9 +91,10 @@ abstract class Changes { case (MethodType(params1, res1), MethodType(params2, res2)) => // new dependent types: probably fix this, use substSym as done for PolyType (sameTypes(tp1.paramTypes, tp2.paramTypes) && - ((tp1.params, tp2.params).zipped forall sameSymbol) && - sameType(res1, res2) && - tp1.isInstanceOf[ImplicitMethodType] == tp2.isInstanceOf[ImplicitMethodType]) + ((tp1.params, tp2.params).zipped forall ((t1, t2) => + (sameSymbol(t1, t1) && sameFlags(t1, t2)))) && + sameType(res1, res2) && + tp1.isInstanceOf[ImplicitMethodType] == tp2.isInstanceOf[ImplicitMethodType]) case (PolyType(tparams1, res1), PolyType(tparams2, res2)) => sameTypeParams(tparams1, tparams2) && sameType(res1, res2) @@ -141,7 +145,7 @@ abstract class Changes { // println("changeSet " + from + "(" + from.info + ")" // + " vs " + to + "(" + to.info + ")") - def omitSymbols(s: Symbol): Boolean = !s.hasFlag(Flags.LOCAL | Flags.LIFTED | Flags.PRIVATE) + def omitSymbols(s: Symbol): Boolean = !s.hasFlag(LOCAL | LIFTED | PRIVATE) val cs = new mutable.ListBuffer[Change] if ((from.info.parents zip to.info.parents) exists { case (t1, t2) => !sameType(t1, t2) }) |