0)))
(defun company-clang-objc-templatify (selector)
- (let* ((end (point))
+ (let* ((end (point-marker))
(beg (- (point) (length selector)))
(templ (company-template-declare-template beg end))
(cnt 0))
(save-excursion
(goto-char beg)
- (while (search-forward ":" end t)
- (let* ((name (format "arg%d" cnt))
- (len (length name)))
- (incf end len)
- (let ((pt (point)))
- (insert name)
- (company-template-add-field templ pt (point)))
- (when (< (point) end)
- (insert " ")
- (incf end))
+ (catch 'stop
+ (while (search-forward ":" end t)
+ (company-template-add-field templ (point) (format "arg%d" cnt))
+ (if (< (point) end)
+ (insert " ")
+ (throw 'stop t))
(incf cnt))))
(company-template-move-to-first templ)))
(setq minimum pos)))
(push-mark)
(goto-char minimum)
- (let ((field (loop for ovl in (overlays-at start)
- when (overlay-get ovl 'company-template-parent)
- return ovl)))
- (company-template-remove-field field))))
+ (company-template-remove-field (company-template-field-at start))))
+
+(defun company-template-field-at (&optional point)
+ (loop for ovl in (overlays-at (or point (point)))
+ when (overlay-get ovl 'company-template-parent)
+ return ovl))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(delq templ company-template--buffer-templates))
(delete-overlay templ))
-(defun company-template-add-field (templ beg end)
- "Add a field to template TEMPL, from BEG to END."
+(defun company-template-add-field (templ pos text &optional display)
+ "Add new field to template TEMPL at POS, inserting TEXT.
+When DISPLAY is non-nil, set the respective property on the overlay.
+Leave point at the end of the field."
(assert templ)
- (save-excursion
- (when (> end (overlay-end templ))
- (move-overlay templ (overlay-start templ) end))
- (let ((ov (make-overlay beg end))
- (siblings (overlay-get templ 'company-template-fields)))
- ;; (overlay-put ov 'evaporate t)
- (overlay-put ov 'intangible t)
- (overlay-put ov 'face 'company-template-field)
- (overlay-put ov 'company-template-parent templ)
- (overlay-put ov 'insert-in-front-hooks '(company-template-insert-hook))
- (push ov siblings)
- (overlay-put templ 'company-template-fields siblings))))
+ (goto-char pos)
+ (insert text)
+ (when (> (point) (overlay-end templ))
+ (move-overlay templ (overlay-start templ) (point)))
+ (let ((ov (make-overlay pos (+ pos (length text))))
+ (siblings (overlay-get templ 'company-template-fields)))
+ ;; (overlay-put ov 'evaporate t)
+ (overlay-put ov 'intangible t)
+ (overlay-put ov 'face 'company-template-field)
+ (when display
+ (overlay-put ov 'display display))
+ (overlay-put ov 'company-template-parent templ)
+ (overlay-put ov 'insert-in-front-hooks '(company-template-insert-hook))
+ (push ov siblings)
+ (overlay-put templ 'company-template-fields siblings)))
(defun company-template-remove-field (ovl &optional clear)
(when (overlayp ovl)
;; common ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun company-template-c-like-templatify (call)
- (let* ((end (point))
- (beg (- (point) (length call))))
+ (let* ((end (point-marker))
+ (beg (- (point) (length call)))
+ (cnt 0))
(goto-char beg)
(when (search-forward "(" end 'move)
(if (eq (char-after) ?\))
(forward-char 1)
(let ((templ (company-template-declare-template beg end)))
(while (re-search-forward (concat " *\\([^,)]*\\)[,)]") end t)
- (company-template-add-field templ
- (match-beginning 1)
- (match-end 1)))
+ (let ((sig (match-string 1)))
+ (delete-region (match-beginning 1) (match-end 1))
+ (save-excursion
+ (company-template-add-field templ (match-beginning 1)
+ (format "arg%d" cnt) sig))
+ (incf cnt)))
(company-template-move-to-first templ))))))
(provide 'company-template)
(require 'company)
(require 'company-keywords)
+;;; Core
+
(ert-deftest company-sorted-keywords ()
"Test that keywords in `company-keywords-alist' are in alphabetical order."
(dolist (pair company-keywords-alist)
(company-call 'open-line 1)
(should (eq 2 (overlay-start company-pseudo-tooltip-overlay)))))))
+;;; Template
+
(ert-deftest company-template-removed-after-the-last-jump ()
(with-temp-buffer
- (insert "{ foo foo }")
+ (insert "{ }")
(goto-char 2)
(let ((tpl (company-template-declare-template (point) (1- (point-max)))))
(save-excursion
(dotimes (i 2)
- (search-forward "foo")
- (company-template-add-field tpl (match-beginning 0) (match-end 0))))
+ (insert " ")
+ (company-template-add-field tpl (point) "foo")))
(company-call 'template-forward-field)
(should (= 3 (point)))
(company-call 'template-forward-field)
(ert-deftest company-template-removed-after-input-and-jump ()
(with-temp-buffer
- (insert "{ bar }")
+ (insert "{ }")
(goto-char 2)
(let ((tpl (company-template-declare-template (point) (1- (point-max)))))
- (company-template-add-field tpl 3 6)
+ (save-excursion
+ (insert " ")
+ (company-template-add-field tpl (point) "bar"))
(company-call 'template-move-to-first tpl)
(should (= 3 (point)))
(dolist (c (string-to-list "tee"))
(let ((this-command command))
(run-hooks 'post-command-hook))))
+(ert-deftest company-template-c-like-templatify ()
+ (with-temp-buffer
+ (let ((text "foo(int a, short b)"))
+ (insert text)
+ (company-template-c-like-templatify text)
+ (should (equal "foo(arg0, arg1)" (buffer-string)))
+ (should (looking-at "arg0"))
+ (should (equal "int a"
+ (overlay-get (company-template-field-at) 'display))))))
+
+;;; Elisp
+
(defmacro company-elisp-with-buffer (contents &rest body)
(declare (indent 0))
`(with-temp-buffer
(company-elisp-with-buffer
"(defun foob ()|)"
(should (equal "" (company-elisp 'prefix)))))
+
+;;; Clang
+
+(ert-deftest company-clang-objc-templatify ()
+ (with-temp-buffer
+ (let ((text "createBookWithTitle:andAuthor:"))
+ (insert text)
+ (company-clang-objc-templatify text)
+ (should (equal "createBookWithTitle:arg0 andAuthor:arg1" (buffer-string)))
+ (should (looking-at "arg0"))
+ (should (null (overlay-get (company-template-field-at) 'display))))))