From dc048926c78db53604317cf5752703867f52479e Mon Sep 17 00:00:00 2001 From: jvican Date: Tue, 2 May 2017 13:08:50 +0200 Subject: [PATCH] Fix fancy uses of analysis Clean up first analysis to make sure that test utilities using information from analysis have correct information that does not collide with the compilation analysis of the previous runs (batch tests). --- .../abstract-type-override/build.sbt | 32 +++++++++++++------ .../project/CompileState.scala | 4 +++ .../abstract-type-override/test | 3 +- .../source-dependencies/constants/pending | 1 - .../trait-member-modified/build.sbt | 12 ++++++- .../project/CompileState.scala | 4 +++ .../transitive-memberRef/build.sbt | 11 +++++++ .../project/CompileState.scala | 4 +++ 8 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 sbt/src/sbt-test/source-dependencies/abstract-type-override/project/CompileState.scala create mode 100644 sbt/src/sbt-test/source-dependencies/trait-member-modified/project/CompileState.scala create mode 100644 sbt/src/sbt-test/source-dependencies/transitive-memberRef/project/CompileState.scala diff --git a/sbt/src/sbt-test/source-dependencies/abstract-type-override/build.sbt b/sbt/src/sbt-test/source-dependencies/abstract-type-override/build.sbt index b0d683951..ae689f73d 100644 --- a/sbt/src/sbt-test/source-dependencies/abstract-type-override/build.sbt +++ b/sbt/src/sbt-test/source-dependencies/abstract-type-override/build.sbt @@ -1,12 +1,26 @@ import sbt.internal.inc.Analysis +import complete.DefaultParsers._ -InputKey[Unit]("checkNumberOfCompilerIterations") := { - val a = (compile in Compile).value.asInstanceOf[Analysis] - val args = Def.spaceDelimited().parsed - assert(args.size == 1) - val expectedIterationsNumber = args(0).toInt - assert(a.compilations.allCompilations.size == expectedIterationsNumber, - "a.compilations.allCompilations.size = %d (expected %d)".format( - a.compilations.allCompilations.size, expectedIterationsNumber) - ) +// Reset compiler iterations, necessary because tests run in batch mode +val recordPreviousIterations = taskKey[Unit]("Record previous iterations.") +recordPreviousIterations := { + CompileState.previousIterations = { + val previousAnalysis = (previousCompile in Compile).value.analysis + if (previousAnalysis.isEmpty) { + streams.value.log.info("No previous analysis detected") + 0 + } else { + previousAnalysis.get match { + case a: Analysis => a.compilations.allCompilations.size + } + } + } +} + +val checkIterations = inputKey[Unit]("Verifies the accumulated number of iterations of incremental compilation.") + +checkIterations := { + val expected: Int = (Space ~> NatBasic).parsed + val actual: Int = ((compile in Compile).value match { case a: Analysis => a.compilations.allCompilations.size }) - CompileState.previousIterations + assert(expected == actual, s"Expected $expected compilations, got $actual") } diff --git a/sbt/src/sbt-test/source-dependencies/abstract-type-override/project/CompileState.scala b/sbt/src/sbt-test/source-dependencies/abstract-type-override/project/CompileState.scala new file mode 100644 index 000000000..078db9c7b --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/abstract-type-override/project/CompileState.scala @@ -0,0 +1,4 @@ +// This is necessary because tests are run in batch mode +object CompileState { + @volatile var previousIterations: Int = -1 +} diff --git a/sbt/src/sbt-test/source-dependencies/abstract-type-override/test b/sbt/src/sbt-test/source-dependencies/abstract-type-override/test index 9ffa4fb17..30168afbf 100644 --- a/sbt/src/sbt-test/source-dependencies/abstract-type-override/test +++ b/sbt/src/sbt-test/source-dependencies/abstract-type-override/test @@ -4,6 +4,7 @@ # See https://github.com/sbt/sbt/issues/726 for details # introduces first compile iteration +> recordPreviousIterations > compile # this change adds a comment and does not change api so introduces # only one additional compile iteration @@ -11,4 +12,4 @@ $ copy-file changes/Bar1.scala src/main/scala/Bar.scala # second iteration #> compile # check if there are only two compile iterations performed -> checkNumberOfCompilerIterations 2 +> checkIterations 2 diff --git a/sbt/src/sbt-test/source-dependencies/constants/pending b/sbt/src/sbt-test/source-dependencies/constants/pending index eebce96e4..7a5ae5879 100644 --- a/sbt/src/sbt-test/source-dependencies/constants/pending +++ b/sbt/src/sbt-test/source-dependencies/constants/pending @@ -1,5 +1,4 @@ # Marked as pending, see https://github.com/sbt/sbt/issues/1543 -# # Tests if source dependencies are tracked properly # for compile-time constants (like final vals in top-level objects) # see https://issues.scala-lang.org/browse/SI-7173 for details diff --git a/sbt/src/sbt-test/source-dependencies/trait-member-modified/build.sbt b/sbt/src/sbt-test/source-dependencies/trait-member-modified/build.sbt index 9675b95c8..75a14e146 100644 --- a/sbt/src/sbt-test/source-dependencies/trait-member-modified/build.sbt +++ b/sbt/src/sbt-test/source-dependencies/trait-member-modified/build.sbt @@ -1,4 +1,14 @@ import sbt.internal.inc.Analysis +import xsbti.Maybe +import xsbti.compile.{PreviousResult, CompileAnalysis, MiniSetup} + +previousCompile in Compile := { + if (!CompileState.isNew) { + val res = new PreviousResult(Maybe.nothing[CompileAnalysis], Maybe.nothing[MiniSetup]) + CompileState.isNew = true + res + } else (previousCompile in Compile).value +} /* Performs checks related to compilations: * a) checks in which compilation given set of files was recompiled @@ -22,7 +32,7 @@ TaskKey[Unit]("checkCompilations") := { val files = fileNames.map(new java.io.File(_)) assert(recompiledFiles(iteration) == files, "%s != %s".format(recompiledFiles(iteration), files)) } - assert(allCompilations.size == 2) + assert(allCompilations.size == 2, s"All compilations is ${allCompilations.size}") // B.scala is just compiled at the beginning recompiledFilesInIteration(0, Set("B.scala")) // A.scala is changed and recompiled diff --git a/sbt/src/sbt-test/source-dependencies/trait-member-modified/project/CompileState.scala b/sbt/src/sbt-test/source-dependencies/trait-member-modified/project/CompileState.scala new file mode 100644 index 000000000..c50b231cc --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/trait-member-modified/project/CompileState.scala @@ -0,0 +1,4 @@ +// This is necessary because tests are run in batch mode +object CompileState { + @volatile var isNew: Boolean = false +} diff --git a/sbt/src/sbt-test/source-dependencies/transitive-memberRef/build.sbt b/sbt/src/sbt-test/source-dependencies/transitive-memberRef/build.sbt index ef7386f4c..7f4c0fd78 100644 --- a/sbt/src/sbt-test/source-dependencies/transitive-memberRef/build.sbt +++ b/sbt/src/sbt-test/source-dependencies/transitive-memberRef/build.sbt @@ -1,7 +1,18 @@ import sbt.internal.inc.Analysis +import xsbti.Maybe +import xsbti.compile.{PreviousResult, CompileAnalysis, MiniSetup} logLevel := Level.Debug +// Reset compile status because scripted tests are run in batch mode +previousCompile in Compile := { + if (!CompileState.isNew) { + val res = new PreviousResult(Maybe.nothing[CompileAnalysis], Maybe.nothing[MiniSetup]) + CompileState.isNew = true + res + } else (previousCompile in Compile).value +} + // disable sbt's heuristic which recompiles everything in case // some fraction (e.g. 50%) of files is scheduled to be recompiled // in this test we want precise information about recompiled files diff --git a/sbt/src/sbt-test/source-dependencies/transitive-memberRef/project/CompileState.scala b/sbt/src/sbt-test/source-dependencies/transitive-memberRef/project/CompileState.scala new file mode 100644 index 000000000..c50b231cc --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/transitive-memberRef/project/CompileState.scala @@ -0,0 +1,4 @@ +// This is necessary because tests are run in batch mode +object CompileState { + @volatile var isNew: Boolean = false +}