[
https://issues.apache.org/jira/browse/GROOVY-11118?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Paul King updated GROOVY-11118:
-------------------------------
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 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 "promotoed" 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.
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 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.
> 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.0.0-alpha-1
>
>
> [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 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 "promotoed" 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.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)