boolean (@NotNull List<? super PsiVariable> array, @NotNull PsiElement scope, @NotNull PsiElement member, @NotNull PsiElement targetClassMember) { if (scope instanceof PsiMethodCallExpression) { final PsiMethodCallExpression call = (PsiMethodCallExpression)scope; if (!checkReferenceExpressionScope(call.getMethodExpression(), targetClassMember)) { return false; } } else if (scope instanceof PsiReferenceExpression) { if (!checkReferenceExpressionScope((PsiReferenceExpression)scope, targetClassMember)) { return false; } } if (scope instanceof PsiJavaCodeReferenceElement) { final PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement)scope; final JavaResolveResult result = ref.advancedResolve(false); final PsiElement refElement = result.getElement(); if (refElement != null) { PsiElement parent = refElement.getParent(); parent = parent != null ? PsiTreeUtil.findCommonParent(parent, member) : null; if (parent == null) { parent = result.getCurrentFileResolveScope(); } if (parent != null && !member.equals(parent)) { // not local in member parent = PsiTreeUtil.findCommonParent(parent, targetClassMember); if (targetClassMember.equals(parent)) { //something in anonymous class if (refElement instanceof PsiVariable) { if (scope instanceof PsiReferenceExpression && PsiUtil.isAccessedForWriting((PsiReferenceExpression)scope)) { return false; } PsiVariable variable = (PsiVariable)refElement; if (!array.contains(variable)) { array.add(variable); } } else { return false; } } } } } else if (scope instanceof PsiThisExpression) { PsiJavaCodeReferenceElement qualifier = ((PsiThisExpression)scope).getQualifier(); if (qualifier == null) { return false; } } else if (scope instanceof PsiSuperExpression) { if (((PsiSuperExpression)scope).getQualifier() == null) { return false; } } for (PsiElement child = scope.getFirstChild(); child != null; child = child.getNextSibling()) { if (!collectOuterLocals(array, child, member, targetClassMember)) return false; } return true; }