Slava Pestov 2009-04-04 16:28:23 -05:00
commit 635d4c1ea0
1 changed files with 31 additions and 24 deletions

View File

@ -36,7 +36,7 @@
(let ((name (match-string-no-properties 2)) (let ((name (match-string-no-properties 2))
(body (match-string-no-properties 4)) (body (match-string-no-properties 4))
(end (match-end 0))) (end (match-end 0)))
(list (split-string body nil t) name pos end))))) (list (split-string (or body "") nil t) name pos end)))))
(defun fuel-refactor--find (code to) (defun fuel-refactor--find (code to)
(let ((candidate) (result)) (let ((candidate) (result))
@ -88,7 +88,7 @@
(defun fuel-refactor--insert-word (word stack-effect code) (defun fuel-refactor--insert-word (word stack-effect code)
(let ((start (goto-char (fuel-refactor--insertion-point)))) (let ((start (goto-char (fuel-refactor--insertion-point))))
(open-line 1) (open-line 1)
(insert ": " word " " stack-effect "\n" code " ;\n") (insert ": " word " " stack-effect "\n" (or code " ") " ;\n")
(indent-region start (point)) (indent-region start (point))
(move-overlay fuel-stack--overlay start (point)))) (move-overlay fuel-stack--overlay start (point))))
@ -103,39 +103,46 @@
(delete-overlay fuel-stack--overlay))) (delete-overlay fuel-stack--overlay)))
(defun fuel-refactor--extract (begin end) (defun fuel-refactor--extract (begin end)
(unless (< begin end) (error "No proper region to extract")) (let* ((rp (< begin end))
(let* ((code (buffer-substring begin end)) (code (and rp (buffer-substring begin end)))
(existing (fuel-refactor--reuse-existing code)) (existing (and code (fuel-refactor--reuse-existing code)))
(code-str (or existing (fuel--region-to-string begin end))) (code-str (and code (or existing (fuel--region-to-string begin end))))
(word (or (car existing) (read-string "New word name: "))) (word (or (car existing) (read-string "New word name: ")))
(stack-effect (or existing (stack-effect (or existing
(fuel-stack--infer-effect code-str) (and code-str (fuel-stack--infer-effect code-str))
(read-string "Stack effect: ")))) (read-string "Stack effect: "))))
(goto-char begin) (when rp
(delete-region begin end) (goto-char begin)
(insert word) (delete-region begin end)
(indent-region begin (point)) (insert word)
(indent-region begin (point)))
(save-excursion (save-excursion
(let ((start (or (cadr existing) (point)))) (let ((start (or (cadr existing) (point))))
(unless existing (unless existing
(fuel-refactor--insert-word word stack-effect code)) (fuel-refactor--insert-word word stack-effect code))
(fuel-refactor--extract-other start (if rp
(or (car (cddr existing)) (point)) (fuel-refactor--extract-other start
code))))) (or (car (cddr existing)) (point))
code)
(unwind-protect
(sit-for fuel-stack-highlight-period)
(delete-overlay fuel-stack--overlay)))))))
(defun fuel-refactor-extract-region (begin end) (defun fuel-refactor-extract-region (begin end)
"Extracts current region as a separate word." "Extracts current region as a separate word."
(interactive "r") (interactive "r")
(let ((begin (save-excursion (if (= begin end)
(goto-char begin) (fuel-refactor--extract begin end)
(when (zerop (skip-syntax-backward "w")) (let ((begin (save-excursion
(skip-syntax-forward "-")) (goto-char begin)
(point))) (when (zerop (skip-syntax-backward "w"))
(end (save-excursion (skip-syntax-forward "-"))
(goto-char end) (point)))
(skip-syntax-forward "w") (end (save-excursion
(point)))) (goto-char end)
(fuel-refactor--extract begin end))) (skip-syntax-forward "w")
(point))))
(fuel-refactor--extract begin end))))
(defun fuel-refactor-extract-sexp () (defun fuel-refactor-extract-sexp ()
"Extracts current innermost sexp (up to point) as a separate "Extracts current innermost sexp (up to point) as a separate