JavaResolveResult (@NotNull PsiJavaCodeReferenceElement ref) { JavaResolveResult result = resolveOptimised(ref, myFile); if (result == null) return null; PsiElement resolved = result.getElement(); PsiElement parent = ref.getParent(); if (myRefCountHolder != null) { myRefCountHolder.registerReference(ref, result); } add(HighlightUtil.checkReference(ref, result, myFile, myLanguageLevel)); if (parent instanceof PsiJavaCodeReferenceElement || ref.isQualified()) { if (!hasErrorResults() && resolved instanceof PsiTypeParameter) { boolean canSelectFromTypeParameter = myJavaSdkVersion.isAtLeast(JavaSdkVersion.JDK_1_7); if (canSelectFromTypeParameter) { PsiClass containingClass = PsiTreeUtil.getParentOfType(ref, PsiClass.class); if (containingClass != null) { if (PsiTreeUtil.isAncestor(containingClass.getExtendsList(), ref, false) || PsiTreeUtil.isAncestor(containingClass.getImplementsList(), ref, false)) { canSelectFromTypeParameter = false; } } } if (!canSelectFromTypeParameter) { add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip( JavaErrorBundle.message("cannot.select.from.a.type.parameter")).range(ref)); } } } if (!hasErrorResults()) add(HighlightClassUtil.checkAbstractInstantiation(ref)); if (!hasErrorResults()) add(HighlightClassUtil.checkExtendsDuplicate(ref, resolved, myFile)); if (!hasErrorResults()) add(HighlightClassUtil.checkClassExtendsForeignInnerClass(ref, resolved)); if (!hasErrorResults()) add(GenericsHighlightUtil.checkSelectStaticClassFromParameterizedType(resolved, ref)); if (!hasErrorResults()) { add(GenericsHighlightUtil.checkParameterizedReferenceTypeArguments(resolved, ref, result.getSubstitutor(), myJavaSdkVersion)); } if (resolved != null && parent instanceof PsiReferenceList) { if (!hasErrorResults()) { PsiReferenceList referenceList = (PsiReferenceList)parent; add(HighlightUtil.checkElementInReferenceList(ref, referenceList, result)); } } if (parent instanceof PsiAnonymousClass && ref.equals(((PsiAnonymousClass)parent).getBaseClassReference())) { if (myOverrideEquivalentMethodsVisitedClasses.add((PsiClass)parent)) { PsiClass aClass = (PsiClass)parent; GenericsHighlightUtil.checkOverrideEquivalentMethods(aClass, false, myErrorSink); } if (!hasErrorResults()) add(GenericsHighlightUtil.checkGenericCannotExtendException((PsiAnonymousClass)parent)); } if (parent instanceof PsiNewExpression newExpression && !(resolved instanceof PsiClass) && resolved instanceof PsiNamedElement && newExpression.getClassOrAnonymousClassReference() == ref) { String text = JavaErrorBundle.message("cannot.resolve.symbol", ((PsiNamedElement)resolved).getName()); HighlightInfo.Builder info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(ref).descriptionAndTooltip(text); if (HighlightUtil.isCallToStaticMember(newExpression)) { var action = new RemoveNewKeywordFix(newExpression); info.registerFix(action, null, null, null, null); } add(info); } if (!hasErrorResults() && resolved instanceof PsiClass) { PsiClass aClass = ((PsiClass)resolved).getContainingClass(); if (aClass != null) { PsiElement qualifier = ref.getQualifier(); PsiElement place; if (qualifier instanceof PsiJavaCodeReferenceElement) { place = ((PsiJavaCodeReferenceElement)qualifier).resolve(); } else { if (parent instanceof PsiNewExpression) { PsiExpression newQualifier = ((PsiNewExpression)parent).getQualifier(); place = newQualifier == null ? ref : PsiUtil.resolveClassInType(newQualifier.getType()); } else { place = ref; } } if (place != null && PsiTreeUtil.isAncestor(aClass, place, false) && aClass.hasTypeParameters() && !PsiUtil.isInsideJavadocComment(place)) { add(HighlightClassUtil.checkCreateInnerClassFromStaticContext(ref, place, (PsiClass)resolved)); } } else if (resolved instanceof PsiTypeParameter) { PsiTypeParameterListOwner owner = ((PsiTypeParameter)resolved).getOwner(); if (owner instanceof PsiClass outerClass) { if (!InheritanceUtil.hasEnclosingInstanceInScope(outerClass, ref, false, false)) { add(HighlightClassUtil.checkIllegalEnclosingUsage(ref, null, outerClass, ref)); } } else if (owner instanceof PsiMethod) { PsiClass cls = ClassUtils.getContainingStaticClass(ref); if (cls != null && PsiTreeUtil.isAncestor(owner, cls, true)) { String description = JavaErrorBundle.message("cannot.be.referenced.from.static.context", ref.getReferenceName()); add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(ref).descriptionAndTooltip(description)); } } } } if (!hasErrorResults()) { add(HighlightUtil.checkPackageAndClassConflict(ref, myFile)); } if (!hasErrorResults() && resolved instanceof PsiClass) { add(HighlightUtil.checkRestrictedIdentifierReference(ref, (PsiClass)resolved, myLanguageLevel)); } if (!hasErrorResults()) { add(HighlightUtil.checkMemberReferencedBeforeConstructorCalled(ref, resolved, myFile, myInsideConstructorOfClass)); } return result; }