Java: Improve error message on accessing static field from enum initializer (IDEA-342001)

GitOrigin-RevId: 533518be63dded4577e70a4ecbd747203d136689
This commit is contained in:
Bas Leijdekkers
2024-01-01 16:14:41 +01:00
committed by intellij-monorepo-bot
parent eb57f29882
commit bee5c5dacd
8 changed files with 57 additions and 48 deletions

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.daemon.impl.analysis;
import com.intellij.codeInsight.daemon.HighlightDisplayKey;
@@ -849,18 +849,28 @@ public final class GenericsHighlightUtil {
}
//http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2
static HighlightInfo.Builder checkAccessStaticFieldFromEnumConstructor(@NotNull PsiReferenceExpression expr, @NotNull JavaResolveResult result) {
static HighlightInfo.Builder checkAccessStaticFieldFromEnumConstructor(@NotNull PsiReferenceExpression expr,
@NotNull JavaResolveResult result) {
PsiField field = ObjectUtils.tryCast(result.getElement(), PsiField.class);
if (field == null) return null;
PsiClass enumClass = getEnumClassForExpressionInInitializer(expr);
if (enumClass == null || !isRestrictedStaticEnumField(field, enumClass)) return null;
String description = JavaErrorBundle.message(
"illegal.to.access.static.member.from.enum.constructor.or.instance.initializer",
HighlightMessageUtil.getSymbolName(field, result.getSubstitutor())
);
int fieldType = field instanceof PsiEnumConstant ? 2 : 1;
PsiMember initializer = PsiUtil.findEnclosingConstructorOrInitializer(expr);
int initializerType;
if (initializer instanceof PsiMethod) {
initializerType = 1;
}
else if (initializer instanceof PsiField) {
initializerType = 2;
}
else {
initializerType = 3;
}
String description = JavaErrorBundle.message("illegal.to.access.static.member.from.enum.constructor.or.instance.initializer",
fieldType, initializerType);
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expr).descriptionAndTooltip(description);
}
@@ -889,15 +899,14 @@ public final class GenericsHighlightUtil {
public static @Nullable PsiClass getEnumClassForExpressionInInitializer(@NotNull PsiExpression expr) {
if (PsiImplUtil.getSwitchLabel(expr) != null) return null;
PsiMember constructorOrInitializer = PsiUtil.findEnclosingConstructorOrInitializer(expr);
if (constructorOrInitializer == null) return null;
if (constructorOrInitializer.hasModifierProperty(PsiModifier.STATIC)) return null;
PsiClass enumClass = constructorOrInitializer instanceof PsiEnumConstantInitializer ?
(PsiClass)constructorOrInitializer : constructorOrInitializer.getContainingClass();
if (constructorOrInitializer == null || constructorOrInitializer.hasModifierProperty(PsiModifier.STATIC)) return null;
PsiClass enumClass = constructorOrInitializer instanceof PsiEnumConstantInitializer
? (PsiClass)constructorOrInitializer
: constructorOrInitializer.getContainingClass();
if (enumClass instanceof PsiEnumConstantInitializer) {
enumClass = enumClass.getSuperClass();
}
if (enumClass == null || !enumClass.isEnum()) return null;
return enumClass;
return enumClass != null && enumClass.isEnum() ? enumClass : null;
}
static HighlightInfo.Builder checkEnumInstantiation(@NotNull PsiElement expression, @Nullable PsiClass aClass) {

View File

@@ -67,7 +67,7 @@ generics.unchecked.call=Unchecked method ''{0}'' invocation
generics.diamond.not.applicable=Diamond operator is not applicable for non-parameterized types
generics.reference.parameters.not.allowed=Reference parameters are not allowed here
foreach.not.applicable=Foreach not applicable to type ''{0}''
illegal.to.access.static.member.from.enum.constructor.or.instance.initializer=It is illegal to access static member ''{0}'' from enum constructor or instance initializer
illegal.to.access.static.member.from.enum.constructor.or.instance.initializer=Accessing {0, choice, 1#static field|2#enum constant} from enum {1, choice, 1#constructor|2#instance field initializer|3#instance initializer} is not allowed
enum.types.cannot.be.instantiated=Enum types cannot be instantiated
generic.array.creation=Generic array creation
cannot.create.array.with.empty.diamond=Cannot create array with '<>'

View File

@@ -1,13 +1,13 @@
enum MyEnumTest {
FOO;
MyEnumTest Foo = <error descr="It is illegal to access static member 'FOO' from enum constructor or instance initializer">FOO</error>;
MyEnumTest Foo = <error descr="Accessing enum constant from enum instance field initializer is not allowed">FOO</error>;
{
MyEnumTest foo = <error descr="It is illegal to access static member 'FOO' from enum constructor or instance initializer">FOO</error>;
MyEnumTest foo = <error descr="Accessing enum constant from enum instance initializer is not allowed">FOO</error>;
}
static MyEnumTest Bar = FOO;
MyEnumTest() {
System.out.println(<error descr="It is illegal to access static member 'Bar' from enum constructor or instance initializer">Bar</error>);
System.out.println(<error descr="Accessing static field from enum constructor is not allowed">Bar</error>);
}
}

View File

@@ -3,9 +3,9 @@ enum Operation {
static int s = 0;
public static final String constS = "";
Operation() {
int i = <error descr="It is illegal to access static member 's' from enum constructor or instance initializer">Operation.s</error>;
i = <error descr="It is illegal to access static member 's' from enum constructor or instance initializer">s</error>;
<error descr="It is illegal to access static member 's' from enum constructor or instance initializer">s</error> = 0;
int i = <error descr="Accessing static field from enum constructor is not allowed">Operation.s</error>;
i = <error descr="Accessing static field from enum constructor is not allowed">s</error>;
<error descr="Accessing static field from enum constructor is not allowed">s</error> = 0;
final int x = Integer.MAX_VALUE;
String co = constS;
// TODO: unclear
@@ -18,12 +18,12 @@ enum Operation {
final int x = Integer.MAX_VALUE;
String co = constS;
// TODO: unclear
//Operation o = X;
Operation o = X;
}
{
int i = <error descr="It is illegal to access static member 's' from enum constructor or instance initializer">Operation.s</error>;
i = <error descr="It is illegal to access static member 's' from enum constructor or instance initializer">s</error>;
<error descr="It is illegal to access static member 's' from enum constructor or instance initializer">s</error> = 0;
int i = <error descr="Accessing static field from enum instance initializer is not allowed">Operation.s</error>;
i = <error descr="Accessing static field from enum instance initializer is not allowed">s</error>;
<error descr="Accessing static field from enum instance initializer is not allowed">s</error> = 0;
final int x = Integer.MAX_VALUE;
String co = constS;
// TODO: unclear

View File

@@ -1,10 +1,10 @@
enum IDEA56239 {
A, B() {
{
System.out.println(<error descr="It is illegal to access static member 'A' from enum constructor or instance initializer">A</error>);
System.out.println(<error descr="It is illegal to access static member 'FOO' from enum constructor or instance initializer">FOO</error>);
System.out.println(<error descr="Accessing enum constant from enum instance initializer is not allowed">A</error>);
System.out.println(<error descr="Accessing static field from enum instance initializer is not allowed">FOO</error>);
System.out.println(FOO1);
System.out.println(<error descr="It is illegal to access static member 'C' from enum constructor or instance initializer">C</error>);
System.out.println(<error descr="Accessing enum constant from enum instance initializer is not allowed">C</error>);
}
}, C(<error descr="Cannot refer to enum constant 'D' before its definition">D</error>), D;
@@ -15,14 +15,14 @@ enum IDEA56239 {
}
IDEA56239(IDEA56239 t) {
System.out.println(<error descr="It is illegal to access static member 'A' from enum constructor or instance initializer">A</error>);
System.out.println(<error descr="It is illegal to access static member 'FOO' from enum constructor or instance initializer">FOO</error>);
System.out.println(<error descr="Accessing enum constant from enum constructor is not allowed">A</error>);
System.out.println(<error descr="Accessing static field from enum constructor is not allowed">FOO</error>);
System.out.println(FOO1);
}
{
System.out.println(<error descr="It is illegal to access static member 'A' from enum constructor or instance initializer">A</error>);
System.out.println(<error descr="It is illegal to access static member 'FOO' from enum constructor or instance initializer">FOO</error>);
System.out.println(<error descr="Accessing enum constant from enum instance initializer is not allowed">A</error>);
System.out.println(<error descr="Accessing static field from enum instance initializer is not allowed">FOO</error>);
System.out.println(FOO1);
}

View File

@@ -1,8 +1,8 @@
public enum State {
STATE1 {
State s = <error descr="It is illegal to access static member 'STATE2' from enum constructor or instance initializer">STATE2</error>;
State s = <error descr="Accessing enum constant from enum instance field initializer is not allowed">STATE2</error>;
},
STATE2 {
State s = <error descr="It is illegal to access static member 'STATE1' from enum constructor or instance initializer">STATE1</error>;
State s = <error descr="Accessing enum constant from enum instance field initializer is not allowed">STATE1</error>;
}
}

View File

@@ -3,9 +3,9 @@ enum Operation {
static int s = 0;
public static final String constS = "";
Operation() {
int i = <error descr="It is illegal to access static member 's' from enum constructor or instance initializer">Operation.s</error>;
i = <error descr="It is illegal to access static member 's' from enum constructor or instance initializer">s</error>;
<error descr="It is illegal to access static member 's' from enum constructor or instance initializer">s</error> = 0;
int i = <error descr="Accessing static field from enum constructor is not allowed">Operation.s</error>;
i = <error descr="Accessing static field from enum constructor is not allowed">s</error>;
<error descr="Accessing static field from enum constructor is not allowed">s</error> = 0;
final int x = Integer.MAX_VALUE;
String co = constS;
// TODO: unclear
@@ -21,9 +21,9 @@ enum Operation {
//Operation o = X;
}
{
int i = <error descr="It is illegal to access static member 's' from enum constructor or instance initializer">Operation.s</error>;
i = <error descr="It is illegal to access static member 's' from enum constructor or instance initializer">s</error>;
<error descr="It is illegal to access static member 's' from enum constructor or instance initializer">s</error> = 0;
int i = <error descr="Accessing static field from enum instance initializer is not allowed">Operation.s</error>;
i = <error descr="Accessing static field from enum instance initializer is not allowed">s</error>;
<error descr="Accessing static field from enum instance initializer is not allowed">s</error> = 0;
final int x = Integer.MAX_VALUE;
String co = constS;
// TODO: unclear
@@ -77,8 +77,8 @@ enum OurEnum {
}
{
Enum<OurEnum> a = <error descr="It is illegal to access static member 'A' from enum constructor or instance initializer">A</error>;
OurEnum enumValue = <error descr="It is illegal to access static member 'B' from enum constructor or instance initializer">B</error>;
Enum<OurEnum> a = <error descr="Accessing enum constant from enum instance initializer is not allowed">A</error>;
OurEnum enumValue = <error descr="Accessing enum constant from enum instance initializer is not allowed">B</error>;
switch (enumValue) {
}

View File

@@ -1,10 +1,10 @@
enum IDEA56239 {
A, B() {
{
System.out.println(<error descr="It is illegal to access static member 'A' from enum constructor or instance initializer">A</error>);
System.out.println(<error descr="It is illegal to access static member 'FOO' from enum constructor or instance initializer">FOO</error>);
System.out.println(<error descr="Accessing enum constant from enum instance initializer is not allowed">A</error>);
System.out.println(<error descr="Accessing static field from enum instance initializer is not allowed">FOO</error>);
System.out.println(FOO1);
System.out.println(<error descr="It is illegal to access static member 'C' from enum constructor or instance initializer">C</error>);
System.out.println(<error descr="Accessing enum constant from enum instance initializer is not allowed">C</error>);
}
}, C(<error descr="Cannot refer to enum constant 'D' before its definition">D</error>), D;
@@ -15,14 +15,14 @@ enum IDEA56239 {
}
IDEA56239(IDEA56239 t) {
System.out.println(<error descr="It is illegal to access static member 'A' from enum constructor or instance initializer">A</error>);
System.out.println(<error descr="It is illegal to access static member 'FOO' from enum constructor or instance initializer">FOO</error>);
System.out.println(<error descr="Accessing enum constant from enum constructor is not allowed">A</error>);
System.out.println(<error descr="Accessing static field from enum constructor is not allowed">FOO</error>);
System.out.println(FOO1);
}
{
System.out.println(<error descr="It is illegal to access static member 'A' from enum constructor or instance initializer">A</error>);
System.out.println(<error descr="It is illegal to access static member 'FOO' from enum constructor or instance initializer">FOO</error>);
System.out.println(<error descr="Accessing enum constant from enum instance initializer is not allowed">A</error>);
System.out.println(<error descr="Accessing static field from enum instance initializer is not allowed">FOO</error>);
System.out.println(FOO1);
}