From 4294ebd301ae18d196474d65083b9c5f9b48b70e Mon Sep 17 00:00:00 2001 From: Rawi01 Date: Sun, 24 Nov 2024 20:58:41 +0100 Subject: [PATCH] [fixes #3605] Remove outer type reference when marking class as static The class now implements Serializable to trigger generation of this$0 fields in the inner class. Since Java 18 the compiler only generates the reference to the outer class if it is in use or the class is Serializable. --- .../javac/handlers/HandleUtilityClass.java | 24 ++++++++++--------- .../after-delombok/UtilityClassInner.java | 3 ++- .../resource/after-ecj/UtilityClassInner.java | 4 ++-- .../resource/before/UtilityClassInner.java | 3 ++- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/core/lombok/javac/handlers/HandleUtilityClass.java b/src/core/lombok/javac/handlers/HandleUtilityClass.java index b20aee3a..bc171b8f 100644 --- a/src/core/lombok/javac/handlers/HandleUtilityClass.java +++ b/src/core/lombok/javac/handlers/HandleUtilityClass.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2021 The Project Lombok Authors. + * Copyright (C) 2015-2024 The Project Lombok Authors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -107,7 +107,7 @@ public class HandleUtilityClass extends JavacAnnotationHandler { if ((typeDecl.mods.flags & (Flags.INTERFACE | Flags.ANNOTATION)) != 0) markStatic = false; } - if (markStatic) classDecl.mods.flags |= Flags.STATIC; + if (markStatic) markClassAsStatic(classDecl); for (JavacNode element : typeNode.down()) { if (element.getKind() == Kind.FIELD) { @@ -125,21 +125,23 @@ public class HandleUtilityClass extends JavacAnnotationHandler { methodDecl.mods.flags |= Flags.STATIC; } else if (element.getKind() == Kind.TYPE) { - JCClassDecl innerClassDecl = (JCClassDecl) element.get(); - innerClassDecl.mods.flags |= Flags.STATIC; - ClassSymbol innerClassSymbol = innerClassDecl.sym; - if (innerClassSymbol != null) { - if (innerClassSymbol.type instanceof ClassType) { - ((ClassType) innerClassSymbol.type).setEnclosingType(Type.noType); - } - innerClassSymbol.erasure_field = null; - } + markClassAsStatic((JCClassDecl) element.get()); } } if (makeConstructor) createPrivateDefaultConstructor(typeNode); } + private void markClassAsStatic(JCClassDecl classDecl) { + classDecl.mods.flags |= Flags.STATIC; // maybe Flags.NOOUTERTHIS too? + ClassSymbol innerClassSymbol = classDecl.sym; + if (innerClassSymbol != null && innerClassSymbol.type instanceof ClassType) { + ClassType classType = (ClassType) innerClassSymbol.type; + classType.setEnclosingType(Type.noType); + innerClassSymbol.erasure_field = null; + } + } + private void createPrivateDefaultConstructor(JavacNode typeNode) { JavacTreeMaker maker = typeNode.getTreeMaker(); JCModifiers mods = maker.Modifiers(Flags.PRIVATE, List.nil()); diff --git a/test/transform/resource/after-delombok/UtilityClassInner.java b/test/transform/resource/after-delombok/UtilityClassInner.java index 4c4c6743..cd91bc2d 100644 --- a/test/transform/resource/after-delombok/UtilityClassInner.java +++ b/test/transform/resource/after-delombok/UtilityClassInner.java @@ -1,5 +1,6 @@ +@java.lang.SuppressWarnings("serial") class UtilityClassInner { - static final class UtilClass { + static final class UtilClass implements java.io.Serializable { @java.lang.SuppressWarnings("all") @lombok.Generated private UtilClass() { diff --git a/test/transform/resource/after-ecj/UtilityClassInner.java b/test/transform/resource/after-ecj/UtilityClassInner.java index 9086367c..31bd396c 100644 --- a/test/transform/resource/after-ecj/UtilityClassInner.java +++ b/test/transform/resource/after-ecj/UtilityClassInner.java @@ -1,5 +1,5 @@ -class UtilityClassInner { - static final @lombok.experimental.UtilityClass class UtilClass { +@java.lang.SuppressWarnings("serial") class UtilityClassInner { + static final @lombok.experimental.UtilityClass class UtilClass implements java.io.Serializable { private @java.lang.SuppressWarnings("all") @lombok.Generated UtilClass() { super(); throw new java.lang.UnsupportedOperationException("This is a utility class and cannot be instantiated"); diff --git a/test/transform/resource/before/UtilityClassInner.java b/test/transform/resource/before/UtilityClassInner.java index ccb0101b..8fd3a9e7 100644 --- a/test/transform/resource/before/UtilityClassInner.java +++ b/test/transform/resource/before/UtilityClassInner.java @@ -1,4 +1,5 @@ +@java.lang.SuppressWarnings("serial") class UtilityClassInner { @lombok.experimental.UtilityClass - class UtilClass {} + class UtilClass implements java.io.Serializable {} } \ No newline at end of file