Function: majutsu-template--default-defun-body

majutsu-template--default-defun-body is a function defined in majutsu-template.el.

Signature

(majutsu-template--default-defun-body CONTEXT)

Documentation

Return default body forms for a body-less helper using CONTEXT plist.

Source Code

;; Defined in /nix/store/jagqw3nms546pad0gxi5f3wsckk6pji7-emacs-packages-deps/share/emacs/site-lisp/majutsu-template.el
(eval-and-compile
  (defun majutsu-template--default-defun-body (context)
    "Return default body forms for a body-less helper using CONTEXT plist."
    (let* ((template-name (plist-get context :template-name))
           (owner (plist-get context :owner))
           (args (plist-get context :args))
           (return-type (plist-get context :returns))
           (self-arg (and owner (car args)))
           (call-args (if owner (cdr args) args))
           (required (cl-remove-if
                      (lambda (arg)
                        (or (majutsu-template--arg-optional arg)
                            (majutsu-template--arg-rest arg)))
                      call-args))
           (optional (cl-remove-if-not #'majutsu-template--arg-optional call-args))
           (rest-arg (cl-find-if #'majutsu-template--arg-rest call-args))
           (call-args-sym (gensym "majutsu-call-args")))
      (when (and owner (not self-arg))
        (user-error "majutsu-template: owner-bound helper %s must have an implicit self argument"
                    template-name))
      (let ((base (when required
                    `(list ,@(mapcar #'majutsu-template--arg-name required))))
            (optional-forms
             (mapcar
              (lambda (arg)
                (let ((name (majutsu-template--arg-name arg)))
                  `(when ,name
                     (setq ,call-args-sym (append ,call-args-sym (list ,name))))))
              optional))
            (rest-form
             (when rest-arg
               (let ((name (majutsu-template--arg-name rest-arg)))
                 `(when ,name
                    (setq ,call-args-sym (append ,call-args-sym ,name)))))))
        (list
         `(let ((,call-args-sym ,base))
            ,@optional-forms
            ,@(when rest-form (list rest-form))
            ,(if owner
                 `(apply #'majutsu-template-method
                   ,(majutsu-template--arg-name self-arg)
                   ',(intern (concat ":" template-name))
                   ,call-args-sym)
               `(majutsu-template--call-node ,template-name
                 ,call-args-sym
                 ',return-type))))))))