mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-18 20:41:22 +07:00
Java: Improve error message on accessing static field from enum initializer (IDEA-342001)
GitOrigin-RevId: 533518be63dded4577e70a4ecbd747203d136689
This commit is contained in:
committed by
intellij-monorepo-bot
parent
eb57f29882
commit
bee5c5dacd
@@ -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) {
|
||||
|
||||
@@ -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 '<>'
|
||||
|
||||
@@ -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>);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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>;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user