[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phpinspect b573369fe5 1/2: Add interactive function to
From: |
ELPA Syncer |
Subject: |
[elpa] externals/phpinspect b573369fe5 1/2: Add interactive function to insert a type name and auto-import it |
Date: |
Tue, 10 Sep 2024 18:58:47 -0400 (EDT) |
branch: externals/phpinspect
commit b573369fe58f0248bb71c8d6666ae71661777c2c
Author: Hugo Thunnissen <devel@hugot.nl>
Commit: Hugo Thunnissen <devel@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