@Override
    public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call) {
      super.visitMethodCallExpression(call);
      if (!HASH_TABLE_CALLS.test(call)) return;
      final PsiExpression qualifier = call.getMethodExpression().getQualifierExpression();
      if (qualifier == null) return;
      if (!TypeUtils.expressionHasTypeOrSubtype(qualifier, CommonClassNames.JAVA_UTIL_PROPERTIES)) return;
      if ("putAll".equals(call.getMethodExpression().getReferenceName())) {
        PsiExpression[] args = call.getArgumentList().getExpressions();
        // putAll with properties or Map<String, String> argument is probably safe,
        // assuming that the original Properties or Map<String, String> object was safely filled
        if (args.length == 1) {
          PsiType type = args[0].getType();
          if (TypeUtils.typeEquals(CommonClassNames.JAVA_UTIL_PROPERTIES, type) ||
            TypeUtils.isJavaLangString(PsiUtil.substituteTypeParameter(type, CommonClassNames.JAVA_UTIL_MAP, 0, true)) &&
            TypeUtils.isJavaLangString(PsiUtil.substituteTypeParameter(type, CommonClassNames.JAVA_UTIL_MAP, 1, true))) {
            return;
          }
        }
      }
      registerMethodCallError(call, call);
    }
@Override
    public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call)