private static @InspectionMessage String getSuspiciousMethodCallMessage(PsiMethodCallExpression methodCall,
                                                                          boolean reportConvertibleMethodCalls,
                                                                          List<SuspiciousMethodCallUtil.PatternMethod> patternMethods,
                                                                          PsiExpression arg,
                                                                          int i) {
    PsiType argType = arg.getType();
    boolean exactType = arg instanceof PsiNewExpression;
    final String plainMessage = SuspiciousMethodCallUtil
      .getSuspiciousMethodCallMessage(methodCall, arg, argType, exactType || reportConvertibleMethodCalls, patternMethods, i);
    if (plainMessage != null && !exactType) {
      String methodName = methodCall.getMethodExpression().getReferenceName();
      if (SuspiciousMethodCallUtil.isCollectionAcceptingMethod(methodName)) {
        // DFA works on raw types, so anyway we cannot narrow the argument type
        return plainMessage;
      }
      TypeConstraint constraint = TypeConstraint.fromDfType(CommonDataflow.getDfType(arg));
      PsiType type = constraint.getPsiType(methodCall.getProject());
      if (type != null && SuspiciousMethodCallUtil.getSuspiciousMethodCallMessage(methodCall, arg, type, reportConvertibleMethodCalls, patternMethods, i) == null) {
        return null;
      }
    }

    return plainMessage;
  }
private static @InspectionMessage String getSuspiciousMethodCallMessage(PsiMethodCallExpression methodCall,
                                                                          boolean reportConvertibleMethodCalls,
                                                                          List<SuspiciousMethodCallUtil.PatternMethod> patternMethods,
                                                                          PsiExpression arg,
                                                                          int i)