diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/classlayout/PublicConstructorInNonPublicClassInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/classlayout/PublicConstructorInNonPublicClassInspection.java
index 5decb59dadce..792f68cbcbe1 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/classlayout/PublicConstructorInNonPublicClassInspection.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/classlayout/PublicConstructorInNonPublicClassInspection.java
@@ -18,6 +18,7 @@ package com.siyeh.ig.classlayout;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
+import com.intellij.psi.util.JavaPsiRecordUtil;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
@@ -104,6 +105,11 @@ public class PublicConstructorInNonPublicClassInspection extends BaseInspection
if (containingClass == null) {
return;
}
+ if (containingClass.isRecord() &&
+ (JavaPsiRecordUtil.isCompactConstructor(method) || JavaPsiRecordUtil.isCanonicalConstructor(method))) {
+ // compact and canonical constructors in record must be public, according to spec
+ return;
+ }
if (containingClass.hasModifierProperty(PsiModifier.PUBLIC) ||
containingClass.hasModifierProperty(PsiModifier.PROTECTED)) {
return;
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/public_constructor_in_non_public_class/PublicConstructorInNonPublicClass.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/public_constructor_in_non_public_class/PublicConstructorInNonPublicClass.java
index bb14be47490b..9497e14976a8 100644
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/public_constructor_in_non_public_class/PublicConstructorInNonPublicClass.java
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/classlayout/public_constructor_in_non_public_class/PublicConstructorInNonPublicClass.java
@@ -12,3 +12,19 @@ class PublicConstructorInNonPublicClass {
public B() {}
}
}
+record Rec() {
+ public Rec {}
+ public Rec(int x) {
+ this();
+ System.out.println(x);
+ }
+}
+record Rec2(int x) {
+ public Rec2() {
+ this(0);
+ }
+ public Rec2(int x) {
+ System.out.println(x);
+ this.x = x;
+ }
+}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/classlayout/PublicConstructorInNonPublicClassInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/classlayout/PublicConstructorInNonPublicClassInspectionTest.java
index d2b363a72caa..37b7b83390fb 100644
--- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/classlayout/PublicConstructorInNonPublicClassInspectionTest.java
+++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/classlayout/PublicConstructorInNonPublicClassInspectionTest.java
@@ -16,7 +16,7 @@ public class PublicConstructorInNonPublicClassInspectionTest extends LightJavaCo
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
- return JAVA_8;
+ return JAVA_14;
}
private void doTest() {