You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2023/02/13 15:14:00 UTC
[groovy] branch GROOVY_4_0_X updated: misc. items
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
new 960abf18df misc. items
960abf18df is described below
commit 960abf18df14d20bc92165e441d1cf7629b3b1d3
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Feb 13 08:56:06 2023 -0600
misc. items
---
.../apache/groovy/parser/antlr4/AstBuilder.java | 24 +++++++---------------
.../org/codehaus/groovy/ast/AnnotatedNode.java | 6 +++---
.../java/org/codehaus/groovy/ast/ClassNode.java | 2 +-
.../org/codehaus/groovy/ast/GroovyCodeVisitor.java | 2 +-
.../java/org/codehaus/groovy/ast/MethodNode.java | 3 +++
.../java/org/codehaus/groovy/ast/ModuleNode.java | 16 ++++++++-------
.../codehaus/groovy/classgen/ExtendedVerifier.java | 3 ++-
.../codehaus/groovy/classgen/GeneratorContext.java | 23 +++++++++++----------
.../org/codehaus/groovy/classgen/Verifier.java | 15 ++++++++------
.../classgen/asm/sc/StaticInvocationWriter.java | 11 ++++++----
...StaticTypesMethodReferenceExpressionWriter.java | 3 +++
.../codehaus/groovy/control/CompilationUnit.java | 7 ++++---
.../groovy/control/CompilerConfiguration.java | 1 -
.../codehaus/groovy/control/ProcessingUnit.java | 4 +---
.../codehaus/groovy/control/ResolveVisitor.java | 6 +++---
.../org/codehaus/groovy/control/SourceUnit.java | 3 +--
.../groovy/control/StaticImportVisitor.java | 2 +-
.../groovy/transform/SealedASTTransformation.java | 7 ++++---
.../transform/trait/SuperCallTraitTransformer.java | 2 +-
.../org/codehaus/groovy/vmplugin/v8/Java8.java | 8 +++-----
20 files changed, 75 insertions(+), 73 deletions(-)
diff --git a/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java b/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
index 066af785df..66d97c0ae9 100644
--- a/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
+++ b/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
@@ -552,7 +552,8 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> {
ModifierManager modifierManager = new ModifierManager(this, this.visitVariableModifiersOpt(ctx.variableModifiersOpt()));
modifierManager.processParameter(parameter);
*/
- return tuple(configureAST(parameter, ctx.variableDeclaratorId()), (Expression) this.visit(ctx.expression()));
+ configureAST(parameter, ctx.variableDeclaratorId());
+ return tuple(parameter, (Expression) this.visit(ctx.expression()));
}
@Override
@@ -1410,7 +1411,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> {
return classNode;
}
- private void transformRecordHeaderToProperties(ClassDeclarationContext ctx, ClassNode classNode) {
+ private void transformRecordHeaderToProperties(final ClassDeclarationContext ctx, final ClassNode classNode) {
Parameter[] parameters = this.visitFormalParameters(ctx.formalParameters());
classNode.putNodeMetaData(RECORD_HEADER, parameters);
@@ -1419,9 +1420,8 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> {
Parameter parameter = parameters[i];
FormalParameterContext parameterCtx = parameter.getNodeMetaData(PARAMETER_CONTEXT);
ModifierManager parameterModifierManager = parameter.getNodeMetaData(PARAMETER_MODIFIER_MANAGER);
- ClassNode originType = parameter.getOriginType();
- PropertyNode propertyNode = declareProperty(parameterCtx, parameterModifierManager, originType,
- classNode, i, parameter, parameter.getName(), parameter.getModifiers(), parameter.getInitialExpression());
+ PropertyNode propertyNode = declareProperty(parameterCtx, parameterModifierManager, parameter.getType(), classNode, i,
+ parameter, parameter.getName(), parameter.getModifiers() | Opcodes.ACC_FINAL, parameter.getInitialExpression());
propertyNode.getField().putNodeMetaData(IS_RECORD_GENERATED, Boolean.TRUE);
}
}
@@ -4259,7 +4259,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> {
@Override
public AnnotationNode visitAnnotation(final AnnotationContext ctx) {
String annotationName = this.visitAnnotationName(ctx.annotationName());
- AnnotationNode annotationNode = new AnnotationNode(ClassHelper.make(annotationName));
+ AnnotationNode annotationNode = new AnnotationNode(makeClassNode(annotationName));
List<Tuple2<String, Expression>> annotationElementValues = this.visitElementValues(ctx.elementValues());
annotationElementValues.forEach(e -> annotationNode.addMember(e.getV1(), e.getV2()));
@@ -4708,17 +4708,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> {
}
private boolean isTrue(final NodeMetaDataHandler nodeMetaDataHandler, final String key) {
- Object nmd = nodeMetaDataHandler.getNodeMetaData(key);
-
- if (null == nmd) {
- return false;
- }
-
- if (!(nmd instanceof Boolean)) {
- throw new GroovyBugError(nodeMetaDataHandler + " node metadata[" + key + "] is not an instance of Boolean");
- }
-
- return (Boolean) nmd;
+ return Boolean.TRUE.equals(nodeMetaDataHandler.getNodeMetaData(key));
}
private CompilationFailedException createParsingFailedException(final String msg, final GroovyParserRuleContext ctx) {
diff --git a/src/main/java/org/codehaus/groovy/ast/AnnotatedNode.java b/src/main/java/org/codehaus/groovy/ast/AnnotatedNode.java
index ed3d4bdc5c..2077185edf 100644
--- a/src/main/java/org/codehaus/groovy/ast/AnnotatedNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/AnnotatedNode.java
@@ -38,13 +38,13 @@ public class AnnotatedNode extends ASTNode implements GroovydocHolder<AnnotatedN
}
public List<AnnotationNode> getAnnotations(final ClassNode type) {
- List<AnnotationNode> ret = new ArrayList<>(annotations.size());
+ List<AnnotationNode> annotations = new ArrayList<>();
for (AnnotationNode node : getAnnotations()) {
if (type.equals(node.getClassNode())) {
- ret.add(node);
+ annotations.add(node);
}
}
- return ret;
+ return annotations;
}
public AnnotationNode addAnnotation(final ClassNode type) {
diff --git a/src/main/java/org/codehaus/groovy/ast/ClassNode.java b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
index daafc5f04c..d29456e854 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
@@ -164,7 +164,7 @@ public class ClassNode extends AnnotatedNode {
private ClassNode superClass;
protected boolean isPrimaryNode;
protected List<InnerClassNode> innerClasses;
- private List<ClassNode> permittedSubclasses = new ArrayList<>(4);
+ private List<ClassNode> permittedSubclasses = new ArrayList<>();
private List<AnnotationNode> typeAnnotations = Collections.emptyList();
private List<RecordComponentNode> recordComponents = Collections.emptyList();
diff --git a/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java b/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
index a2f9c5776f..2566431106 100644
--- a/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
+++ b/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
@@ -206,7 +206,7 @@ public interface GroovyCodeVisitor {
}
default void visitListOfExpressions(final List<? extends Expression> list) {
- if (list != null) list.forEach(expr -> expr.visit(this));
+ if (list != null) for (Expression expr : list) expr.visit(this);
}
default void visit(final Expression expression) {
diff --git a/src/main/java/org/codehaus/groovy/ast/MethodNode.java b/src/main/java/org/codehaus/groovy/ast/MethodNode.java
index b2b06184c0..a510bf27d9 100644
--- a/src/main/java/org/codehaus/groovy/ast/MethodNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/MethodNode.java
@@ -267,6 +267,9 @@ public class MethodNode extends AnnotatedNode {
return "<clinit>".equals(name);
}
+ /**
+ * @since 4.0.0
+ */
public boolean isConstructor() {
return "<init>".equals(name);
}
diff --git a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
index ba0dbb120b..eb4203723b 100644
--- a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
@@ -471,20 +471,22 @@ public class ModuleNode extends ASTNode {
public void sortClasses() {
if (isEmpty()) return;
- List<ClassNode> sorted = new LinkedList<>(), todo = getClasses();
+ List<ClassNode> classes = getClasses();
+ if (classes.size() == 1) return;
+ List<ClassNode> ordered = new LinkedList<>();
int level = 1;
- while (!todo.isEmpty()) {
- for (Iterator<ClassNode> it = todo.iterator(); it.hasNext(); ) {
- ClassNode cn = it.next(), sc = cn;
+ while (!classes.isEmpty()) {
+ for (Iterator<ClassNode> it = classes.iterator(); it.hasNext(); ) {
+ ClassNode cn = it.next(), sc = cn.getSuperClass();
- for (int i = 0; sc != null && i < level; i += 1) sc = sc.getSuperClass();
+ for (int i = 1; i < level && sc != null; i += 1) sc = sc.getSuperClass();
if (sc != null && sc.isPrimaryClassNode()) continue;
- sorted.add(cn);
+ ordered.add(cn);
it.remove();
}
level += 1;
}
- this.classes = sorted;
+ this.classes = ordered;
}
public boolean hasImportsResolved() {
diff --git a/src/main/java/org/codehaus/groovy/classgen/ExtendedVerifier.java b/src/main/java/org/codehaus/groovy/classgen/ExtendedVerifier.java
index 79dad6f107..14810acedc 100644
--- a/src/main/java/org/codehaus/groovy/classgen/ExtendedVerifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/ExtendedVerifier.java
@@ -64,6 +64,7 @@ import static org.codehaus.groovy.ast.AnnotationNode.RECORD_COMPONENT_TARGET;
import static org.codehaus.groovy.ast.AnnotationNode.TYPE_PARAMETER_TARGET;
import static org.codehaus.groovy.ast.AnnotationNode.TYPE_TARGET;
import static org.codehaus.groovy.ast.AnnotationNode.TYPE_USE_TARGET;
+import static org.codehaus.groovy.ast.ClassHelper.DEPRECATED_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.makeCached;
import static org.codehaus.groovy.ast.tools.GeneralUtils.getInterfacesAndSuperInterfaces;
import static org.codehaus.groovy.ast.tools.GeneralUtils.listX;
@@ -394,7 +395,7 @@ public class ExtendedVerifier extends ClassCodeVisitorSupport {
}
private static void visitDeprecation(AnnotatedNode node, AnnotationNode visited) {
- if (visited.getClassNode().isResolved() && visited.getClassNode().getName().equals("java.lang.Deprecated")) {
+ if (visited.getClassNode().isResolved() && visited.getClassNode().equals(DEPRECATED_TYPE)) {
if (node instanceof MethodNode) {
MethodNode mn = (MethodNode) node;
mn.setModifiers(mn.getModifiers() | Opcodes.ACC_DEPRECATED);
diff --git a/src/main/java/org/codehaus/groovy/classgen/GeneratorContext.java b/src/main/java/org/codehaus/groovy/classgen/GeneratorContext.java
index 774b908198..e5ae5a976d 100644
--- a/src/main/java/org/codehaus/groovy/classgen/GeneratorContext.java
+++ b/src/main/java/org/codehaus/groovy/classgen/GeneratorContext.java
@@ -24,9 +24,8 @@ import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.ast.CompileUnit;
import org.codehaus.groovy.ast.MethodNode;
-
/**
- * A context shared across generations of a class and its inner classes
+ * A context shared across generations of a class and its inner classes.
*/
public class GeneratorContext {
@@ -101,15 +100,17 @@ public class GeneratorContext {
CHARACTERS_TO_ENCODE['\\'-MIN_ENCODING] = true;
}
- public static String encodeAsValidClassName(String name) {
- final int l = name.length();
- StringBuilder b = null;
+ public static String encodeAsValidClassName(final String name) {
+ if (name.equals("module-info") || name.equals("package-info")) return name;
+
int lastEscape = -1;
- for(int i = 0; i < l; ++i) {
- final int encodeIndex = name.charAt(i) - MIN_ENCODING;
+ StringBuilder b = null;
+ final int n = name.length();
+ for (int i = 0; i < n; i += 1) {
+ int encodeIndex = name.charAt(i) - MIN_ENCODING;
if (encodeIndex >= 0 && encodeIndex < CHARACTERS_TO_ENCODE.length) {
if (CHARACTERS_TO_ENCODE[encodeIndex]) {
- if(b == null) {
+ if (b == null) {
b = new StringBuilder(name.length() + 3);
b.append(name, 0, i);
} else {
@@ -120,9 +121,9 @@ public class GeneratorContext {
}
}
}
- if(b == null) return name;
- if (lastEscape == -1) throw new GroovyBugError("unexpected escape char control flow in "+name);
- b.append(name, lastEscape + 1, l);
+ if (b == null) return name;
+ if (lastEscape == -1) throw new GroovyBugError("unexpected escape char control flow in " + name);
+ b.append(name, lastEscape + 1, n);
return b.toString();
}
}
diff --git a/src/main/java/org/codehaus/groovy/classgen/Verifier.java b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
index ecee1e4a6d..db78827edf 100644
--- a/src/main/java/org/codehaus/groovy/classgen/Verifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
@@ -466,7 +466,7 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
FieldNode staticMetaClassField = node.addField(staticMetaClassFieldName, ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC, ClassHelper.make(ClassInfo.class, false), null);
staticMetaClassField.setSynthetic(true);
-
+ ClassNode classNode = this.classNode;
node.addSyntheticMethod(
"$getStaticMetaClass",
ACC_PROTECTED,
@@ -1322,14 +1322,15 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
}
protected Statement createGetterBlock(final PropertyNode propertyNode, final FieldNode field) {
+ String owner = BytecodeHelper.getClassInternalName(classNode);
return new BytecodeSequence(new BytecodeInstruction() {
@Override
public void visit(final MethodVisitor mv) {
if (field.isStatic()) {
- mv.visitFieldInsn(GETSTATIC, BytecodeHelper.getClassInternalName(classNode), field.getName(), BytecodeHelper.getTypeDescription(field.getType()));
+ mv.visitFieldInsn(GETSTATIC, owner, field.getName(), BytecodeHelper.getTypeDescription(field.getType()));
} else {
mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, BytecodeHelper.getClassInternalName(classNode), field.getName(), BytecodeHelper.getTypeDescription(field.getType()));
+ mv.visitFieldInsn(GETFIELD, owner, field.getName(), BytecodeHelper.getTypeDescription(field.getType()));
}
BytecodeHelper.doReturn(mv, field.getType());
}
@@ -1337,16 +1338,17 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
}
protected Statement createSetterBlock(final PropertyNode propertyNode, final FieldNode field) {
+ String owner = BytecodeHelper.getClassInternalName(classNode);
return new BytecodeSequence(new BytecodeInstruction() {
@Override
public void visit(final MethodVisitor mv) {
if (field.isStatic()) {
BytecodeHelper.load(mv, field.getType(), 0);
- mv.visitFieldInsn(PUTSTATIC, BytecodeHelper.getClassInternalName(classNode), field.getName(), BytecodeHelper.getTypeDescription(field.getType()));
+ mv.visitFieldInsn(PUTSTATIC, owner, field.getName(), BytecodeHelper.getTypeDescription(field.getType()));
} else {
mv.visitVarInsn(ALOAD, 0);
BytecodeHelper.load(mv, field.getType(), 1);
- mv.visitFieldInsn(PUTFIELD, BytecodeHelper.getClassInternalName(classNode), field.getName(), BytecodeHelper.getTypeDescription(field.getType()));
+ mv.visitFieldInsn(PUTFIELD, owner, field.getName(), BytecodeHelper.getTypeDescription(field.getType()));
}
mv.visitInsn(RETURN);
}
@@ -1532,6 +1534,7 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
// if we reach this point there is least one parameter or return type
// that is different in its specified form, so create a bridge method
+ String owner = BytecodeHelper.getClassInternalName(classNode);
return new MethodNode(
oldMethod.getName(),
overridingMethod.getModifiers() | ACC_SYNTHETIC | ACC_BRIDGE,
@@ -1556,7 +1559,7 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
BytecodeHelper.doCast(mv, goal[i].getType());
}
}
- mv.visitMethodInsn(INVOKEVIRTUAL, BytecodeHelper.getClassInternalName(classNode), overridingMethod.getName(), BytecodeHelper.getMethodDescriptor(nmr, overridingMethod.getParameters()), false);
+ mv.visitMethodInsn(INVOKEVIRTUAL, owner, overridingMethod.getName(), BytecodeHelper.getMethodDescriptor(nmr, overridingMethod.getParameters()), false);
BytecodeHelper.doReturn(mv, oldMethod.getReturnType());
}
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 f240f92752..08b228ff63 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
@@ -21,6 +21,7 @@ package org.codehaus.groovy.classgen.asm.sc;
import org.codehaus.groovy.ast.ClassHelper;
import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.ast.ConstructorNode;
+import org.codehaus.groovy.ast.EnumConstantClassNode;
import org.codehaus.groovy.ast.FieldNode;
import org.codehaus.groovy.ast.GroovyCodeVisitor;
import org.codehaus.groovy.ast.InnerClassNode;
@@ -475,7 +476,7 @@ public class StaticInvocationWriter extends InvocationWriter {
} else {
controller.getSourceUnit().addFatalError("Binding failed" +
" for arguments [" + argumentList.stream().map(arg -> typeChooser.resolveType(arg, classNode).toString(false)).collect(Collectors.joining(", ")) + "]" +
- " and parameters [" + Arrays.stream(parameters).map(prm -> prm.getType().toString(false)).collect(Collectors.joining(", ")) + "]", currentCall);
+ " and parameters [" + Arrays.stream(parameters).map(prm -> prm.getType().toString(false)).collect(Collectors.joining(", ")) + "]", getCurrentCall());
}
}
for (int i = 0; i < nArgs; i += 1) {
@@ -729,9 +730,11 @@ public class StaticInvocationWriter extends InvocationWriter {
type = ClassHelper.getWrapper(type);
}
ClassNode declaringClass = target.getDeclaringClass();
- if (type.getClass() != ClassNode.class
- && type.getClass() != InnerClassNode.class
- && type.getClass() != DecompiledClassNode.class) {
+ Class<?> typeClass = type.getClass();
+ if (typeClass != ClassNode.class
+ && typeClass != InnerClassNode.class
+ && typeClass != DecompiledClassNode.class
+ && typeClass != EnumConstantClassNode.class) {
type = declaringClass; // ex: LUB type
}
if (isObjectType(declaringClass)) {
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java
index c1804e74c1..faae19a75e 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java
@@ -33,6 +33,7 @@ import org.codehaus.groovy.ast.tools.GeneralUtils;
import org.codehaus.groovy.classgen.asm.BytecodeHelper;
import org.codehaus.groovy.classgen.asm.MethodReferenceExpressionWriter;
import org.codehaus.groovy.classgen.asm.WriterController;
+import org.codehaus.groovy.control.MultipleCompilationErrorsException;
import org.codehaus.groovy.syntax.RuntimeParserException;
import org.codehaus.groovy.transform.sc.StaticCompilationMetadataKeys;
import org.codehaus.groovy.transform.stc.ExtensionMethodNode;
@@ -388,6 +389,8 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
private void addFatalError(final String msg, final ASTNode node) {
controller.getSourceUnit().addFatalError(msg, node);
+ // GRECLIPSE: addFatalError won't throw for quick parse
+ throw new MultipleCompilationErrorsException(controller.getSourceUnit().getErrorCollector());
}
//--------------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/control/CompilationUnit.java b/src/main/java/org/codehaus/groovy/control/CompilationUnit.java
index 974a4f8db8..4df0164d70 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilationUnit.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilationUnit.java
@@ -580,7 +580,7 @@ public class CompilationUnit extends ProcessingUnit {
* Adds a ClassNode directly to the unit (i.e. without source).
* WARNING: the source is needed for error reporting, using
* this method without setting a SourceUnit will cause
- * NullPinterExceptions
+ * NullPointerExceptions
*/
public void addClassNode(final ClassNode node) {
ModuleNode module = new ModuleNode(getAST());
@@ -809,9 +809,10 @@ public class CompilationUnit extends ProcessingUnit {
//
// Recurse for inner classes
//
- LinkedList<ClassNode> innerClasses = ((AsmClassGenerator) visitor).getInnerClasses();
+ Deque<ClassNode> innerClasses = ((AsmClassGenerator) visitor).getInnerClasses();
while (!innerClasses.isEmpty()) {
- classgen.call(source, context, innerClasses.removeFirst());
+ ClassNode innerClass = innerClasses.removeFirst();
+ classgen.call(source, context, innerClass);
}
}
diff --git a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
index 9029e1f713..51b67a7880 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
@@ -98,7 +98,6 @@ public class CompilerConfiguration {
public static final String JDK18 = "18";
/** This (<code>"19"</code>) is the value for targetBytecode to compile for a JDK 19. */
public static final String JDK19 = "19";
-
/** This (<code>"20"</code>) is the value for targetBytecode to compile for a JDK 20. */
public static final String JDK20 = "20";
diff --git a/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java b/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java
index 5c744f3cf4..4cec35e950 100644
--- a/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java
+++ b/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java
@@ -20,8 +20,6 @@ package org.codehaus.groovy.control;
import groovy.lang.GroovyClassLoader;
-import java.security.PrivilegedAction;
-
import static java.util.Objects.requireNonNull;
/**
@@ -104,7 +102,7 @@ public abstract class ProcessingUnit {
@SuppressWarnings("removal") // TODO a future Groovy version should create the loader not as a privileged action
private GroovyClassLoader createClassLoader() {
- return java.security.AccessController.doPrivileged((PrivilegedAction<GroovyClassLoader>) () -> {
+ return java.security.AccessController.doPrivileged((java.security.PrivilegedAction<GroovyClassLoader>) () -> {
ClassLoader parent = Thread.currentThread().getContextClassLoader();
if (parent == null) parent = ProcessingUnit.class.getClassLoader();
return new GroovyClassLoader(parent, getConfiguration());
diff --git a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
index c2eee6a3af..c57283bce6 100644
--- a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
@@ -395,8 +395,9 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
GenericsType typeParameter = genericParameterNames.get(new GenericsTypeName(typeName));
if (typeParameter != null) {
- type.setRedirect(typeParameter.getType());
+ type.setDeclaringClass(typeParameter.getType().getDeclaringClass());
type.setGenericsTypes(new GenericsType[]{typeParameter});
+ type.setRedirect(typeParameter.getType());
type.setGenericsPlaceHolder(true);
return true;
}
@@ -423,8 +424,7 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
protected boolean resolveNestedClass(final ClassNode type) {
if (type instanceof ConstructedNestedClass || type instanceof ConstructedClassWithPackage) return false;
- ClassNode cn = currentClass;
- Set<ClassNode> cycleCheck = new HashSet<>();
+ ClassNode cn = currentClass; Set<ClassNode> cycleCheck = new HashSet<>();
// GROOVY-4043: for type "X", try "A$X" with each type in the class hierarchy (except for Object)
for (; cn != null && cycleCheck.add(cn) && !ClassHelper.isObjectType(cn); cn = cn.getSuperClass()) {
if (setRedirect(type, cn)) return true;
diff --git a/src/main/java/org/codehaus/groovy/control/SourceUnit.java b/src/main/java/org/codehaus/groovy/control/SourceUnit.java
index fb6c35e167..d7a577ab2e 100644
--- a/src/main/java/org/codehaus/groovy/control/SourceUnit.java
+++ b/src/main/java/org/codehaus/groovy/control/SourceUnit.java
@@ -39,7 +39,6 @@ import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.net.URL;
-import java.security.PrivilegedAction;
/**
* Provides an anchor for a single source unit (usually a script file)
@@ -245,7 +244,7 @@ public class SourceUnit extends ProcessingUnit {
@SuppressWarnings("removal") // TODO a future Groovy version should get the property not as a privileged action
private String getProperty(String key) {
- return java.security.AccessController.doPrivileged((PrivilegedAction<String>) () -> System.getProperty(key));
+ return java.security.AccessController.doPrivileged((java.security.PrivilegedAction<String>) () -> System.getProperty(key));
}
/**
diff --git a/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java b/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java
index 0fad93fa3b..8be57d7dc1 100644
--- a/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java
@@ -305,7 +305,7 @@ public class StaticImportVisitor extends ClassCodeExpressionTransformer {
}
MethodCallExpression result = new MethodCallExpression(object, method, args);
- result.setGenericsTypes(mce.getGenericsTypes());
+ result.setGenericsTypes(mce.getGenericsTypes()); // GROOVY-6757
result.setMethodTarget(mce.getMethodTarget());
result.setImplicitThis(mce.isImplicitThis());
result.setSpreadSafe(mce.isSpreadSafe());
diff --git a/src/main/java/org/codehaus/groovy/transform/SealedASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/SealedASTTransformation.java
index 9037670579..eba9f5454e 100644
--- a/src/main/java/org/codehaus/groovy/transform/SealedASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/SealedASTTransformation.java
@@ -36,6 +36,7 @@ import org.codehaus.groovy.control.SourceUnit;
import java.util.List;
import static org.codehaus.groovy.ast.ClassHelper.make;
+import static org.codehaus.groovy.runtime.StringGroovyMethods.isAtLeast;
/**
* Handles generation of code for the @Sealed annotation.
@@ -69,12 +70,12 @@ public class SealedASTTransformation extends AbstractASTTransformation {
return;
}
cNode.putNodeMetaData(SEALED_CLASS, Boolean.TRUE);
- boolean isPostJDK17 = false;
+ boolean isAtLeastJDK17 = false;
String message = "Expecting JDK17+ but unable to determine target bytecode";
if (sourceUnit != null) {
CompilerConfiguration config = sourceUnit.getConfiguration();
String targetBytecode = config.getTargetBytecode();
- isPostJDK17 = CompilerConfiguration.isPostJDK17(targetBytecode);
+ isAtLeastJDK17 = isAtLeast(targetBytecode, CompilerConfiguration.JDK17);
message = "Expecting JDK17+ but found " + targetBytecode;
}
List<AnnotationNode> annotations = cNode.getAnnotations(SEALED_OPTIONS_TYPE);
@@ -82,7 +83,7 @@ public class SealedASTTransformation extends AbstractASTTransformation {
SealedMode mode = getMode(options, "mode");
boolean doNotAnnotate = options != null && memberHasValue(options, "alwaysAnnotate", Boolean.FALSE);
- boolean isNative = isPostJDK17 && mode != SealedMode.EMULATE;
+ boolean isNative = isAtLeastJDK17 && mode != SealedMode.EMULATE;
if (doNotAnnotate) {
cNode.putNodeMetaData(SEALED_ALWAYS_ANNOTATE_KEY, Boolean.FALSE);
}
diff --git a/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java b/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
index 578f9dbfb9..dea2d75d15 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
@@ -110,8 +110,8 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
Expression thisExpr = ClassHelper.isClassType(parameters[0].getType()) ? thisPropX(false, "class") : varX("this");
MethodCallExpression setterCall = callX(classX(helperType), setterName, args(thisExpr, bin.getRightExpression()));
- setterCall.getObjectExpression().setSourcePosition(leftExpression.getObjectExpression());
setterCall.getMethod().setSourcePosition(leftExpression.getProperty());
+ setterCall.getObjectExpression().setSourcePosition(traitType);
setterCall.setSpreadSafe(leftExpression.isSpreadSafe());
setterCall.setImplicitThis(false);
return setterCall;
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java b/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java
index 81b060ebfe..6ab1a1e937 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java
@@ -68,7 +68,6 @@ import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.security.Permission;
-import java.security.PrivilegedAction;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
@@ -682,7 +681,7 @@ public class Java8 implements VMPlugin {
private Object getInvokeSpecialHandleFallback(final Method method, final Object receiver) {
if (!method.isAccessible()) {
- doPrivilegedInternal((PrivilegedAction<Object>) () -> {
+ doPrivilegedInternal(() -> {
ReflectionUtils.trySetAccessible(method);
return null;
});
@@ -695,11 +694,10 @@ public class Java8 implements VMPlugin {
}
}
@SuppressWarnings("removal") // TODO a future Groovy version should perform the operation not as a privileged action
- private static <T> T doPrivilegedInternal(PrivilegedAction<T> action) {
+ private static <T> T doPrivilegedInternal(java.security.PrivilegedAction<T> action) {
return java.security.AccessController.doPrivileged(action);
}
-
@Override
public Object invokeHandle(final Object handle, final Object[] args) throws Throwable {
return ((MethodHandle) handle).invokeWithArguments(args);
@@ -732,7 +730,7 @@ public class Java8 implements VMPlugin {
try {
if (!lookup.isAccessible()) {
final Constructor<MethodHandles.Lookup> finalReference = lookup;
- doPrivilegedInternal((java.security.PrivilegedAction<Object>) () -> {
+ doPrivilegedInternal(() -> {
ReflectionUtils.trySetAccessible(finalReference);
return null;
});