X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/4b909bfb2baed9afaf2762b0b13b9490ad4bc246..52e32183d3338334b50da18ad9b450e73ad36564:/company-eclim.el?ds=sidebyside diff --git a/company-eclim.el b/company-eclim.el index eb9518709..d6f699a9d 100644 --- a/company-eclim.el +++ b/company-eclim.el @@ -66,8 +66,8 @@ eclim can only complete correctly when the buffer has been saved." (defvar company-eclim--project-name nil) (make-variable-buffer-local 'company-eclim--project-name) -(defvar company-eclim--doc nil) -(make-variable-buffer-local 'company-eclim--doc) +(declare-function json-read "json") +(defvar json-array-type) (defun company-eclim--call-process (&rest args) (let ((coding-system-for-read 'utf-8) @@ -108,7 +108,7 @@ eclim can only complete correctly when the buffer has been saved." (interactive "d") (let ((project-file (file-relative-name buffer-file-name (company-eclim--project-dir))) - (project-name (company-eclim--project-name))) + completions) (when company-eclim-auto-save (when (buffer-modified-p) (basic-save-buffer)) @@ -116,8 +116,6 @@ eclim can only complete correctly when the buffer has been saved." (company-eclim--call-process "java_src_update" "-p" (company-eclim--project-name) "-f" project-file)) - (setq company-eclim--doc - (make-hash-table :test 'equal)) (dolist (item (cdr (assoc 'completions (company-eclim--call-process "java_complete" "-p" (company-eclim--project-name) @@ -128,11 +126,12 @@ eclim can only complete correctly when the buffer has been saved." "-l" "standard")))) (let* ((meta (cdr (assoc 'info item))) (completion meta)) - (when (string-match " [:-]" completion) + (when (string-match " ?[(:-]" completion) (setq completion (substring completion 0 (match-beginning 0)))) - (puthash completion meta company-eclim--doc)))) - (let ((completion-ignore-case nil)) - (all-completions prefix company-eclim--doc))) + (put-text-property 0 1 'meta meta completion) + (push completion completions))) + (let ((completion-ignore-case nil)) + (all-completions prefix completions)))) (defun company-eclim--search-point (prefix) (if (or (plusp (length prefix)) (eq (char-before) ?.)) @@ -140,20 +139,20 @@ eclim can only complete correctly when the buffer has been saved." (point))) (defun company-eclim--meta (candidate) - (gethash candidate company-eclim--doc)) - -(defun company-eclim--templatify (call) - (let* ((end (point)) - (beg (- (point) (length call))) - (templ (company-template-declare-template beg end))) - (save-excursion - (goto-char beg) - (while (re-search-forward "\\([(,] ?\\)\\([^ ]+ \\)\\([^ ,)]*\\)" end t) - (let ((name (match-string 3))) - (replace-match "\\1" t) - (decf end (length (match-string 2))) - (company-template-add-field templ (point) name)))) - (company-template-move-to-first templ))) + (get-text-property 0 'meta candidate)) + +(defun company-eclim--annotation (candidate) + (let ((meta (company-eclim--meta candidate))) + (when (string-match "\\(([^-]*\\) -" meta) + (substring meta (match-beginning 1) (match-end 1))))) + +(defun company-eclim--prefix () + (let ((prefix (company-grab-symbol))) + (when prefix + ;; Completion candidates for annotations don't include '@'. + (when (eq ?@ (string-to-char prefix)) + (setq prefix (substring prefix 1))) + prefix))) (defun company-eclim (command &optional arg &rest ignored) "`company-mode' completion back-end for Eclim. @@ -171,15 +170,16 @@ Completions only work correctly when the buffer has been saved. company-eclim-executable (company-eclim--project-name) (not (company-in-string-or-comment)) - (or (company-grab-symbol) 'stop))) + (or (company-eclim--prefix) 'stop))) (candidates (company-eclim--candidates arg)) (meta (company-eclim--meta arg)) ;; because "" doesn't return everything (no-cache (equal arg "")) - (crop (when (string-match "(" arg) - (substring arg 0 (match-beginning 0)))) - (post-completion (when (string-match "([^)]" arg) - (company-eclim--templatify arg))))) + (annotation (company-eclim--annotation arg)) + (post-completion (let ((anno (company-eclim--annotation arg))) + (when anno + (insert anno) + (company-template-c-like-templatify anno)))))) (provide 'company-eclim) ;;; company-eclim.el ends here