[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phpinspect f003b6a279 105/126: Make project indexation
From: |
ELPA Syncer |
Subject: |
[elpa] externals/phpinspect f003b6a279 105/126: Make project indexation asynchronous using `phpinspect-pipeline' |
Date: |
Sat, 12 Aug 2023 00:58:50 -0400 (EDT) |
branch: externals/phpinspect
commit f003b6a2794b2071f0c2d3cfa783f28670645fa4
Author: Hugo Thunnissen <devel@hugot.nl>
Commit: Hugo Thunnissen <devel@hugot.nl>
Make project indexation asynchronous using `phpinspect-pipeline'
---
phpinspect-autoload.el | 291 ++++++++++++++++++++++++++++++-------------------
phpinspect-cache.el | 6 +-
phpinspect-fs.el | 5 +-
phpinspect-pipeline.el | 115 +++++++++----------
phpinspect.el | 14 ++-
test/test-autoload.el | 132 +++++++++++-----------
6 files changed, 313 insertions(+), 250 deletions(-)
diff --git a/phpinspect-autoload.el b/phpinspect-autoload.el
index 8245be322e..cb7cca9104 100644
--- a/phpinspect-autoload.el
+++ b/phpinspect-autoload.el
@@ -27,12 +27,19 @@
(require 'phpinspect-project)
(require 'phpinspect-fs)
(require 'phpinspect-util)
+(require 'phpinspect-pipeline)
(cl-defstruct (phpinspect-psr0
(:constructor phpinspect-make-psr0-generated))
(prefix nil
:type string
:documentation "The namespace prefix for which the directories
contain code.")
+ (autoloader nil
+ :type phpinspect-autoloader)
+ (own nil
+ :type boolean)
+ (fs nil
+ :type phpinspect-fs)
(directories nil
:type list
:documentation
@@ -43,17 +50,17 @@
(prefix nil
:type string
:documentation "The namespace prefix for which the directories
contain code.")
+ (autoloader nil
+ :type phpinspect-autoloader)
+ (own nil
+ :type boolean)
+ (fs nil
+ :type phpinspect-fs)
(directories nil
:type list
:documentation
"The directories that this autoloader finds code in."))
-(cl-defstruct (phpinspect-classmap
- (:constructor phpinspect-make-classmap-generated))
- (directories nil
- :type list
- :documentation
- "The directories that this autoloader finds code in."))
(cl-defstruct (phpinspect-autoloader
(:constructor phpinspect-make-autoloader))
@@ -75,34 +82,29 @@
qualified names congruent with a bareword type name. Keyed by
bareword typenames."))
-(defun phpinspect-make-autoload-definition-closure (project-root fs typehash)
- "Create a closure that can be used to `maphash' the autoload
-section of a composer-json."
- (lambda (type prefixes)
- (let ((strategy))
- (cond
- ((string= "psr-0" type)
- (maphash
- (lambda (prefix directory-paths)
- (when (stringp directory-paths) (setq directory-paths (list
directory-paths)))
- (setq strategy (phpinspect-make-psr0-generated :prefix prefix))
- (dolist (path directory-paths)
- (push (concat project-root "/" path)
- (phpinspect-psr0-directories strategy))))
- prefixes))
- ((string= "psr-4" type)
- (maphash
- (lambda (prefix directory-paths)
- (when (stringp directory-paths) (setq directory-paths (list
directory-paths)))
- (setq strategy (phpinspect-make-psr4-generated :prefix prefix))
- (dolist (path directory-paths)
- (push (concat project-root "/" path)
- (phpinspect-psr4-directories strategy))))
- prefixes))
- (t (phpinspect--log "Unsupported autoload strategy \"%s\" encountered"
type)))
-
- (when strategy
- (phpinspect-al-strategy-fill-typehash strategy fs typehash)))))
+;; (define-inline phpinspect-directory-lister (dirs &optional fs)
+;; (inline-letevals (dirs fs)
+;; (inline-quote
+;; (let* ((directory (pop ,dirs))
+;; (files
+;; (phpinspect-fs-directory-files ,fs directory))
+;; listing)
+;; (dolist (file files)
+;; (if (phpinspect-fs-file-directory-p ,fs file)
+;; (push file ,dirs)
+;; (push file listing)))
+
+;; listing))))
+
+;; (phpinspect-define-pipeline-step phpinspect-directory-lister
phpinspect-directory-lister)
+
+(cl-defstruct (phpinspect-cj-iter-ctx (:constructor
phpinspect-make-cj-iter-ctx))
+ (autoloader nil
+ :type phpinspect-autoloader)
+ (compiled-dirs nil
+ :type boolean)
+ (dirs nil
+ :type list))
(cl-defmethod phpinspect--read-json-file (fs file)
(with-temp-buffer
@@ -110,100 +112,161 @@ section of a composer-json."
(goto-char 0)
(phpinspect-json-preset (json-read))))
-(cl-defmethod phpinspect-autoloader-refresh ((autoloader
phpinspect-autoloader))
- "Refresh autoload definitions by reading composer.json files
- from the project and vendor folders."
- (let* ((project-root (phpinspect-project-root (phpinspect-autoloader-project
autoloader)))
- (fs (phpinspect-project-fs (phpinspect-autoloader-project
autoloader)))
- (vendor-dir (concat project-root "/vendor"))
- (composer-json-path (concat project-root "/composer.json"))
- (composer-json)
- (project-autoload )
- (type-name-fqn-bags (make-hash-table :test 'eq :size 3000
:rehash-size 3000))
- (own-types (make-hash-table :test 'eq :size 10000 :rehash-size 10000))
- (types (make-hash-table :test 'eq :size 10000 :rehash-size 10000)))
-
- (when (phpinspect-fs-file-exists-p fs composer-json-path)
- (setq composer-json (phpinspect--read-json-file fs composer-json-path))
-
- (if (hash-table-p composer-json)
- (setq project-autoload (gethash "autoload" composer-json))
- (phpinspect--log "Error: Parsing %s did not return a hashmap."
- composer-json-path)))
+(define-inline phpinspect-filename-to-typename (dir filename &optional prefix)
+ (inline-quote
+ (phpinspect-intern-name
+ (replace-regexp-in-string
+ "[\\\\]+"
+ "\\\\"
+ (concat "\\"
+ (or ,prefix "")
+ (replace-regexp-in-string
+ "/" "\\\\"
+ (string-remove-suffix
+ ".php"
+ (string-remove-prefix ,dir ,filename))))))))
-
- (when project-autoload
- (maphash (phpinspect-make-autoload-definition-closure project-root fs
own-types)
- project-autoload)
-
- (maphash (phpinspect-make-autoload-definition-closure project-root fs
types)
- project-autoload))
+(defun phpinspect-find-composer-json-files (fs project-root)
+ (let ((cj-path (concat project-root "/composer.json"))
+ (vendor-dir (concat project-root "/vendor"))
+ files)
+ (when (phpinspect-fs-file-exists-p fs cj-path)
+ (push `(local . ,cj-path) files))
(when (phpinspect-fs-file-directory-p fs vendor-dir)
(dolist (author-dir (phpinspect-fs-directory-files fs vendor-dir))
(when (phpinspect-fs-file-directory-p fs author-dir)
(dolist (dependency-dir (phpinspect-fs-directory-files fs
author-dir))
+ (setq cj-path (concat dependency-dir "/composer.json"))
(when (and (phpinspect-fs-file-directory-p fs dependency-dir)
- (phpinspect-fs-file-exists-p fs (concat dependency-dir
"/composer.json")))
- (let* ((dependency-json (phpinspect--read-json-file
- fs
- (concat dependency-dir
"/composer.json")))
- (dependency-autoload (gethash "autoload"
dependency-json)))
- (when dependency-autoload
- (maphash (phpinspect-make-autoload-definition-closure
- dependency-dir fs types)
- dependency-autoload))))))))
-
- (maphash (lambda (type-fqn _)
- (let* ((type-name (phpinspect-intern-name
- (car (last (split-string (symbol-name
type-fqn) "\\\\")))))
- (bag (gethash type-name type-name-fqn-bags)))
- (push type-fqn bag)
- (puthash type-name bag type-name-fqn-bags)))
- types)
-
- (setf (phpinspect-autoloader-own-types autoloader) own-types)
- (setf (phpinspect-autoloader-types autoloader) types)
- (setf (phpinspect-autoloader-type-name-fqn-bags autoloader)
- type-name-fqn-bags)))
+ (phpinspect-fs-file-exists-p fs cj-path))
+ (push `(vendor . ,cj-path) files))))))
+ files))
+
+(cl-defmethod phpinspect-al-strategy-execute ((strat phpinspect-psr4))
+ (let* ((fs (phpinspect-psr4-fs strat))
+ (al (phpinspect-psr4-autoloader strat))
+ (own (phpinspect-psr4-own strat))
+ (own-typehash (phpinspect-autoloader-own-types al))
+ (typehash (phpinspect-autoloader-types al))
+ (prefix (phpinspect-psr4-prefix strat))
+ type-fqn)
+ (dolist (dir (phpinspect-psr4-directories strat))
+ (dolist (file (phpinspect-fs-directory-files-recursively fs dir
"\\.php$"))
+ (setq type-fqn (phpinspect-filename-to-typename dir file prefix))
+ (phpinspect-autoloader-put-type-bag al type-fqn)
+ (puthash type-fqn file typehash)
+ (when own
+ (puthash type-fqn file own-typehash))))))
+
+(cl-defmethod phpinspect-al-strategy-execute ((strat phpinspect-psr0))
+ (let* ((fs (phpinspect-psr0-fs strat))
+ (al (phpinspect-psr0-autoloader strat))
+ (own (phpinspect-psr0-own strat))
+ (own-typehash (phpinspect-autoloader-own-types al))
+ (typehash (phpinspect-autoloader-types al))
+ type-fqn)
+ (dolist (dir (phpinspect-psr0-directories strat))
+ (dolist (file (phpinspect-fs-directory-files-recursively fs dir
"\\.php$"))
+ (setq type-fqn (phpinspect-filename-to-typename dir file))
+ (phpinspect-autoloader-put-type-bag al type-fqn)
+ (puthash type-fqn file typehash)
+ (when own
+ (puthash type-fqn file own-typehash))))))
+
+(cl-defmethod phpinspect-autoloader-put-type-bag ((al phpinspect-autoloader)
(type-fqn symbol))
+ (let* ((type-name (phpinspect-intern-name
+ (car (last (split-string (symbol-name type-fqn)
"\\\\")))))
+ (bag (gethash type-name (phpinspect-autoloader-type-name-fqn-bags
al))))
+ (if bag
+ (push type-fqn bag)
+ (push type-fqn bag)
+ (puthash type-name bag (phpinspect-autoloader-type-name-fqn-bags al)))))
+
+
+(phpinspect-define-pipeline-step phpinspect-al-strategy-execute
phpinspect-al-strategy-execute)
+
+(cl-defmethod phpinspect-iterate-composer-jsons
+ ((al phpinspect-autoloader) file)
+ (let* ((fs (phpinspect-project-fs (phpinspect-autoloader-project al)))
+ (project-root (file-name-directory (cdr file)))
+ (json (phpinspect--read-json-file fs (cdr file)))
+ (autoload (gethash "autoload" json))
+ batch)
+ (when (hash-table-p autoload)
+ (maphash
+ (lambda (type prefixes)
+ (let ((strategy))
+ (pcase type
+ ("psr-0"
+ (maphash
+ (lambda (prefix directory-paths)
+ (when (stringp directory-paths)
+ (setq directory-paths (list directory-paths)))
+ (setq strategy (phpinspect-make-psr0-generated
+ :autoloader al
+ :fs fs
+ :prefix prefix
+ :own (eq 'local (car file))))
+ (dolist (path directory-paths)
+ (push (file-name-concat project-root path)
+ (phpinspect-psr0-directories strategy))))
+ prefixes))
+ ("psr-4"
+ (maphash
+ (lambda (prefix directory-paths)
+ (when (stringp directory-paths)
+ (setq directory-paths (list directory-paths)))
+ (setq strategy (phpinspect-make-psr4-generated
+ :fs fs
+ :autoloader al
+ :prefix prefix
+ :own (eq 'local (car file))))
+ (dolist (path directory-paths)
+ (push (file-name-concat project-root path)
+ (phpinspect-psr4-directories strategy))))
+ prefixes))
+ (_ (phpinspect--log "Unsupported autoload strategy \"%s\"
encountered" type)))
+
+ (push strategy batch)))
+ autoload)
+ (phpinspect-pipeline-emit-all batch))))
+
+(phpinspect-define-pipeline-step phpinspect-iterate-composer-jsons
+ phpinspect-iterate-composer-jsons)
(cl-defmethod phpinspect-autoloader-resolve ((autoloader phpinspect-autoloader)
typename-symbol)
(or (gethash typename-symbol (phpinspect-autoloader-own-types autoloader))
(gethash typename-symbol (phpinspect-autoloader-types autoloader))))
+(cl-defmethod phpinspect-autoloader-refresh ((autoloader
phpinspect-autoloader) &optional async-callback)
+ "Refresh autoload definitions by reading composer.json files
+ from the project and vendor folders."
+ (let* ((project-root (phpinspect-project-root (phpinspect-autoloader-project
autoloader)))
+ (fs (phpinspect-project-fs (phpinspect-autoloader-project
autoloader)))
+ result error)
+ (setf (phpinspect-autoloader-type-name-fqn-bags autoloader)
+ (make-hash-table :test 'eq :size 3000 :rehash-size 3000))
+ (setf (phpinspect-autoloader-own-types autoloader)
+ (make-hash-table :test 'eq :size 10000 :rehash-size 10000))
+ (setf (phpinspect-autoloader-types autoloader)
+ (make-hash-table :test 'eq :size 10000 :rehash-size 10000))
+
+ (phpinspect-pipeline (phpinspect-find-composer-json-files fs project-root)
+ :async (or async-callback
+ (lambda (_result error)
+ (if error
+ (message "Error during autoloader refresh: %s" error)
+ (message (concat "Refreshed project autoloader. Found %d
types within project,"
+ " %d types total.")
+ (hash-table-count
(phpinspect-autoloader-own-types autoloader))
+ (hash-table-count (phpinspect-autoloader-types
autoloader))))))
+ :into (phpinspect-iterate-composer-jsons :with-context autoloader)
+ :into phpinspect-al-strategy-execute)))
+
+(cl-defmethod phpinspect-autoloader-refresh
-(cl-defgeneric phpinspect-al-strategy-fill-typehash (strategy fs typehash)
- "Make STRATEGY return a map with type names as keys and the
- paths to the files they are defined in as values.")
-
-(defsubst phpinspect-filename-to-typename (dir filename &optional prefix)
- (phpinspect-intern-name
- (replace-regexp-in-string
- "[\\\\]+"
- "\\\\"
- (concat "\\"
- (or prefix "")
- (replace-regexp-in-string
- "/" "\\\\"
- (string-remove-suffix
- ".php"
- (string-remove-prefix dir filename)))))))
-
-(cl-defmethod phpinspect-al-strategy-fill-typehash ((strategy phpinspect-psr0)
- fs
- typehash)
- (dolist (dir (phpinspect-psr0-directories strategy))
- (dolist (file (phpinspect-fs-directory-files-recursively fs dir "\\.php$"))
- (puthash (phpinspect-filename-to-typename dir file) file typehash))))
-
-(cl-defmethod phpinspect-al-strategy-fill-typehash ((strategy phpinspect-psr4)
- fs
- typehash)
- (let ((prefix (phpinspect-psr4-prefix strategy)))
- (dolist (dir (phpinspect-psr4-directories strategy))
- (dolist (file (phpinspect-fs-directory-files-recursively fs dir
"\\.php$"))
- (puthash (phpinspect-filename-to-typename dir file prefix) file
typehash)))))
(provide 'phpinspect-autoload)
;;; phpinspect-autoload.el ends here
diff --git a/phpinspect-cache.el b/phpinspect-cache.el
index b5b0182724..54a5507da1 100644
--- a/phpinspect-cache.el
+++ b/phpinspect-cache.el
@@ -55,9 +55,9 @@ then returned."
:root project-root
:worker (phpinspect-make-dynamic-worker))
(phpinspect--cache-projects cache)))
- (let ((autoload (phpinspect-make-autoloader :project project)))
- (setf (phpinspect-project-autoload project) autoload)
- (phpinspect-autoloader-refresh autoload)))
+ (let ((autoloader (phpinspect-make-autoloader :project project)))
+ (setf (phpinspect-project-autoload project) autoloader)
+ (phpinspect-autoloader-refresh autoloader)))
project))
(provide 'phpinspect-cache)
diff --git a/phpinspect-fs.el b/phpinspect-fs.el
index 0a9aeceb16..ab293ef9a9 100644
--- a/phpinspect-fs.el
+++ b/phpinspect-fs.el
@@ -41,9 +41,8 @@
(defalias 'phpinspect-virtual-file-modification-time #'cadr)
(defalias 'phpinspect-virtual-file-contents #'car)
-(cl-defmethod phpinspect-virtual-fs-set-file ((fs phpinspect-virtual-fs)
- path
- contents)
+(defun phpinspect-virtual-fs-set-file (fs path contents)
+ (declare (indent defun))
(puthash path (phpinspect-make-virtual-file contents)
(phpinspect-virtual-fs-files fs)))
diff --git a/phpinspect-pipeline.el b/phpinspect-pipeline.el
index 456243c869..77cd704930 100644
--- a/phpinspect-pipeline.el
+++ b/phpinspect-pipeline.el
@@ -70,7 +70,7 @@
thread-live (thread-live-p (car thread)))
(when thread-live
- (if ended
+ (if end
(setq errors (nconc errors (list (format "Thread %s ended
pipeline, but is still running"
(thread-name (car
thread))))))
(setq errors (nconc errors (list (format "Thread %s is still running
when pipeline is closing"
@@ -91,13 +91,19 @@
(signal 'phpinspect-pipeline-error errors))))
-(defmacro phpinspect-pipeline-emit (data)
- `(throw 'phpinspect-pipeline-emit ,data))
+(define-inline phpinspect-pipeline-emit (data)
+ (inline-letevals (data)
+ (inline-quote
+ (throw 'phpinspect-pipeline-emit ,data))))
-(defmacro phpinspect-pipeline-emit-all (collection)
- `(throw 'phpinspect-pipeline-emit
- (phpinspect-make-pipeline-emission
- :collection ,collection)))
+(define-inline phpinspect-pipeline-emit-all (collection)
+ (inline-letevals (collection)
+ (inline-quote
+ (throw 'phpinspect-pipeline-emit
+ (if ,collection
+ (phpinspect-make-pipeline-emission
+ :collection ,collection)
+ ,collection)))))
(defmacro phpinspect-pipeline-end (&optional value)
(if value
@@ -197,8 +203,8 @@
(end-queue-sym (gensym "end-queue"))
(ctx-sym (gensym "ctx"))
(recv-sym (gensym))
- (errors (gensym))
(result-sym (gensym))
+ (seed-sym (gensym))
(collecting-sym (gensym)))
`(progn
(when (eq main-thread (current-thread))
@@ -209,13 +215,15 @@
(,queue-sym (phpinspect-make-queue))
(,end-queue-sym (phpinspect-make-queue))
(,collecting-sym t)
- ,recv-sym ,result-sym)
+ ,recv-sym ,result-sym ,seed-sym)
,(phpinspect--chain-pipeline-steps steps queue-sym end-queue-sym
ctx-sym)
- (phpinspect-pipeline--enqueue
- ,queue-sym
- (phpinspect-make-pipeline-emission :collection ,seed-form)
'no-notify)
+ (setq ,seed-sym ,seed-form)
+ (when ,seed-sym
+ (phpinspect-pipeline--enqueue
+ ,queue-sym
+ (phpinspect-make-pipeline-emission :collection ,seed-form)
'no-notify))
(phpinspect-pipeline--enqueue
,queue-sym (phpinspect-make-pipeline-end :thread (current-thread)))
@@ -249,7 +257,7 @@
(lambda ()
(condition-case err
(let ((,result ,(append '(phpinspect--pipeline) (list
seed-form) macro-params)))
- (funcall ,async ,result nil))
+ (funcall ,async (or ,result
'phpinspect-pipeline-nil-result) nil))
(t (funcall ,async nil err))))
"phpinspect-pipeline-async")
,(append '(phpinspect--pipeline) (list seed-form) macro-params)))))
@@ -257,11 +265,11 @@
(define-inline phpinspect-pipeline-receive (queue)
(inline-letevals (queue)
- `(or (phpinspect-queue-dequeue ,queue)
- (let ((mx (make-mutex)))
- (with-mutex mx
- (condition-wait (make-condition-variable mx
"phpinspect-pipeline-receive")))
- (phpinspect-queue-dequeue ,queue)))))
+ (inline-quote
+ (let ((val))
+ (while (not (setq val (phpinspect-queue-dequeue ,queue)))
+ (thread-yield))
+ val))))
(defun phpinspect-pipeline-step-name (name &optional suffix)
(intern (concat (symbol-name name) (if suffix (concat "-" suffix) ""))))
@@ -275,17 +283,16 @@
(define-inline phpinspect-pipeline--enqueue (queue emission &optional
no-notify)
(inline-letevals (queue emission no-notify)
(inline-quote
- (if (and (phpinspect-pipeline-emission-p ,emission)
- (phpinspect-pipeline-emission-collection ,emission))
- (progn
- (while (cdr (phpinspect-pipeline-emission-collection ,emission))
+ (when ,emission
+ (if (phpinspect-pipeline-emission-p ,emission)
+ (when (phpinspect-pipeline-emission-collection ,emission)
+ (while (cdr (phpinspect-pipeline-emission-collection ,emission))
+ (phpinspect-queue-enqueue
+ ,queue (pop (phpinspect-pipeline-emission-collection
,emission))
+ ,no-notify))
(phpinspect-queue-enqueue
- ,queue (pop (phpinspect-pipeline-emission-collection ,emission))
- ,no-notify))
- (phpinspect-queue-enqueue
- ,queue (pop (phpinspect-pipeline-emission-collection ,emission))
,no-notify))
- (phpinspect-queue-enqueue ,queue ,emission ,no-notify)))))
-
+ ,queue (pop (phpinspect-pipeline-emission-collection ,emission))
,no-notify))
+ (phpinspect-queue-enqueue ,queue ,emission ,no-notify))))))
(defmacro phpinspect-define-pipeline-step (name function-name)
(unless (symbolp name)
@@ -320,7 +327,6 @@
(out-queue (gensym "queue"))
(context-sym (gensym "context"))
(continue-running (gensym "continue-running"))
- (original-thread (gensym "original-thread"))
(pctx-sym (gensym "pipeline-ctx"))
(incoming-end (gensym "incoming-end"))
(end (gensym "end")))
@@ -330,8 +336,7 @@
(setq statement (nconc statement (list context-sym))))
(inline-quote
- (let ((,original-thread (current-thread))
- (,inc-queue ,queue)
+ (let ((,inc-queue ,queue)
(,out-queue ,consumer-queue)
(,context-sym ,context)
(,pctx-sym ,pipeline-ctx))
@@ -345,33 +350,29 @@
(condition-case err
(progn
(phpinspect-pipeline-pause)
- (catch 'phpinspect-pipeline-break
- (while ,continue-running
- (setq ,incoming
(phpinspect-pipeline-receive ,inc-queue))
- (if (phpinspect-pipeline-end-p
,incoming)
+ (setq ,incoming
(phpinspect-pipeline-receive ,inc-queue))
+
+ (if (phpinspect-pipeline-end-p ,incoming)
+ (progn
+ (setq ,incoming-end ,incoming)
+ (when (phpinspect-pipeline-end-value
,incoming)
(progn
- (setq ,incoming-end ,incoming)
- (when
(phpinspect-pipeline-end-value ,incoming)
- (progn
- (setq ,incoming
(phpinspect-pipeline-end-value ,incoming)
- ,outgoing ,statement)
- (phpinspect-pipeline--enqueue
,out-queue ,outgoing 'no-notify)))
-
- (setq ,end
(phpinspect-make-pipeline-end :thread (current-thread)))
-
(phpinspect-pipeline-ctx-register-end ,pctx-sym ,end)
- (setq ,continue-running nil)
- (phpinspect-pipeline--enqueue
,out-queue ,end))
-
- ;; Else
- (setq ,outgoing ,statement)
- (when (phpinspect-pipeline-end-p
,outgoing)
- (setq ,end
(phpinspect-make-pipeline-end :thread (current-thread)))
-
(phpinspect-pipeline-ctx-register-end ,pctx-sym ,end)
- (setq ,continue-running nil))
- (phpinspect-pipeline--enqueue
,out-queue ,outgoing))
-
- (when ,end
- (throw 'phpinspect-pipeline-break
nil)))))
+ (setq ,incoming
(phpinspect-pipeline-end-value ,incoming)
+ ,outgoing ,statement)
+ (phpinspect-pipeline--enqueue
,out-queue ,outgoing 'no-notify)))
+
+ (setq ,end
(phpinspect-make-pipeline-end :thread (current-thread)))
+ (phpinspect-pipeline-ctx-register-end
,pctx-sym ,end)
+ (setq ,continue-running nil)
+ (phpinspect-pipeline--enqueue
,out-queue ,end))
+
+ ;; Else
+ (setq ,outgoing ,statement)
+ (when (phpinspect-pipeline-end-p
,outgoing)
+ (setq ,end
(phpinspect-make-pipeline-end :thread (current-thread)))
+ (phpinspect-pipeline-ctx-register-end
,pctx-sym ,end)
+ (setq ,continue-running nil))
+ (phpinspect-pipeline--enqueue ,out-queue
,outgoing)))
(phpinspect-pipeline-incoming)
(t (phpinspect--log "Pipeline thread errored:
%s" err)
(setq ,end (phpinspect-make-pipeline-end
:thread (current-thread) :error err))
diff --git a/phpinspect.el b/phpinspect.el
index 8a13cd60db..fa7c1241ad 100644
--- a/phpinspect.el
+++ b/phpinspect.el
@@ -352,11 +352,15 @@ before the search is executed."
(phpinspect--get-or-create-global-cache)
(phpinspect-current-project-root)))
(autoloader (phpinspect-project-autoload project)))
- (phpinspect-autoloader-refresh autoloader)
- (message (concat "Refreshed project autoloader. Found %d types within
project,"
- " %d types total.")
- (hash-table-count (phpinspect-autoloader-own-types autoloader))
- (hash-table-count (phpinspect-autoloader-types autoloader)))))
+ ;; Update display so that it is clear to the user that emacs is
+ ;; responsive. Otherwise the autoloader refresh thread hogging the cpu will
+ ;; make it look like emacs is not responsive, especially when M-x uses some
+ ;; kind of completion framework, in which case the completion popup will
+ ;; appear frozen while the thread is executing.
+ (redisplay)
+
+ (phpinspect-autoloader-refresh autoloader)))
+
(provide 'phpinspect)
;;; phpinspect.el ends here
diff --git a/test/test-autoload.el b/test/test-autoload.el
index 43417c3963..7d9348b5cc 100644
--- a/test/test-autoload.el
+++ b/test/test-autoload.el
@@ -28,91 +28,73 @@
(require 'phpinspect-fs)
(require 'phpinspect-autoload)
-(ert-deftest phpinspect-psr0-fill-typehash ()
+(ert-deftest phpinspect-find-composer-json-files ()
(let* ((fs (phpinspect-make-virtual-fs))
- (typehash (make-hash-table :size 10 :test 'eq))
- (autoload
- (phpinspect-make-psr0-generated :prefix "App\\")))
-
- (phpinspect-virtual-fs-set-file
- fs "/home/user/projects/app/src/App/Services/SuperService.php" "")
-
- (phpinspect-virtual-fs-set-file
- fs "/home/user/projects/app/src/Kernel.php" "")
-
- (phpinspect-virtual-fs-set-file
- fs "/home/user/projects/app/src/App/Controller/Banana.php" "")
-
- (phpinspect-virtual-fs-set-file
- fs "/home/user/projects/app/lib/Mailer_Lib.php" "")
+ (autoloader (phpinspect-make-autoloader
+ :project (phpinspect--make-project :root "/root" :fs
fs))))
+ (phpinspect-virtual-fs-set-file fs
+ "/root/composer.json"
+ "{ \"autoload\": { \"psr-4\": {\"WoW\\\\Dwarves\\\\\": \"src/\"}}}")
- (setf (phpinspect-psr0-directories autoload) (list
"/home/user/projects/app/src/"
-
"/home/user/projects/app/lib/"))
+ (phpinspect-virtual-fs-set-file fs
+ "/root/vendor/runescape/client/composer.json"
+ "{\"autoload\": { \"psr-0\": {\"Runescape\\\\Banana\\\\\": [\"src/\",
\"lib\"]}}}")
- (phpinspect-al-strategy-fill-typehash autoload fs typehash)
- (should-not (hash-table-empty-p typehash))
+ (phpinspect-virtual-fs-set-file fs
+ "/root/vendor/apples/pears/composer.json"
+ "{\"autoload\": { \"psr-0\": {\"Runescape\\\\Banana\\\\\": [\"src/\",
\"lib\"]}}}")
- (should (string=
"/home/user/projects/app/src/App/Services/SuperService.php"
- (gethash (phpinspect-intern-name
"\\App\\Services\\SuperService")
- typehash)))
- (should (string= "/home/user/projects/app/src/Kernel.php"
- (gethash (phpinspect-intern-name "\\Kernel")
- typehash)))
- (should (string= "/home/user/projects/app/src/App/Controller/Banana.php"
- (gethash (phpinspect-intern-name
"\\App\\Controller\\Banana")
- typehash)))
+ (let ((sorter (lambda (file1 file2) (string-lessp (cdr file1) (cdr
file2)))))
- (should (string= "/home/user/projects/app/lib/Mailer_Lib.php"
- (gethash (phpinspect-intern-name "\\Mailer_Lib")
- typehash)))))
+ (should (equal (sort '((vendor . "/root/vendor/apples/pears/composer.json")
+ (vendor .
"/root/vendor/runescape/client/composer.json")
+ (local . "/root/composer.json"))
+ sorter)
+ (sort (phpinspect-find-composer-json-files fs "/root")
+ sorter))))))
-(ert-deftest phpinspect-psr4-fill-typehash ()
+(ert-deftest phpinspect-autoload-composer-json-iterator ()
(let* ((fs (phpinspect-make-virtual-fs))
- (typehash (make-hash-table :size 10 :test 'eq))
- (autoload
- (phpinspect-make-psr4-generated :prefix "App\\")))
-
- (phpinspect-virtual-fs-set-file
- fs "/home/user/projects/app/src/Services/SuperService.php" "")
+ (autoloader (phpinspect-make-autoloader
+ :project (phpinspect--make-project :root "/root" :fs
fs)))
+ result error)
- (phpinspect-virtual-fs-set-file
- fs "/home/user/projects/app/src/Kernel.php" "")
+ (phpinspect-virtual-fs-set-file fs
+ "/root/composer.json"
+ "{ \"autoload\": { \"psr-4\": {\"WoW\\\\Dwarves\\\\\": \"src/\"}}}")
- (phpinspect-virtual-fs-set-file
- fs "/home/user/projects/app/src/Controller/Banana.php" "")
+ (phpinspect-virtual-fs-set-file fs
+ "/root/vendor/runescape/client/composer.json"
+ "{\"autoload\": { \"psr-0\": {\"Runescape\\\\Banana\\\\\": [\"src/\",
\"lib\"]}}}")
- (phpinspect-virtual-fs-set-file
- fs "/home/user/projects/app/lib/Mailer_Lib.php" "")
- (setf (phpinspect-psr4-directories autoload) (list
"/home/user/projects/app/src/"
-
"/home/user/projects/app/lib/"))
+ (phpinspect-virtual-fs-set-file fs
+ "/root/vendor/apples/pears/composer.json"
+ "{\"autoload\": { \"psr-0\": {\"Runescape\\\\Banana\\\\\": [\"src/\",
\"lib\"]},
+ \"psr-4\": {\"Another\\\\Namespace\\\\\":
[\"separate/\"]}}}")
- (phpinspect-al-strategy-fill-typehash autoload fs typehash)
+ (phpinspect-pipeline (phpinspect-find-composer-json-files fs "/root")
+ :async (lambda (res err)
+ (setq result res
+ error err))
+ :into (phpinspect-iterate-composer-jsons :with-context autoloader))
- (should-not (hash-table-empty-p typehash))
+ (while (not (or result error))
+ (thread-yield))
- (should (string= "/home/user/projects/app/src/Services/SuperService.php"
- (gethash (phpinspect-intern-name
"\\App\\Services\\SuperService")
- typehash)))
- (should (string= "/home/user/projects/app/src/Kernel.php"
- (gethash (phpinspect-intern-name "\\App\\Kernel")
- typehash)))
- (should (string= "/home/user/projects/app/src/Controller/Banana.php"
- (gethash (phpinspect-intern-name
"\\App\\Controller\\Banana")
- typehash)))
+ (should-not error)
- (should (string= "/home/user/projects/app/lib/Mailer_Lib.php"
- (gethash (phpinspect-intern-name "\\App\\Mailer_Lib")
- typehash)))))
+ (should (= 4 (length result)))
+ (should (= 2 (length (seq-filter #'phpinspect-psr0-p result))))
+ (should (= 2 (length (seq-filter #'phpinspect-psr4-p result))))))
-(ert-deftest phpinspect-autoloader-refresh ()
+(ert-deftest phpinspect-al-strategy-execute ()
(let* ((fs (phpinspect-make-virtual-fs))
- (project (phpinspect--make-project
- :fs fs
- :root "/project/root"))
(autoloader (phpinspect-make-autoloader
- :project project)))
+ :project (phpinspect--make-project :root "/project/root"
:fs fs)))
+ result error)
+
(phpinspect-virtual-fs-set-file
fs
"/project/root/composer.json"
@@ -144,7 +126,17 @@
(phpinspect-virtual-fs-set-file
fs "/project/root/vendor/not-runescape/wow/src/TestClass.php" "")
- (phpinspect-autoloader-refresh autoloader)
+ (phpinspect-pipeline (phpinspect-find-composer-json-files fs
"/project/root")
+ :async (lambda (res err)
+ (setq result res
+ error err))
+ :into (phpinspect-iterate-composer-jsons :with-context autoloader)
+ :into phpinspect-al-strategy-execute)
+
+ (while (not (or result error))
+ (thread-yield))
+
+ (should-not error)
(should-not (hash-table-empty-p (phpinspect-autoloader-own-types
autoloader)))
(should-not (hash-table-empty-p (phpinspect-autoloader-types autoloader)))
@@ -152,4 +144,8 @@
(should (string=
"/project/root/vendor/runescape/client/src/Runescape/Banana/App.php"
(phpinspect-autoloader-resolve
autoloader
- (phpinspect-intern-name "\\Runescape\\Banana\\App"))))))
+ (phpinspect-intern-name "\\Runescape\\Banana\\App"))))
+ (should (string= "/project/root/vendor/not-runescape/wow/src/TestClass.php"
+ (phpinspect-autoloader-resolve
+ autoloader
+ (phpinspect-intern-name "\\WoW\\Dwarves\\TestClass"))))))
- [elpa] externals/phpinspect 281c5e4ae6 077/126: Remove some overly verbose logging, (continued)
- [elpa] externals/phpinspect 281c5e4ae6 077/126: Remove some overly verbose logging, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 0596bc52bf 091/126: Optimize splay tree and use it to store token's children, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect ab6954faf5 090/126: Retrieve and wrap metadata using the correct overlay for region, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 389e77eb8b 092/126: Expand existing overlay when possible, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 23245d0158 098/126: Fix some compilation warnings, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect db370623da 108/126: Implement "files" autoload strategy, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 6678ba20c6 103/126: Implement async processing pipeline, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 2099abced8 099/126: Add Cask configuration and fix some compilation warnings, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 3175d9a6ac 126/126: Fix typo, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect d86ef5756b 115/126: Remove `phpinspect-define-pipeline-step' in favor of direct fun call, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect f003b6a279 105/126: Make project indexation asynchronous using `phpinspect-pipeline',
ELPA Syncer <=
- [elpa] externals/phpinspect ce995f2bc4 101/126: Remove unused variables, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect f2ece03f2a 109/126: Add factilities to filter logs from different modules, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 59a098a4cd 015/126: Add note about parser cache to defhandler + add config example, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 4430aaccb9 011/126: Rework parser code, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 0350069e34 005/126: Fix native (built-in) type names, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect f8689ac9df 018/126: Return parser function in stead of just the symbol, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 825a3de2c4 017/126: Add indexation command to mode docstring + add install to readme, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 1e4e865c9b 021/126: Add variables nested in (function or other) blocks to candidates, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 2b85271b2b 030/126: Test + fix get-last-statement-in-token for static attribute references, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect a60dba5f11 031/126: WIP: new struct to represent types, and string comparison optimization with obarray, ELPA Syncer, 2023/08/12