[clang-tools-extra] r283067 - [clang-rename] Overhaul clang-rename.el.
Kirill Bobyrev via cfe-commits
cfe-commits at lists.llvm.org
Sun Oct 2 07:51:35 PDT 2016
Author: omtcyfz
Date: Sun Oct 2 09:51:33 2016
New Revision: 283067
URL: http://llvm.org/viewvc/llvm-project?rev=283067&view=rev
Log:
[clang-rename] Overhaul clang-rename.el.
* Use lexical binding, as recommended for new libraries.
* Fix customization variable (set correct group and type).
* Create a new customization group for the library.
* Autoload the main clang-rename command so that users don't have to explicitly load the library.
* Correctly translate between file and buffer positions using bufferpos-to-filepos (if available) or a fallback.
* Don't invoke the shell, it's not necessary and adds complexity.
* Save clang-rename output in a buffer and display that on failure.
* Save all buffers before calling clang-rename. This is required anyway and prevents data loss when the buffer is later reverted.
* In revert-buffer, use keywords instead of t for Boolean arguments to improve readability.
* Don't reset buffer modes when reverting.
* Emacs treats the character after a symbol as part of the symbol, while clang-rename doesn't; resolve this inconsistency.
* Formatting.
Patch by Philipp Stephani!
Reviewers: omtcyfz
Differential Revision: https://reviews.llvm.org/D25156
Modified:
clang-tools-extra/trunk/clang-rename/tool/clang-rename.el
Modified: clang-tools-extra/trunk/clang-rename/tool/clang-rename.el
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/tool/clang-rename.el?rev=283067&r1=283066&r2=283067&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-rename/tool/clang-rename.el (original)
+++ clang-tools-extra/trunk/clang-rename/tool/clang-rename.el Sun Oct 2 09:51:33 2016
@@ -1,11 +1,11 @@
-;;; clang-rename.el --- Renames every occurrence of a symbol found at <offset>.
+;;; clang-rename.el --- Renames every occurrence of a symbol found at <offset>. -*- lexical-binding: t; -*-
;; Keywords: tools, c
;;; Commentary:
;; To install clang-rename.el make sure the directory of this file is in your
-;; 'load-path' and add
+;; `load-path' and add
;;
;; (require 'clang-rename)
;;
@@ -13,31 +13,61 @@
;;; Code:
+(defgroup clang-rename nil
+ "Integration with clang-rename"
+ :group 'c)
+
(defcustom clang-rename-binary "clang-rename"
"Path to clang-rename executable."
- :type 'hook
- :options '(turn-on-auto-fill flyspell-mode)
- :group 'wp)
+ :type '(file :must-match t)
+ :group 'clang-rename)
+;;;###autoload
(defun clang-rename (new-name)
- "Rename all instances of the symbol at the point using clang-rename"
+ "Rename all instances of the symbol at point to NEW-NAME using clang-rename."
(interactive "sEnter a new name: ")
- (let (;; Emacs offset is 1-based.
- (offset (- (point) 1))
- (orig-buf (current-buffer))
- (file-name (buffer-file-name)))
-
- (let ((rename-command
- (format "bash -f -c '%s -offset=%s -new-name=%s -i %s'"
- clang-rename-binary offset new-name file-name)))
- (message (format "Running clang-rename command %s" rename-command))
- ;; Run clang-rename via bash.
- (shell-command rename-command)
- ;; Reload buffer.
- (revert-buffer t t)
- )
- )
-)
+ (save-some-buffers :all)
+ ;; clang-rename should not be combined with other operations when undoing.
+ (undo-boundary)
+ (let ((output-buffer (get-buffer-create "*clang-rename*")))
+ (with-current-buffer output-buffer (erase-buffer))
+ (let ((exit-code (call-process
+ clang-rename-binary nil output-buffer nil
+ (format "-offset=%d"
+ ;; clang-rename wants file (byte) offsets, not
+ ;; buffer (character) positions.
+ (clang-rename--bufferpos-to-filepos
+ ;; Emacs treats one character after a symbol as
+ ;; part of the symbol, but clang-rename doesnât.
+ ;; Use the beginning of the current symbol, if
+ ;; available, to resolve the inconsistency.
+ (or (car (bounds-of-thing-at-point 'symbol))
+ (point))
+ 'exact))
+ (format "-new-name=%s" new-name)
+ "-i" (buffer-file-name))))
+ (if (and (integerp exit-code) (zerop exit-code))
+ ;; Success; revert current buffer so it gets the modifications.
+ (progn
+ (kill-buffer output-buffer)
+ (revert-buffer :ignore-auto :noconfirm :preserve-modes))
+ ;; Failure; append exit code to output buffer and display it.
+ (let ((message (format-message
+ "clang-rename failed with %s %s"
+ (if (integerp exit-code) "exit status" "signal")
+ exit-code)))
+ (with-current-buffer output-buffer
+ (insert ?\n message ?\n))
+ (message "%s" message)
+ (display-buffer output-buffer))))))
+
+(defalias 'clang-rename--bufferpos-to-filepos
+ (if (fboundp 'bufferpos-to-filepos)
+ 'bufferpos-to-filepos
+ ;; Emacs 24 doesnât have âbufferpos-to-fileposâ, simulate it using
+ ;; âposition-bytesâ.
+ (lambda (position &optional _quality _coding-system)
+ (1- (position-bytes position)))))
(provide 'clang-rename)
More information about the cfe-commits
mailing list