[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phpinspect 8296641ba9 07/18: Implement removal of unuse
From: |
ELPA Syncer |
Subject: |
[elpa] externals/phpinspect 8296641ba9 07/18: Implement removal of unused imports in `phpinspect-fix-imports' |
Date: |
Fri, 16 Aug 2024 06:58:56 -0400 (EDT) |
branch: externals/phpinspect
commit 8296641ba965f0d418a999e7cd7f7d41f9712a7a
Author: Hugo Thunnissen <devel@hugot.nl>
Commit: Hugo Thunnissen <devel@hugot.nl>
Implement removal of unused imports in `phpinspect-fix-imports'
---
phpinspect-imports.el | 62 +++++++++++++++++++++++++++++++++++++++++++++------
phpinspect-meta.el | 6 +++++
phpinspect-type.el | 15 ++++++++-----
3 files changed, 70 insertions(+), 13 deletions(-)
diff --git a/phpinspect-imports.el b/phpinspect-imports.el
index fbb0cf44a7..ec5fd7658f 100644
--- a/phpinspect-imports.el
+++ b/phpinspect-imports.el
@@ -111,14 +111,56 @@ buffer position to insert the use statement at."
(defalias 'phpinspect-fix-uses-interactive #'phpinspect-fix-imports
"Alias for backwards compatibility")
+(defsubst phpinspect-namespace-meta-body (namespace-meta)
+ "Return the token metadata of NAMESPACE-META's body.
+More specifically, returns the token itself if it is a namespace
+without block. If the namespace is defined with a block ('{}'),
+NAMESPACE-META itself is returned without alterations."
+ (if (phpinspect-block-p (caddr (phpinspect-meta-token namespace-meta)))
+ (phpinspect-meta-find-first-child-matching-token namespace-meta
#'phpinspect-block-p)
+ namespace-meta))
+
+(defun phpinspect-find-use-statement-for-import (parent-token import-type)
+ (phpinspect-meta-find-first-child-matching-token
+ (if (phpinspect-namespace-p (phpinspect-meta-token parent-token))
+ (phpinspect-namespace-meta-body parent-token)
+ parent-token)
+ (lambda (token)
+ (and (phpinspect-use-p token)
+ (phpinspect-word-p (cadr token))
+ (phpinspect--type= import-type (phpinspect-use-name-to-type (cadadr
token)))))))
+
+(defun phpinspect-remove-unneeded-use-statements (types buffer imports
parent-token)
+ (let ((namespace (phpinspect-meta-find-parent-matching-token parent-token
#'phpinspect-namespace-p)))
+ (dolist (import imports)
+ (unless (member (car import) types)
+ (when-let ((use-meta (phpinspect-find-use-statement-for-import
namespace (cdr import))))
+ (let ((start-point (phpinspect-meta-start use-meta))
+ (use-before (phpinspect-meta-find-left-sibling use-meta)))
+ (if (phpinspect-use-p (phpinspect-meta-token use-before))
+ ;; left-sibling is another use statement, remove all preceding
whitespace
+ (setq start-point (- start-point (length
(phpinspect-meta-whitespace-before use-meta))))
+ ;; left-sibling isn't a use statement, just remove a newline if
+ ;; any whitespace is present
+ (when (length> (phpinspect-meta-whitespace-before use-meta) 0)
+ (setq start-point (- start-point 1))))
+
+ (delete-region start-point (phpinspect-meta-end use-meta))
+ (phpinspect-buffer-parse buffer 'no-interrupt)))))))
+
(defun phpinspect-add-use-statements-for-missing-types (types buffer imports
project parent-token)
- (let (namespace namespace-name)
- (dolist (type types)
- (setq namespace (phpinspect-meta-find-parent-matching-token
- parent-token #'phpinspect-namespace-p)
- namespace-name (if namespace
+ "Add use statements to BUFFER for TYPES if not already included in IMPORTS.
+
+Uses PROJECT's autoloader to determine available types for import.
+
+PARENT-TOKEN must be a `token-meta' object and is used to
+determine the scope of the imports (global or local namespace)."
+ (let* ((namespace (phpinspect-meta-find-parent-matching-token
+ parent-token #'phpinspect-namespace-p))
+ (namespace-name (if namespace
(phpinspect-namespace-name
(phpinspect-meta-token namespace))
- ""))
+ "")))
+ (dolist (type types)
;; Add use statements for types that aren't imported or already
referenced
;; with a fully qualified name.
(unless (or (or (alist-get type imports))
@@ -149,6 +191,9 @@ that there are import (\"use\") statements for them."
(phpinspect-add-use-statements-for-missing-types
used-types buffer imports project (phpinspect-buffer-root-meta
buffer))
+ (phpinspect-remove-unneeded-use-statements
+ used-types buffer imports (phpinspect-buffer-root-meta buffer))
+
(dolist (class classes)
(let* ((class-imports (alist-get 'imports class))
(used-types (alist-get 'used-types class))
@@ -164,6 +209,9 @@ that there are import (\"use\") statements for them."
(error "Unable to find token for class %s" class-name))
(phpinspect-add-use-statements-for-missing-types
- used-types buffer (append imports class-imports) project
token-meta))))))
+ used-types buffer (append imports class-imports) project
token-meta)
+
+ (phpinspect-remove-unneeded-use-statements
+ used-types buffer class-imports token-meta))))))
(provide 'phpinspect-imports)
diff --git a/phpinspect-meta.el b/phpinspect-meta.el
index 906fe7c90c..53ba9540ce 100644
--- a/phpinspect-meta.el
+++ b/phpinspect-meta.el
@@ -270,6 +270,12 @@
(when (funcall predicate child)
(throw 'return child)))))
+(cl-defmethod phpinspect-meta-find-first-child-matching-token ((meta (head
meta)) predicate)
+ (catch 'return
+ (phpinspect-splayt-traverse-lr (child (phpinspect-meta-children meta))
+ (when (funcall predicate (phpinspect-meta-token child))
+ (throw 'return child)))))
+
(cl-defmethod phpinspect-meta-last-child ((meta (head meta)))
(phpinspect-meta-find-child-before meta (phpinspect-meta-end meta)))
diff --git a/phpinspect-type.el b/phpinspect-type.el
index 5ffa0fa598..bee9a406ca 100644
--- a/phpinspect-type.el
+++ b/phpinspect-type.el
@@ -299,12 +299,15 @@ mutability of the variable")
(not (or (phpinspect--variable-static-p variable)
(phpinspect--variable-const-p variable))))
-(defun phpinspect--use-to-type (use)
+(defun phpinspect-use-name-to-type (fqn-string)
+ (phpinspect--make-type :name (if (string-match "^\\\\" fqn-string)
+ fqn-string
+ (concat "\\" fqn-string))
+ :fully-qualified t))
+
+(defun phpinspect--use-to-type-cons (use)
(let* ((fqn (cadr (cadr use)))
- (type (phpinspect--make-type :name (if (string-match "^\\\\" fqn)
- fqn
- (concat "\\" fqn))
- :fully-qualified t))
+ (type (phpinspect-use-name-to-type fqn))
(type-name (if (and (phpinspect-word-p (caddr use))
(string= "as" (cadr (caddr use))))
(cadr (cadddr use))
@@ -313,7 +316,7 @@ mutability of the variable")
(cons (phpinspect-intern-name type-name) type)))
(defun phpinspect--uses-to-types (uses)
- (mapcar #'phpinspect--use-to-type uses))
+ (mapcar #'phpinspect--use-to-type-cons uses))
(defun phpinspect--get-class-name-from-token (class-token)
(let ((subtoken (seq-find (lambda (word)
- [elpa] externals/phpinspect updated (3887bc58d4 -> 4ec4c40c9d), ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect d3f100388e 04/18: Resolve property types using other methods when resolving from constructor fails, ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect 3fff772d8a 03/18: Fix phpinspect-buffer-index-functions test, ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect d141f8a6db 08/18: Infer namespace token within import manipulation loop, ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect 8296641ba9 07/18: Implement removal of unused imports in `phpinspect-fix-imports',
ELPA Syncer <=
- [elpa] externals/phpinspect 93b815d71a 14/18: Index used traits (juste use of type, no actual functionality outside of that), ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect 6a175c9e44 06/18: Update a few doc strings in phpinspect-index.el, ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect 31c6e06934 09/18: Reparse buffer when fixing import (+ add comment explaining why), ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect 2e064d52e1 17/18: Implement containing type inference for collection-like class properties, ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect 5528aff2a2 01/18: Handle cases where the filepath of a type cannot be determined, ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect 2520c89680 02/18: Account for tokens after @method annotation when indexing, ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect f2f1ac9b84 05/18: Add property types and anonymous function argument types to used-types index, ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect 130e2c06c5 13/18: Index types used in arrays, ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect f1dc699560 11/18: Detect types used with "instanceoff", ELPA Syncer, 2024/08/16
- [elpa] externals/phpinspect 3a0ce3ac2d 16/18: Fix another infinite recursion bug, ELPA Syncer, 2024/08/16