boolean (@NotNull PsiMethodCallExpression callExpression, @NotNull PsiVariable variable, int stamp, @NotNull Set<MethodSignature> checkedMethods) { final PsiReferenceExpression methodExpression = callExpression.getMethodExpression(); if (expressionAssignsVariable(methodExpression, variable, stamp, checkedMethods)) { return true; } final PsiExpressionList argumentList = callExpression.getArgumentList(); final PsiExpression[] arguments = argumentList.getExpressions(); for (final PsiExpression argument : arguments) { if (expressionAssignsVariable(argument, variable, stamp, checkedMethods)) { return true; } } final PsiMethod method = callExpression.resolveMethod(); if (method == null) { return false; } final MethodSignature methodSignature = method.getSignature(PsiSubstitutor.EMPTY); if (!checkedMethods.add(methodSignature)) { return false; } final PsiClass containingClass = ClassUtils.getContainingClass(callExpression); final PsiClass calledClass = method.getContainingClass(); // Can remark out this block to continue chase outside of of // current class if (calledClass == null || !calledClass.equals(containingClass)) { return false; } if (method.hasModifierProperty(PsiModifier.STATIC) || method.isConstructor() || method.hasModifierProperty(PsiModifier.PRIVATE) || method.hasModifierProperty(PsiModifier.FINAL) || calledClass.hasModifierProperty(PsiModifier.FINAL)) { final PsiCodeBlock body = method.getBody(); return blockAssignsVariable(body, variable, stamp, checkedMethods); } return false; }