[java-highlighting] IDEA-270163 Good code is red: private record declared in anonymous class

GitOrigin-RevId: fd0e72648b09de6efcac2749d2e4c9e8c99542d5
This commit is contained in:
Tagir Valeev
2022-12-13 16:12:25 +01:00
committed by intellij-monorepo-bot
parent 6328482822
commit 8653f21eef
4 changed files with 27 additions and 8 deletions

View File

@@ -57,7 +57,10 @@ import com.intellij.psi.util.*;
import com.intellij.refactoring.util.RefactoringChangeUtil;
import com.intellij.ui.ColorUtil;
import com.intellij.ui.ExperimentalUI;
import com.intellij.util.*;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ArrayUtilRt;
import com.intellij.util.JavaPsiConstructorUtil;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.NamedColorUtil;
@@ -1044,7 +1047,9 @@ public final class HighlightUtil {
else {
if (PsiModifier.STATIC.equals(modifier) || privateOrProtected || PsiModifier.PACKAGE_LOCAL.equals(modifier)) {
isAllowed = modifierOwnerParent instanceof PsiClass &&
(PsiModifier.STATIC.equals(modifier) || ((PsiClass)modifierOwnerParent).getQualifiedName() != null) ||
(PsiModifier.STATIC.equals(modifier) ||
PsiUtil.isLanguageLevel16OrHigher(modifierOwnerParent) ||
((PsiClass)modifierOwnerParent).getQualifiedName() != null) ||
FileTypeUtils.isInServerPageFile(modifierOwnerParent) ||
// non-physical dummy holder might not have FQN
!modifierOwnerParent.isPhysical();
@@ -1063,8 +1068,9 @@ public final class HighlightUtil {
isAllowed &= !PsiModifier.ABSTRACT.equals(modifier);
}
if (aClass.getContainingClass() instanceof PsiAnonymousClass) {
isAllowed &= !privateOrProtected;
if (aClass.getContainingClass() instanceof PsiAnonymousClass &&
privateOrProtected && !PsiUtil.isLanguageLevel16OrHigher(modifierOwnerParent)) {
isAllowed = false;
}
}
if (PsiModifier.NON_SEALED.equals(modifier) && !aClass.hasModifierProperty(PsiModifier.SEALED)) {

View File

@@ -1,5 +1,5 @@
//statics in inner -- in Java 16 allowed everywhere
public class a {
<error descr="Class 'a' is public, should be declared in a file named 'a.java'">public class a</error> {
static final Number x = null;
static final int ix = x== null ? 4 : 3;
@@ -83,7 +83,7 @@ public class a {
void withanonymous() {
new Object() {
<error descr="Modifier 'private' not allowed here">private</error> class RT {}
private class RT {}
private void method() {}
private int myI;
};

View File

@@ -0,0 +1,11 @@
public class PrivateRecordInsideAnonymous {
void foo() {
new Object() {
private record Foo() { }
};
class Local {
private class Priv {}
protected class Prot {}
}
}
}

View File

@@ -2,8 +2,7 @@
package com.intellij.java.codeInsight.daemon;
import com.intellij.JavaTestUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightRecordCanonicalConstructor;
import com.intellij.psi.PsiDeclarationStatement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.introduceVariable.ReassignVariableUtil;
import com.intellij.testFramework.LightProjectDescriptor;
@@ -59,6 +58,9 @@ public class LightRecordsHighlightingTest extends LightJavaCodeInsightFixtureTes
ReassignVariableUtil.registerDeclaration(getEditor(), decl, getTestRootDisposable());
ReassignVariableUtil.reassign(getEditor());
}
public void testPrivateRecordInsideAnonymous() {
doTest();
}
private void doTest() {
myFixture.addClass("package java.lang; public abstract class Record {" +