docs: private MethodCallExpression createMethodCallExpression(PropertyExpression propertyExpression, Expression arguments) {
          MethodCallExpression methodCallExpression =
                  new MethodCallExpression(
                          propertyExpression.getObjectExpression(),
                          propertyExpression.getProperty(),
                          arguments
                  );
  
          methodCallExpression.setImplicitThis(false);
          methodCallExpression.setSafe(propertyExpression.isSafe());
          methodCallExpression.setSpreadSafe(propertyExpression.isSpreadSafe());
  
          // method call obj*.m(): "safe"(false) and "spreadSafe"(true)
          // property access obj*.p: "safe"(true) and "spreadSafe"(true)
          // so we have to reset safe here.
          if (propertyExpression.isSpreadSafe()) {
              methodCallExpression.setSafe(false);
          }
  
          // if the generics types meta data is not empty, it is a generic method call, e.g. obj.<Integer>a(1, 2)
          methodCallExpression.setGenericsTypes(
                  propertyExpression.getNodeMetaData(PATH_EXPRESSION_BASE_EXPR_GENERICS_TYPES));
  
          return methodCallExpression;
      }