Java: fix and improve error message (IDEA-356573)

GitOrigin-RevId: 0b3ff17ed8d439ff99ce1e2294a6fac2dcb83770
This commit is contained in:
Bas Leijdekkers
2024-07-19 14:21:52 +02:00
committed by intellij-monorepo-bot
parent 291bb89726
commit 5b1dbe4383
6 changed files with 15 additions and 13 deletions

View File

@@ -1448,14 +1448,16 @@ public final class GenericsHighlightUtil {
static HighlightInfo.Builder checkRawOnParameterizedType(@NotNull PsiJavaCodeReferenceElement parent, @Nullable PsiElement resolved) {
PsiReferenceParameterList list = parent.getParameterList();
if (list == null || list.getTypeArguments().length > 0) return null;
PsiElement qualifier = parent.getQualifier();
if (qualifier instanceof PsiJavaCodeReferenceElement &&
((PsiJavaCodeReferenceElement)qualifier).getTypeParameters().length > 0 &&
resolved instanceof PsiTypeParameterListOwner &&
((PsiTypeParameterListOwner)resolved).hasTypeParameters() &&
!((PsiTypeParameterListOwner)resolved).hasModifierProperty(PsiModifier.STATIC)) {
String message = JavaErrorBundle.message("text.improper.formed.type");
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(parent).descriptionAndTooltip(message);
if (parent.getQualifier() instanceof PsiJavaCodeReferenceElement ref &&
ref.getTypeParameters().length > 0 &&
resolved instanceof PsiTypeParameterListOwner typeParameterListOwner &&
typeParameterListOwner.hasTypeParameters() &&
!typeParameterListOwner.hasModifierProperty(PsiModifier.STATIC)) {
PsiElement referenceNameElement = parent.getReferenceNameElement();
if (referenceNameElement != null) {
String message = JavaErrorBundle.message("text.improper.formed.type", referenceNameElement.getText());
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(parent).descriptionAndTooltip(message);
}
}
return null;
}

View File

@@ -585,7 +585,7 @@ annotation.cannot.be.local=Local annotations are not allowed
create.class.action.this.not.valid.java.qualified.name=This is not a valid Java qualified name
text.class.inherits.abstract.and.default={0} inherits abstract and default for {1} from types {2} and {3}
text.class.inherits.unrelated.defaults={0} inherits unrelated defaults for {1} from types {2}
text.improper.formed.type=Improper formed type; some type parameters are missing
text.improper.formed.type=Improperly formed type: ''{0}'' needs type arguments because its qualifier has type arguments
text.class.is.not.accessible={0} is not accessible in current context
text.class.cannot.access=Cannot access {0}
auto.closeable.resource=auto-closeable resource

View File

@@ -1,5 +1,5 @@
class A<T> {
class B<S> {
<error descr="Improper formed type; some type parameters are missing">A<T>.B</error> x;
<error descr="Improperly formed type: 'B' needs type arguments because its qualifier has type arguments">A<T>.B</error> x;
}
}

View File

@@ -11,7 +11,7 @@ class GenericOuter<T> {
class OuterClient {
public void context() {
<error descr="Improper formed type; some type parameters are missing">GenericOuter<String>.GenericInner</error> v1 = null;
<error descr="Improperly formed type: 'GenericInner' needs type arguments because its qualifier has type arguments">GenericOuter<String>.GenericInner</error> v1 = null;
GenericOuter.GenericInner<error descr="Type arguments given on a raw type"><String></error> v2 = null;
GenericOuter.GenericInner v3 = null;
GenericOuter<String>.GenericInner<String> v4 = null;

View File

@@ -1,5 +1,5 @@
class A<T> {
class B<S> {
<error descr="Improper formed type; some type parameters are missing">A<T>.B</error> x;
<error descr="Improperly formed type: 'B' needs type arguments because its qualifier has type arguments">A<T>.B</error> x;
}
}

View File

@@ -11,7 +11,7 @@ class GenericOuter<T> {
class OuterClient {
public void context() {
<error descr="Improper formed type; some type parameters are missing">GenericOuter<String>.GenericInner</error> v1 = null;
<error descr="Improperly formed type: 'GenericInner' needs type arguments because its qualifier has type arguments">GenericOuter<String>.GenericInner</error> v1 = null;
GenericOuter.GenericInner<error descr="Type arguments given on a raw type"><String></error> v2 = null;
GenericOuter.GenericInner v3 = null;
GenericOuter<String>.GenericInner<String> v4 = null;