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;
                     });