diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index d862bab7533..ebb14578f66 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -35,18 +35,12 @@ jobs: matrix: include: # bootstrap tests - - java-version: 8 - buildcmd: ci/test-mill-release.sh - - java-version: 17 - buildcmd: ci/test-mill-release.sh - # Limit some tests to Java 17 to limit CI times - - java-version: 17 + - java-version: 8 # Have one job on oldest JVM buildcmd: ci/test-mill-dev.sh + - java-version: 17 # Have one job on default JVM + buildcmd: ci/test-mill-release.sh - java-version: 17 buildcmd: ci/test-mill-bootstrap.sh - # Have one job on latest JVM - - java-version: 20 - buildcmd: ci/test-mill-bootstrap.sh # Just some reporting to enable reasoning about library upgrades - java-version: 8 buildcmd: | @@ -64,24 +58,40 @@ jobs: matrix: java-version: [8, 17] millargs: - # unit and module tests + # Run unit and module tests on both oldest and newest Java versions - '"{main,scalalib,testrunner,bsp}.__.test"' - '"scalajslib.__.test"' - '"scalanativelib.__.test"' - # integration tests - - "integration.feature.__.server.test" - - "integration.feature.__.fork.test" # contrib tests - "contrib._.test" include: - # Limit some tests to Java 17 to limit CI times + # Integration and example tests are slow, so don't run the on multiple Java versions + + # Group these tests together to try and balance out the runtimes of each job + # Just running in `local` mode since they shouldn't depend on the mode + - java-version: 17 + millargs: "'example.{basic,scalabuilds,scalamodule,web}[_].local.test'" + - java-version: 17 + millargs: "'example.{basicjava,javabuilds,javamodule,javaweb}[_].local.test'" + - java-version: 17 + millargs: "'example.{thirdparty,cross,misc,tasks}[_].local.test'" + + # Most of these integration tests should not depend on which mode they + # are run in, so just run them in `local` + - java-version: 17 + millargs: "'integration.{failure,feature,ide}[_].local.test'" + + # These invalidation tests need to be exercised in all three execution modes + # to make sure they work with and without -i/--no-server being passed - java-version: 17 - millargs: "example.__.local.test" + millargs: "'integration.invalidation[_].local.test'" - java-version: 17 - millargs: "integration.feature.__.local.test" + millargs: "'integration.invalidation[_].fork.test'" - java-version: 17 - millargs: "integration.failure.__.test" + millargs: "'integration.invalidation[_].server.test'" + + # Check docsite compiles - java-version: 17 millargs: docs.githubPages @@ -130,16 +140,16 @@ jobs: include: # Limit some tests to Java 17 to limit CI times + # just run a subset of examples/ on Windows, because for some reason running + # the whole suite can take hours on windows v.s. half an hour on linux - java-version: 17 - # just run a subset of examples/ on Windows, because for some reason running - # the whole suite can take hours on windows v.s. half an hour on linux - millargs: '"example.basic.__.local.test"' + millargs: '"example.basic[_].local.test"' - java-version: 17 - millargs: "integration.feature.__.fork.test" + millargs: "'integration.feature[_].fork.test'" - java-version: 17 - millargs: "integration.feature.__.server.test" + millargs: "'integration.invalidation[_].server.test'" - java-version: 17 - millargs: "integration.failure.__.fork.test" + millargs: "'integration.failure[_].fork.test'" - java-version: 17 millargs: "contrib.__.test" diff --git a/build.sc b/build.sc index eb34fe3ee82..c67ab077da1 100644 --- a/build.sc +++ b/build.sc @@ -1370,6 +1370,8 @@ object example extends MillScalaModule { object integration extends MillScalaModule { object failure extends Cross[IntegrationCrossModule](listIn(millSourcePath / "failure")) object feature extends Cross[IntegrationCrossModule](listIn(millSourcePath / "feature")) + object invalidation extends Cross[IntegrationCrossModule](listIn(millSourcePath / "invalidation")) + object ide extends Cross[IntegrationCrossModule](listIn(millSourcePath / "ide")) trait IntegrationCrossModule extends IntegrationTestCrossModule def moduleDeps = Seq(scalalib, scalajslib, scalanativelib, runner.test) diff --git a/ci/test-mill-bootstrap.sh b/ci/test-mill-bootstrap.sh index 8a178fb709b..1cd7c0a2439 100755 --- a/ci/test-mill-bootstrap.sh +++ b/ci/test-mill-bootstrap.sh @@ -20,5 +20,4 @@ ci/prepare-mill-bootstrap.sh # Run tests target/mill-release -i "__.compile" -target/mill-release -i "{main,scalalib}.__.test" target/mill-release -i "example.basic[1-simple].server.test" diff --git a/docs/modules/ROOT/pages/Java_Module_Config.adoc b/docs/modules/ROOT/pages/Java_Module_Config.adoc index 5f8d3a6c0b7..d37badb11e4 100644 --- a/docs/modules/ROOT/pages/Java_Module_Config.adoc +++ b/docs/modules/ROOT/pages/Java_Module_Config.adoc @@ -84,3 +84,7 @@ If you are using millw, a more permanent solution could be to set the environmen == Native C Code with JNI include::example/javamodule/12-jni.adoc[] + +== Annotation Processors with Lombok + +include::example/javamodule/13-annotation-processors-lombok.adoc[] diff --git a/example/javamodule/13-annotation-processors-lombok/bar/src/bar/GetterSetterExample.java b/example/javamodule/13-annotation-processors-lombok/bar/src/bar/GetterSetterExample.java new file mode 100644 index 00000000000..b4345030525 --- /dev/null +++ b/example/javamodule/13-annotation-processors-lombok/bar/src/bar/GetterSetterExample.java @@ -0,0 +1,27 @@ +package bar; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; + +public class GetterSetterExample { + /** + * Age of the person. Water is wet. + * + * @param age New value for this person's age. Sky is blue. + * @return The current value of this person's age. Circles are round. + */ + @Getter @Setter private int age = 10; + + /** + * Name of the person. + * -- SETTER -- + * Changes the name of this person. + * + * @param name The new value. + */ + @Setter(AccessLevel.PROTECTED) private String name; + + @Override public String toString() { + return String.format("%s (age: %d)", name, age); + } +} \ No newline at end of file diff --git a/example/javamodule/13-annotation-processors-lombok/bar/test/src/bar/HelloWorldTest.java b/example/javamodule/13-annotation-processors-lombok/bar/test/src/bar/HelloWorldTest.java new file mode 100644 index 00000000000..9fa7223e308 --- /dev/null +++ b/example/javamodule/13-annotation-processors-lombok/bar/test/src/bar/HelloWorldTest.java @@ -0,0 +1,13 @@ +package bar; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class HelloWorldTest { + @Test + public void testSimple() { + GetterSetterExample exampleValue = new GetterSetterExample(); + assertEquals(exampleValue.getAge(), 10); + exampleValue.setAge(20); + assertEquals(exampleValue.getAge(), 20); + } +} diff --git a/example/javamodule/13-annotation-processors-lombok/build.sc b/example/javamodule/13-annotation-processors-lombok/build.sc new file mode 100644 index 00000000000..33b25b1c039 --- /dev/null +++ b/example/javamodule/13-annotation-processors-lombok/build.sc @@ -0,0 +1,57 @@ +import mill._, javalib._ + + +object foo extends JavaModule { + def compileIvyDeps = Agg(ivy"org.projectlombok:lombok:1.18.34") + + object test extends JavaTests with TestModule.Junit4 +} + +// This is an example of how to use Mill to build Java projects using Java annotations and +// annotation processors. In this case, we use the annotations provided by +// https://projectlombok.org[Project Lombok] to automatically generate getters and setters +// from class private fields + +/** Usage + +> ./mill foo.test +Test foo.HelloWorldTest.testSimple started +Test foo.HelloWorldTest.testSimple finished... +... + +*/ + +// The Java compiler automatically discovers annotation processors based on the +// classes available during compilation, e.g. on `compileIvyDeps` or `ivyDeps`, +// which is what takes place in the example above. +// +// In some cases, you may need +// to pass in the annotation processors manually, e.g. if you need annotation +// processors that are not on the compilation classpath, or you need finer control +// over exactly which annotation processors are active. To do this, you can define +// a module to contain the exact annotation processors you want, and pass +// in `-processorpath` to `javacOptions` explicitly: + +object processors extends JavaModule{ + def ivyDeps = Agg(ivy"org.projectlombok:lombok:1.18.34") +} + +object bar extends JavaModule { + def compileIvyDeps = Agg(ivy"org.projectlombok:lombok:1.18.34") + + def javacOptions = Seq( + "-processorpath", + processors.runClasspath().map(_.path).mkString(":"), + ) + + object test extends JavaTests with TestModule.Junit4 +} + +/** Usage + + > ./mill bar.test +Test bar.HelloWorldTest.testSimple started +Test bar.HelloWorldTest.testSimple finished... +... + +*/ \ No newline at end of file diff --git a/example/javamodule/13-annotation-processors-lombok/foo/src/foo/GetterSetterExample.java b/example/javamodule/13-annotation-processors-lombok/foo/src/foo/GetterSetterExample.java new file mode 100644 index 00000000000..7266a36e5d7 --- /dev/null +++ b/example/javamodule/13-annotation-processors-lombok/foo/src/foo/GetterSetterExample.java @@ -0,0 +1,27 @@ +package foo; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; + +public class GetterSetterExample { + /** + * Age of the person. Water is wet. + * + * @param age New value for this person's age. Sky is blue. + * @return The current value of this person's age. Circles are round. + */ + @Getter @Setter private int age = 10; + + /** + * Name of the person. + * -- SETTER -- + * Changes the name of this person. + * + * @param name The new value. + */ + @Setter(AccessLevel.PROTECTED) private String name; + + @Override public String toString() { + return String.format("%s (age: %d)", name, age); + } +} \ No newline at end of file diff --git a/example/javamodule/13-annotation-processors-lombok/foo/test/src/foo/HelloWorldTest.java b/example/javamodule/13-annotation-processors-lombok/foo/test/src/foo/HelloWorldTest.java new file mode 100644 index 00000000000..544d1d7581d --- /dev/null +++ b/example/javamodule/13-annotation-processors-lombok/foo/test/src/foo/HelloWorldTest.java @@ -0,0 +1,13 @@ +package foo; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class HelloWorldTest { + @Test + public void testSimple() { + GetterSetterExample exampleValue = new GetterSetterExample(); + assertEquals(exampleValue.getAge(), 10); + exampleValue.setAge(20); + assertEquals(exampleValue.getAge(), 20); + } +} diff --git a/integration/feature/subprocess-stdout/test/src/SubprocessStdoutTests.scala b/integration/feature/subprocess-stdout/test/src/SubprocessStdoutTests.scala index 024698dde90..75ec1e6dbe4 100644 --- a/integration/feature/subprocess-stdout/test/src/SubprocessStdoutTests.scala +++ b/integration/feature/subprocess-stdout/test/src/SubprocessStdoutTests.scala @@ -11,46 +11,48 @@ object SubprocessStdoutTests extends IntegrationTestSuite { // Make sure that when a lot of printed/inherited stdout/stderr is printed // in quick succession, the output ordering is preserved and it doesn't get // jumbled up - assert( - res1.contains( - s"""print stdout1 - |proc stdout1 - |print stderr1 - |proc stderr1 - |print stdout2 - |proc stdout2 - |print stderr2 - |proc stderr2 - |print stdout3 - |proc stdout3 - |print stderr3 - |proc stderr3 - |print stdout4 - |proc stdout4 - |print stderr4 - |proc stderr4 - |print stdout5 - |proc stdout5 - |print stderr5 - |proc stderr5 - |print stdout6 - |proc stdout6 - |print stderr6 - |proc stderr6 - |print stdout7 - |proc stdout7 - |print stderr7 - |proc stderr7 - |print stdout8 - |proc stdout8 - |print stderr8 - |proc stderr8 - |print stdout9 - |proc stdout9 - |print stderr9 - |proc stderr9""".stripMargin.replaceAll("\r\n", "\n") + retry(3) { + assert( + res1.contains( + s"""print stdout1 + |proc stdout1 + |print stderr1 + |proc stderr1 + |print stdout2 + |proc stdout2 + |print stderr2 + |proc stderr2 + |print stdout3 + |proc stdout3 + |print stderr3 + |proc stderr3 + |print stdout4 + |proc stdout4 + |print stderr4 + |proc stderr4 + |print stdout5 + |proc stdout5 + |print stderr5 + |proc stderr5 + |print stdout6 + |proc stdout6 + |print stderr6 + |proc stderr6 + |print stdout7 + |proc stdout7 + |print stderr7 + |proc stderr7 + |print stdout8 + |proc stdout8 + |print stderr8 + |proc stderr8 + |print stdout9 + |proc stdout9 + |print stderr9 + |proc stderr9""".stripMargin.replaceAll("\r\n", "\n") + ) ) - ) + } // Make sure subprocess output that isn't captures by all of Mill's stdout/stderr/os.Inherit // redirects still gets pikced up from the stdout/stderr log files and displayed. They may diff --git a/integration/feature/bloop/repo/build.sc b/integration/ide/bloop/repo/build.sc similarity index 100% rename from integration/feature/bloop/repo/build.sc rename to integration/ide/bloop/repo/build.sc diff --git a/integration/feature/bloop/test/src/BloopTests.scala b/integration/ide/bloop/test/src/BloopTests.scala similarity index 100% rename from integration/feature/bloop/test/src/BloopTests.scala rename to integration/ide/bloop/test/src/BloopTests.scala diff --git a/integration/feature/bsp-install/repo/build.sc b/integration/ide/bsp-install/repo/build.sc similarity index 100% rename from integration/feature/bsp-install/repo/build.sc rename to integration/ide/bsp-install/repo/build.sc diff --git a/integration/feature/bsp-install/test/src/BspInstallDebugTests.scala b/integration/ide/bsp-install/test/src/BspInstallDebugTests.scala similarity index 100% rename from integration/feature/bsp-install/test/src/BspInstallDebugTests.scala rename to integration/ide/bsp-install/test/src/BspInstallDebugTests.scala diff --git a/integration/feature/bsp-install/test/src/BspInstallTests.scala b/integration/ide/bsp-install/test/src/BspInstallTests.scala similarity index 100% rename from integration/feature/bsp-install/test/src/BspInstallTests.scala rename to integration/ide/bsp-install/test/src/BspInstallTests.scala diff --git a/integration/feature/bsp-modules/repo/build.sc b/integration/ide/bsp-modules/repo/build.sc similarity index 100% rename from integration/feature/bsp-modules/repo/build.sc rename to integration/ide/bsp-modules/repo/build.sc diff --git a/integration/feature/bsp-modules/repo/proj1/build.sc b/integration/ide/bsp-modules/repo/proj1/build.sc similarity index 100% rename from integration/feature/bsp-modules/repo/proj1/build.sc rename to integration/ide/bsp-modules/repo/proj1/build.sc diff --git a/integration/feature/bsp-modules/repo/proj2/build.sc b/integration/ide/bsp-modules/repo/proj2/build.sc similarity index 100% rename from integration/feature/bsp-modules/repo/proj2/build.sc rename to integration/ide/bsp-modules/repo/proj2/build.sc diff --git a/integration/feature/bsp-modules/repo/proj3/build.sc b/integration/ide/bsp-modules/repo/proj3/build.sc similarity index 100% rename from integration/feature/bsp-modules/repo/proj3/build.sc rename to integration/ide/bsp-modules/repo/proj3/build.sc diff --git a/integration/feature/bsp-modules/test/src/BspModulesTests.scala b/integration/ide/bsp-modules/test/src/BspModulesTests.scala similarity index 100% rename from integration/feature/bsp-modules/test/src/BspModulesTests.scala rename to integration/ide/bsp-modules/test/src/BspModulesTests.scala diff --git a/integration/feature/gen-idea/repo/extended/build.sc b/integration/ide/gen-idea/repo/extended/build.sc similarity index 100% rename from integration/feature/gen-idea/repo/extended/build.sc rename to integration/ide/gen-idea/repo/extended/build.sc diff --git a/integration/feature/gen-idea/repo/extended/idea/compiler.xml b/integration/ide/gen-idea/repo/extended/idea/compiler.xml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/compiler.xml rename to integration/ide/gen-idea/repo/extended/idea/compiler.xml diff --git a/integration/feature/gen-idea/repo/extended/idea/libraries/SBT_ junit_junit_2_13_4_13_2_jar.xml b/integration/ide/gen-idea/repo/extended/idea/libraries/SBT_ junit_junit_2_13_4_13_2_jar.xml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/libraries/SBT_ junit_junit_2_13_4_13_2_jar.xml rename to integration/ide/gen-idea/repo/extended/idea/libraries/SBT_ junit_junit_2_13_4_13_2_jar.xml diff --git a/integration/feature/gen-idea/repo/extended/idea/libraries/SBT_ org_scalameta_munit_2_13_0_7_29_jar.xml b/integration/ide/gen-idea/repo/extended/idea/libraries/SBT_ org_scalameta_munit_2_13_0_7_29_jar.xml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/libraries/SBT_ org_scalameta_munit_2_13_0_7_29_jar.xml rename to integration/ide/gen-idea/repo/extended/idea/libraries/SBT_ org_scalameta_munit_2_13_0_7_29_jar.xml diff --git a/integration/feature/gen-idea/repo/extended/idea/libraries/scala3_library_3_3_0_2_jar.xml b/integration/ide/gen-idea/repo/extended/idea/libraries/scala3_library_3_3_0_2_jar.xml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/libraries/scala3_library_3_3_0_2_jar.xml rename to integration/ide/gen-idea/repo/extended/idea/libraries/scala3_library_3_3_0_2_jar.xml diff --git a/integration/feature/gen-idea/repo/extended/idea/libraries/scala_SDK_2_13_6.xml b/integration/ide/gen-idea/repo/extended/idea/libraries/scala_SDK_2_13_6.xml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/libraries/scala_SDK_2_13_6.xml rename to integration/ide/gen-idea/repo/extended/idea/libraries/scala_SDK_2_13_6.xml diff --git a/integration/feature/gen-idea/repo/extended/idea/libraries/scala_SDK_3_0_2.xml b/integration/ide/gen-idea/repo/extended/idea/libraries/scala_SDK_3_0_2.xml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/libraries/scala_SDK_3_0_2.xml rename to integration/ide/gen-idea/repo/extended/idea/libraries/scala_SDK_3_0_2.xml diff --git a/integration/feature/gen-idea/repo/extended/idea/libraries/scala_library_2_13_6_jar.xml b/integration/ide/gen-idea/repo/extended/idea/libraries/scala_library_2_13_6_jar.xml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/libraries/scala_library_2_13_6_jar.xml rename to integration/ide/gen-idea/repo/extended/idea/libraries/scala_library_2_13_6_jar.xml diff --git a/integration/feature/gen-idea/repo/extended/idea/mill_modules/helloworld.iml b/integration/ide/gen-idea/repo/extended/idea/mill_modules/helloworld.iml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/mill_modules/helloworld.iml rename to integration/ide/gen-idea/repo/extended/idea/mill_modules/helloworld.iml diff --git a/integration/feature/gen-idea/repo/extended/idea/mill_modules/helloworld.subscala3.iml b/integration/ide/gen-idea/repo/extended/idea/mill_modules/helloworld.subscala3.iml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/mill_modules/helloworld.subscala3.iml rename to integration/ide/gen-idea/repo/extended/idea/mill_modules/helloworld.subscala3.iml diff --git a/integration/feature/gen-idea/repo/extended/idea/mill_modules/helloworld.test.iml b/integration/ide/gen-idea/repo/extended/idea/mill_modules/helloworld.test.iml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/mill_modules/helloworld.test.iml rename to integration/ide/gen-idea/repo/extended/idea/mill_modules/helloworld.test.iml diff --git a/integration/feature/gen-idea/repo/extended/idea/mill_modules/mill-build.iml b/integration/ide/gen-idea/repo/extended/idea/mill_modules/mill-build.iml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/mill_modules/mill-build.iml rename to integration/ide/gen-idea/repo/extended/idea/mill_modules/mill-build.iml diff --git a/integration/feature/gen-idea/repo/extended/idea/mill_modules/mill-build.mill-build.iml b/integration/ide/gen-idea/repo/extended/idea/mill_modules/mill-build.mill-build.iml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/mill_modules/mill-build.mill-build.iml rename to integration/ide/gen-idea/repo/extended/idea/mill_modules/mill-build.mill-build.iml diff --git a/integration/feature/gen-idea/repo/extended/idea/misc.xml b/integration/ide/gen-idea/repo/extended/idea/misc.xml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/misc.xml rename to integration/ide/gen-idea/repo/extended/idea/misc.xml diff --git a/integration/feature/gen-idea/repo/extended/idea/modules.xml b/integration/ide/gen-idea/repo/extended/idea/modules.xml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/modules.xml rename to integration/ide/gen-idea/repo/extended/idea/modules.xml diff --git a/integration/feature/gen-idea/repo/extended/idea/runConfigurations/testrun.xml b/integration/ide/gen-idea/repo/extended/idea/runConfigurations/testrun.xml similarity index 100% rename from integration/feature/gen-idea/repo/extended/idea/runConfigurations/testrun.xml rename to integration/ide/gen-idea/repo/extended/idea/runConfigurations/testrun.xml diff --git a/integration/feature/gen-idea/repo/extended/mill-build/build.sc b/integration/ide/gen-idea/repo/extended/mill-build/build.sc similarity index 100% rename from integration/feature/gen-idea/repo/extended/mill-build/build.sc rename to integration/ide/gen-idea/repo/extended/mill-build/build.sc diff --git a/integration/feature/gen-idea/repo/hello-idea/build.sc b/integration/ide/gen-idea/repo/hello-idea/build.sc similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/build.sc rename to integration/ide/gen-idea/repo/hello-idea/build.sc diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala3_library_3_3_3_1_jar.xml b/integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala3_library_3_3_3_1_jar.xml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala3_library_3_3_3_1_jar.xml rename to integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala3_library_3_3_3_1_jar.xml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_2_12_5.xml b/integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_2_12_5.xml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_2_12_5.xml rename to integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_2_12_5.xml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_2_13_14.xml b/integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_2_13_14.xml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_2_13_14.xml rename to integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_2_13_14.xml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_3_3_1.xml b/integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_3_3_1.xml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_3_3_1.xml rename to integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala_SDK_3_3_1.xml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala_library_2_12_5_jar.xml b/integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala_library_2_12_5_jar.xml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala_library_2_12_5_jar.xml rename to integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala_library_2_12_5_jar.xml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala_library_2_13_14_jar.xml b/integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala_library_2_13_14_jar.xml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/libraries/scala_library_2_13_14_jar.xml rename to integration/ide/gen-idea/repo/hello-idea/idea/libraries/scala_library_2_13_14_jar.xml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.iml b/integration/ide/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.iml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.iml rename to integration/ide/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.iml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.scala3.iml b/integration/ide/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.scala3.iml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.scala3.iml rename to integration/ide/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.scala3.iml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.scala3.test.iml b/integration/ide/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.scala3.test.iml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.scala3.test.iml rename to integration/ide/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.scala3.test.iml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.test.iml b/integration/ide/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.test.iml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.test.iml rename to integration/ide/gen-idea/repo/hello-idea/idea/mill_modules/helloidea.test.iml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/mill_modules/mill-build.iml b/integration/ide/gen-idea/repo/hello-idea/idea/mill_modules/mill-build.iml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/mill_modules/mill-build.iml rename to integration/ide/gen-idea/repo/hello-idea/idea/mill_modules/mill-build.iml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/misc.xml b/integration/ide/gen-idea/repo/hello-idea/idea/misc.xml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/misc.xml rename to integration/ide/gen-idea/repo/hello-idea/idea/misc.xml diff --git a/integration/feature/gen-idea/repo/hello-idea/idea/modules.xml b/integration/ide/gen-idea/repo/hello-idea/idea/modules.xml similarity index 100% rename from integration/feature/gen-idea/repo/hello-idea/idea/modules.xml rename to integration/ide/gen-idea/repo/hello-idea/idea/modules.xml diff --git a/integration/feature/gen-idea/test/src/GenIdeaExtendedTests.scala b/integration/ide/gen-idea/test/src/GenIdeaExtendedTests.scala similarity index 100% rename from integration/feature/gen-idea/test/src/GenIdeaExtendedTests.scala rename to integration/ide/gen-idea/test/src/GenIdeaExtendedTests.scala diff --git a/integration/feature/gen-idea/test/src/GenIdeaTests.scala b/integration/ide/gen-idea/test/src/GenIdeaTests.scala similarity index 100% rename from integration/feature/gen-idea/test/src/GenIdeaTests.scala rename to integration/ide/gen-idea/test/src/GenIdeaTests.scala diff --git a/integration/feature/gen-idea/test/src/GenIdeaUtils.scala b/integration/ide/gen-idea/test/src/GenIdeaUtils.scala similarity index 100% rename from integration/feature/gen-idea/test/src/GenIdeaUtils.scala rename to integration/ide/gen-idea/test/src/GenIdeaUtils.scala diff --git a/integration/feature/codesig-hello/repo/build.sc b/integration/invalidation/codesig-hello/repo/build.sc similarity index 100% rename from integration/feature/codesig-hello/repo/build.sc rename to integration/invalidation/codesig-hello/repo/build.sc diff --git a/integration/feature/codesig-hello/test/src/CodeSigHelloTests.scala b/integration/invalidation/codesig-hello/test/src/CodeSigHelloTests.scala similarity index 100% rename from integration/feature/codesig-hello/test/src/CodeSigHelloTests.scala rename to integration/invalidation/codesig-hello/test/src/CodeSigHelloTests.scala diff --git a/integration/feature/codesig-nested/repo/build.sc b/integration/invalidation/codesig-nested/repo/build.sc similarity index 100% rename from integration/feature/codesig-nested/repo/build.sc rename to integration/invalidation/codesig-nested/repo/build.sc diff --git a/integration/feature/codesig-nested/test/src/CodeSigNestedTests.scala b/integration/invalidation/codesig-nested/test/src/CodeSigNestedTests.scala similarity index 100% rename from integration/feature/codesig-nested/test/src/CodeSigNestedTests.scala rename to integration/invalidation/codesig-nested/test/src/CodeSigNestedTests.scala diff --git a/integration/feature/codesig-scalamodule/repo/build.sc b/integration/invalidation/codesig-scalamodule/repo/build.sc similarity index 100% rename from integration/feature/codesig-scalamodule/repo/build.sc rename to integration/invalidation/codesig-scalamodule/repo/build.sc diff --git a/integration/feature/codesig-scalamodule/test/src/CodeSigScalaModuleTests.scala b/integration/invalidation/codesig-scalamodule/test/src/CodeSigScalaModuleTests.scala similarity index 100% rename from integration/feature/codesig-scalamodule/test/src/CodeSigScalaModuleTests.scala rename to integration/invalidation/codesig-scalamodule/test/src/CodeSigScalaModuleTests.scala diff --git a/integration/feature/invalidation-foreign/repo/build.sc b/integration/invalidation/invalidation-foreign/repo/build.sc similarity index 100% rename from integration/feature/invalidation-foreign/repo/build.sc rename to integration/invalidation/invalidation-foreign/repo/build.sc diff --git a/integration/feature/invalidation-foreign/repo/foreignA/build.sc b/integration/invalidation/invalidation-foreign/repo/foreignA/build.sc similarity index 100% rename from integration/feature/invalidation-foreign/repo/foreignA/build.sc rename to integration/invalidation/invalidation-foreign/repo/foreignA/build.sc diff --git a/integration/feature/invalidation-foreign/repo/foreignB/build.sc b/integration/invalidation/invalidation-foreign/repo/foreignB/build.sc similarity index 100% rename from integration/feature/invalidation-foreign/repo/foreignB/build.sc rename to integration/invalidation/invalidation-foreign/repo/foreignB/build.sc diff --git a/integration/feature/invalidation-foreign/test/src/ScriptsInvalidationForeignTests.scala b/integration/invalidation/invalidation-foreign/test/src/ScriptsInvalidationForeignTests.scala similarity index 100% rename from integration/feature/invalidation-foreign/test/src/ScriptsInvalidationForeignTests.scala rename to integration/invalidation/invalidation-foreign/test/src/ScriptsInvalidationForeignTests.scala diff --git "a/integration/feature/invalidation/repo/-#!+\342\206\222&%=~/inputSymbols.sc" "b/integration/invalidation/invalidation/repo/-#!+\342\206\222&%=~/inputSymbols.sc" similarity index 100% rename from "integration/feature/invalidation/repo/-#!+\342\206\222&%=~/inputSymbols.sc" rename to "integration/invalidation/invalidation/repo/-#!+\342\206\222&%=~/inputSymbols.sc" diff --git a/integration/feature/invalidation/repo/-#+&%.sc b/integration/invalidation/invalidation/repo/-#+&%.sc similarity index 100% rename from integration/feature/invalidation/repo/-#+&%.sc rename to integration/invalidation/invalidation/repo/-#+&%.sc diff --git a/integration/feature/invalidation/repo/a/inputA.sc b/integration/invalidation/invalidation/repo/a/inputA.sc similarity index 100% rename from integration/feature/invalidation/repo/a/inputA.sc rename to integration/invalidation/invalidation/repo/a/inputA.sc diff --git a/integration/feature/invalidation/repo/b/inputB.sc b/integration/invalidation/invalidation/repo/b/inputB.sc similarity index 100% rename from integration/feature/invalidation/repo/b/inputB.sc rename to integration/invalidation/invalidation/repo/b/inputB.sc diff --git a/integration/feature/invalidation/repo/b/inputD.sc b/integration/invalidation/invalidation/repo/b/inputD.sc similarity index 100% rename from integration/feature/invalidation/repo/b/inputD.sc rename to integration/invalidation/invalidation/repo/b/inputD.sc diff --git a/integration/feature/invalidation/repo/build.sc b/integration/invalidation/invalidation/repo/build.sc similarity index 100% rename from integration/feature/invalidation/repo/build.sc rename to integration/invalidation/invalidation/repo/build.sc diff --git a/integration/feature/invalidation/repo/e/inputE.sc b/integration/invalidation/invalidation/repo/e/inputE.sc similarity index 100% rename from integration/feature/invalidation/repo/e/inputE.sc rename to integration/invalidation/invalidation/repo/e/inputE.sc diff --git a/integration/feature/invalidation/repo/inputC.sc b/integration/invalidation/invalidation/repo/inputC.sc similarity index 100% rename from integration/feature/invalidation/repo/inputC.sc rename to integration/invalidation/invalidation/repo/inputC.sc diff --git a/integration/feature/invalidation/test/src/ScriptsInvalidationTests.scala b/integration/invalidation/invalidation/test/src/ScriptsInvalidationTests.scala similarity index 100% rename from integration/feature/invalidation/test/src/ScriptsInvalidationTests.scala rename to integration/invalidation/invalidation/test/src/ScriptsInvalidationTests.scala diff --git a/integration/feature/editing/repo/build.sc b/integration/invalidation/multi-level-editing/repo/build.sc similarity index 100% rename from integration/feature/editing/repo/build.sc rename to integration/invalidation/multi-level-editing/repo/build.sc diff --git a/integration/feature/editing/repo/foo/src/Example.scala b/integration/invalidation/multi-level-editing/repo/foo/src/Example.scala similarity index 100% rename from integration/feature/editing/repo/foo/src/Example.scala rename to integration/invalidation/multi-level-editing/repo/foo/src/Example.scala diff --git a/integration/feature/editing/repo/mill-build/build.sc b/integration/invalidation/multi-level-editing/repo/mill-build/build.sc similarity index 100% rename from integration/feature/editing/repo/mill-build/build.sc rename to integration/invalidation/multi-level-editing/repo/mill-build/build.sc diff --git a/integration/feature/editing/repo/mill-build/mill-build/build.sc b/integration/invalidation/multi-level-editing/repo/mill-build/mill-build/build.sc similarity index 100% rename from integration/feature/editing/repo/mill-build/mill-build/build.sc rename to integration/invalidation/multi-level-editing/repo/mill-build/mill-build/build.sc diff --git a/integration/feature/editing/test/src/MultiLevelBuildTests.scala b/integration/invalidation/multi-level-editing/test/src/MultiLevelBuildTests.scala similarity index 100% rename from integration/feature/editing/test/src/MultiLevelBuildTests.scala rename to integration/invalidation/multi-level-editing/test/src/MultiLevelBuildTests.scala diff --git a/integration/feature/watch-source-input/repo/bar.txt b/integration/invalidation/watch-source-input/repo/bar.txt similarity index 100% rename from integration/feature/watch-source-input/repo/bar.txt rename to integration/invalidation/watch-source-input/repo/bar.txt diff --git a/integration/feature/watch-source-input/repo/baz.txt b/integration/invalidation/watch-source-input/repo/baz.txt similarity index 100% rename from integration/feature/watch-source-input/repo/baz.txt rename to integration/invalidation/watch-source-input/repo/baz.txt diff --git a/integration/feature/watch-source-input/repo/build.sc b/integration/invalidation/watch-source-input/repo/build.sc similarity index 100% rename from integration/feature/watch-source-input/repo/build.sc rename to integration/invalidation/watch-source-input/repo/build.sc diff --git a/integration/feature/watch-source-input/repo/foo1.txt b/integration/invalidation/watch-source-input/repo/foo1.txt similarity index 100% rename from integration/feature/watch-source-input/repo/foo1.txt rename to integration/invalidation/watch-source-input/repo/foo1.txt diff --git a/integration/feature/watch-source-input/repo/foo2.txt b/integration/invalidation/watch-source-input/repo/foo2.txt similarity index 100% rename from integration/feature/watch-source-input/repo/foo2.txt rename to integration/invalidation/watch-source-input/repo/foo2.txt diff --git a/integration/feature/watch-source-input/repo/watchValue.txt b/integration/invalidation/watch-source-input/repo/watchValue.txt similarity index 100% rename from integration/feature/watch-source-input/repo/watchValue.txt rename to integration/invalidation/watch-source-input/repo/watchValue.txt diff --git a/integration/feature/watch-source-input/test/src/WatchSourceInputTests.scala b/integration/invalidation/watch-source-input/test/src/WatchSourceInputTests.scala similarity index 100% rename from integration/feature/watch-source-input/test/src/WatchSourceInputTests.scala rename to integration/invalidation/watch-source-input/test/src/WatchSourceInputTests.scala diff --git a/integration/feature/zinc-incremental-compilation/repo/app/src/main/scala/App.scala b/integration/invalidation/zinc-incremental-compilation/repo/app/src/main/scala/App.scala similarity index 100% rename from integration/feature/zinc-incremental-compilation/repo/app/src/main/scala/App.scala rename to integration/invalidation/zinc-incremental-compilation/repo/app/src/main/scala/App.scala diff --git a/integration/feature/zinc-incremental-compilation/repo/app/src/main/scala/models/TestModel1.scala b/integration/invalidation/zinc-incremental-compilation/repo/app/src/main/scala/models/TestModel1.scala similarity index 100% rename from integration/feature/zinc-incremental-compilation/repo/app/src/main/scala/models/TestModel1.scala rename to integration/invalidation/zinc-incremental-compilation/repo/app/src/main/scala/models/TestModel1.scala diff --git a/integration/feature/zinc-incremental-compilation/repo/build.sc b/integration/invalidation/zinc-incremental-compilation/repo/build.sc similarity index 100% rename from integration/feature/zinc-incremental-compilation/repo/build.sc rename to integration/invalidation/zinc-incremental-compilation/repo/build.sc diff --git a/integration/feature/zinc-incremental-compilation/test/src/ZincIncrementalCompilationTests.scala b/integration/invalidation/zinc-incremental-compilation/test/src/ZincIncrementalCompilationTests.scala similarity index 100% rename from integration/feature/zinc-incremental-compilation/test/src/ZincIncrementalCompilationTests.scala rename to integration/invalidation/zinc-incremental-compilation/test/src/ZincIncrementalCompilationTests.scala