boolean (final PsiReferenceExpression refExpression) { final JavaResolveResult resolveResult = refExpression.advancedResolve(false); PsiElement oldMember = resolveResult.getElement(); if (oldMember == null) return false; try { PsiElement parent = PsiUtil.skipParenthesizedExprUp(refExpression.getParent()); if (parent instanceof PsiMethodCallExpression) {//check for virtual call PsiMethod targetMethod = (PsiMethod)oldMember; if (targetMethod.hasModifierProperty(PsiModifier.STATIC)) { return false; } PsiMethodCallExpression newCall = (PsiMethodCallExpression)copyCallExpression(((PsiMethodCallExpression)parent), PsiTypesUtil.getExpectedTypeByParent(parent)); if (newCall == null) return false; PsiExpression newQualifier = deparenthesizeExpression(newCall.getMethodExpression().getQualifierExpression()); LOG.assertTrue(newQualifier != null); PsiElement oldReference = newQualifier.getCopyableUserData(RecaptureTypeMapper.SELF_REFERENCE); PsiElement replace = newQualifier.replace(getInnerMostOperand(newQualifier)); replace.putCopyableUserData(RecaptureTypeMapper.SELF_REFERENCE, oldReference); final JavaResolveResult newResult = newCall.getMethodExpression().advancedResolve(false); if (!newResult.isValidResult()) return false; final PsiMethod newTargetMethod = (PsiMethod)newResult.getElement(); LOG.assertTrue(newTargetMethod != null, "isValidResult() check above should find this"); PsiType newReturnType = newCall.getType(); PsiType oldReturnType = ((PsiMethodCallExpression)parent).getType(); if (Comparing.equal(newReturnType == null ? null : new RecaptureTypeMapper().mapType(newReturnType), oldReturnType) && (Comparing.equal(newTargetMethod, targetMethod) || !(newTargetMethod.isDeprecated() && !targetMethod.isDeprecated()) && MethodSignatureUtil.isSuperMethod(newTargetMethod, targetMethod) && // see SCR11555, SCR14559 areThrownExceptionsCompatible(targetMethod, newTargetMethod) && areNullabilityCompatible(targetMethod, newTargetMethod))) { return true; } return false; } else { final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(refExpression.getProject()); final PsiReferenceExpression newExpression = (PsiReferenceExpression)elementFactory.createExpressionFromText(refExpression.getText(), refExpression); final PsiExpression newQualifier = newExpression.getQualifierExpression(); LOG.assertTrue(newQualifier != null); newQualifier.replace(getInnerMostOperand(newQualifier)); JavaResolveResult newResult = newExpression.advancedResolve(false); if (!newResult.isValidResult()) return false; return oldMember.equals(newResult.getElement()); } } catch (IncorrectOperationException ignore) { return false; } }