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

Paul King commented on GROOVY-11118:
------------------------------------

JEP 445 ([https://openjdk.org/jeps/445]) does two things:
 # It allows Java source files without a class declaration but with a main 
method declaration (and optionally other methods and fields). In addition to 
the normal psvm signature taking String[] it allows an instance method and 
supports having no arguments. Such classes aren't modified in any way.
 # The JDK launch protocol is enhanced to know not just about psvm but also 
these other variants. The no-arg static variant is called but without 
command-line arguments passed through. The instance variants must have a 
non-private constructor (can be the default) which is more-or-less called in 
that case.

JEP 445 goes further in that it talks about anonymous classes but I haven't 
pursued that (yet).

In the current PR:
 * I don't modify instance main methods (and I have adapted our default runner 
to know about them), so they follow JEP 445 but don't need JDK21 with preview 
to run through the Groovy runner but would need that JDK version to run 
directly from Java via their main method.
 * static main methods are "promoted" to have the normal psvm signature (this 
is legacy behavior) but the outer class no longer extends Script nor does the 
main method contents get moved into run. This represents partial JEP 445 
compatibility since we do change the class but does end up offering a much 
simplified start up while supporting some of Groovy's current behavior. The 
runner protocol also knows about the bare (non-promoted) non psvm variants but 
you'd need to write those out long-hand or use transforms to get them.
 * support is added to overwrite the "run" method which will give exactly the 
same behavior as the current static main support, i.e. has a class which 
extends Script and has access to the script context and binding

> Partial JEP 445 compatibility
> -----------------------------
>
>                 Key: GROOVY-11118
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11118
>             Project: Groovy
>          Issue Type: New Feature
>            Reporter: Paul King
>            Assignee: Paul King
>            Priority: Major
>              Labels: GEP, breaking
>             Fix For: 5.x
>
>
> [JEP 445: Unnamed Classes and Instance Main 
> Methods|https://openjdk.org/jeps/445] provides features that improve using 
> Java for scripting purposes. While these features offer a subset of the 
> features offered by Groovy for scripting, it would be nice to offer some 
> interworking for cut-n-paste compatibility and leveraging the updated launch 
> protocol.
> (i) This description will contain the most update-to-date proposal for the 
> design but may undergo change during discussions. If needed, a separate GEP 
> section in the wiki will capture the final design.
> h2. Scripting semantics
> ||Source file characteristics||Semantics determined||
> |Contains class declaration|Compiled as a class|
> |Contains uncontained non-declaration statements
> or a static main method|Compiled as a Groovy script|
> |Contains an instance main method, and
> possibly field and other method declarations|Compiled as a JEP 445 compatible 
> class|
> Groovy scripts are wrapped into an encompassing class that extends 
> {{{}groovy.lang.Script{}}}.
> Such classes have a {{public static void main}} added which (summarising) 
> creates a class instance and calls its {{run}} method.
> Uncontained statements within the script can be thought of as belonging 
> within the {{run}} method.
> Declaration statements within the script are treated as local variable 
> definitions (also within the {{run}} method).
> Field definitions can be obtained by annotating declaration statements with 
> the {{@Field}} annotation.
> JEP 445 scripts do not extend {{Script}} and do not have any methods added.
> Declaration statements within the script are treated as field definitions.
> h2. Script runner
> Groovy's runner mechanism will be extended to follow a similar protocol to 
> Java's revised launch protocol. This should be available for JDK11+ and a 
> JEP-445 compatible class could be invoked using JDK21+ with preview enabled 
> (with Groovy on the classpath unless a POJO class is created).
> h2. Breaking changes
> Previously, if a script had a single instance {{main}} method not taking a 
> {{String[]}} parameter and no loose statements, that was previously accepted 
> as a normal Groovy script (and nothing would execute). Now if the method has 
> an Object parameter, that is treated as a JEP-445 script and its contents 
> executed.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to