diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index da8e0be1a7bd..3e248c34ea77 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -78,6 +78,8 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static com.intellij.util.ObjectUtils.notNull; + /** * @author cdr * @since Jul 30, 2002 @@ -521,7 +523,8 @@ public class HighlightUtil extends HighlightUtilBase { if (initializer == null || initializer instanceof PsiArrayInitializerExpression) return null; PsiType lType = variable.getType(); PsiType rType = initializer.getType(); - int start = variable.getTypeElement().getTextRange().getStartOffset(); + PsiTypeElement typeElement = variable.getTypeElement(); + int start = typeElement != null ? typeElement.getTextRange().getStartOffset() : variable.getTextRange().getStartOffset(); int end = variable.getTextRange().getEndOffset(); HighlightInfo highlightInfo = checkAssignability(lType, rType, initializer, new TextRange(start, end), 0); if (highlightInfo != null) { @@ -1308,7 +1311,7 @@ public class HighlightUtil extends HighlightUtilBase { return errorResult; } - @Nullable + @NotNull private static List checkMultiCatchParameter(@NotNull final PsiParameter parameter, @NotNull final Collection thrownTypes) { final List typeElements = PsiUtil.getParameterTypeElements(parameter); @@ -1689,7 +1692,7 @@ public class HighlightUtil extends HighlightUtilBase { @NotNull static String buildProblemWithAccessDescription(@NotNull final PsiElement reference, @NotNull final JavaResolveResult result) { - return buildProblemWithAccessDescription(reference, result, result.getElement()); + return buildProblemWithAccessDescription(reference, result, notNull(result.getElement())); } @NotNull @@ -1983,9 +1986,9 @@ public class HighlightUtil extends HighlightUtilBase { */ @Nullable static HighlightInfo checkIllegalForwardReferenceToField(@NotNull PsiReferenceExpression expression, @NotNull PsiField referencedField) { - final Boolean isIllegalForwardReference = isIllegalForwardReferenceToField(expression, referencedField, false); + Boolean isIllegalForwardReference = isIllegalForwardReferenceToField(expression, referencedField, false); if (isIllegalForwardReference == null) return null; - String description = isIllegalForwardReference ? JavaErrorMessages.message("illegal.forward.reference") : JavaErrorMessages.message("illegal.self.reference"); + String description = JavaErrorMessages.message(isIllegalForwardReference ? "illegal.forward.reference" : "illegal.self.reference"); return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(description).create(); } @@ -2539,12 +2542,11 @@ public class HighlightUtil extends HighlightUtilBase { final PsiExpression thenExpression = conditionalExpression.getThenExpression(); assert thenExpression != null; PsiType thenType = thenExpression.getType(); - PsiType elseType = type; - if (thenType == null || elseType == null) return null; + if (thenType == null || type == null) return null; if (conditionalExpression.getType() == null) { // cannot derive type of conditional expression - // elseType will never be castable to thenType, so no quick fix here - return createIncompatibleTypeHighlightInfo(thenType, elseType, expression.getTextRange(), 0); + // elseType will never be cast-able to thenType, so no quick fix here + return createIncompatibleTypeHighlightInfo(thenType, type, expression.getTextRange(), 0); } return null; } @@ -2693,14 +2695,13 @@ public class HighlightUtil extends HighlightUtilBase { @Nullable - static HighlightInfo checkReference(@NotNull final PsiJavaCodeReferenceElement ref, - @NotNull final JavaResolveResult result, + static HighlightInfo checkReference(@NotNull PsiJavaCodeReferenceElement ref, + @NotNull JavaResolveResult result, @NotNull PsiFile containingFile, @NotNull LanguageLevel languageLevel) { - final PsiElement refName = ref.getReferenceNameElement(); - + PsiElement refName = ref.getReferenceNameElement(); if (!(refName instanceof PsiIdentifier) && !(refName instanceof PsiKeyword)) return null; - final PsiElement resolved = result.getElement(); + PsiElement resolved = result.getElement(); HighlightInfo highlightInfo = checkMemberReferencedBeforeConstructorCalled(ref, resolved, containingFile); if (highlightInfo != null) return highlightInfo; @@ -2710,46 +2711,39 @@ public class HighlightUtil extends HighlightUtilBase { if (refParent instanceof PsiReferenceExpression && (granny = refParent.getParent()) instanceof PsiMethodCallExpression) { PsiReferenceExpression referenceToMethod = ((PsiMethodCallExpression)granny).getMethodExpression(); PsiExpression qualifierExpression = referenceToMethod.getQualifierExpression(); - if (qualifierExpression == ref) { - @SuppressWarnings("UnnecessaryLocalVariable") PsiElement qualifier = resolved; - if (qualifier != null && !(qualifier instanceof PsiClass) && !(qualifier instanceof PsiVariable)) { - return HighlightInfo.newHighlightInfo(HighlightInfoType.WRONG_REF).range(qualifierExpression).descriptionAndTooltip( - "Qualifier must be an expression").create(); - } + if (qualifierExpression == ref && resolved != null && !(resolved instanceof PsiClass) && !(resolved instanceof PsiVariable)) { + String message = JavaErrorMessages.message("qualifier.must.be.expression"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.WRONG_REF).range(qualifierExpression).descriptionAndTooltip(message).create(); } } else if (refParent instanceof PsiMethodCallExpression) { return null; // methods checked elsewhere } + if (resolved == null) { // do not highlight unknown packages - javac does not care about illegal package names - if (isInsidePackageStatement(refName)) return null; - if (result.isPackagePrefixPackageReference()) return null; + if (isInsidePackageStatement(refName) || result.isPackagePrefixPackageReference() || PsiUtil.isInsideJavadocComment(ref)) return null; + JavaResolveResult[] results = ref.multiResolve(true); String description; if (results.length > 1) { - String t1 = format(results[0].getElement()); - String t2 = format(results[1].getElement()); + String t1 = format(notNull(results[0].getElement())); + String t2 = format(notNull(results[1].getElement())); description = JavaErrorMessages.message("ambiguous.reference", refName.getText(), t1, t2); } else { description = JavaErrorMessages.message("cannot.resolve.symbol", refName.getText()); } - HighlightInfoType type = HighlightInfoType.WRONG_REF; - if (PsiUtil.isInsideJavadocComment(ref)) return null; - - HighlightInfo info = HighlightInfo.newHighlightInfo(type).range(refName).descriptionAndTooltip(description).create(); - + HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.WRONG_REF).range(refName).descriptionAndTooltip(description).create(); UnresolvedReferenceQuickFixProvider.registerReferenceFixes(ref, new QuickFixActionRegistrarImpl(info)); return info; } if (!result.isValidResult() && !PsiUtil.isInsideJavadocComment(ref)) { if (!result.isAccessible()) { - String description = buildProblemWithAccessDescription(ref, result, resolved); - HighlightInfo info = - HighlightInfo.newHighlightInfo(HighlightInfoType.WRONG_REF).range(refName).descriptionAndTooltip(description).create(); + String message = buildProblemWithAccessDescription(ref, result, resolved); + HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.WRONG_REF).range(refName).descriptionAndTooltip(message).create(); if (result.isStaticsScopeCorrect()) { registerAccessQuickFixAction((PsiMember)resolved, ref, info, result.getCurrentFileResolveScope()); if (ref instanceof PsiReferenceExpression) { @@ -2771,18 +2765,19 @@ public class HighlightUtil extends HighlightUtilBase { return info; } } + if ((resolved instanceof PsiLocalVariable || resolved instanceof PsiParameter) && !(resolved instanceof ImplicitVariable)) { - highlightInfo = HighlightControlFlowUtil.checkVariableMustBeFinal((PsiVariable)resolved, ref, languageLevel); + return HighlightControlFlowUtil.checkVariableMustBeFinal((PsiVariable)resolved, ref, languageLevel); } - else if (resolved instanceof PsiClass) { - if (((PsiClass)resolved).getContainingClass() == null && - PsiTreeUtil.getParentOfType(ref, PsiImportStatementBase.class) != null && - PsiUtil.isFromDefaultPackage((PsiClass)resolved)) { - String description = JavaErrorMessages.message("cannot.resolve.symbol", refName.getText()); - return HighlightInfo.newHighlightInfo(HighlightInfoType.WRONG_REF).range(refName).descriptionAndTooltip(description).create(); - } + else if (resolved instanceof PsiClass && + ((PsiClass)resolved).getContainingClass() == null && + PsiTreeUtil.getParentOfType(ref, PsiImportStatementBase.class) != null && + PsiUtil.isFromDefaultPackage((PsiClass)resolved)) { + String description = JavaErrorMessages.message("cannot.resolve.symbol", refName.getText()); + return HighlightInfo.newHighlightInfo(HighlightInfoType.WRONG_REF).range(refName).descriptionAndTooltip(description).create(); } - return highlightInfo; + + return null; } @NotNull diff --git a/java/java-psi-impl/src/messages/JavaErrorMessages.properties b/java/java-psi-impl/src/messages/JavaErrorMessages.properties index d2a9aa701e90..6c82d3436a71 100644 --- a/java/java-psi-impl/src/messages/JavaErrorMessages.properties +++ b/java/java-psi-impl/src/messages/JavaErrorMessages.properties @@ -272,6 +272,7 @@ numeric.overflow.in.expression=Numeric overflow in expression static.member.accessed.via.instance.reference=Static member ''{0}.{1}'' accessed via instance reference unresolved.label=Undefined label: ''{0}'' deprecated.symbol=''{0}'' is deprecated +qualifier.must.be.expression=Qualifier must be an expression cannot.resolve.symbol=Cannot resolve symbol ''{0}'' 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