branch: externals/phpinspect commit b573369fe58f0248bb71c8d6666ae71661777c2c Author: Hugo Thunnissen <de...@hugot.nl> Commit: Hugo Thunnissen <de...@hugot.nl>
Add interactive function to insert a type name and auto-import it --- phpinspect-autoload.el | 3 +++ phpinspect-imports.el | 17 +++++++++++++++++ phpinspect-project.el | 21 +++++++++++++++++++++ phpinspect-type.el | 3 +++ 4 files changed, 44 insertions(+) diff --git a/phpinspect-autoload.el b/phpinspect-autoload.el index ef00061197..78adb664ab 100644 --- a/phpinspect-autoload.el +++ b/phpinspect-autoload.el @@ -202,6 +202,9 @@ the vendor directory." (push type-fqn bag) (puthash type-name bag (phpinspect-autoloader-type-name-fqn-bags al))))) +(defun phpinspect-autoloader-get-type-names (al) + (hash-table-keys (phpinspect-autoloader-type-name-fqn-bags al))) + (cl-defmethod phpinspect-autoloader-get-type-bag ((al phpinspect-autoloader) (type-name (head phpinspect-name))) (gethash type-name (phpinspect-autoloader-type-name-fqn-bags al))) diff --git a/phpinspect-imports.el b/phpinspect-imports.el index db34b4d2ed..9e2505f025 100644 --- a/phpinspect-imports.el +++ b/phpinspect-imports.el @@ -398,4 +398,21 @@ that there are import (\"use\") statements for them." (phpinspect-format-use-statements buffer (phpinspect-find-first-use parent)) (phpinspect-buffer-parse buffer 'no-interrupt))))))) +(defun phpinspect-insert-type (type-name) + "Insert TYPE-NAME as string into current buffer. + +This function adds a use statement for TYPE-NAME when none is found." + (interactive (list (phpinspect-project-read-type-name "Select a Type: "))) + (if phpinspect-current-buffer + (let* ((rctx (phpinspect-buffer-get-resolvecontext + phpinspect-current-buffer (point))) + (type-resolver (phpinspect--make-type-resolver-for-resolvecontext rctx))) + (unless (phpinspect-type-resolver-get-import type-resolver type-name) + (phpinspect-add-use-interactive + type-name phpinspect-current-buffer + (phpinspect-buffer-project phpinspect-current-buffer) + (phpinspect-buffer-namespace-at-point phpinspect-current-buffer (point)))) + (insert (phpinspect-name-string type-name))) + (phpinspect-message "Not a phpinspect buffer"))) + (provide 'phpinspect-imports) diff --git a/phpinspect-project.el b/phpinspect-project.el index 32f05609e3..79ba9909ba 100644 --- a/phpinspect-project.el +++ b/phpinspect-project.el @@ -358,6 +358,27 @@ before the search is executed." (or (phpinspect-project-get-typedef-or-extra project type) (phpinspect-project-get-typedef-create project type)))) +(defvar phpinspect--project-type-name-history nil + "History list to use for `phpinspect-project-read-type-name'") + +(defun phpinspect-project-read-type-name (prompt &optional project) + "Read a non-fully-qualified type-name using `completing-read'. + +PROMPT is passed to `completing-read'. + +PROJECT, if provided should be an instance of +`phpinspect-project'. If PROJECT is nil, the active project is +determined using `phpinspect-current-project'." + (unless project (setq project (phpinspect-current-project))) + + (phpinspect-intern-name + (completing-read + prompt + (phpinspect-names-to-alist + (phpinspect-autoloader-get-type-names + (phpinspect-project-autoload project))) + nil 'require-match nil 'phpinspect--project-type-name-history))) + ;;; INDEX TASK (cl-defstruct (phpinspect-index-task (:constructor phpinspect-make-index-task-generated)) diff --git a/phpinspect-type.el b/phpinspect-type.el index bf5af9b61b..a164ed0c51 100644 --- a/phpinspect-type.el +++ b/phpinspect-type.el @@ -222,6 +222,9 @@ NAMESPACE may be nil, or a string with a namespace FQN." (types :mutable nil :type list) (namespace :mutable nil :type string)) +(defun phpinspect-type-resolver-get-import (resolver name) + (assoc-default name (phpinspect-type-resolver--types resolver) #'eq nil)) + (defun phpinspect--make-type-resolver (types &optional token-tree namespace) "Little wrapper closure to pass around and resolve types with." (let* ((inside-class