[ 
https://issues.apache.org/jira/browse/GROOVY-9273?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18139281#comment-18139281
 ] 

ASF GitHub Bot commented on GROOVY-9273:
----------------------------------------

daniellansun opened a new pull request, #3235:
URL: https://github.com/apache/groovy/pull/3235

   ## GROOVY-9273 / GROOVY-9668: support JPMS module declarations (module-info)
   
   - https://issues.apache.org/jira/browse/GROOVY-9273
   - https://issues.apache.org/jira/browse/GROOVY-9668
   
   ## Summary
   
   Groovy now accepts a modular compilation unit (`module-info.groovy` or 
`module-info.java`) and compiles it to a real `module-info.class` (JVMS 
§4.7.25), following JLS §7.7.
   
   - Grammar: `{Annotation} [open] module Identifier{.Identifier} { directives 
}`, with imports allowed before the declaration (JLS §7.3). `requires`, 
`exports`, `opens`, `uses`, `provides`, `to`, `with`, `transitive`, and `open` 
are contextual identifiers inside that file only, so existing Groovy code that 
uses those names is unchanged.
   - Directives: `requires` [`transitive`] [`static`] (either modifier order), 
`exports`/`opens` with an optional `to` clause, `uses`, and `provides` … `with` 
one or more providers.
   - Checks: duplicate requires/exports/opens/uses/provides, duplicate `to` / 
`with` targets, duplicate modifiers, `opens` in an `open` module, `requires 
java.base` with modifiers, `requires` in module `java.base`, self-requires and 
resolution failures (missing module, cycle), exports of a package with no 
compilation unit in the module, enum services, provider visibility / nesting / 
module membership, provider constructor or `public static provider()` method, 
and readability of service and annotation types. An absent `requires java.base` 
is emitted as `ACC_MANDATED`.
   - `import module` (GROOVY-11896) is unchanged in ordinary compilation units 
and may appear before the module declaration.
   
   `module-info.class` is written with ASM `ClassWriter.visitModule`: requires 
flags `TRANSITIVE` / `STATIC_PHASE`, exports and opens (including qualified 
targets), uses, provides, concealed packages in `ModulePackages`, and module 
annotations (`ElementType.MODULE`).
   
   ## Tests
   
   ```
   ./gradlew :test --tests org.apache.groovy.jpms.ModuleDeclarationTest --tests 
org.apache.groovy.classgen.ModuleDeclarationCoverageTest --tests 
org.codehaus.groovy.ast.AnnotationNodeTest --tests groovy.ImportTest
   ```
   
   46 tests passed, including directive round-trips via 
`ModuleDescriptor.read`, ServiceLoader, `requires transitive` readability, 
automatic modules (`Automatic-Module-Name`), qualified exports, `java 
--describe-module`, and `jdeps`.
   
   JaCoCo on that run (`:jacocoTestReport`): `ModuleDeclarationNode` 100% 
instruction / 100% branch. `ModuleDeclarationVerifier` 99% instruction / 91% 
branch. Residual uncovered lines are a `ModuleFinder.find` miss after a 
successful resolve, a `FindException` handler in version lookup, and a closing 
brace. The class-file version floor below Java 9 is covered by a direct emitter 
call; the compiler's minimum target is 17, so that path is not reachable 
through `CompilerConfiguration`.
   




> Support module descriptor, aka. module-info
> -------------------------------------------
>
>                 Key: GROOVY-9273
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9273
>             Project: Groovy
>          Issue Type: New Feature
>            Reporter: Daniel Sun
>            Priority: Major
>
>  
> [https://openjdk.java.net/projects/jigsaw/quick-start]
> [http://tutorials.jenkov.com/java/modules.html#java-module-basics]
> [https://www.oracle.com/corporate/features/understanding-java-9-modules.html]
> [https://www.concretepage.com/java/java-9/java-module]



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to