You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2019/04/25 02:32:21 UTC
[groovy] 01/02: GROOVY-9073: added compiler option to enable
preview features (JEP 12)
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 7b395f5a3a9f46ba3bf0edd6ce335746ac10d638
Author: Keegan Witt <ke...@gmail.com>
AuthorDate: Mon Apr 8 14:36:09 2019 -0400
GROOVY-9073: added compiler option to enable preview features (JEP 12)
---
src/bin/groovyConsole_completion | 2 +-
src/bin/groovy_completion | 2 +-
src/bin/groovyc_completion | 2 +-
src/bin/groovysh_completion | 2 +-
src/main/groovy/groovy/ui/GroovyMain.java | 4 +++
.../groovy/classgen/AsmClassGenerator.java | 2 +-
.../groovy/classgen/asm/WriterController.java | 8 +++---
.../groovy/control/CompilerConfiguration.java | 30 +++++++++++++++++++++-
.../codehaus/groovy/tools/FileSystemCompiler.java | 4 +++
src/spec/doc/tools-groovy.adoc | 1 +
src/spec/doc/tools-groovyc.adoc | 1 +
.../main/java/org/codehaus/groovy/ant/Groovyc.java | 24 +++++++++++++++++
.../groovy/cli/picocli/CliBuilderTest.groovy | 24 +++++++++++++++--
.../src/spec/doc/groovy-console.adoc | 3 ++-
.../groovy-groovysh/src/spec/doc/groovysh.adoc | 3 ++-
15 files changed, 98 insertions(+), 14 deletions(-)
diff --git a/src/bin/groovyConsole_completion b/src/bin/groovyConsole_completion
index 10c777c..9803661 100644
--- a/src/bin/groovyConsole_completion
+++ b/src/bin/groovyConsole_completion
@@ -90,7 +90,7 @@ function _picocli_groovyConsole() {
PREV_WORD=${COMP_WORDS[COMP_CWORD-1]}
COMMANDS=""
- FLAG_OPTS="-cp -classpath --classpath -h --help -V --version -pa --parameters -i --indy"
+ FLAG_OPTS="-cp -classpath --classpath -h --help -V --version -pa --parameters -pr --enable-preview -i --indy"
ARG_OPTS="-D --define --configscript"
COMPREPLY=( $(compgen -W "${FLAG_OPTS} ${ARG_OPTS} ${COMMANDS}" -- ${CURR_WORD}) )
diff --git a/src/bin/groovy_completion b/src/bin/groovy_completion
index 13cd712..9fc1fa7 100644
--- a/src/bin/groovy_completion
+++ b/src/bin/groovy_completion
@@ -90,7 +90,7 @@ function _picocli_groovy() {
PREV_WORD=${COMP_WORDS[COMP_CWORD-1]}
COMMANDS=""
- FLAG_OPTS="-d --debug -n -p -pa --parameters --indy -h --help -v --version"
+ FLAG_OPTS="-d --debug -n -p -pa --parameters -pr --enable-preview --indy -h --help -v --version"
ARG_OPTS="-cp -classpath --classpath -D --define --disableopt -c --encoding -e -i -l -a --autosplit --configscript -b --basescript"
COMPREPLY=( $(compgen -W "${FLAG_OPTS} ${ARG_OPTS} ${COMMANDS}" -- ${CURR_WORD}) )
diff --git a/src/bin/groovyc_completion b/src/bin/groovyc_completion
index ebb2a2a..d4591f1 100644
--- a/src/bin/groovyc_completion
+++ b/src/bin/groovyc_completion
@@ -90,7 +90,7 @@ function _picocli_groovyc() {
PREV_WORD=${COMP_WORDS[COMP_CWORD-1]}
COMMANDS=""
- FLAG_OPTS="-e --exception -pa --parameters -j --jointCompilation --indy -h --help -v --version"
+ FLAG_OPTS="-e --exception -pa --parameters -pr --enable-preview -j --jointCompilation --indy -h --help -v --version"
ARG_OPTS="-cp -classpath --classpath -sourcepath --sourcepath --temp --encoding -d -b --basescript -J -F --configscript"
case ${CURR_WORD} in
diff --git a/src/bin/groovysh_completion b/src/bin/groovysh_completion
index 5b8869c..d3e4a8a 100644
--- a/src/bin/groovysh_completion
+++ b/src/bin/groovysh_completion
@@ -87,7 +87,7 @@ function _picocli_groovysh() {
PREV_WORD=${COMP_WORDS[COMP_CWORD-1]}
COMMANDS=""
- FLAG_OPTS="-cp -classpath --classpath -h --help -V --version -v --verbose -q --quiet -d --debug -pa --parameters"
+ FLAG_OPTS="-cp -classpath --classpath -h --help -V --version -v --verbose -q --quiet -d --debug -pr --enable-preview -pr --parameters"
ARG_OPTS="-e --evaluate -C --color -D --define -T --terminal"
COMPREPLY=( $(compgen -W "${FLAG_OPTS} ${ARG_OPTS} ${COMMANDS}" -- ${CURR_WORD}) )
diff --git a/src/main/groovy/groovy/ui/GroovyMain.java b/src/main/groovy/groovy/ui/GroovyMain.java
index 7bdf937..e6702e4 100644
--- a/src/main/groovy/groovy/ui/GroovyMain.java
+++ b/src/main/groovy/groovy/ui/GroovyMain.java
@@ -199,6 +199,9 @@ public class GroovyMain {
@Option(names = {"-pa", "--parameters"}, description = "Generate metadata for reflection on method parameter names (jdk8+ only)")
private boolean parameterMetadata;
+ @Option(names = {"-pr", "--enable-preview"}, description = "Enable preview Java features (JEP 12) (jdk12+ only)")
+ private boolean previewFeatures;
+
@Option(names = "-l", arity = "0..1", paramLabel = "<port>", description = "Listen on a port and process inbound lines (default: 1960)")
private String port;
@@ -241,6 +244,7 @@ public class GroovyMain {
main.debug = debug;
main.conf.setDebug(main.debug);
main.conf.setParameters(parameterMetadata);
+ main.conf.setPreviewFeatures(previewFeatures);
main.processFiles = lineByLine || lineByLinePrint;
main.autoOutput = lineByLinePrint;
main.editFiles = extension != null;
diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index d9bea88..6f6d217 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -221,7 +221,7 @@ public class AsmClassGenerator extends ClassGenerator {
Object min = classNode.getNodeMetaData(MINIMUM_BYTECODE_VERSION);
if (min instanceof Integer) {
int minVersion = (int) min;
- if (bytecodeVersion < minVersion) {
+ if ((bytecodeVersion ^ Opcodes.V_PREVIEW) < minVersion) {
bytecodeVersion = minVersion;
}
}
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
index ef27fff..1747f8b 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
@@ -98,7 +98,7 @@ public class WriterController {
this.outermostClass = null;
this.internalClassName = BytecodeHelper.getClassInternalName(classNode);
- bytecodeVersion = chooseBytecodeVersion(invokedynamic, config.getTargetBytecode());
+ bytecodeVersion = chooseBytecodeVersion(invokedynamic, config.isPreviewFeatures(), config.getTargetBytecode());
if (invokedynamic) {
this.invocationWriter = new InvokeDynamicWriter(this);
@@ -149,14 +149,14 @@ public class WriterController {
}
return new LoggableClassVisitor(cv);
}
- private static int chooseBytecodeVersion(final boolean invokedynamic, final String targetBytecode) {
+ private static int chooseBytecodeVersion(final boolean invokedynamic, final boolean previewFeatures, final String targetBytecode) {
Integer bytecodeVersion = CompilerConfiguration.JDK_TO_BYTECODE_VERSION_MAP.get(targetBytecode);
if (invokedynamic && bytecodeVersion < Opcodes.V1_8) {
- return Opcodes.V1_8;
+ return previewFeatures ? Opcodes.V1_8 | Opcodes.V_PREVIEW : Opcodes.V1_8;
} else {
if (null != bytecodeVersion) {
- return bytecodeVersion;
+ return previewFeatures ? bytecodeVersion | Opcodes.V_PREVIEW : bytecodeVersion;
}
}
diff --git a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
index 9e185ca..9cf01a7 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
@@ -208,6 +208,11 @@ public class CompilerConfiguration {
private String targetBytecode;
/**
+ * Whether the bytecode version has preview features enabled (JEP 12)
+ */
+ private boolean previewFeatures;
+
+ /**
* options for joint compilation (null by default == no joint compilation)
*/
private Map<String, Object> jointCompilationOptions;
@@ -243,7 +248,6 @@ public class CompilerConfiguration {
* Sets the Flags to defaults.
*/
public CompilerConfiguration() {
- //
// Set in safe defaults
setWarningLevel(WarningMessage.LIKELY_ERRORS);
@@ -258,6 +262,7 @@ public class CompilerConfiguration {
setRecompileGroovySource(false);
setMinimumRecompilationInterval(100);
setTargetBytecode(getSystemPropertySafe("groovy.target.bytecode", getMinBytecodeVersion()));
+ setPreviewFeatures(getSystemPropertySafe("groovy.preview.features") != null);
setDefaultScriptExtension(getSystemPropertySafe("groovy.default.scriptExtension", ".groovy"));
// Source file encoding
@@ -349,6 +354,7 @@ public class CompilerConfiguration {
setRecompileGroovySource(configuration.getRecompileGroovySource());
setMinimumRecompilationInterval(configuration.getMinimumRecompilationInterval());
setTargetBytecode(configuration.getTargetBytecode());
+ setPreviewFeatures(configuration.isPreviewFeatures());
setDefaultScriptExtension(configuration.getDefaultScriptExtension());
setSourceEncoding(configuration.getSourceEncoding());
setTargetDirectory(configuration.getTargetDirectory());
@@ -398,6 +404,7 @@ public class CompilerConfiguration {
* <tr><td><code>"groovy.source.encoding"</code></td><td>{@link #getSourceEncoding}</td></tr>
* <tr><td><code>"groovy.target.directory"</code></td><td>{@link #getTargetDirectory}</td></tr>
* <tr><td><code>"groovy.target.bytecode"</code></td><td>{@link #getTargetBytecode}</td></tr>
+ * <tr><td><code>"groovy.preview.features"</code></td><td>{@link #isPreviewFeatures}</td></tr>
* <tr><td><code>"groovy.classpath"</code></td><td>{@link #getClasspath}</td></tr>
* <tr><td><code>"groovy.output.verbose"</code></td><td>{@link #getVerbose}</td></tr>
* <tr><td><code>"groovy.output.debug"</code></td><td>{@link #getDebug}</td></tr>
@@ -511,6 +518,9 @@ public class CompilerConfiguration {
text = configuration.getProperty("groovy.target.bytecode");
if (text != null) setTargetBytecode(text);
+ text = configuration.getProperty("groovy.preview.features");
+ if (text != null && text.equalsIgnoreCase("true")) setPreviewFeatures(true);
+
//
// Classpath
//
@@ -846,6 +856,24 @@ public class CompilerConfiguration {
return this.targetBytecode;
}
+ /**
+ * Whether the bytecode version has preview features enabled (JEP 12)
+ *
+ * @return preview features
+ */
+ public boolean isPreviewFeatures() {
+ return previewFeatures;
+ }
+
+ /**
+ * Sets whether the bytecode version has preview features enabled (JEP 12).
+ *
+ * @param previewFeatures whether to support preview features
+ */
+ public void setPreviewFeatures(boolean previewFeatures) {
+ this.previewFeatures = previewFeatures;
+ }
+
private static String getMinBytecodeVersion() {
return JDK8;
}
diff --git a/src/main/java/org/codehaus/groovy/tools/FileSystemCompiler.java b/src/main/java/org/codehaus/groovy/tools/FileSystemCompiler.java
index 1c040cb..e197c6f 100644
--- a/src/main/java/org/codehaus/groovy/tools/FileSystemCompiler.java
+++ b/src/main/java/org/codehaus/groovy/tools/FileSystemCompiler.java
@@ -331,6 +331,9 @@ public class FileSystemCompiler {
@Option(names = {"-pa", "--parameters"}, description = "Generate metadata for reflection on method parameter names (jdk8+ only)")
private boolean parameterMetadata;
+ @Option(names = {"-pr", "--enable-preview"}, description = "Enable preview Java features (JEP 12) (jdk12+ only)")
+ private boolean previewFeatures;
+
@Option(names = {"-j", "--jointCompilation"}, description = "Attach javac compiler to compile .java files")
private boolean jointCompilation;
@@ -372,6 +375,7 @@ public class FileSystemCompiler {
}
configuration.setParameters(parameterMetadata);
+ configuration.setPreviewFeatures(previewFeatures);
configuration.setSourceEncoding(encoding);
configuration.setScriptBaseClass(scriptBaseClass);
diff --git a/src/spec/doc/tools-groovy.adoc b/src/spec/doc/tools-groovy.adoc
index 50f578d..caf202c 100644
--- a/src/spec/doc/tools-groovy.adoc
+++ b/src/spec/doc/tools-groovy.adoc
@@ -60,4 +60,5 @@ int (disable any int based optimizations) |
| -p | | process files line by line and print result (see also -n) |
| -v | --version | display the Groovy and JVM versions | groovy -v
| -pa | --parameters | Generates metadata for reflection on method parameter names on JDK 8 and above. Defaults to false. | groovy --parameters Person.groovy
+| -pr | --enable-preview | Enable preview Java features (JEP 12) (jdk12+ only). | groovy --enable-preview Person.groovy
|=======================================================================
diff --git a/src/spec/doc/tools-groovyc.adoc b/src/spec/doc/tools-groovyc.adoc
index db29911..7871561 100644
--- a/src/spec/doc/tools-groovyc.adoc
+++ b/src/spec/doc/tools-groovyc.adoc
@@ -52,6 +52,7 @@ a number of command line switches:
| -Jproperty=value | | Properties to be passed to `javac` if joint compilation is enabled | groovyc -j -Jtarget=1.6 -Jsource=1.6 A.groovy B.java
| -Fflag | | Flags to be passed to `javac` if joint compilation is enabled | groovyc -j -Fnowarn A.groovy B.java
| -pa | --parameters | Generates metadata for reflection on method parameter names. Requires Java 8+. | groovyc --parameters Person.groovy
+| -pr | --enable-preview | Enable preview Java features (JEP 12) (jdk12+ only). | groovy --enable-preview Person.groovy
| @argfile | | Read options and source files from specified file. | groovyc @conf/args
|=======================================================================
diff --git a/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovyc.java b/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovyc.java
index 9ab3dd7..899536d 100644
--- a/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovyc.java
+++ b/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovyc.java
@@ -217,6 +217,11 @@ public class Groovyc extends MatchingTask {
private boolean parameters = false;
/**
+ * If true, enable preview Java features (JEP 12) (jdk12+ only). Defaults to false.
+ */
+ private boolean previewFeatures = false;
+
+ /**
* Adds a path for source compilation.
*
* @return a nested src element.
@@ -826,6 +831,22 @@ public class Groovyc extends MatchingTask {
}
/**
+ * If true, enable preview Java features (JEP 12) (jdk12+ only).
+ *
+ * @param previewFeatures set to true to enable preview features
+ */
+ public void setPreviewFeatures(boolean previewFeatures) {
+ this.previewFeatures = previewFeatures;
+ }
+
+ /**
+ * Returns true if preview features has been enabled.
+ */
+ public boolean getPreviewFeatures() {
+ return previewFeatures;
+ }
+
+ /**
* Executes the task.
*
* @throws BuildException if an error occurs
@@ -1102,6 +1123,9 @@ public class Groovyc extends MatchingTask {
if (parameters) {
commandLineList.add("--parameters");
}
+ if (previewFeatures) {
+ commandLineList.add("--enable-preview");
+ }
if (useIndy) {
commandLineList.add("--indy");
}
diff --git a/subprojects/groovy-cli-picocli/src/test/groovy/groovy/cli/picocli/CliBuilderTest.groovy b/subprojects/groovy-cli-picocli/src/test/groovy/groovy/cli/picocli/CliBuilderTest.groovy
index 6849d3c..be164c4 100644
--- a/subprojects/groovy-cli-picocli/src/test/groovy/groovy/cli/picocli/CliBuilderTest.groovy
+++ b/subprojects/groovy-cli-picocli/src/test/groovy/groovy/cli/picocli/CliBuilderTest.groovy
@@ -896,6 +896,7 @@ class CliBuilderTest extends GroovyTestCase {
h(longOpt: 'help', 'cli.option.help.description')
V(longOpt: 'version', 'cli.option.version.description')
pa(longOpt: 'parameters', 'cli.option.parameters.description')
+ pr(longOpt: 'preview', 'cli.option.preview.description')
i(longOpt: 'indy', 'cli.option.indy.description')
D(longOpt: 'define', args: 2, argName: 'name=value', valueSeparator: '=', 'cli.option.define.description')
_(longOpt: 'configscript', args: 1, 'cli.option.configscript.description')
@@ -913,6 +914,14 @@ class CliBuilderTest extends GroovyTestCase {
assert !options.pa
assert options.arguments() == ['-parameters']
+ assert cli.parse(['--enable-preview']).preview
+ assert cli.parse(['--enable-preview']).pr
+
+ options = cli.parse(['-preview'])
+ assert !options.preview
+ assert !options.pr
+ assert options.arguments() == ['-preview']
+
assert cli.parse(['--indy']).indy
assert cli.parse(['--indy']).i
resetPrintWriter()
@@ -951,6 +960,7 @@ class CliBuilderTest extends GroovyTestCase {
h(longOpt: 'help', 'cli.option.help.description')
V(longOpt: 'version', 'cli.option.version.description')
pa(longOpt: 'parameters', 'cli.option.parameters.description')
+ pr(longOpt: 'preview', 'cli.option.preview.description')
i(longOpt: 'indy', 'cli.option.indy.description')
D(longOpt: 'define', args: 2, argName: 'name=value', valueSeparator: '=', 'cli.option.define.description')
_(longOpt: 'configscript', args: 1, 'cli.option.configscript.description')
@@ -964,6 +974,10 @@ class CliBuilderTest extends GroovyTestCase {
assert cli.parse(['-parameters']).pa
assert cli.parse(['-pa']).parameters
+ assert cli.parse(['--enable-preview']).pr
+ assert cli.parse(['-preview']).pr
+ assert cli.parse(['-pr']).preview
+
assert cli.parse(['--indy']).i
assert cli.parse(['-indy']).i
assert cli.parse(['-i']).indy
@@ -1012,13 +1026,15 @@ class CliBuilderTest extends GroovyTestCase {
h(longOpt: 'help', 'cli.option.help.description')
V(longOpt: 'version', 'cli.option.version.description')
pa(longOpt: 'parameters', 'cli.option.parameters.description')
+ pr(longOpt: 'preview', 'cli.option.preview.description')
i(longOpt: 'indy', 'cli.option.indy.description')
D(longOpt: 'define', args: 2, argName: 'String', valueSeparator: '=', 'cli.option.define.description')
_(longOpt: 'configscript', args: 1, 'cli.option.configscript.description')
}
cli.usage()
def expectedUsage = """\
-Usage: groovy [-hiV] [-cp] [-pa] [-configscript=PARAM] [-D=<String>=<String>]...
+Usage: groovy [-hiV] [-cp] [-pa] [-pr] [-configscript=PARAM]
+ [-D=<String>=<String>]...
-configscript, --configscript=PARAM
cli.option.configscript.description
-cp, -classpath, --classpath
@@ -1029,6 +1045,8 @@ Usage: groovy [-hiV] [-cp] [-pa] [-configscript=PARAM] [-D=<String>=<String>]...
-i, -indy, --indy cli.option.indy.description
-pa, -parameters, --parameters
cli.option.parameters.description
+ -pr, -preview, --enable-preview
+ cli.option.preview.description
-V, -version, --version cli.option.version.description"""
assertEquals(expectedUsage, stringWriter.toString().tokenize('\r\n').join('\n'))
@@ -1039,13 +1057,14 @@ Usage: groovy [-hiV] [-cp] [-pa] [-configscript=PARAM] [-D=<String>=<String>]...
h(longOpt: 'help', 'cli.option.help.description')
V(longOpt: 'version', 'cli.option.version.description')
pa(longOpt: 'parameters', 'cli.option.parameters.description')
+ pr(longOpt: 'preview', 'cli.option.preview.description')
i(longOpt: 'indy', 'cli.option.indy.description')
D(longOpt: 'define', args: 2, argName: 'String', valueSeparator: '=', 'cli.option.define.description')
_(longOpt: 'configscript', args: 1, 'cli.option.configscript.description')
}
cli.usage()
expectedUsage = """\
-Usage: groovy [-hiV] [-cp] [-pa] [--configscript=PARAM]
+Usage: groovy [-hiV] [-cp] [-pa] [-pr] [--configscript=PARAM]
[-D=<String>=<String>]...
--configscript=PARAM cli.option.configscript.description
-cp, --classpath cli.option.cp.description
@@ -1054,6 +1073,7 @@ Usage: groovy [-hiV] [-cp] [-pa] [--configscript=PARAM]
-h, --help cli.option.help.description
-i, --indy cli.option.indy.description
-pa, --parameters cli.option.parameters.description
+ -pr, --enable-preview cli.option.preview.description
-V, --version cli.option.version.description"""
assertEquals(expectedUsage, stringWriter.toString().tokenize('\r\n').join('\n'))
}
diff --git a/subprojects/groovy-console/src/spec/doc/groovy-console.adoc b/subprojects/groovy-console/src/spec/doc/groovy-console.adoc
index d49639c..a77d7df 100644
--- a/subprojects/groovy-console/src/spec/doc/groovy-console.adoc
+++ b/subprojects/groovy-console/src/spec/doc/groovy-console.adoc
@@ -62,8 +62,9 @@ The Groovy Swing Console allows a user to enter and run Groovy scripts.
-D, --define=<name=value> Define a system property
-h, --help Display this help message
-i, --indy Enable InvokeDynamic (Indy) compilation for scripts
- -pa, --parameters Generate metadata for reflection on method parameter
+ -pa, --parameters Generate metadata for reflection on method parameter
names (jdk8+ only)
+ -pr, --enable-preview Enable preview Java features (JEP 12) (jdk12+ only)
-V, --version Display the version
-----------------------------------------------------------------
diff --git a/subprojects/groovy-groovysh/src/spec/doc/groovysh.adoc b/subprojects/groovy-groovysh/src/spec/doc/groovysh.adoc
index b3d00f0..bb25a67 100644
--- a/subprojects/groovy-groovysh/src/spec/doc/groovysh.adoc
+++ b/subprojects/groovy-groovysh/src/spec/doc/groovysh.adoc
@@ -61,8 +61,9 @@ experiments.
Define a system property
-e, --evaluate=<CODE> Evaluate the code first when starting interactive session
-h, --help Display this help message
- -pa, --parameters Generate metadata for reflection on method parameter names
+ -pa, --parameters Generate metadata for reflection on method parameter names
(jdk8+ only)
+ -pr, --enable-preview Enable preview Java features (JEP 12) (jdk12+ only)
-q, --quiet Suppress superfluous output
-T, --terminal=<TYPE> Specify the terminal TYPE to use
-v, --verbose Enable verbose output