void (PsiTypeParameterListOwner originalMember, ArrayList<? super InternalUsageInfo> classRefs, PsiClass containingClass, PsiElement element, boolean includeSelf) { if (element instanceof PsiReferenceExpression ref) { // resolving only "naked" fields and methods if (!ref.isQualified() && ref.resolve() instanceof PsiMember member && !member.hasModifierProperty(PsiModifier.STATIC)) { if (originalMember.getManager().areElementsEquivalent(member, originalMember)) { if (includeSelf) { classRefs.add(new SelfUsageInfo(element, originalMember)); } } else { final PsiClass memberContainingClass = member.getContainingClass(); if (!(originalMember instanceof PsiClass) || !isPartOf(memberContainingClass, (PsiClass)originalMember)) { if (isPartOf(memberContainingClass, containingClass)) { classRefs.add(new InternalUsageInfo(element, member)); } } } } } else if (element instanceof PsiThisExpression && !(element.getParent() instanceof PsiReceiverParameter)) { PsiJavaCodeReferenceElement qualifier = ((PsiThisExpression) element).getQualifier(); PsiElement refElement = qualifier != null ? qualifier.resolve() : PsiTreeUtil.getParentOfType(element, PsiClass.class); if (refElement instanceof PsiClass && !refElement.equals(originalMember) && isPartOf((PsiClass)refElement, containingClass)) { final PsiElement parent = element.getParent(); if (parent instanceof PsiReferenceExpression && ((PsiReferenceExpression)parent).isReferenceTo(originalMember)) { if (includeSelf) { classRefs.add(new SelfUsageInfo(parent, originalMember)); } } else { classRefs.add(new InternalUsageInfo(element, refElement)); } } } else if (element instanceof PsiSuperExpression) { PsiJavaCodeReferenceElement qualifier = ((PsiSuperExpression) element).getQualifier(); PsiElement refElement = qualifier != null ? qualifier.resolve() : PsiTreeUtil.getParentOfType(element, PsiClass.class); if (refElement instanceof PsiClass) { if (isPartOf((PsiClass) refElement, containingClass)) { if (!(originalMember instanceof PsiClass && isPartOf((PsiClass)refElement, (PsiClass)originalMember))) { classRefs.add(new InternalUsageInfo(element, refElement)); } } } } else if (element instanceof PsiNewExpression) { PsiJavaCodeReferenceElement classReference = ((PsiNewExpression) element).getClassReference(); if (classReference != null) { PsiElement refElement = classReference.resolve(); if (refElement instanceof PsiClass) { PsiClass hisClass = ((PsiClass) refElement).getContainingClass(); if (hisClass != originalMember && isPartOf(hisClass, containingClass) && !((PsiClass)refElement).hasModifierProperty(PsiModifier.STATIC)) { classRefs.add(new InternalUsageInfo(element, refElement)); } } } } PsiElement[] children = element.getChildren(); for (PsiElement child : children) { addClassRefs(originalMember, classRefs, containingClass, child, includeSelf); } }