From 1925127c5212b3d5b049e86f5dd73445327cf3a7 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sun, 16 Nov 2025 19:44:14 +0100 Subject: [PATCH] [lombok] IDEA-355551 Lombok plugin should show compilation error for @Slf4j over non-static inner class GitOrigin-RevId: 94f463e78030b1e1f4bc39dfef5757dd18f6471f --- .../clazz/log/AbstractLogProcessor.java | 15 ++++++++++++++ .../messages/LombokBundle.properties | 2 ++ ...4jOnNonStaticInnerClassInspectionTest.java | 20 +++++++++++++++++++ .../Slf4jOnNonStaticInnerClass.java | 17 ++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/inspection/Slf4jOnNonStaticInnerClassInspectionTest.java create mode 100644 plugins/lombok/testData/inspection/slf4jOnNonStaticInner/Slf4jOnNonStaticInnerClass.java diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/AbstractLogProcessor.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/AbstractLogProcessor.java index b0505fc3719e..9704a7f3b487 100644 --- a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/AbstractLogProcessor.java +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/AbstractLogProcessor.java @@ -89,10 +89,25 @@ public abstract class AbstractLogProcessor extends AbstractClassProcessor { builder.addErrorMessage("inspection.message.not.generating.field.s.field.with.same.name.already.exists", loggerName); result = false; } + + final boolean loggerStatic = isLoggerStatic(psiClass); + if (psiClass.isRecord() && !loggerStatic) { + builder.addErrorMessage("inspection.message.logger.fields.must.be.static.in.records"); + result = false; + } + + if (loggerStatic && + !(psiClass.hasModifierProperty(PsiModifier.STATIC) || psiClass.getContainingClass() == null || psiClass.isRecord()) + ) { + builder.addErrorMessage("inspection.message.logger.can.be.used.on.static.inner.classes.only", StringUtil.getShortName(getSupportedAnnotationClasses()[0])); + result = false; + } } return result; } + + @Override protected void generatePsiElements(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, diff --git a/plugins/lombok/src/main/resources/messages/LombokBundle.properties b/plugins/lombok/src/main/resources/messages/LombokBundle.properties index a58b18b58193..5ff34b1f6a98 100644 --- a/plugins/lombok/src/main/resources/messages/LombokBundle.properties +++ b/plugins/lombok/src/main/resources/messages/LombokBundle.properties @@ -77,6 +77,8 @@ inspection.message.field.name.constants.only.supported.on.class.enum.or.field.ty inspection.message.field.name.constants.inner.type=@FieldNameConstants inner type already exists, but asEnum={0} does not match existing type inspection.message.s.legal.only.on.classes.enums=''@{0}'' is legal only on classes and enums inspection.message.not.generating.field.s.field.with.same.name.already.exists=Not generating field ''{0}'': A field with same name already exists +inspection.message.logger.fields.must.be.static.in.records=Logger fields must be static in records +inspection.message.logger.can.be.used.on.static.inner.classes.only=''@{0}'' is not supported on non-static nested classes. inspection.message.custom.log.not.configured.correctly=The @CustomLog is not configured correctly; please set log.custom.declaration in lombok.config. inspection.message.custom.log.does.not.allow.topic=@CustomLog does not allow a topic. inspection.message.custom.log.requires.topic=@CustomLog requires a topic. diff --git a/plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/inspection/Slf4jOnNonStaticInnerClassInspectionTest.java b/plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/inspection/Slf4jOnNonStaticInnerClassInspectionTest.java new file mode 100644 index 000000000000..850d378ca3a7 --- /dev/null +++ b/plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/inspection/Slf4jOnNonStaticInnerClassInspectionTest.java @@ -0,0 +1,20 @@ +package de.plushnikov.intellij.plugin.inspection; + +import com.intellij.codeInspection.InspectionProfileEntry; + +public class Slf4jOnNonStaticInnerClassInspectionTest extends LombokInspectionTest { + + @Override + protected String getBasePath() { + return super.getBasePath() + "/" + TEST_DATA_INSPECTION_DIRECTORY + "/slf4jOnNonStaticInner"; + } + + @Override + protected InspectionProfileEntry getInspection() { + return new LombokInspection(); + } + + public void testSlf4jOnNonStaticInnerClass() { + doTest(); + } +} diff --git a/plugins/lombok/testData/inspection/slf4jOnNonStaticInner/Slf4jOnNonStaticInnerClass.java b/plugins/lombok/testData/inspection/slf4jOnNonStaticInner/Slf4jOnNonStaticInnerClass.java new file mode 100644 index 000000000000..7c35677f7491 --- /dev/null +++ b/plugins/lombok/testData/inspection/slf4jOnNonStaticInner/Slf4jOnNonStaticInnerClass.java @@ -0,0 +1,17 @@ +import lombok.extern.slf4j.Slf4j; + +@Slf4j +class Slf4jOnNonStaticInnerClassOuter { + @Slf4j + class Inner { + } + + @Slf4j + static class StaticInnerOk { + } + + @Slf4j + record SomeRecord() { + + } +}