diff --git a/.github/workflows/ant.yml b/.github/workflows/ant.yml index a216ebba60..d28dc1352b 100644 --- a/.github/workflows/ant.yml +++ b/.github/workflows/ant.yml @@ -183,3 +183,32 @@ jobs: - name: Compile in container run: docker run --entrypoint="" -v $(pwd)/lombok.jar:/workspace/lombok.jar $IMAGE_NAME /bin/bash -c "cd classpath; ${{ matrix.tool.cmd }}" + + manual-tests: + runs-on: ubuntu-24.04 + needs: build + strategy: + matrix: + jdk: [8, 11, 17, 21, 23] + dir: [compileTests] + fail-fast: false + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK ${{ matrix.jdk }} + uses: actions/setup-java@v4 + with: + java-version: ${{ matrix.jdk }} + distribution: 'zulu' + + - uses: actions/download-artifact@v4 + with: + name: lombok.jar + path: dist + + - name: Run tests + working-directory: ./test/manual/${{ matrix.dir }}/ + run: ./runTests.sh + diff --git a/src/core/lombok/javac/handlers/HandleUtilityClass.java b/src/core/lombok/javac/handlers/HandleUtilityClass.java index b20aee3ae6..bc171b8f89 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 @@ private void changeModifiersAndGenerateConstructor(JavacNode typeNode, JavacNode 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 @@ private void changeModifiersAndGenerateConstructor(JavacNode typeNode, JavacNode 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/manual/compileTests/.gitignore b/test/manual/compileTests/.gitignore new file mode 100644 index 0000000000..e2e7327cde --- /dev/null +++ b/test/manual/compileTests/.gitignore @@ -0,0 +1 @@ +/out diff --git a/test/manual/compileTests/runTests.sh b/test/manual/compileTests/runTests.sh new file mode 100755 index 0000000000..1b129920e1 --- /dev/null +++ b/test/manual/compileTests/runTests.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -e +echo 'This will compile a selection of files in test/transform/resource/before. If the compilation works without error, lombok is working as designed.' + +mkdir -p out/ + +# list of files to iterate over +FILES="UtilityClassInner.java" +BASE_PATH="../../../test/transform/resource/before" +LOMBOK_JAR="../../../dist/lombok.jar" + +# compile all files in list +for f in $FILES +do + + echo "Compiling $f" + javac -processorpath $LOMBOK_JAR -cp $LOMBOK_JAR -d out/ $BASE_PATH/$f +done + +rm -rf out/ diff --git a/test/transform/resource/after-delombok/UtilityClassInner.java b/test/transform/resource/after-delombok/UtilityClassInner.java index 4c4c674377..cd91bc2d7c 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 9086367cf8..31bd396c41 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 ccb0101b17..8fd3a9e7ff 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