From b2e9e1b26b0ac298ffbd71664766705fb0a82438 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Wed, 17 Feb 2010 11:34:35 +0000 Subject: Checking the symbols of parameters in overloade... Checking the symbols of parameters in overloaded methods didn't seem to work in all cases. Apparently the enclosing class of the owner of the parameter was changing during the compilations from trait to the implementation class. This was causing annoying excessive compilation for Types.scala. --- src/compiler/scala/tools/nsc/dependencies/Changes.scala | 8 ++++---- test/files/buildmanager/overloaded_1/A.scala | 11 +++++++++++ test/files/buildmanager/overloaded_1/overloaded_1.check | 6 ++++++ test/files/buildmanager/overloaded_1/overloaded_1.test | 2 ++ 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 test/files/buildmanager/overloaded_1/A.scala create mode 100644 test/files/buildmanager/overloaded_1/overloaded_1.check create mode 100644 test/files/buildmanager/overloaded_1/overloaded_1.test diff --git a/src/compiler/scala/tools/nsc/dependencies/Changes.scala b/src/compiler/scala/tools/nsc/dependencies/Changes.scala index 3c000f8a18..6aef637902 100644 --- a/src/compiler/scala/tools/nsc/dependencies/Changes.scala +++ b/src/compiler/scala/tools/nsc/dependencies/Changes.scala @@ -41,10 +41,10 @@ abstract class Changes { } case class ParentChanged(e: Entity) extends Change - private val changedTypeParams = new mutable.ListBuffer[String] + private val changedTypeParams = new mutable.HashSet[String] - private def sameSymbol(sym1: Symbol, sym2: Symbol): Boolean = - sym1.fullName == sym2.fullName + private def sameSymbol(sym1: Symbol, sym2: Symbol, simple: Boolean = false): Boolean = + if (simple) sym1.encodedName == sym2.encodedName else sym1.fullName == sym2.fullName private def sameFlags(sym1: Symbol, sym2: Symbol): Boolean = sym1.flags == sym2.flags private def sameAnnotations(sym1: Symbol, sym2: Symbol): Boolean = @@ -108,7 +108,7 @@ abstract class Changes { case (mt1 @ MethodType(params1, res1), mt2 @ MethodType(params2, res2)) => // new dependent types: probably fix this, use substSym as done for PolyType sameTypes(tp1.paramTypes, tp2.paramTypes) && - (tp1.params corresponds tp2.params)((t1, t2) => sameSymbol(t1, t2) && sameFlags(t1, t2)) && + (tp1.params corresponds tp2.params)((t1, t2) => sameSymbol(t1, t2, true) && sameFlags(t1, t2)) && sameType(res1, res2) && mt1.isImplicit == mt2.isImplicit case (PolyType(tparams1, res1), PolyType(tparams2, res2)) => diff --git a/test/files/buildmanager/overloaded_1/A.scala b/test/files/buildmanager/overloaded_1/A.scala new file mode 100644 index 0000000000..c070faf978 --- /dev/null +++ b/test/files/buildmanager/overloaded_1/A.scala @@ -0,0 +1,11 @@ +trait As { + trait C extends D { + override def foo = this /// Shouldn't cause the change + override def foo(act: List[D]) = this + } + + abstract class D{ + def foo: D = this + def foo(act: List[D]) = this + } +} diff --git a/test/files/buildmanager/overloaded_1/overloaded_1.check b/test/files/buildmanager/overloaded_1/overloaded_1.check new file mode 100644 index 0000000000..4d643ce6b4 --- /dev/null +++ b/test/files/buildmanager/overloaded_1/overloaded_1.check @@ -0,0 +1,6 @@ +builder > A.scala +compiling Set(A.scala) +Changes: Map() +builder > A.scala +compiling Set(A.scala) +Changes: Map(class As$D -> List(), object As$C$class -> List(), object As$class -> List(), trait As -> List(), trait As$C -> List()) diff --git a/test/files/buildmanager/overloaded_1/overloaded_1.test b/test/files/buildmanager/overloaded_1/overloaded_1.test new file mode 100644 index 0000000000..392e0d365f --- /dev/null +++ b/test/files/buildmanager/overloaded_1/overloaded_1.test @@ -0,0 +1,2 @@ +>>compile A.scala +>>compile A.scala -- cgit v1.2.3