From bd806744fb8cfe49da0dc556eede578fa811bc63 Mon Sep 17 00:00:00 2001 From: Ilyas Selimov Date: Fri, 2 Jul 2021 19:04:55 +0700 Subject: [PATCH] IDEA-266665 - added inspection that reports redundant modifiers in records GitOrigin-RevId: 6774066ca0e4663228aca9e2921184ea74c2938a --- .../InspectionGadgetsBundle.properties | 4 +- .../UnnecessaryRecordModifierInspection.java | 50 +++++++++++++++++++ .../src/META-INF/InspectionGadgets.xml | 4 ++ .../UnnecessaryRecordModifier.html | 17 +++++++ .../UnnecessaryModifier.java | 12 +++++ ...necessaryRecordModifierInspectionTest.java | 29 +++++++++++ 6 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryRecordModifierInspection.java create mode 100644 plugins/InspectionGadgets/src/inspectionDescriptions/UnnecessaryRecordModifier.html create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_record_modifier/UnnecessaryModifier.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/style/UnnecessaryRecordModifierInspectionTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties index 1326317a6efa..0e07108017f9 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties @@ -776,7 +776,8 @@ empty.try.block.display.name=Empty 'try' block field.has.setter.but.no.getter.display.name=Field has setter but no getter three.negations.per.method.display.name=Method with more than three negations conditional.expression.display.name=Conditional expression -unnecessary.enum.modifier.display.name=Unnecessary enum modifier +unnecessary.enum.modifier.display.name=Unnecessary 'enum' modifier +unnecessary.record.modifier.display.name=Unnecessary 'record' modifier string.equals.empty.string.display.name='String.equals()' can be replaced with 'String.isEmpty()' synchronize.on.lock.display.name=Synchronization on a Lock object synchronized.on.literal.object.name=Synchronization on an object initialized with a literal @@ -1290,6 +1291,7 @@ too.broad.scope.narrow.quickfix=Move declaration of ''{0}'' closer to usages press.escape.to.remove.highlighting.message=Press Escape to remove the highlighting unnecessary.enum.modifier.problem.descriptor=Modifier #ref is redundant for enum constructors #loc unnecessary.enum.modifier.problem.descriptor1=Modifier #ref is redundant for inner enums #loc +unnecessary.redundant.modifier.problem.descriptor=Modifier #ref is redundant for records literal.as.arg.to.string.equals.problem.descriptor=Literal #ref is argument of ''{0}()'', instead of its qualifier #loc literal.as.arg.to.string.equals.flip.quickfix=Flip ''{0}()'' c.style.array.declaration.replace.quickfix=Replace with Java-style array declaration diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryRecordModifierInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryRecordModifierInspection.java new file mode 100644 index 000000000000..f9603ca69b09 --- /dev/null +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryRecordModifierInspection.java @@ -0,0 +1,50 @@ +// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.siyeh.ig.style; + +import com.intellij.codeInspection.CleanupLocalInspectionTool; +import com.intellij.codeInspection.ProblemHighlightType; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiModifier; +import com.intellij.psi.PsiModifierList; +import com.intellij.psi.util.PsiUtil; +import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.BaseInspection; +import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.InspectionGadgetsFix; +import com.siyeh.ig.fixes.RemoveModifierFix; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class UnnecessaryRecordModifierInspection extends BaseInspection implements CleanupLocalInspectionTool { + + @Override + protected @NotNull String buildErrorString(Object... infos) { + return InspectionGadgetsBundle.message("unnecessary.redundant.modifier.problem.descriptor"); + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new UnnecessaryRecordModifierVisitor(); + } + + @Override + protected @Nullable InspectionGadgetsFix buildFix(Object... infos) { + return new RemoveModifierFix((String)infos[0]); + } + + private static class UnnecessaryRecordModifierVisitor extends BaseInspectionVisitor { + @Override + public void visitClass(PsiClass aClass) { + if (!aClass.isRecord()) return; + PsiModifierList modifiers = aClass.getModifierList(); + if (modifiers == null) return; + for (PsiElement modifier : modifiers.getChildren()) { + String modifierText = modifier.getText(); + if (PsiModifier.FINAL.equals(modifierText) || !PsiUtil.isLocalClass(aClass) && PsiModifier.STATIC.equals(modifierText)) { + registerError(modifier, ProblemHighlightType.LIKE_UNUSED_SYMBOL, modifierText); + } + } + } + } +} diff --git a/plugins/InspectionGadgets/src/META-INF/InspectionGadgets.xml b/plugins/InspectionGadgets/src/META-INF/InspectionGadgets.xml index 4410019ba9db..690e9f174b44 100644 --- a/plugins/InspectionGadgets/src/META-INF/InspectionGadgets.xml +++ b/plugins/InspectionGadgets/src/META-INF/InspectionGadgets.xml @@ -2403,6 +2403,10 @@ key="unnecessary.qualifier.for.this.display.name" groupBundle="messages.InspectionsBundle" groupKey="group.names.code.style.issues" enabledByDefault="false" level="WARNING" cleanupTool="true" implementationClass="com.siyeh.ig.style.UnnecessaryQualifierForThisInspection"/> + diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/UnnecessaryRecordModifier.html b/plugins/InspectionGadgets/src/inspectionDescriptions/UnnecessaryRecordModifier.html new file mode 100644 index 000000000000..9f839c9f99c7 --- /dev/null +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/UnnecessaryRecordModifier.html @@ -0,0 +1,17 @@ + + +Reports any redundant modifier on records. +

Example:

+

+final record R() {
+}
+
+class Test {
+  static record R() {
+  }
+}
+
+ +

+ + \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_record_modifier/UnnecessaryModifier.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_record_modifier/UnnecessaryModifier.java new file mode 100644 index 000000000000..e2d1f86e3520 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_record_modifier/UnnecessaryModifier.java @@ -0,0 +1,12 @@ +final record R() { +} + +class C { + static record R () { + } + + void test() { + static final record R () { + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/style/UnnecessaryRecordModifierInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/style/UnnecessaryRecordModifierInspectionTest.java new file mode 100644 index 000000000000..f0968a07c6eb --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/style/UnnecessaryRecordModifierInspectionTest.java @@ -0,0 +1,29 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.siyeh.ig.style; + +import com.intellij.testFramework.LightProjectDescriptor; +import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase; +import com.siyeh.ig.LightJavaInspectionTestCase; +import org.jetbrains.annotations.NotNull; + +public class UnnecessaryRecordModifierInspectionTest extends LightJavaCodeInsightFixtureTestCase { + @Override + protected String getBasePath() { + return LightJavaInspectionTestCase.INSPECTION_GADGETS_TEST_DATA_PATH + "com/siyeh/igtest/style/unnecessary_record_modifier"; + } + + @NotNull + @Override + protected LightProjectDescriptor getProjectDescriptor() { + return JAVA_16; + } + + private void doTest() { + myFixture.enableInspections(new UnnecessaryRecordModifierInspection()); + myFixture.testHighlighting(getTestName(false) + ".java"); + } + + public void testUnnecessaryModifier() { + doTest(); + } +}