From f7a5a1cb2256b25cc5a1262265cacc47ad0918c0 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 17 Nov 2022 15:26:26 +0100 Subject: [PATCH] Java: more clear error message on generic class literal (IDEA-306263) GitOrigin-RevId: d8d2cd5941a288e663fd6918c3e379b669553967 --- .../daemon/impl/analysis/GenericsHighlightUtil.java | 12 ++++++++++-- .../src/messages/JavaErrorBundle.properties | 4 ++-- .../genericsHighlighting/IDEA57539.java | 4 ++-- .../genericsHighlighting/ReferenceTypeParams.java | 10 +++++----- .../genericsHighlighting8/IDEA57539.java | 4 ++-- .../genericsHighlighting8/ReferenceTypeParams.java | 10 +++++----- 6 files changed, 26 insertions(+), 18 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index e56ebfcf0218..164a20877a21 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -1061,8 +1061,16 @@ public final class GenericsHighlightUtil { return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(operand).descriptionAndTooltip(description); } if (type.getParameters().length > 0) { - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(operand).descriptionAndTooltip( - JavaErrorBundle.message("cannot.select.from.parameterized.type")); + final HighlightInfo.Builder info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(operand).descriptionAndTooltip( + JavaErrorBundle.message("cannot.select.from.parameterized.type")); + final PsiJavaCodeReferenceElement referenceElement = operand.getInnermostComponentReferenceElement(); + if (referenceElement != null) { + final PsiReferenceParameterList parameterList = referenceElement.getParameterList(); + if (parameterList != null) { + info.registerFix(QUICK_FIX_FACTORY.createDeleteFix(parameterList), null, null, null, null); + } + } + return info; } return null; } diff --git a/java/java-psi-impl/src/messages/JavaErrorBundle.properties b/java/java-psi-impl/src/messages/JavaErrorBundle.properties index 5681c6b3624b..7f533050c91c 100644 --- a/java/java-psi-impl/src/messages/JavaErrorBundle.properties +++ b/java/java-psi-impl/src/messages/JavaErrorBundle.properties @@ -82,7 +82,7 @@ illegal.generic.type.for.instanceof=Illegal generic type for instanceof unsafe.cast.in.instanceof=''{0}'' cannot be safely cast to ''{1}'' instanceof.pattern.supertype=Pattern type ''{0}'' is a supertype of expression type ''{1}'' instanceof.pattern.equals=Pattern type ''{0}'' is the same as expression type -cannot.select.dot.class.from.type.variable=Cannot select from a type variable +cannot.select.dot.class.from.type.variable=Cannot access class object of a type parameter method.does.not.override.super=Method does not override method from its superclass static.method.cannot.be.annotated.with.override=Static methods cannot be annotated with @Override call.to.super.is.not.allowed.in.enum.constructor=Call to super is not allowed in enum constructor @@ -518,7 +518,7 @@ qualified.class.reference.not.allowed.in.qualified.new=Qualified class reference actual.type.argument.contradict.inferred.type=Actual type argument and inferred type contradict each other default.method.overrides.object.member=Default method ''{0}'' overrides a member of ''java.lang.Object'' two.methods.are.inherited.with.same.signature=Methods {0} from {1} and {2} from {3} are inherited with the same signature -cannot.select.from.parameterized.type=Cannot select from parameterized type +cannot.select.from.parameterized.type=Cannot access class object of parameterized type safevarargs.not.allowed.non.final.instance.methods=@SafeVarargs is not allowed on non-final instance methods safevarargs.not.suppress.potentially.unsafe.operations=@SafeVarargs do not suppress potentially unsafe operations safevarargs.not.applicable.for.reifiable.types=@SafeVarargs is not applicable for reifiable types diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57539.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57539.java index cfaaf59713de..a2c1b21c50e5 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57539.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57539.java @@ -1,10 +1,10 @@ class E { - Class o = T[].class; + Class o = T[].class; } class MyClass { Class getTs() { - return T[].class; + return T[].class; } public static void main(String[] args) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ReferenceTypeParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ReferenceTypeParams.java index 355d27fa207b..c06c4c51d7b1 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ReferenceTypeParams.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ReferenceTypeParams.java @@ -88,7 +88,7 @@ class myAList extends mylist { Class foo (Class clazz) { Class clazz1 = (Class)clazz; //Should be unchecked warning - return T.class; + return T.class; } } @@ -130,11 +130,11 @@ abstract class GenericTest99> { class ClassLiteral { { - Object c1 = T.class; - Object c2 = T[].class; + Object c1 = T.class; + Object c2 = T[].class; - Object c3 = List.class; - Object c4 = List[].class; + Object c3 = List.class; + Object c4 = List[].class; Object c5 = List[].class; Object c6 = List.class; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57539.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57539.java index 196929487d73..34c083794e5a 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57539.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57539.java @@ -1,10 +1,10 @@ class E { - Class o = T[].class; + Class o = T[].class; } class MyClass { Class getTs() { - return T[].class; + return T[].class; } public static void main(String[] args) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/ReferenceTypeParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/ReferenceTypeParams.java index f848f66a7ae6..99c7a57a8dd8 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/ReferenceTypeParams.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/ReferenceTypeParams.java @@ -88,7 +88,7 @@ class myAList extends mylist { Class foo (Class clazz) { Class clazz1 = (Class)clazz; //Should be unchecked warning - return T.class; + return T.class; } } @@ -130,11 +130,11 @@ abstract class GenericTest99> { class ClassLiteral { { - Object c1 = T.class; - Object c2 = T[].class; + Object c1 = T.class; + Object c2 = T[].class; - Object c3 = List.class; - Object c4 = List[].class; + Object c3 = List.class; + Object c4 = List[].class; Object c5 = List[].class; Object c6 = List.class; }