You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2019/11/01 16:45:39 UTC
[groovy] 01/09: sync with groovy-eclipse
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 2f14a777bc2a00f15af772734f8c05f633711d4b
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Oct 31 08:38:13 2019 -0500
sync with groovy-eclipse
(cherry picked from commit 37c2db46c7b7a96d95a6cd33178f4c5d44c167dc)
---
.../groovy/grape/GrabAnnotationTransformation.java | 11 +-
.../java/org/codehaus/groovy/ast/CompileUnit.java | 22 +--
.../org/codehaus/groovy/ast/GroovyCodeVisitor.java | 10 +-
.../java/org/codehaus/groovy/ast/ImportNode.java | 5 +-
.../java/org/codehaus/groovy/ast/MethodNode.java | 3 +-
.../java/org/codehaus/groovy/ast/ModuleNode.java | 98 ++++++-------
.../java/org/codehaus/groovy/ast/Parameter.java | 21 ++-
.../classgen/asm/sc/StaticInvocationWriter.java | 30 ++--
.../groovy/control/CompilerConfiguration.java | 151 +++++----------------
9 files changed, 128 insertions(+), 223 deletions(-)
diff --git a/src/main/java/groovy/grape/GrabAnnotationTransformation.java b/src/main/java/groovy/grape/GrabAnnotationTransformation.java
index eac9e2c..d30430a 100644
--- a/src/main/java/groovy/grape/GrabAnnotationTransformation.java
+++ b/src/main/java/groovy/grape/GrabAnnotationTransformation.java
@@ -58,6 +58,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -201,9 +202,9 @@ public class GrabAnnotationTransformation extends ClassCodeVisitorSupport implem
}
}
- List<Map<String,Object>> grabMaps = new ArrayList<Map<String,Object>>();
- List<Map<String,Object>> grabMapsInit = new ArrayList<Map<String,Object>>();
- List<Map<String,Object>> grabExcludeMaps = new ArrayList<Map<String,Object>>();
+ Collection<Map<String,Object>> grabMaps = new LinkedHashSet<>();
+ Collection<Map<String,Object>> grabMapsInit = new ArrayList<>();
+ Collection<Map<String,Object>> grabExcludeMaps = new ArrayList<>();
for (ClassNode classNode : sourceUnit.getAST().getClasses()) {
grabAnnotations = new ArrayList<AnnotationNode>();
@@ -387,7 +388,7 @@ public class GrabAnnotationTransformation extends ClassCodeVisitorSupport implem
}
}
- private void callGrabAsStaticInitIfNeeded(ClassNode classNode, ClassNode grapeClassNode, List<Map<String,Object>> grabMapsInit, List<Map<String, Object>> grabExcludeMaps) {
+ private void callGrabAsStaticInitIfNeeded(ClassNode classNode, ClassNode grapeClassNode, Collection<Map<String,Object>> grabMapsInit, Collection<Map<String, Object>> grabExcludeMaps) {
List<Statement> grabInitializers = new ArrayList<Statement>();
MapExpression basicArgs = new MapExpression();
if (autoDownload != null) {
@@ -400,7 +401,7 @@ public class GrabAnnotationTransformation extends ClassCodeVisitorSupport implem
if (systemProperties != null && !systemProperties.isEmpty()) {
BlockStatement block = new BlockStatement();
- for(Map.Entry e : systemProperties.entrySet()) {
+ for(Map.Entry<String, String> e : systemProperties.entrySet()) {
block.addStatement(stmt(callX(SYSTEM_CLASSNODE, "setProperty", args(constX(e.getKey()), constX(e.getValue())))));
}
StaticMethodCallExpression enabled = callX(SYSTEM_CLASSNODE, "getProperty", args(constX("groovy.grape.enable"), constX("true")));
diff --git a/src/main/java/org/codehaus/groovy/ast/CompileUnit.java b/src/main/java/org/codehaus/groovy/ast/CompileUnit.java
index 656cc23..4344b46 100644
--- a/src/main/java/org/codehaus/groovy/ast/CompileUnit.java
+++ b/src/main/java/org/codehaus/groovy/ast/CompileUnit.java
@@ -24,8 +24,6 @@ import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.control.SourceUnit;
import org.codehaus.groovy.control.messages.SyntaxErrorMessage;
import org.codehaus.groovy.syntax.SyntaxException;
-import org.codehaus.groovy.util.ListHashMap;
-import org.objectweb.asm.Opcodes;
import java.security.CodeSource;
import java.util.ArrayList;
@@ -55,7 +53,7 @@ public class CompileUnit implements NodeMetaDataHandler {
private final Map<String, SourceUnit> classNameToSource = new LinkedHashMap<>();
private final Map<String, InnerClassNode> generatedInnerClasses = new LinkedHashMap<>();
private final Map<String, ConstructedOuterNestedClassNode> classesToResolve = new LinkedHashMap<>();
- private Map metaDataMap = null;
+ private Map metaDataMap;
public CompileUnit(GroovyClassLoader classLoader, CompilerConfiguration config) {
this(classLoader, null, config);
@@ -214,8 +212,8 @@ public class CompileUnit implements NodeMetaDataHandler {
}
@Override
- public ListHashMap getMetaDataMap() {
- return (ListHashMap) metaDataMap;
+ public Map<?, ?> getMetaDataMap() {
+ return metaDataMap;
}
@Override
@@ -224,7 +222,9 @@ public class CompileUnit implements NodeMetaDataHandler {
}
/**
- * Represents a resolved type as a placeholder, SEE GROOVY-7812
+ * Represents a resolved type as a placeholder.
+ *
+ * @see GROOVY-7812
*/
@Internal
public static class ConstructedOuterNestedClassNode extends ClassNode {
@@ -232,11 +232,15 @@ public class CompileUnit implements NodeMetaDataHandler {
private final List<BiConsumer<ConstructedOuterNestedClassNode, ClassNode>> setRedirectListenerList = new ArrayList<>();
public ConstructedOuterNestedClassNode(ClassNode outer, String innerClassName) {
- super(innerClassName, Opcodes.ACC_PUBLIC, ClassHelper.OBJECT_TYPE);
+ super(innerClassName, ACC_PUBLIC, ClassHelper.OBJECT_TYPE);
this.enclosingClassNode = outer;
this.isPrimaryNode = false;
}
+ public ClassNode getEnclosingClassNode() {
+ return enclosingClassNode;
+ }
+
@Override
public void setRedirect(ClassNode cn) {
for (BiConsumer<ConstructedOuterNestedClassNode, ClassNode> setRedirectListener : setRedirectListenerList) {
@@ -245,10 +249,6 @@ public class CompileUnit implements NodeMetaDataHandler {
super.setRedirect(cn);
}
- public ClassNode getEnclosingClassNode() {
- return enclosingClassNode;
- }
-
public void addSetRedirectListener(BiConsumer<ConstructedOuterNestedClassNode, ClassNode> setRedirectListener) {
setRedirectListenerList.add(setRedirectListener);
}
diff --git a/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java b/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
index d807e60..be45610 100644
--- a/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
+++ b/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
@@ -199,14 +199,6 @@ public interface GroovyCodeVisitor {
default void visitEmptyExpression(EmptyExpression expression) {}
default void visitListOfExpressions(List<? extends Expression> list) {
- if (list == null) return;
- for (Expression expression : list) {
- if (expression instanceof SpreadExpression) {
- Expression spread = ((SpreadExpression) expression).getExpression();
- spread.visit(this);
- } else {
- expression.visit(this);
- }
- }
+ if (list != null) list.forEach(expr -> expr.visit(this));
}
}
diff --git a/src/main/java/org/codehaus/groovy/ast/ImportNode.java b/src/main/java/org/codehaus/groovy/ast/ImportNode.java
index b011104..df249bb 100644
--- a/src/main/java/org/codehaus/groovy/ast/ImportNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ImportNode.java
@@ -28,7 +28,6 @@ public class ImportNode extends AnnotatedNode implements Opcodes {
private final ClassNode type;
private final String alias;
private final String fieldName;
- // TODO use PackageNode instead here?
private final String packageName;
private final boolean isStar;
private final boolean isStatic;
@@ -104,12 +103,12 @@ public class ImportNode extends AnnotatedNode implements Opcodes {
return "import static " + typeName + ".*";
}
if (isStatic) {
- if (alias != null && alias.length() != 0 && !alias.equals(fieldName)) {
+ if (alias != null && !alias.isEmpty() && !alias.equals(fieldName)) {
return "import static " + typeName + "." + fieldName + " as " + alias;
}
return "import static " + typeName + "." + fieldName;
}
- if (alias == null || alias.length() == 0) {
+ if (alias == null || alias.isEmpty()) {
return "import " + typeName;
}
return "import " + typeName + " as " + alias;
diff --git a/src/main/java/org/codehaus/groovy/ast/MethodNode.java b/src/main/java/org/codehaus/groovy/ast/MethodNode.java
index b05888b..a9da877 100644
--- a/src/main/java/org/codehaus/groovy/ast/MethodNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/MethodNode.java
@@ -27,7 +27,7 @@ import java.util.List;
import java.util.Optional;
/**
- * Represents a method declaration
+ * Represents a method declaration.
*/
public class MethodNode extends AnnotatedNode implements Opcodes {
@@ -103,6 +103,7 @@ public class MethodNode extends AnnotatedNode implements Opcodes {
public void setParameters(Parameter[] parameters) {
invalidateCachedData();
VariableScope scope = new VariableScope();
+ this.hasDefaultValue = false;
this.parameters = parameters;
if (parameters != null && parameters.length > 0) {
for (Parameter para : parameters) {
diff --git a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
index 54f7e16..7033169 100644
--- a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
@@ -37,6 +37,7 @@ import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -51,21 +52,21 @@ import java.util.Map;
*/
public class ModuleNode extends ASTNode implements Opcodes {
- private final BlockStatement statementBlock = new BlockStatement();
- List<ClassNode> classes = new LinkedList<ClassNode>();
- private final List<MethodNode> methods = new ArrayList<MethodNode>();
- private final Map<String, ImportNode> imports = new HashMap<String, ImportNode>();
- private final List<ImportNode> starImports = new ArrayList<ImportNode>();
- private final Map<String, ImportNode> staticImports = new LinkedHashMap<String, ImportNode>();
- private final Map<String, ImportNode> staticStarImports = new LinkedHashMap<String, ImportNode>();
+ private List<ClassNode> classes = new LinkedList<>();
+ private final List<MethodNode> methods = new ArrayList<>();
+ private final Map<String, ImportNode> imports = new HashMap<>();
+ private final List<ImportNode> starImports = new ArrayList<>();
+ private final Map<String, ImportNode> staticImports = new LinkedHashMap<>();
+ private final Map<String, ImportNode> staticStarImports = new LinkedHashMap<>();
private CompileUnit unit;
private PackageNode packageNode;
private String description;
private boolean createClassForStatements = true;
private transient SourceUnit context;
- private boolean importsResolved = false;
+ private boolean importsResolved;
private ClassNode scriptDummy;
- private String mainClassName = null;
+ private String mainClassName;
+ private final BlockStatement statementBlock = new BlockStatement();
private final Parameter[] SCRIPT_CONTEXT_CTOR = {new Parameter(ClassHelper.BINDING_TYPE, "context")};
public ModuleNode (SourceUnit context ) {
@@ -87,7 +88,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
public List<ClassNode> getClasses() {
if (createClassForStatements && (!statementBlock.isEmpty() || !methods.isEmpty() || isPackageInfo())) {
ClassNode mainClass = createStatementsClass();
- mainClassName = mainClass.getName();
+ mainClassName = mainClass.getName();
createClassForStatements = false;
classes.add(0, mainClass);
mainClass.setModule(this);
@@ -101,7 +102,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
}
public List<ImportNode> getImports() {
- return new ArrayList<ImportNode>(imports.values());
+ return new ArrayList<>(imports.values());
}
public List<ImportNode> getStarImports() {
@@ -126,7 +127,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
}
public void addImport(String alias, ClassNode type) {
- addImport(alias, type, new ArrayList<AnnotationNode>());
+ addImport(alias, type, new ArrayList<>());
}
public void addImport(String alias, ClassNode type, List<AnnotationNode> annotations) {
@@ -137,7 +138,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
}
public void addStarImport(String packageName) {
- addStarImport(packageName, new ArrayList<AnnotationNode>());
+ addStarImport(packageName, Collections.emptyList());
}
public void addStarImport(String packageName, List<AnnotationNode> annotations) {
@@ -147,6 +148,32 @@ public class ModuleNode extends ASTNode implements Opcodes {
storeLastAddedImportNode(importNode);
}
+ public void addStaticImport(ClassNode type, String fieldName, String alias) {
+ addStaticImport(type, fieldName, alias, Collections.emptyList());
+ }
+
+ public void addStaticImport(ClassNode type, String fieldName, String alias, List<AnnotationNode> annotations) {
+ ImportNode node = new ImportNode(type, fieldName, alias);
+ node.addAnnotations(annotations);
+ ImportNode prev = staticImports.put(alias, node);
+ if (prev != null) {
+ staticImports.put(prev.toString(), prev);
+ staticImports.put(alias, staticImports.remove(alias));
+ }
+ storeLastAddedImportNode(node);
+ }
+
+ public void addStaticStarImport(String name, ClassNode type) {
+ addStaticStarImport(name, type, Collections.emptyList());
+ }
+
+ public void addStaticStarImport(String name, ClassNode type, List<AnnotationNode> annotations) {
+ ImportNode node = new ImportNode(type);
+ node.addAnnotations(annotations);
+ staticStarImports.put(name, node);
+ storeLastAddedImportNode(node);
+ }
+
public void addStatement(Statement node) {
statementBlock.addStatement(node);
}
@@ -206,12 +233,9 @@ public class ModuleNode extends ASTNode implements Opcodes {
* @return the underlying character stream description
*/
public String getDescription() {
- if( context != null )
- {
+ if (context != null) {
return context.getName();
- }
- else
- {
+ } else {
return this.description;
}
}
@@ -233,7 +257,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
setScriptBaseClassFromConfig(scriptDummy);
return scriptDummy;
}
-
+
String name = getPackageName();
if (name == null) {
name = "";
@@ -273,13 +297,13 @@ public class ModuleNode extends ASTNode implements Opcodes {
}
}
}
-
+
protected ClassNode createStatementsClass() {
ClassNode classNode = getScriptClassDummy();
if (classNode.getName().endsWith("package-info")) {
return classNode;
}
-
+
handleMainMethodIfPresent(methods);
// return new Foo(new ShellContext(args)).run()
@@ -346,7 +370,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
}
/*
- * If a main method is provided by user, account for it under run() as scripts generate their own 'main' so they can run.
+ * If a main method is provided by user, account for it under run() as scripts generate their own 'main' so they can run.
*/
private void handleMainMethodIfPresent(List methods) {
boolean found = false;
@@ -360,7 +384,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
argTypeMatches = (argType.equals(ClassHelper.OBJECT_TYPE) || argType.getName().contains("String[]"));
retTypeMatches = (retType == ClassHelper.VOID_TYPE || retType == ClassHelper.OBJECT_TYPE);
-
+
if(retTypeMatches && argTypeMatches) {
if(found) {
throw new RuntimeException("Repetitive main method found.");
@@ -412,11 +436,11 @@ public class ModuleNode extends ASTNode implements Opcodes {
public boolean isEmpty() {
return classes.isEmpty() && statementBlock.getStatements().isEmpty();
}
-
+
public void sortClasses(){
if (isEmpty()) return;
List<ClassNode> classes = getClasses();
- LinkedList<ClassNode> sorted = new LinkedList<ClassNode>();
+ LinkedList<ClassNode> sorted = new LinkedList<>();
int level=1;
while (!classes.isEmpty()) {
for (Iterator<ClassNode> cni = classes.iterator(); cni.hasNext();) {
@@ -448,32 +472,10 @@ public class ModuleNode extends ASTNode implements Opcodes {
return staticStarImports;
}
- public void addStaticImport(ClassNode type, String fieldName, String alias) {
- addStaticImport(type, fieldName, alias, new ArrayList<AnnotationNode>());
- }
-
- public void addStaticImport(ClassNode type, String fieldName, String alias, List<AnnotationNode> annotations) {
- ImportNode node = new ImportNode(type, fieldName, alias);
- node.addAnnotations(annotations);
- staticImports.put(alias, node);
- storeLastAddedImportNode(node);
- }
-
- public void addStaticStarImport(String name, ClassNode type) {
- addStaticStarImport(name, type, new ArrayList<AnnotationNode>());
- }
-
- public void addStaticStarImport(String name, ClassNode type, List<AnnotationNode> annotations) {
- ImportNode node = new ImportNode(type);
- node.addAnnotations(annotations);
- staticStarImports.put(name, node);
- storeLastAddedImportNode(node);
- }
-
// This method only exists as a workaround for GROOVY-6094
// In order to keep binary compatibility
private void storeLastAddedImportNode(final ImportNode node) {
- if (getNodeMetaData(ImportNode.class)==ImportNode.class) {
+ if (getNodeMetaData(ImportNode.class) == ImportNode.class) {
putNodeMetaData(ImportNode.class, node);
}
}
diff --git a/src/main/java/org/codehaus/groovy/ast/Parameter.java b/src/main/java/org/codehaus/groovy/ast/Parameter.java
index b1fe29d..36d4967 100644
--- a/src/main/java/org/codehaus/groovy/ast/Parameter.java
+++ b/src/main/java/org/codehaus/groovy/ast/Parameter.java
@@ -20,7 +20,6 @@ package org.codehaus.groovy.ast;
import org.codehaus.groovy.ast.expr.Expression;
-
/**
* Represents a parameter on a constructor or method call. The type name is
* optional - it defaults to java.lang.Object if unknown.
@@ -31,13 +30,13 @@ public class Parameter extends AnnotatedNode implements Variable {
private ClassNode type;
private final String name;
+ private ClassNode originType;
private boolean dynamicTyped;
+ private boolean closureShare;
private Expression defaultValue;
private boolean hasDefaultValue;
private boolean inStaticContext;
- private boolean closureShare=false;
private int modifiers;
- private ClassNode originType=ClassHelper.DYNAMIC_TYPE;
public Parameter(ClassNode type, String name) {
this.name = name;
@@ -45,7 +44,7 @@ public class Parameter extends AnnotatedNode implements Variable {
this.originType = type;
this.hasDefaultValue = false;
}
-
+
public Parameter(ClassNode type, String name, Expression defaultValue) {
this(type,name);
this.defaultValue = defaultValue;
@@ -68,11 +67,11 @@ public class Parameter extends AnnotatedNode implements Variable {
this.type = type;
dynamicTyped |= type==ClassHelper.DYNAMIC_TYPE;
}
-
+
public boolean hasInitialExpression() {
return this.hasDefaultValue;
}
-
+
/**
* @return the default value expression for this parameter or null if
* no default value is specified
@@ -80,16 +79,16 @@ public class Parameter extends AnnotatedNode implements Variable {
public Expression getInitialExpression() {
return defaultValue;
}
-
+
public void setInitialExpression(Expression init) {
defaultValue = init;
hasDefaultValue = defaultValue != null;
}
-
+
public boolean isInStaticContext() {
return inStaticContext;
}
-
+
public void setInStaticContext(boolean inStaticContext) {
this.inStaticContext = inStaticContext;
}
@@ -103,7 +102,7 @@ public class Parameter extends AnnotatedNode implements Variable {
}
public void setClosureSharedVariable(boolean inClosure) {
- closureShare = inClosure;
+ closureShare = inClosure;
}
public int getModifiers() {
@@ -113,7 +112,7 @@ public class Parameter extends AnnotatedNode implements Variable {
public ClassNode getOriginType() {
return originType;
}
-
+
public void setOriginType(ClassNode cn) {
originType = cn;
}
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
index 1d0c6e7..42f2fa4 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
@@ -456,17 +456,11 @@ public class StaticInvocationWriter extends InvocationWriter {
) {
int stackLen = operandStack.getStackLength() + argumentListSize;
MethodVisitor mv = controller.getMethodVisitor();
- //mv = new org.objectweb.asm.util.TraceMethodVisitor(mv);
controller.setMethodVisitor(mv);
// varg call
// first parameters as usual
for (int i = 0; i < para.length - 1; i++) {
- Expression expression = argumentList.get(i);
- expression.putNodeMetaData(PARAMETER_TYPE, para[i].getType());
- expression.visit(acg);
- if (!isNullConstant(expression)) {
- operandStack.doGroovyCast(para[i].getType());
- }
+ visitArgument(argumentList.get(i), para[i].getType());
}
// last parameters wrapped in an array
List<Expression> lastParams = new LinkedList<Expression>();
@@ -487,12 +481,7 @@ public class StaticInvocationWriter extends InvocationWriter {
}
} else if (argumentListSize == para.length) {
for (int i = 0; i < argumentListSize; i++) {
- Expression expression = argumentList.get(i);
- expression.putNodeMetaData(PARAMETER_TYPE, para[i].getType());
- expression.visit(acg);
- if (!isNullConstant(expression)) {
- operandStack.doGroovyCast(para[i].getType());
- }
+ visitArgument(argumentList.get(i), para[i].getType());
}
} else {
// method call with default arguments
@@ -519,16 +508,19 @@ public class StaticInvocationWriter extends InvocationWriter {
}
}
for (int i = 0; i < arguments.length; i++) {
- Expression expression = arguments[i];
- expression.putNodeMetaData(PARAMETER_TYPE, para[i].getType());
- expression.visit(acg);
- if (!isNullConstant(expression)) {
- operandStack.doGroovyCast(para[i].getType());
- }
+ visitArgument(arguments[i], para[i].getType());
}
}
}
+ private void visitArgument(Expression argumentExpr, ClassNode parameterType) {
+ argumentExpr.putNodeMetaData(PARAMETER_TYPE, parameterType);
+ argumentExpr.visit(controller.getAcg());
+ if (!isNullConstant(argumentExpr)) {
+ controller.getOperandStack().doGroovyCast(parameterType);
+ }
+ }
+
private static boolean isNullConstant(final Expression expression) {
return (expression instanceof ConstantExpression && ((ConstantExpression) expression).getValue() == null);
}
diff --git a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
index 265ebbd..f30b3b6 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
@@ -35,6 +35,7 @@ import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
@@ -55,30 +56,30 @@ public class CompilerConfiguration {
/** This (<code>"runtimeGroovydoc"</code>) is the Optimization Option value for enabling attaching {@link groovy.lang.Groovydoc} annotation. */
public static final String RUNTIME_GROOVYDOC = "runtimeGroovydoc";
- /** This (<code>"memStub"</code>) is the Joint Compilation Option value for enabling generating stubs in memory. .*/
+ /** This (<code>"memStub"</code>) is the Joint Compilation Option value for enabling generating stubs in memory. */
public static final String MEM_STUB = "memStub";
- /** This (<code>"1.4"</code>) is the value for targetBytecode to compile for a JDK 1.4. **/
+ /** This (<code>"1.4"</code>) is the value for targetBytecode to compile for a JDK 1.4. */
public static final String JDK4 = "1.4";
- /** This (<code>"1.5"</code>) is the value for targetBytecode to compile for a JDK 1.5. **/
+ /** This (<code>"1.5"</code>) is the value for targetBytecode to compile for a JDK 1.5. */
public static final String JDK5 = "1.5";
- /** This (<code>"1.6"</code>) is the value for targetBytecode to compile for a JDK 1.6. **/
+ /** This (<code>"1.6"</code>) is the value for targetBytecode to compile for a JDK 1.6. */
public static final String JDK6 = "1.6";
- /** This (<code>"1.7"</code>) is the value for targetBytecode to compile for a JDK 1.7. **/
+ /** This (<code>"1.7"</code>) is the value for targetBytecode to compile for a JDK 1.7. */
public static final String JDK7 = "1.7";
- /** This (<code>"1.8"</code>) is the value for targetBytecode to compile for a JDK 1.8. **/
+ /** This (<code>"1.8"</code>) is the value for targetBytecode to compile for a JDK 1.8. */
public static final String JDK8 = "1.8";
- /** This (<code>"9"</code>) is the value for targetBytecode to compile for a JDK 9. **/
+ /** This (<code>"9"</code>) is the value for targetBytecode to compile for a JDK 9. */
public static final String JDK9 = "9";
- /** This (<code>"10"</code>) is the value for targetBytecode to compile for a JDK 10. **/
+ /** This (<code>"10"</code>) is the value for targetBytecode to compile for a JDK 10. */
public static final String JDK10 = "10";
- /** This (<code>"11"</code>) is the value for targetBytecode to compile for a JDK 11. **/
+ /** This (<code>"11"</code>) is the value for targetBytecode to compile for a JDK 11. */
public static final String JDK11 = "11";
- /** This (<code>"12"</code>) is the value for targetBytecode to compile for a JDK 12. **/
+ /** This (<code>"12"</code>) is the value for targetBytecode to compile for a JDK 12. */
public static final String JDK12 = "12";
- /** This (<code>"13"</code>) is the value for targetBytecode to compile for a JDK 13. **/
+ /** This (<code>"13"</code>) is the value for targetBytecode to compile for a JDK 13. */
public static final String JDK13 = "13";
- /** This (<code>"14"</code>) is the value for targetBytecode to compile for a JDK 14. **/
+ /** This (<code>"14"</code>) is the value for targetBytecode to compile for a JDK 14. */
public static final String JDK14 = "14";
/**
@@ -86,7 +87,7 @@ public class CompilerConfiguration {
* @deprecated
*/
@Deprecated
- public static final String POST_JDK5 = JDK5; // for backwards compatibility
+ public static final String POST_JDK5 = JDK5;
/**
* This constant is for comparing targetBytecode to ensure it is set to an earlier value than JDK 1.5.
@@ -112,10 +113,8 @@ public class CompilerConfiguration {
JDK14, Opcodes.V14
);
- private static final String[] EMPTY_STRING_ARRAY = new String[0];
-
- /** An array of the valid targetBytecode values */
- public static final String[] ALLOWED_JDKS = JDK_TO_BYTECODE_VERSION_MAP.keySet().toArray(EMPTY_STRING_ARRAY);
+ /** The valid targetBytecode values. */
+ public static final String[] ALLOWED_JDKS = JDK_TO_BYTECODE_VERSION_MAP.keySet().toArray(new String[JDK_TO_BYTECODE_VERSION_MAP.size()]);
/**
* The default source encoding
@@ -126,7 +125,7 @@ public class CompilerConfiguration {
* A convenience for getting a default configuration. Do not modify it!
* See {@link #CompilerConfiguration(Properties)} for an example on how to
* make a suitable copy to modify. But if you're really starting from a
- * default context, then you probably just want <code>new CompilerConfiguration()</code>.
+ * default context, then you probably just want <code>new CompilerConfiguration()</code>.
*/
public static final CompilerConfiguration DEFAULT = new CompilerConfiguration() {
@Override
@@ -280,7 +279,6 @@ public class CompilerConfiguration {
}
};
-
/**
* See {@link WarningMessage} for levels.
*/
@@ -319,7 +317,7 @@ public class CompilerConfiguration {
/**
* If true, generates metadata for reflection on method parameters
*/
- private boolean parameters = false;
+ private boolean parameters;
/**
* The number of non-fatal errors to allow before bailing
@@ -925,7 +923,6 @@ public class CompilerConfiguration {
return defaultScriptExtension;
}
-
public void setDefaultScriptExtension(String defaultScriptExtension) {
this.defaultScriptExtension = defaultScriptExtension;
}
@@ -947,8 +944,8 @@ public class CompilerConfiguration {
}
/**
- * Allow setting the bytecode compatibility level. The parameter can take
- * one of the values in {@link #ALLOWED_JDKS}.
+ * Sets the bytecode compatibility level. The parameter can take one of the values
+ * in {@link #ALLOWED_JDKS}.
*
* @param version the bytecode compatibility level
*/
@@ -963,9 +960,8 @@ public class CompilerConfiguration {
}
/**
- * Retrieves the compiler bytecode compatibility level.
- * Defaults to the minimum officially supported bytecode
- * version for any particular Groovy version.
+ * Retrieves the compiler bytecode compatibility level. Defaults to the minimum
+ * officially supported bytecode version for any particular Groovy version.
*
* @return bytecode compatibility level
*/
@@ -1088,111 +1084,34 @@ public class CompilerConfiguration {
}
/**
- * Check whether invoke dynamic enabled
- * @return the result
+ * Checks if invoke dynamic is enabled.
*/
public boolean isIndyEnabled() {
- Boolean indyEnabled = this.getOptimizationOptions().get(INVOKEDYNAMIC);
-
- if (null == indyEnabled) {
- return false;
- }
-
- return indyEnabled;
+ Boolean indyEnabled = getOptimizationOptions().get(INVOKEDYNAMIC);
+ return Optional.ofNullable(indyEnabled).orElse(Boolean.FALSE).booleanValue();
}
/**
- * Check whether groovydoc enabled
- * @return the result
+ * Checks if groovydoc is enabled.
*/
public boolean isGroovydocEnabled() {
- Boolean groovydocEnabled = this.getOptimizationOptions().get(GROOVYDOC);
-
- if (null == groovydocEnabled) {
- return false;
- }
-
- return groovydocEnabled;
+ Boolean groovydocEnabled = getOptimizationOptions().get(GROOVYDOC);
+ return Optional.ofNullable(groovydocEnabled).orElse(Boolean.FALSE).booleanValue();
}
/**
- * Check whether runtime groovydoc enabled
- * @return the result
+ * Checks if runtime groovydoc is enabled.
*/
public boolean isRuntimeGroovydocEnabled() {
- Boolean runtimeGroovydocEnabled = this.getOptimizationOptions().get(RUNTIME_GROOVYDOC);
-
- if (null == runtimeGroovydocEnabled) {
- return false;
- }
-
- return runtimeGroovydocEnabled;
+ Boolean runtimeGroovydocEnabled = getOptimizationOptions().get(RUNTIME_GROOVYDOC);
+ return Optional.ofNullable(runtimeGroovydocEnabled).orElse(Boolean.FALSE).booleanValue();
}
/**
- * Check whether mem stub enabled
- * @return the result
+ * Checks if in-memory stub creation is enabled.
*/
public boolean isMemStubEnabled() {
- Object memStubEnabled = this.getJointCompilationOptions().get(MEM_STUB);
-
- if (null == memStubEnabled) {
- return false;
- }
-
- return "true".equals(memStubEnabled.toString());
- }
-
-
-// See http://groovy.329449.n5.nabble.com/What-the-static-compile-by-default-tt5750118.html
-// https://issues.apache.org/jira/browse/GROOVY-8543
-//
-// {
-// // this object initializer assures that `enableCompileStaticByDefault` must be invoked no matter which constructor called.
-// if (getBooleanSafe("groovy.compile.static")) {
-// enableCompileStaticByDefault();
-// }
-// }
-//
-//
-// private void enableCompileStaticByDefault() {
-// compilationCustomizers.add(
-// new CompilationCustomizer(CompilePhase.CONVERSION) {
-// @Override
-// public void call(final SourceUnit source, GeneratorContext context, ClassNode classNode) throws CompilationFailedException {
-// for (ClassNode cn : source.getAST().getClasses()) {
-// newClassCodeVisitor(source).visitClass(cn);
-// }
-// }
-//
-// private ClassCodeVisitorSupport newClassCodeVisitor(SourceUnit source) {
-// return new ClassCodeVisitorSupport() {
-// @Override
-// public void visitClass(ClassNode node) {
-// enableCompileStatic(node);
-// }
-//
-// private void enableCompileStatic(ClassNode classNode) {
-// if (!classNode.getAnnotations(ClassHelper.make(GROOVY_TRANSFORM_COMPILE_STATIC)).isEmpty()) {
-// return;
-// }
-// if (!classNode.getAnnotations(ClassHelper.make(GROOVY_TRANSFORM_COMPILE_DYNAMIC)).isEmpty()) {
-// return;
-// }
-//
-// classNode.addAnnotation(new AnnotationNode(ClassHelper.make(GROOVY_TRANSFORM_COMPILE_STATIC)));
-// }
-//
-// @Override
-// protected SourceUnit getSourceUnit() {
-// return source;
-// }
-//
-// private static final String GROOVY_TRANSFORM_COMPILE_STATIC = "groovy.transform.CompileStatic";
-// private static final String GROOVY_TRANSFORM_COMPILE_DYNAMIC = "groovy.transform.CompileDynamic";
-// };
-// }
-// }
-// );
-// }
+ Object memStubEnabled = getJointCompilationOptions().get(MEM_STUB);
+ return Optional.ofNullable(memStubEnabled).map(value -> "true".equals(value.toString())).orElse(Boolean.FALSE).booleanValue();
+ }
}