diff --git a/internal/compiler-bridge/src/main/scala/xsbt/Dependency.scala b/internal/compiler-bridge/src/main/scala/xsbt/Dependency.scala index 20ce91c9d6..1bad94f944 100644 --- a/internal/compiler-bridge/src/main/scala/xsbt/Dependency.scala +++ b/internal/compiler-bridge/src/main/scala/xsbt/Dependency.scala @@ -92,16 +92,21 @@ final class Dependency(val global: CallbackGlobal) extends LocateClassFile with } // Define processor reusing `processDependency` definition - val memberRef = processDependency(DependencyByMemberRef) _ - val inheritance = processDependency(DependencyByInheritance) _ - val localInheritance = processDependency(LocalDependencyByInheritance) _ + val memberRef = processDependency(DependencyByMemberRef, false) _ + val inheritance = processDependency(DependencyByInheritance, true) _ + val localInheritance = processDependency(LocalDependencyByInheritance, true) _ + + @deprecated("Use processDependency that takes allowLocal.", "1.1.0") + def processDependency(context: DependencyContext)(dep: ClassDependency): Unit = + processDependency(context, true)(dep) /* * Handles dependency on given symbol by trying to figure out if represents a term * that is coming from either source code (not necessarily compiled in this compilation * run) or from class file and calls respective callback method. */ - def processDependency(context: DependencyContext)(dep: ClassDependency): Unit = { + def processDependency(context: DependencyContext, allowLocal: Boolean)( + dep: ClassDependency): Unit = { val fromClassName = classNameAsString(dep.from) def binaryDependency(file: File, binaryClassName: String) = @@ -133,11 +138,12 @@ final class Dependency(val global: CallbackGlobal) extends LocateClassFile with case None => debuglog(Feedback.noOriginFileForExternalSymbol(dep.to)) } - } else if (onSource.file != sourceFile) { - // Dependency is internal -- but from other file / compilation unit + } else if (onSource.file != sourceFile || allowLocal) { + // We cannot ignore dependencies coming from the same source file because + // the dependency info needs to propagate. See source-dependencies/trait-trait-211. val onClassName = classNameAsString(dep.to) callback.classDependency(onClassName, fromClassName, context) - } else () // Comes from the same file, ignore + } } } @@ -227,7 +233,6 @@ final class Dependency(val global: CallbackGlobal) extends LocateClassFile with val depClass = enclOrModuleClass(dep) val dependency = ClassDependency(fromClass, depClass) if (!cache.contains(dependency) && - fromClass.associatedFile != depClass.associatedFile && !depClass.isRefinementClass) { process(dependency) cache.add(dependency) diff --git a/internal/zinc-core/src/main/scala/sbt/internal/inc/Relations.scala b/internal/zinc-core/src/main/scala/sbt/internal/inc/Relations.scala index 16318212f6..6f78eb1524 100644 --- a/internal/zinc-core/src/main/scala/sbt/internal/inc/Relations.scala +++ b/internal/zinc-core/src/main/scala/sbt/internal/inc/Relations.scala @@ -275,6 +275,7 @@ object Relations { case o: ClassDependencies => internal == o.internal && external == o.external case _ => false } + override def toString: String = s"ClassDependencies(internal = $internal, external = $external)" override def hashCode = (internal, external).hashCode } @@ -661,26 +662,23 @@ private class MRelationsNameHashing( override def hashCode = (srcProd :: libraryDep :: libraryClassName :: memberRef :: inheritance :: classes :: Nil).hashCode - override def toString = ( - """ + override def toString: String = { + val internalDepsStr = (internalDependencies.dependencies map { + case (k, vs) => k + " " + relation_s(vs) + }).mkString("\n ", "\n ", "") + val externalDepsStr = (externalDependencies.dependencies map { + case (k, vs) => k + " " + relation_s(vs) + }).mkString("\n ", "\n ", "") + s""" |Relations (with name hashing enabled): - | products: %s - | library deps: %s - | library class names: %s - | class deps: %s - | ext deps: %s - | class names: %s - | used names: %s - | product class names: %s - """.trim.stripMargin.format( - List(srcProd, - libraryDep, - libraryClassName, - internalClassDep, - externalClassDep, - classes, - names, - productClassName) map relation_s: _*) - ) - + | products: ${relation_s(srcProd)} + | library deps: ${relation_s(libraryDep)} + | library class names: ${relation_s(libraryClassName)} + | internalDependencies: $internalDepsStr + | externalDependencies: $externalDepsStr + | class names: ${relation_s(classes)} + | used names: ${relation_s(names)} + | product class names: ${relation_s(productClassName)} + """.trim.stripMargin + } } diff --git a/zinc/src/sbt-test/source-dependencies/patMat-scope/test b/zinc/src/sbt-test/source-dependencies/patMat-scope/test index 48a933573b..60aa342999 100644 --- a/zinc/src/sbt-test/source-dependencies/patMat-scope/test +++ b/zinc/src/sbt-test/source-dependencies/patMat-scope/test @@ -12,9 +12,7 @@ $ sleep 1000 $ exists target/classes/foo/SealedUsedInPatMatScope.class $ exists target/classes/foo/SealedNameUsedInDefaultScope.class -# Default scopes should not change -$ newer beforeFirstCompilation target/classes/foo/SealedNameUsedInDefaultScope.class -# But PatMat and direct usage of child should be recompiled +# PatMat and direct usage of child should be recompiled $ newer target/classes/foo/SealedUsedInPatMatScope.class beforeFirstCompilation # Change type of Sealed diff --git a/zinc/src/sbt-test/source-dependencies/trait-trait-211/build.json b/zinc/src/sbt-test/source-dependencies/trait-trait-211/build.json new file mode 100644 index 0000000000..e2b0035d3b --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/trait-trait-211/build.json @@ -0,0 +1,8 @@ +{ + "projects": [ + { + "name": "mirtest", + "scalaVersion": "2.11.8" + } + ] +} diff --git a/zinc/src/sbt-test/source-dependencies/trait-trait-211/changes/SliceTransforms1.scala b/zinc/src/sbt-test/source-dependencies/trait-trait-211/changes/SliceTransforms1.scala new file mode 100644 index 0000000000..8004d156a8 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/trait-trait-211/changes/SliceTransforms1.scala @@ -0,0 +1,12 @@ +package gg +package table + +trait SliceTransforms { + def transform: Unit = { + // the use site is updated + buildNonemptyObjects(0, 1) + } + + // add extra parameter here + def buildNonemptyObjects(a: Int, b: Int): Unit = () +} diff --git a/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/EvaluatorSpecs.scala b/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/EvaluatorSpecs.scala new file mode 100644 index 0000000000..32e7b8cf8d --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/EvaluatorSpecs.scala @@ -0,0 +1,9 @@ +package xx + +import gg.table._ + +trait EvaluatorSpecification extends EvaluatorTestSupport { +} + +trait EvaluatorTestSupport extends SliceTransforms { +} diff --git a/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/Hello.scala b/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/Hello.scala new file mode 100644 index 0000000000..10e1143812 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/Hello.scala @@ -0,0 +1,8 @@ +package xx + +object Hello extends App { + val consumer = new StringLibSpecs + consumer.transform +} + +class StringLibSpecs extends EvaluatorSpecification diff --git a/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/SliceTransforms.scala b/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/SliceTransforms.scala new file mode 100644 index 0000000000..fb8c4c462d --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/SliceTransforms.scala @@ -0,0 +1,10 @@ +package gg +package table + +trait SliceTransforms { + def transform: Unit = { + buildNonemptyObjects(0) + } + + def buildNonemptyObjects(a: Int): Unit = () +} diff --git a/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/incOptions.properties b/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/incOptions.properties new file mode 100644 index 0000000000..adfc92c361 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/trait-trait-211/mirtest/incOptions.properties @@ -0,0 +1 @@ +relationsDebug = true diff --git a/zinc/src/sbt-test/source-dependencies/trait-trait-211/test b/zinc/src/sbt-test/source-dependencies/trait-trait-211/test new file mode 100644 index 0000000000..d0fb2c1e75 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/trait-trait-211/test @@ -0,0 +1,5 @@ +> mirtest/run + +## After copying the Good implementation, we should be able to run successfully. +$ copy-file changes/SliceTransforms1.scala mirtest/SliceTransforms.scala +> mirtest/run