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"/>
+
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 @@
+