[ 
https://issues.apache.org/jira/browse/GROOVY-11166?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul King updated GROOVY-11166:
-------------------------------
    Description: 
[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 only a class declaration|Compiled as a class|
|Contains class declaration(s) and uncontained statements|Class definitions 
elevated to top-level, uncontained statements treated like a normal script|
|Contains only a class declaration|Compiled as a class|
|Contains an instance main method, and possibly field and other method 
declarations|*NEW*: Compiled as a JEP 445 compatible class|
|Contains a static main method, and possibly field and other method 
declarations|*NEW*: Compiled like a JEP 445 compatible class but method 
signature "promoted" to public static void main with String[] argument|
|Contains uncontained non-declaration statements or a no-arg instance {{run}} 
method|*NEW*: Compiled as a Groovy script|

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.
* Previously, if a script had a static main method and no other loose 
statements, the main method's contents were moved into the run method and the 
script class extended Script. Now, creating a no-arg {{run}} method is 
supported for this scenario. If a static {{main}} method is created, it is 
treated as a JEP 445 compatible script.

  was:
[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 only a class declaration|Compiled as a class|
|Contains class declaration(s) and uncontained statements|Class definitions 
elevated to top-level, uncontained statements treated like a normal script|
|Contains only a class declaration|Compiled as a class|
|Contains uncontained non-declaration statements or a no-arg instance {{run}} 
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|
|Contains a static main method, and possibly field and other method 
declarations|Compiled as a JEP 445 compatible class but method signature 
"promoted" to public static void main with String[] argument|

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.
* Previously, if a script had a static main method and no other loose 
statements, the main method's contents were moved into the run method and the 
script class extended Script. Now, creating a no-arg {{run}} method is 
supported for this scenario. If a static {{main}} method is created, it is 
treated as a JEP 445 compatible script.


> JEP 445 compatibility
> ---------------------
>
>                 Key: GROOVY-11166
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11166
>             Project: Groovy
>          Issue Type: New Feature
>            Reporter: Paul King
>            Assignee: Paul King
>            Priority: Major
>              Labels: GEP, breaking
>
> [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 only a class declaration|Compiled as a class|
> |Contains class declaration(s) and uncontained statements|Class definitions 
> elevated to top-level, uncontained statements treated like a normal script|
> |Contains only a class declaration|Compiled as a class|
> |Contains an instance main method, and possibly field and other method 
> declarations|*NEW*: Compiled as a JEP 445 compatible class|
> |Contains a static main method, and possibly field and other method 
> declarations|*NEW*: Compiled like a JEP 445 compatible class but method 
> signature "promoted" to public static void main with String[] argument|
> |Contains uncontained non-declaration statements or a no-arg instance {{run}} 
> method|*NEW*: Compiled as a Groovy script|
> 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.
> * Previously, if a script had a static main method and no other loose 
> statements, the main method's contents were moved into the run method and the 
> script class extended Script. Now, creating a no-arg {{run}} method is 
> supported for this scenario. If a static {{main}} method is created, it is 
> treated as a JEP 445 compatible script.



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

Reply via email to