On 2/14/2020 9:34 PM, Christian Stein wrote:
Assuming `--patch-module-descriptor` was already available, the
org.astro test story would read:
- org.astro/main/module-info.java:
module org.astro {
exports org.astro;
requires java.logging;
}
- org.astro/test/module-info.java:
open /*test*/ module org.astro /*extends main module org.astro*/ {
requires java.sql; // system-provided module needed by test code
requires org.junit.jupiter; // framework reflecting entry-points
requires org.assertj.core; // ...and more test-related modules
}
A build tool now easily may detect that `--patch-module-descriptor`
is required at test compile and run time. It could infer it from the
same module name or simply by seeing a main and a test
`module-info.java` compilation unit within the sources of the
org.astro Maven-/Gradle-/pro-/Bach-/any-build-tool-"module".
Build tools could pass the following argument to javac/java
while being in their test-scope tasks. Of course, implying that
org.astro/test/module-info.java is the current "primary" module
descriptor:
--patch-module-descriptor org.astro=org.astro/main/module-info.java
That's it.
The primary test-relevant modular directives are enriched by
those of the main module as declared in org.astro/main/module-info.java
resulting effectively in a synthetic in-module test module descriptor that
resembles the inter-module test descriptor presented above:
- SYNTHETIC test module for org.astro
open /*test*/ module org.astro /*extends main module org.astro*/ {
requires java.sql; // system-provided module needed by test code
requires org.junit.jupiter; // framework reflecting entry-points
requires org.assertj.core; // ...and more test-related modules
//
exports org.astro; // patched from org.astro/main/module-info.java
requires java.logging; // patched from org.astro/main/module-info.java
}
Good description of how the main module
(org.astro/main/module-info.java) and the test module
(org.astro/test/module-info.java) interact to form a test-scoped module.
If a build tool has detected the presence of the test module, then the
build tool can use javax.lang.model.element.ModuleElement to inspect the
test module's declaration and infer what it requires, whether it's open,
etc. Then, the build tool can enrich the main module by passing
--add-modules, --add-reads, and --add-opens to javac/java while in a
test scope. No need for --patch-module-descriptor in the JDK.
Alex