Let's say that I have an Erlang function, with spec.
-spec foo(integer(), string()) ->
boolean().
foo(_Integer, _String) ->
true.
My dream would be to generate the edoc from this information within Emacs automatically. The generated code should look like:
%%--------------------------------------------------------------------
%% @doc
%% Your description goes here
%% @spec foo(_Integer::integer(), _String::string()) ->
%%% boolean()
%% @end
%%--------------------------------------------------------------------
-spec foo(integer(), string()) ->
boolean().
foo(_Integer, _String) ->
true.
Does a similar feature already exist?
I don't know Erlang, but this might get you started:
EDIT: Closer, but will only work if args are on the same line :(
EDIT: Seems to work for args on separate lines now
(defun my-erlang-insert-edoc ()
"Insert edoc."
(interactive)
(save-excursion
(when (re-search-forward "^\\s *-spec\\s +\\([a-zA-Z0-9_]+\\)\\s *(\\(\\(.\\|\n\\)*?\\))\\s *->[ \t\n]*\\(.+?\\)\\." nil t)
(let* ((beg (match-beginning 0))
(funcname (match-string-no-properties 1))
(arg-string (match-string-no-properties 2))
(retval (match-string-no-properties 4))
(args (split-string arg-string "[ \t\n,]" t)))
(when (re-search-forward (concat "^\\s *" funcname "\\s *(\\(\\(.\\|\n\\)*?\\))\\s *->") nil t)
(let ((arg-types (split-string (match-string-no-properties 1) "[ \t\n,]" t)))
(goto-char beg)
(insert "%%-----------------------------------------------------------------------------\n")
(insert "%% @doc\n")
(insert "%% Your description goes here\n")
(insert "%% @spec " funcname "(")
(dolist (arg args)
(insert (car arg-types) "::" arg)
(setq arg-types (cdr arg-types))
(when arg-types
(insert ", ")))
(insert ") ->\n")
(insert "%% " retval "\n")
(insert "%% @end\n")
(insert "%%-----------------------------------------------------------------------------\n")))))))