void (PsiElement ref) { if (ref instanceof PsiReferenceExpression) { final PsiElement parent = ref.getParent(); if (parent instanceof PsiReferenceExpression) { PsiElement refMember = ((PsiReferenceExpression)parent).resolve(); if (!isInSuper(refMember)) { markNode(ref); } } return; } PsiElement parent = ref.getParent(); if (parent instanceof PsiTypeElement typeElement) { PsiElement pparent = parent.getParent(); while (pparent instanceof PsiTypeElement) { addLink(pparent, parent); addLink(parent, pparent); parent = pparent; pparent = parent.getParent(); } addLink(typeElement, ref); addLink(ref, typeElement); if (pparent instanceof PsiVariable) { processVariableType((PsiVariable)pparent); } else if (pparent instanceof PsiMethod) { processMethodReturnType((PsiMethod)pparent); } else if (pparent instanceof PsiTypeCastExpression) { addLink(pparent, typeElement); addLink(typeElement, pparent); } else if (pparent instanceof PsiReferenceParameterList refParameterList) { final PsiElement ppparent = pparent.getParent(); if (ppparent instanceof PsiJavaCodeReferenceElement classReference) { if (classReference.getParent() instanceof PsiReferenceList) { final PsiReferenceList referenceList = ((PsiReferenceList)ppparent.getParent()); final PsiClass parentClass = PsiTreeUtil.getParentOfType(ref, PsiClass.class); if (parentClass != null && !parentClass.equals(myClass)) { if (referenceList.equals(parentClass.getExtendsList()) || referenceList.equals(parentClass.getImplementsList())) { final PsiTypeElement[] typeParameterElements = refParameterList.getTypeParameterElements(); for (int i = 0; i < typeParameterElements.length; i++) { if (typeParameterElements[i] == typeElement) { final PsiElement resolved = classReference.resolve(); if (resolved instanceof PsiClass) { final PsiTypeParameter[] typeParameters = ((PsiClass)resolved).getTypeParameters(); if (typeParameters.length > i) { linkTypeParameterInstantiations(typeParameters[i], typeElement, parentClass); return; } } } } } } } else if (classReference.getParent() instanceof PsiTypeElement) { processUsage(classReference); return; } else if (classReference.getParent() instanceof PsiNewExpression) { final PsiVariable variable = PsiTreeUtil.getParentOfType(classReference, PsiVariable.class); if (variable != null) { processUsage(variable); return; } } else if (classReference.getParent() instanceof PsiAnonymousClass) { processUsage(classReference); return; } } markNode(ref); //??? } } else if (parent instanceof PsiNewExpression newExpression) { if (newExpression.getType() instanceof PsiArrayType) { addLink(newExpression, ref); addLink(ref, newExpression); PsiArrayInitializerExpression initializer = newExpression.getArrayInitializer(); if (initializer != null) { addLink(ref, initializer); } checkToArray(ref, newExpression); } else { markNode(ref); } } else if (parent instanceof PsiJavaCodeReferenceElement && ref.equals(((PsiJavaCodeReferenceElement)parent).getQualifier())) { final PsiElement resolved = ((PsiJavaCodeReferenceElement)parent).resolve(); if (resolved == null || !isInSuper(resolved)) { markNode(ref); } } else { markNode(ref); } }