Java: more clear error message on trying to reference member of primitive type (IDEA-321123)

GitOrigin-RevId: 7244dcae3a1a93396930b6a7e4b1303a8482dbf0
This commit is contained in:
Bas Leijdekkers
2023-06-05 08:56:43 +00:00
committed by intellij-monorepo-bot
parent 4daa4f49ea
commit b2cc1fde75
5 changed files with 28 additions and 4 deletions
@@ -868,11 +868,20 @@ public final class HighlightMethodUtil {
}
else if (candidates.length == 0) {
PsiClass qualifierClass = RefactoringChangeUtil.getQualifierClass(referenceToMethod);
String qualifier = qualifierClass != null ? qualifierClass.getName() : null;
String className = qualifierClass != null ? qualifierClass.getName() : null;
PsiExpression qualifierExpression = referenceToMethod.getQualifierExpression();
description = qualifier != null
? JavaErrorBundle.message("ambiguous.method.call.no.match", referenceToMethod.getReferenceName(), qualifier)
: JavaErrorBundle.message("cannot.resolve.method", referenceToMethod.getReferenceName() + buildArgTypesList(list, true));
if (className != null) {
description = JavaErrorBundle.message("ambiguous.method.call.no.match", referenceToMethod.getReferenceName(), className);
}
else {
description =
qualifierExpression != null &&
qualifierExpression.getType() instanceof PsiPrimitiveType primitiveType &&
!primitiveType.equals(PsiTypes.nullType()) && !primitiveType.equals(PsiTypes.voidType())
? JavaErrorBundle.message("cannot.call.method.on.type", qualifierExpression.getText(), primitiveType.getPresentableText(false))
: JavaErrorBundle.message("cannot.resolve.method", referenceToMethod.getReferenceName() + buildArgTypesList(list, true));
}
highlightInfoType = HighlightInfoType.WRONG_REF;
}
else {
@@ -3266,6 +3266,15 @@ public final class HighlightUtil {
}
else {
description = JavaErrorBundle.message("cannot.resolve.symbol", refName.getText());
if (ref instanceof PsiReferenceExpression expression) {
PsiExpression qualifierExpression = expression.getQualifierExpression();
if (qualifierExpression != null &&
qualifierExpression.getType() instanceof PsiPrimitiveType primitiveType &&
!primitiveType.equals(PsiTypes.nullType()) && !primitiveType.equals(PsiTypes.voidType())) {
description = JavaErrorBundle.message("cannot.access.member.on.type", qualifierExpression.getText(),
primitiveType.getPresentableText(false));
}
}
}
HighlightInfo.Builder info =
@@ -305,6 +305,8 @@ deprecated.symbol=''{0}'' is deprecated
marked.for.removal.symbol=''{0}'' is deprecated and marked for removal
qualifier.must.be.expression=Qualifier must be an expression
cannot.resolve.symbol=Cannot resolve symbol ''{0}''
cannot.access.member.on.type=Cannot access member because ''{0}'' has primitive type {1}
cannot.call.method.on.type=Cannot call method because ''{0}'' has primitive type {1}
class.is.already.defined.in.single.static.import=Class ''{0}'' is already defined in a single static import
class.is.ambiguous.in.single.static.import=Class ''{0}'' is ambiguous in a single static import
field.is.already.defined.in.single.static.import=Field ''{0}'' is already defined in a single static import
@@ -50,6 +50,9 @@ public class a12 {
<error descr="Cannot resolve method 'foo123Unresolved' in 'a12'">foo123Unresolved</error>(<error descr="Expression expected">String</error>);
<error descr="Cannot resolve method 'foo123Unresolved' in 'a12'">foo123Unresolved</error>(<error descr="Cannot resolve symbol 'xxxx'">xxxx</error>);
int i = 0;
System.out.println(i.<error descr="Cannot access member because 'i' has primitive type int">x</error>);
System.out.println(true.<error descr="Cannot call method because 'true' has primitive type boolean">toString</error>());
<error descr="Cannot resolve method 'xxxxxx' in 'a12'">xxxxxx</error>(<error descr="Cannot resolve symbol 'xxxxxx'">xxxxxx</error>);
@@ -2,5 +2,6 @@ class Test {
void test() {
var x = <error descr="Cannot resolve method 'unresolved' in 'Test'">unresolved</error>();
System.out.println(x.<error descr="Cannot resolve method 'hashCode()'">hashCode</error>());
System.out.println(x.<error descr="Cannot resolve symbol 'x'">x</error>);
}
}