unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [ELPA] New Package: phpinspect.el
@ 2023-08-07 20:22 Hugo Thunnissen
  2023-08-12  4:56 ` Stefan Monnier
  0 siblings, 1 reply; 8+ messages in thread
From: Hugo Thunnissen @ 2023-08-07 20:22 UTC (permalink / raw)
  To: emacs-devel; +Cc: Stefan Monnier

Hi all,

I would like to propose my package, phpinspect.el, to be added to GNU Elpa.

PHPInspect is a minor mode that provides code intelligence for PHP in 
Emacs. At its core is a PHP parser implemented in Emacs Lisp. PHPInspect 
comes with backends for |completion-at-point|, |company-mode| and 
|eldoc|. A backend for |xref| is planned to be implemented at a later 
date. The main documentation can be found in the docstring of 
phpinspect-mode and in README.md in the source repository.

I have done my best to bring much of the package's code under test with 
ert and "fieldtest" the package by using it myself. There are some parts 
of the code though that I think need to be tested in more environments 
than mine to see how they hold up. For example: the package makes heavy 
use of collaborative threads to parse and index code while emacs is 
otherwise idling. I have done my best to make this as non-intrusive as 
possible, but I'm not sure how the default behavior of the threads will 
hold up for users on different (maybe less performant) systems from mine.

I have signed my copyright papers a year back, so I think the paperwork 
is in order.

The elpa contribution process is all new to me and my code has mostly 
only been read and written by me, so pointers and feedback on both 
topics are very welcome :)

source repository: https://github.com/hugot/phpinspect.el.git

Kind regards,

Hugo




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [ELPA] New Package: phpinspect.el
  2023-08-07 20:22 [ELPA] New Package: phpinspect.el Hugo Thunnissen
@ 2023-08-12  4:56 ` Stefan Monnier
  2023-08-12  5:04   ` Stefan Monnier
  2023-08-15 17:45   ` Hugo Thunnissen
  0 siblings, 2 replies; 8+ messages in thread
From: Stefan Monnier @ 2023-08-12  4:56 UTC (permalink / raw)
  To: Hugo Thunnissen; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 563 bytes --]

> I would like to propose my package, phpinspect.el, to be added to GNU Elpa.

Done.

AFAICT the code has currently some significant problems in terms of
dependencies which make its compilation fail because variables are used
by macros during compilation when the var has not yet been defined, or
macros are used before they're defined, etc...

The patch below seems to make the compilation go through (and fixes
various warnings), but there are a lot of compilation warnings left
which you might want to check.  It also includes a few FIXMEs.


        Stefan



[-- Attachment #2: phpinspect.patch --]
[-- Type: text/x-diff, Size: 29470 bytes --]

diff --git a/.gitignore b/.gitignore
index 9dfdcfc74a..8267c9df55 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,7 @@
 *.elc
 /benchmarks/profile.txt
-/.cask
\ No newline at end of file
+/.cask
+
+# ELPA-generated files
+/phpinspect-autoloads.el
+/phpinspect-pkg.el
diff --git a/benchmarks/parse-file.el b/benchmarks/parse-file.el
index 604ba2e833..7bea574fa6 100644
--- a/benchmarks/parse-file.el
+++ b/benchmarks/parse-file.el
@@ -1,3 +1,4 @@
+;; -*- lexical-binding: t; -*-
 
 (require 'phpinspect-parser)
 
@@ -13,25 +14,25 @@
 
     (message "Incremental parse (warmup):")
     (phpinspect-with-parse-context (phpinspect-make-pctx :incremental t)
-      (benchmark 1 '(phpinspect-parse-current-buffer)))
+      (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
     (let ((bmap (phpinspect-make-bmap))
           (bmap2 (phpinspect-make-bmap)))
       (message "Incremental parse:")
       (phpinspect-with-parse-context (phpinspect-make-pctx :incremental t :bmap bmap)
-        (benchmark 1 '(phpinspect-parse-current-buffer)))
+        (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
       (garbage-collect)
 
       (message "Incremental parse (no edits):")
       (phpinspect-with-parse-context (phpinspect-make-pctx :incremental t :bmap bmap2 :previous-bmap bmap :edtrack (phpinspect-make-edtrack))
-        (benchmark 1 '(phpinspect-parse-current-buffer)))
+        (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
       (garbage-collect)
 
       (message "Incremental parse repeat (no edits):")
       (phpinspect-with-parse-context (phpinspect-make-pctx :incremental t :previous-bmap bmap2 :edtrack (phpinspect-make-edtrack))
-        (benchmark 1 '(phpinspect-parse-current-buffer)))
+        (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
       (garbage-collect)
 
@@ -45,13 +46,13 @@
         (message "Incremental parse after buffer edit:")
         ;; Removes closing curly brace of __construct
         (goto-char 9062)
-        (delete-backward-char 1)
+        (delete-char -1)
 
         (garbage-collect)
 
         (phpinspect-edtrack-register-edit edtrack 9061 9061 1)
         (phpinspect-with-parse-context (phpinspect-make-pctx :bmap bmap-after :incremental t :previous-bmap bmap :edtrack edtrack)
-          (benchmark 1 '(phpinspect-parse-current-buffer)))
+          (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
         (phpinspect-edtrack-clear edtrack)
         (insert "{")
@@ -65,7 +66,7 @@
         ;;(profiler-start 'cpu)
         (message "Incremental parse after 2 more edits:")
         (phpinspect-with-parse-context (phpinspect-make-pctx :incremental t :previous-bmap bmap-after :edtrack edtrack)
-          (benchmark 1 '(phpinspect-parse-current-buffer)))
+          (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
         ;; (save-current-buffer
         ;;   (profiler-stop)
@@ -78,9 +79,9 @@
 
     (garbage-collect)
     (message "Bare (no token reuse) parse (warmup):")
-    (benchmark 1 '(phpinspect-parse-current-buffer))
+    (benchmark-run 1 (phpinspect-parse-current-buffer))
 
 
     (garbage-collect)
     (message "Bare (no token reuse) parse:")
-    (benchmark 1 '(phpinspect-parse-current-buffer))))
+    (benchmark-run 1 (phpinspect-parse-current-buffer))))
diff --git a/benchmarks/splay-tree.el b/benchmarks/splay-tree.el
index 261ddfe08a..934487d199 100644
--- a/benchmarks/splay-tree.el
+++ b/benchmarks/splay-tree.el
@@ -1,3 +1,4 @@
+;; -*- lexical-binding: t; -*-
 
 
 (require 'phpinspect-splayt)
@@ -6,28 +7,28 @@
       (tree (phpinspect-make-splayt)))
   (message "Splay tree 10000 insertions:")
   (garbage-collect)
-  (benchmark
-   1 '(dotimes (i 10000)
-        (phpinspect-splayt-insert tree i 'value)))
+  (benchmark-run
+   1 (dotimes (i 10000)
+       (phpinspect-splayt-insert tree i 'value)))
 
   (message "Splay tree 10000 lookups:")
   (garbage-collect)
-  (benchmark
-   1 '(dotimes (i 10000)
-        (phpinspect-splayt-find tree i))))
+  (benchmark-run
+   1 (dotimes (i 10000)
+       (phpinspect-splayt-find tree i))))
 
 
 (let (map)
   (message "Hashtable 10000 insertions:")
   (garbage-collect)
-  (benchmark
-   1 '(progn
-        (setq map (make-hash-table :test #'eq :size 10000 :rehash-size 1.5))
-        (dotimes (i 10000)
-        (puthash i 'value map))))
+  (benchmark-run
+   1 (progn
+       (setq map (make-hash-table :test #'eq :size 10000 :rehash-size 1.5))
+       (dotimes (i 10000)
+         (puthash i 'value map))))
 
   (message "Hashtable 10000 lookups:")
   (garbage-collect)
-  (benchmark
-   1 '(dotimes (i 10000)
-        (gethash i map))))
+  (benchmark-run
+   1 (dotimes (i 10000)
+       (gethash i map))))
diff --git a/phpinspect-bmap.el b/phpinspect-bmap.el
index 0fded42705..2f2796e6fe 100644
--- a/phpinspect-bmap.el
+++ b/phpinspect-bmap.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-bmap.el --- PHP parsing and completion package  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -25,7 +25,7 @@
 
 (require 'phpinspect-splayt)
 (require 'phpinspect-meta)
-(require 'phpinspect-changeset)
+;; (require 'phpinspect-changeset) ;; FIXME: Circular dependency :-(
 (require 'phpinspect-util)
 (require 'compat)
 
diff --git a/phpinspect-cache.el b/phpinspect-cache.el
index cdf89ee124..e33029378a 100644
--- a/phpinspect-cache.el
+++ b/phpinspect-cache.el
@@ -1,6 +1,6 @@
 ;;; phpinspect.el --- PHP parsing and completion package  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -45,8 +45,7 @@ If its value is nil, it is created and then returned."
             "A `hash-table` with the root directories of projects
 as keys and project caches as values."))
 
-(cl-defgeneric phpinspect--cache-getproject
-    ((cache phpinspect--cache) (project-name string))
+(cl-defgeneric phpinspect--cache-getproject (cache project-name)
   "Get project by PROJECT-NAME that is located in CACHE.")
 
 (cl-defmethod phpinspect--cache-getproject
diff --git a/phpinspect-changeset.el b/phpinspect-changeset.el
index 7f19ed2201..382de3c730 100644
--- a/phpinspect-changeset.el
+++ b/phpinspect-changeset.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-changeset.el --- Metadata changeset module  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -23,6 +23,8 @@
 
 ;;; Code:
 
+(require 'phpinspect-parse-context) ;; FIXME: Circular dependency :-(
+
 (define-inline phpinspect-make-changeset (meta)
   (inline-letevals (meta)
     (inline-quote
diff --git a/phpinspect-completion.el b/phpinspect-completion.el
index 59b7d7d823..f5546169d8 100644
--- a/phpinspect-completion.el
+++ b/phpinspect-completion.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-type.el --- PHP parsing and completion package -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -97,11 +97,11 @@ candidate. Candidates can be indexed functions and variables.")
           :type phpinspect-buffer))
 
 
-(cl-defgeneric phpinspect-comp-strategy-supports (strategy (query phpinspect-completion-query) (context phpinspect--resolvecontext))
+(cl-defgeneric phpinspect-comp-strategy-supports (strategy query context)
   "Should return non-nil if STRATEGY should be deployed for QUERY
 and CONTEXT. All strategies must implement this method.")
 
-(cl-defgeneric phpinspect-comp-strategy-execute (strategy (query phpinspect-completion-query) (context phpinspect--resolvecontext))
+(cl-defgeneric phpinspect-comp-strategy-execute (strategy query context)
   "Should return a list of objects for which
 `phpinspect--make-completion' is implemented.")
 
diff --git a/phpinspect-edtrack.el b/phpinspect-edtrack.el
index bd065932ca..96fb77579b 100644
--- a/phpinspect-edtrack.el
+++ b/phpinspect-edtrack.el
@@ -24,6 +24,7 @@
 ;;; Code:
 
 (require 'phpinspect-util)
+(require 'phpinspect-meta)
 
 (eval-when-compile
   (phpinspect--declare-log-group 'edtrack))
@@ -73,11 +74,6 @@
 (defsubst phpinspect-edit-original-end (edit)
   (or (caar edit) 0))
 
-(defsubst phpinspect-edit-end (edit)
-  (let ((end (or (caar edit) 0))
-        (previous-edit (cdr edit)))
-    (+ end (phpinspect-edit-delta previous-edit))))
-
 (defsubst phpinspect-edit-delta (edit)
   (let ((delta (or (cdar edit) 0))
         (previous-edit edit))
@@ -85,6 +81,11 @@
       (setq delta (+ delta (cdar previous-edit))))
     delta))
 
+(defsubst phpinspect-edit-end (edit)
+  (let ((end (or (caar edit) 0))
+        (previous-edit (cdr edit)))
+    (+ end (phpinspect-edit-delta previous-edit))))
+
 (defsubst phpinspect-edtrack-original-position-at-point (track point)
   (let ((edit (phpinspect-edtrack-edits track))
         (encroached)
diff --git a/phpinspect-eldoc.el b/phpinspect-eldoc.el
index 8efa9b7e72..a1a28a6984 100644
--- a/phpinspect-eldoc.el
+++ b/phpinspect-eldoc.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-eldoc.el --- PHP parsing and completion package  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -26,6 +26,7 @@
 (require 'phpinspect-meta)
 (require 'phpinspect-parser)
 (require 'phpinspect-resolve)
+(require 'phpinspect-buffer)
 
 (defvar phpinspect-eldoc-word-width 14
   "The maximum width of words in eldoc strings.")
@@ -38,11 +39,11 @@
           :type phpinspect-buffer))
 
 
-(cl-defgeneric phpinspect-eld-strategy-supports (strategy (query phpinspect-eldoc-query) (context phpinspect--resolvecontext))
+(cl-defgeneric phpinspect-eld-strategy-supports (strategy query context)
   "Should return non-nil if STRATEGY should be deployed for QUERY
 and CONTEXT. All strategies must implement this method.")
 
-(cl-defgeneric phpinspect-eld-strategy-execute (strategy (query phpinspect-eldoc-query) (context phpinspect--resolvecontext))
+(cl-defgeneric phpinspect-eld-strategy-execute (strategy query context)
   "Should return an object for which `phpinspect-eldoc-string' is implemented.")
 
 (cl-defgeneric phpinspect-eldoc-string (response)
diff --git a/phpinspect-parse-context.el b/phpinspect-parse-context.el
index fb2ae38db2..b3fcf12ffd 100644
--- a/phpinspect-parse-context.el
+++ b/phpinspect-parse-context.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-parse-context.el --- PHP parsing context module  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021, 2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -25,7 +25,7 @@
 
 (require 'phpinspect-util)
 (require 'phpinspect-meta)
-(require 'phpinspect-changeset)
+;; (require 'phpinspect-changeset) ;; FIXME: Circular dependency :-(
 (require 'phpinspect-bmap)
 
 (defvar phpinspect-parse-context nil
@@ -36,7 +36,7 @@ parsing. Usually used in combination with
 (cl-defstruct (phpinspect-pctx (:constructor phpinspect-make-pctx))
   "Parser Context"
   (incremental nil)
-  (interrupt-threshold (time-convert '(2 . 1000))
+  (interrupt-threshold (time-convert '(2 . 1000) t)
                        :documentation
                        "After how much time `interrupt-predicate'
 should be polled. This is 2ms by default.")
@@ -98,7 +98,7 @@ thrown.")
     (inline-quote
      (progn
        (unless (phpinspect-pctx--start-time ,pctx)
-         (setf (phpinspect-pctx--start-time ,pctx) (time-convert nil)))
+         (setf (phpinspect-pctx--start-time ,pctx) (time-convert nil t)))
 
        ;; Interrupt when blocking too long while input is pending.
        (when (and (time-less-p (phpinspect-pctx-interrupt-threshold ,pctx)
@@ -107,6 +107,12 @@ thrown.")
          (phpinspect-pctx-cancel ,pctx)
          (throw 'phpinspect-parse-interrupted nil))))))
 
+
+(defsubst phpinspect-pctx-consume-whitespace (pctx)
+  (let ((whitespace (phpinspect-pctx-whitespace-before pctx)))
+    (setf (phpinspect-pctx-whitespace-before pctx) "")
+    whitespace))
+
 (define-inline phpinspect-pctx-register-token (pctx token start end)
   (inline-letevals (pctx)
     (inline-quote
@@ -117,11 +123,6 @@ thrown.")
   (inline-quote
    (setf (phpinspect-pctx-whitespace-before ,pctx) ,whitespace)))
 
-(defsubst phpinspect-pctx-consume-whitespace (pctx)
-  (let ((whitespace (phpinspect-pctx-whitespace-before pctx)))
-    (setf (phpinspect-pctx-whitespace-before pctx) "")
-    whitespace))
-
 (defun phpinspect-pctx-cancel (pctx)
   (phpinspect--log "Cancelling parse context")
   (dolist (changeset (phpinspect-pctx-changesets pctx))
diff --git a/phpinspect-parser.el b/phpinspect-parser.el
index d3d70a348b..fc1ae56734 100644
--- a/phpinspect-parser.el
+++ b/phpinspect-parser.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-parser.el --- PHP parsing module  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -79,17 +79,18 @@ Type can be any of the token types returned by
       (phpinspect-comma-p token)
       (phpinspect-html-p token)))
 
-(defsubst phpinspect-end-of-statement-p (token)
-  (or (phpinspect-end-of-token-p token)
-      (phpinspect-block-p token)))
-
 (defsubst phpinspect-incomplete-block-p (token)
   (phpinspect-token-type-p token :incomplete-block))
 
+
 (defsubst phpinspect-block-p (token)
   (or (phpinspect-token-type-p token :block)
       (phpinspect-incomplete-block-p token)))
 
+(defsubst phpinspect-end-of-statement-p (token)
+  (or (phpinspect-end-of-token-p token)
+      (phpinspect-block-p token)))
+
 (defun phpinspect-end-of-use-p (token)
   (or (phpinspect-block-p token)
       (phpinspect-end-of-token-p token)))
@@ -184,6 +185,10 @@ Type can be any of the token types returned by
   (or (phpinspect-token-type-p token :array)
       (phpinspect-incomplete-array-p token)))
 
+
+(defsubst phpinspect-root-p (object)
+  (phpinspect-token-type-p object :root))
+
 (defsubst phpinspect-incomplete-root-p (token)
   (and (phpinspect-root-p token)
        (seq-find #'phpinspect-incomplete-token-p (cdr token))))
@@ -227,10 +232,6 @@ Type can be any of the token types returned by
 (defun phpinspect-use-keyword-p (token)
   (and (phpinspect-word-p token) (string= (car (last token)) "use")))
 
-
-(defsubst phpinspect-root-p (object)
-  (phpinspect-token-type-p object :root))
-
 (defsubst phpinspect-namespace-or-root-p (object)
   (or (phpinspect-namespace-p object)
       (phpinspect-root-p object)))
@@ -261,6 +262,7 @@ Type can be any of the token types returned by
   "Apply inverse of `phpinspect-class-p' to TOKEN."
   (not (phpinspect-class-p token)))
 
+(eval-and-compile
 (defun phpinspect-handler-func-name (handler-name)
   (intern (concat "phpinspect--" (symbol-name handler-name) "-handler")))
 
@@ -268,7 +270,7 @@ Type can be any of the token types returned by
   (intern (concat "phpinspect--" (symbol-name handler-name) "-handler-regexp")))
 
 (defun phpinspect-parser-func-name (name &optional suffix)
-  (intern (concat "phpinspect--parse-" (symbol-name name) (if suffix (concat "-" suffix) ""))))
+  (intern (concat "phpinspect--parse-" (symbol-name name) (if suffix (concat "-" suffix) "")))))
 
 (defmacro phpinspect-defhandler (name arguments docstring attribute-alist &rest body)
   "Define a parser handler that becomes available for use with phpinspect-parse.
@@ -552,15 +554,12 @@ parsing incrementally."
          (incremental-name (phpinspect-parser-func-name name "incremental")))
 
     `(let ((parser (phpinspect-make-parser ,@parameters)))
-       (defconst ,simple-name nil)
-       (defconst ,incremental-name nil)
+       (defconst ,simple-name parser)
+       (defconst ,incremental-name parser)
 
        (put (quote ,simple-name) 'phpinspect--parser t)
        (put (quote ,incremental-name) 'phpinspect--incremental-parser t)
 
-       (setf ,simple-name parser)
-       (setf ,incremental-name parser)
-
        ;; Stub function to please the byte compiler (real function will be
        ;; defined by `phpinspect-define-parser-functions'.
        (defun ,func-name (_buffer _max-point &optional _continue-condition _root)))))
diff --git a/phpinspect-pipeline.el b/phpinspect-pipeline.el
index 3c3069d1f0..3ae2a14a3c 100644
--- a/phpinspect-pipeline.el
+++ b/phpinspect-pipeline.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-pipeline.el --- PHP parsing and completion package  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -276,8 +276,12 @@ directories."
                (when (eq :with-context key)
                  (setq value `(quote ,value)))
                (setq key (intern (string-replace ":with-" ":" (symbol-name key))))
+               ;; FIXME: There's an O(N²) complexity here :-(
                (setq construct-params (nconc construct-params (list key value)))))
-           (push (eval `(phpinspect--make-pipeline-step ,@construct-params :name (quote ,name)))
+           ;; FIXME: Instead of constructing an expression to pass to `eval',
+           ;; with all the quoting that implies, can't we create a list of
+           ;; values to pass to `apply', saving untold kittens along the way?
+           (push (eval `(phpinspect--make-pipeline-step ,@construct-params :name (quote ,name)) t)
                  steps)))
         (_ (error "unexpected key %s" key))))
 
@@ -320,7 +324,7 @@ directories."
             ,queue-sym (phpinspect-make-pipeline-end :thread (current-thread)))
 
            (while ,collecting-sym
-             (ignore-error 'phpinspect-pipeline-incoming
+             (ignore-error phpinspect-pipeline-incoming
                (progn
                  (phpinspect-pipeline--register-wakeup-function ,end-queue-sym)
                  (while (not (phpinspect-pipeline-end-p
diff --git a/phpinspect-project.el b/phpinspect-project.el
index 0df08d9821..8a04993fbf 100644
--- a/phpinspect-project.el
+++ b/phpinspect-project.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-project.el --- PHP parsing and completion package  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -265,6 +265,13 @@ before the search is executed."
 (cl-defmethod phpinspect-project-add-file-index ((project phpinspect-project) (filename string))
   (phpinspect-project-add-index project (phpinspect-project-index-file project filename)))
 
+(defcustom phpinspect-projects nil
+  "PHPInspect Projects."
+  :type '(alist :key-type string
+                :value-type (alist :key-type symbol
+                                   :options ((include-dirs (repeat string)))))
+  :group 'phpinspect)
+
 (defun phpinspect-project-enqueue-include-dirs (project)
   (interactive (list (phpinspect--cache-get-project-create
                       (phpinspect--get-or-create-global-cache)
@@ -279,13 +286,6 @@ before the search is executed."
        (phpinspect-project-worker project)
        (phpinspect-make-index-dir-task :dir dir :project project)))))
 
-(defcustom phpinspect-projects nil
-  "PHPInspect Projects."
-  :type '(alist :key-type string
-                :value-type (alist :key-type symbol
-                                   :options ((include-dirs (repeat string)))))
-  :group 'phpinspect)
-
 (defun phpinspect-project-add-include-dir (dir)
   "Configure DIR as an include dir for the current project."
   (interactive (list (read-directory-name "Include Directory: ")))
diff --git a/phpinspect-resolve.el b/phpinspect-resolve.el
index 76e2159249..a2442e6b54 100644
--- a/phpinspect-resolve.el
+++ b/phpinspect-resolve.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-resolve.el --- PHP parsing and completion package -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -26,6 +26,7 @@
 (require 'phpinspect-resolvecontext)
 (require 'phpinspect-type)
 (require 'phpinspect-parser)
+(require 'phpinspect-index) ;For `phpinspect-get-or-create-cached-project-class'.
 
 (cl-defstruct (phpinspect--assignment
                (:constructor phpinspect--make-assignment))
diff --git a/phpinspect-type.el b/phpinspect-type.el
index 8fc60064fa..d4b27b59e1 100644
--- a/phpinspect-type.el
+++ b/phpinspect-type.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-type.el --- Data structures that represent phpinspect types  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -24,6 +24,8 @@
 ;;; Code:
 
 (require 'phpinspect-util)
+(require 'phpinspect-parser)            ;For `phpinspect-const-p'.
+;; (require 'phpinspect-index) ;FIXME: Circular dependency :-(
 
 (cl-defstruct (phpinspect--type
                (:constructor phpinspect--make-type-generated)
@@ -230,7 +232,7 @@ return type of the function."))
 (cl-defmethod phpinspect--function-set-name ((func phpinspect--function) (name string))
   (setf (phpinspect--function-name-symbol func) (intern name phpinspect-name-obarray)))
 
-(cl-defgeneric phpinspect--function-name ((func phpinspect--function)))
+(cl-defgeneric phpinspect--function-name (func))
 
 (cl-defmethod phpinspect--function-name ((func phpinspect--function))
   (symbol-name (phpinspect--function-name-symbol func)))
diff --git a/phpinspect-util.el b/phpinspect-util.el
index 190bfec77f..fc723800bd 100644
--- a/phpinspect-util.el
+++ b/phpinspect-util.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-util.el --- PHP parsing and completion package  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -31,6 +31,25 @@ PHP. Used to optimize string comparison.")
   '("composer.json" "composer.lock" ".git" ".svn" ".hg")
   "List of files that could indicate a project root directory.")
 
+(eval-and-compile (defvar phpinspect-log-groups nil))
+
+(defmacro phpinspect--log (&rest args)
+  (let ((log-group (alist-get (if (fboundp 'macroexp-file-name) ;Emacs≥28
+                                  (macroexp-file-name)
+                                (or load-file-name buffer-file-name))
+                              phpinspect-log-groups nil nil #'string=)))
+    `(when (and phpinspect--debug
+                (or (not phpinspect-enabled-log-groups)
+                    ,(when log-group
+                       `(member (quote ,log-group) phpinspect-enabled-log-groups))))
+       (with-current-buffer (get-buffer-create "**phpinspect-logs**")
+         (unless window-point-insertion-type
+           (set (make-local-variable 'window-point-insertion-type) t))
+         (goto-char (buffer-end 1))
+         (insert (concat "[" (format-time-string "%H:%M:%S") "]: "
+                         ,(if log-group (concat "(" (symbol-name log-group) ") ") "")
+                         (format ,@args) "\n"))))))
+
 (defun phpinspect--find-project-root (&optional start-file)
   "(Attempt to) Find the root directory of the visited PHP project.
 If a found project root has a parent directory called \"vendor\",
@@ -65,7 +84,6 @@ level of START-FILE in stead of `default-directory`."
       (message "Enabled phpinspect logging.")
     (message "Disabled phpinspect logging.")))
 
-(defvar phpinspect-log-groups nil)
 (defvar phpinspect-enabled-log-groups nil)
 
 (defvar-local phpinspect--current-log-group nil)
@@ -85,20 +103,6 @@ level of START-FILE in stead of `default-directory`."
 
 (phpinspect--declare-log-group 'bam)
 
-(defmacro phpinspect--log (&rest args)
-  (let ((log-group (alist-get (or load-file-name buffer-file-name) phpinspect-log-groups nil nil #'string=)))
-    `(when (and phpinspect--debug
-                (or (not phpinspect-enabled-log-groups)
-                    ,(when log-group
-                       `(member (quote ,log-group) phpinspect-enabled-log-groups))))
-       (with-current-buffer (get-buffer-create "**phpinspect-logs**")
-         (unless window-point-insertion-type
-           (set (make-local-variable 'window-point-insertion-type) t))
-         (goto-char (buffer-end 1))
-         (insert (concat "[" (format-time-string "%H:%M:%S") "]: "
-                         ,(if log-group (concat "(" (symbol-name log-group) ") ") "")
-                         (format ,@args) "\n"))))))
-
 (defun phpinspect-filter-logs (group-name)
   (interactive (list (completing-read "Log group: "
                                       (mapcar (lambda (g) (symbol-name (cdr g)))
diff --git a/phpinspect-worker.el b/phpinspect-worker.el
index 0d42dd73bf..bc9c5a2855 100644
--- a/phpinspect-worker.el
+++ b/phpinspect-worker.el
@@ -1,6 +1,6 @@
 ;;; phpinspect-worker.el --- PHP parsing and completion package  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -134,7 +134,7 @@ already present in the queue."
       ;; This error is used to wake up the thread when new tasks are added to the
       ;; queue.
       (condition-case err
-          (ignore-error 'phpinspect-wakeup-thread
+          (ignore-error phpinspect-wakeup-thread
             (let* ((task (phpinspect-queue-dequeue (phpinspect-worker-queue worker)))
                    (mx (make-mutex))
                    (continue (make-condition-variable mx)))
@@ -238,8 +238,7 @@ already present in the queue."
         :documentation
         "The type whose file should be indexed."))
 
-(cl-defgeneric phpinspect-make-index-task ((project phpinspect-project)
-                                          (type phpinspect--type))
+(cl-defgeneric phpinspect-make-index-task (project type)
   (phpinspect-make-index-task-generated
    :project project
    :type type))
diff --git a/phpinspect.el b/phpinspect.el
index e42f92c3e4..3110bb48b6 100644
--- a/phpinspect.el
+++ b/phpinspect.el
@@ -1,6 +1,6 @@
 ;;; phpinspect.el --- PHP parsing and completion package  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021  Free Software Foundation, Inc
+;; Copyright (C) 2021-2023  Free Software Foundation, Inc
 
 ;; Author: Hugo Thunnissen <devel@hugot.nl>
 ;; Keywords: php, languages, tools, convenience
@@ -179,14 +179,14 @@ at point (capf) functions:
 
 (defun my-php-personal-hook ()
   ;; Shortcut to add use statements for classes you use.
-  (define-key php-mode-map (kbd \"C-c u\") 'phpinspect-fix-imports)
+  (define-key php-mode-map (kbd \"C-c u\") #\\='phpinspect-fix-imports)
 
   ;; Shortcuts to quickly search/open files of PHP classes.
   ;; You can make these local to php-mode, but making them global
   ;; like this makes them work in other modes/filetypes as well, which
   ;; can be handy when jumping between templates, config files and PHP code.
-  (global-set-key (kbd \"C-c a\") 'phpinspect-find-class-file)
-  (global-set-key (kbd \"C-c c\") 'phpinspect-find-own-class-file)
+  (global-set-key (kbd \"C-c a\") #\\='phpinspect-find-class-file)
+  (global-set-key (kbd \"C-c c\") #\\='phpinspect-find-own-class-file)
 
   ;; Enable phpinspect-mode
   (phpinspect-mode))
@@ -316,7 +316,7 @@ currently opened projects."
 (defun phpinspect-get-all-fqns (&optional filter)
   "Return a list of all FQNS congruent with FILTER in the currently active project.
 
-FILTER must be nil or the symbol 'own' if FILTER is 'own', only
+FILTER must be nil or the symbol `own' if FILTER is `own', only
 fully qualified names from the project's source, and not its
 dependencies, are returned."
   (let* ((project (phpinspect--cache-get-project-create

[-- Attachment #3: +make.log --]
[-- Type: text/plain, Size: 62148 bytes --]

Byte compiling packages/phpinspect/benchmarks/splay-tree.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In toplevel form:
packages/phpinspect/benchmarks/splay-tree.el:6:8: Warning: Unused lexical variable ‘here’
packages/phpinspect/benchmarks/splay-tree.el:34:9: Warning: value from call to ‘gethash’ is unused
Byte compiling packages/phpinspect/phpinspect-bmap.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In end of data:
packages/phpinspect/phpinspect-bmap.el:254:6: Warning: the function ‘phpinspect-meta-with-changeset’ is not known to be defined.
Byte compiling packages/phpinspect/benchmarks/parse-file.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-autoload.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-buffer.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-changeset.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-cache.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-class.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In end of data:
packages/phpinspect/phpinspect-class.el:90:14: Warning: the function ‘phpinspect-project-get-class-create’ is not known to be defined.
Byte compiling packages/phpinspect/phpinspect-edtrack.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In phpinspect-taint-end:
packages/phpinspect/phpinspect-edtrack.el:154:11: Warning: defsubst ‘phpinspect-taint-end’ was used before it was defined

In phpinspect-taint-overlaps-region:
packages/phpinspect/phpinspect-edtrack.el:164:11: Warning: defsubst ‘phpinspect-taint-overlaps-region’ was used before it was defined

In phpinspect-taint-overlaps-meta:
packages/phpinspect/phpinspect-edtrack.el:178:11: Warning: defsubst ‘phpinspect-taint-overlaps-meta’ was used before it was defined

In phpinspect-edtrack-register-taint:
packages/phpinspect/phpinspect-edtrack.el:193:11: Warning: defsubst ‘phpinspect-edtrack-register-taint’ was used before it was defined
Byte compiling packages/phpinspect/phpinspect-completion.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-eldoc.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In phpinspect-mode:
packages/phpinspect/phpinspect.el:141:2: Warning: docstring has wrong usage of unescaped single quotes (use \=' or different quoting such as `...')
Byte compiling packages/phpinspect/phpinspect-fs.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-imports.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-index.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In end of data:
packages/phpinspect/phpinspect-index.el:515:22: Warning: the function ‘phpinspect--get-or-create-global-cache’ is not known to be defined.
packages/phpinspect/phpinspect-index.el:514:21: Warning: the function ‘phpinspect--cache-get-project-create’ is not known to be defined.
Byte compiling packages/phpinspect/phpinspect-meta.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In phpinspect-meta-width:
packages/phpinspect/phpinspect-meta.el:64:11: Warning: defsubst ‘phpinspect-meta-width’ was used before it was defined
Byte compiling packages/phpinspect/phpinspect-parse-context.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In end of data:
packages/phpinspect/phpinspect-parse-context.el:129:6: Warning: the function ‘phpinspect-changeset-revert’ is not known to be defined.
Byte compiling packages/phpinspect/phpinspect-pipeline.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In phpinspect-pipeline:
packages/phpinspect/phpinspect-pipeline.el:344:13: Warning: assignment to free variable ‘key’
packages/phpinspect/phpinspect-pipeline.el:345:13: Warning: assignment to free variable ‘value’
packages/phpinspect/phpinspect-pipeline.el:347:14: Warning: reference to free variable ‘key’
packages/phpinspect/phpinspect-pipeline.el:348:29: Warning: reference to free variable ‘value’
Byte compiling packages/phpinspect/phpinspect-parser.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In phpinspect--variable-handler:
packages/phpinspect/phpinspect-parser.el:709:2: Warning: defsubst ‘phpinspect--variable-handler’ was used before it was defined

In phpinspect--list-handler:
packages/phpinspect/phpinspect-parser.el:912:2: Warning: defsubst ‘phpinspect--list-handler’ was used before it was defined

In end of data:
packages/phpinspect/phpinspect-parser.el:1062:8: Warning: the function ‘phpinspect--parse-root’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:1019:18: Warning: the function ‘phpinspect--parse-array’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:1001:4: Warning: the function ‘phpinspect--parse-static’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:989:45: Warning: the function ‘phpinspect--parse-scope-protected’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:988:43: Warning: the function ‘phpinspect--parse-scope-private’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:987:42: Warning: the function ‘phpinspect--parse-scope-public’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:940:21: Warning: the function ‘phpinspect--parse-declaration’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:918:21: Warning: the function ‘phpinspect--parse-list’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:861:19: Warning: the function ‘phpinspect--parse-block’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:842:19: Warning: the function ‘phpinspect--parse-class-block’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:820:19: Warning: the function ‘phpinspect--parse-block-without-scopes’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:796:22: Warning: the function ‘phpinspect--parse-const’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:779:4: Warning: the function ‘phpinspect--parse-namespace’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:749:4: Warning: the function ‘phpinspect--parse-use’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:707:13: Warning: the function ‘phpinspect--parse-comment’ is not known to be defined.
packages/phpinspect/phpinspect-parser.el:702:31: Warning: the function ‘phpinspect--parse-doc-block’ is not known to be defined.
Byte compiling packages/phpinspect/phpinspect-project.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In end of data:
packages/phpinspect/phpinspect-project.el:287:9: Warning: the function ‘phpinspect-make-index-dir-task’ is not known to be defined.
packages/phpinspect/phpinspect-project.el:277:24: Warning: the function ‘phpinspect--get-or-create-global-cache’ is not known to be defined.
packages/phpinspect/phpinspect-project.el:276:23: Warning: the function ‘phpinspect--cache-get-project-create’ is not known to be defined.
packages/phpinspect/phpinspect-project.el:251:52: Warning: the function ‘phpinspect-index-current-buffer’ is not known to be defined.
packages/phpinspect/phpinspect-project.el:230:21: Warning: the function ‘phpinspect-autoloader-resolve’ is not known to be defined.
packages/phpinspect/phpinspect-project.el:229:8: Warning: the function ‘phpinspect-autoloader-refresh’ is not known to be defined.
packages/phpinspect/phpinspect-project.el:127:39: Warning: the function ‘phpinspect-make-index-task’ is not known to be defined.
packages/phpinspect/phpinspect-project.el:126:12: Warning: the function ‘phpinspect-worker-enqueue’ is not known to be defined.
packages/phpinspect/phpinspect-project.el: Warning: the function ‘phpinspect-make-dynamic-worker’ is not known to be defined.
Byte compiling packages/phpinspect/phpinspect-queue.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-serialize.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-resolvecontext.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In end of data:
packages/phpinspect/phpinspect-resolvecontext.el:208:9: Warning: the function ‘phpinspect--uses-to-types’ is not known to be defined.
packages/phpinspect/phpinspect-resolvecontext.el:205:32: Warning: the function ‘phpinspect-namespace-body’ is not known to be defined.
packages/phpinspect/phpinspect-resolvecontext.el:164:5: Warning: the function ‘phpinspect--get-or-create-global-cache’ is not known to be defined.
packages/phpinspect/phpinspect-resolvecontext.el:163:4: Warning: the function ‘phpinspect--cache-get-project-create’ is not known to be defined.
packages/phpinspect/phpinspect-resolvecontext.el:80:20: Warning: the function ‘phpinspect-statement-introduction-p’ is not known to be defined.
Byte compiling packages/phpinspect/phpinspect-resolve.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In end of data:
packages/phpinspect/phpinspect-resolve.el:135:45: Warning: the function ‘phpinspect--get-or-create-global-cache’ is not known to be defined.
packages/phpinspect/phpinspect-resolve.el:135:7: Warning: the function ‘phpinspect--cache-get-project-create’ is not known to be defined.
Byte compiling packages/phpinspect/phpinspect-splayt.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-suggest.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/phpinspect-util.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In phpinspect--find-project-root:
packages/phpinspect/phpinspect-util.el:61:4: Warning: reference to free variable ‘phpinspect--debug’
packages/phpinspect/phpinspect-util.el:61:4: Warning: reference to free variable ‘phpinspect-enabled-log-groups’
Byte compiling packages/phpinspect/phpinspect-type.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In end of data:
packages/phpinspect/phpinspect-type.el:180:30: Warning: the function ‘phpinspect--get-class-name-from-token’ is not known to be defined.
Byte compiling packages/phpinspect/phpinspect-worker.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/test/phpinspect-test.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/test/test-bmap.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In toplevel form:
packages/phpinspect/test/test-bmap.el:72:11: Warning: assignment to free variable ‘result’
packages/phpinspect/test/test-bmap.el:73:82: Warning: reference to free variable ‘result’
Byte compiling packages/phpinspect/test/test-autoload.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In toplevel form:
packages/phpinspect/test/test-autoload.el:33:11: Warning: Unused lexical variable ‘autoloader’
packages/phpinspect/test/test-autoload.el:50:21: Warning: ‘sort’ on constant list (arg 1)
Byte compiling packages/phpinspect/test/test-buffer.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In toplevel form:
packages/phpinspect/test/test-buffer.el:33:11: Warning: Unused lexical variable ‘class’
packages/phpinspect/test/test-buffer.el:35:37: Warning: reference to free variable ‘phpinspect-test-php-file-directory’
packages/phpinspect/test/test-buffer.el:55:10: Warning: Unused lexical variable ‘buffer’

In end of data:
packages/phpinspect/test/test-buffer.el:253:43: Warning: the function ‘phpinspect-after-change-function’ is not known to be defined.
Byte compiling packages/phpinspect/test/test-class.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/test/test-edtrack.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/test/test-eldoc.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/test/test-fs.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/test/test-parse-context.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In end of data:
packages/phpinspect/test/test-parse-context.el:34:8: Warning: the function ‘phpinspect-meta-with-changeset’ is not known to be defined.
Byte compiling packages/phpinspect/test/test-index.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In toplevel form:
packages/phpinspect/test/test-index.el:85:23: Warning: ‘sort’ on constant list (arg 1)
packages/phpinspect/test/test-index.el:166:37: Warning: reference to free variable ‘phpinspect-test-php-file-directory’

In end of data:
packages/phpinspect/test/test-index.el:154:12: Warning: the function ‘phpinspect-test-read-fixture-serialization’ is not known to be defined.
packages/phpinspect/test/test-index.el:152:13: Warning: the function ‘phpinspect-test-read-fixture-data’ is not known to be defined.
Byte compiling packages/phpinspect/test/test-parser.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In end of data:
packages/phpinspect/test/test-parser.el:153:17: Warning: the function ‘phpinspect--index-tokens’ is not known to be defined.
packages/phpinspect/test/test-parser.el:93:12: Warning: the function ‘phpinspect-test-parse-fixture-code’ is not known to be defined.
packages/phpinspect/test/test-parser.el:92:12: Warning: the function ‘phpinspect-test-read-fixture-data’ is not known to be defined.
Byte compiling packages/phpinspect/test/test-pipeline.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In toplevel form:
packages/phpinspect/test/test-pipeline.el:29:22: Warning: Unused lexical variable ‘thread’

In end of data:
packages/phpinspect/test/test-pipeline.el:53:13: Warning: the function ‘aah-it-broke’ is not known to be defined.
packages/phpinspect/test/test-pipeline.el:35:13: Warning: the function ‘correct-the-record’ is not known to be defined.
Byte compiling packages/phpinspect/test/test-project.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In toplevel form:
packages/phpinspect/test/test-project.el:38:11: Warning: Unused lexical variable ‘worker’
packages/phpinspect/test/test-project.el:42:52: Warning: Unused lexical argument ‘ignored’

In end of data:
packages/phpinspect/test/test-project.el:38:19: Warning: the function ‘phpinspect-make-worker’ is not known to be defined.
Byte compiling packages/phpinspect/test/test-resolvecontext.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In toplevel form:
packages/phpinspect/test/test-resolvecontext.el:32:35: Warning: reference to free variable ‘phpinspect-test-php-file-directory’

In end of data:
packages/phpinspect/test/test-resolvecontext.el:87:28: Warning: the function ‘phpinspect-test-read-fixture-data’ is not known to be defined.
packages/phpinspect/test/test-resolvecontext.el:33:19: Warning: the function ‘phpinspect-parse-string-to-bmap’ is not known to be defined.
Byte compiling packages/phpinspect/test/test-type.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In end of data:
packages/phpinspect/test/test-type.el:33:18: Warning: the function ‘phpinspect--make-type’ is not known to be defined.
packages/phpinspect/test/test-type.el:32:17: Warning: the function ‘phpinspect--resolve-late-static-binding’ is not known to be defined.
packages/phpinspect/test/test-type.el:31:16: Warning: the function ‘phpinspect--type=’ is not known to be defined.
Byte compiling packages/phpinspect/test/test-util.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In toplevel form:
packages/phpinspect/test/test-util.el:28:58: Warning: reference to free variable ‘*’

In end of data:
packages/phpinspect/test/test-util.el:44:19: Warning: the function ‘phpinspect--pattern-concat’ is not known to be defined.
packages/phpinspect/test/test-util.el:35:16: Warning: the function ‘phpinspect--pattern-match’ is not known to be defined.
packages/phpinspect/test/test-util.el:31:45: Warning: the function ‘phpinspect--pattern-code’ is not known to be defined.
packages/phpinspect/test/test-util.el:28:21: Warning: the function ‘phpinspect--make-pattern’ is not known to be defined.
Byte compiling packages/phpinspect/test/test-worker.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/test/util/generate-test-data.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable
Byte compiling packages/phpinspect/test/test-splayt.el
Unable to activate package ‘zig-mode’.
Required package ‘reformatter-0.6’ is unavailable
Unable to activate package ‘evil-visualstar’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-numbers’.
Required package ‘evil-1.2.0’ is unavailable
Unable to activate package ‘evil-lisp-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-indent-plus’.
Required package ‘evil-0’ is unavailable
Unable to activate package ‘evil-iedit-state’.
Required package ‘evil-1.0.9’ is unavailable
Unable to activate package ‘evil-goggles’.
Required package ‘evil-1.0.0’ is unavailable
Unable to activate package ‘evil-exchange’.
Required package ‘evil-1.2.8’ is unavailable
Unable to activate package ‘evil-args’.
Required package ‘evil-1.0.8’ is unavailable
Unable to activate package ‘evil-anzu’.
Required package ‘evil-1.0.0’ is unavailable

In toplevel form:
packages/phpinspect/test/test-splayt.el:74:22: Warning: ‘sort’ on constant list (arg 1)
packages/phpinspect/test/test-splayt.el:94:22: Warning: ‘sort’ on constant list (arg 1)
packages/phpinspect/test/test-splayt.el:164:21: Warning: ‘sort’ on constant list (arg 1)

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [ELPA] New Package: phpinspect.el
  2023-08-12  4:56 ` Stefan Monnier
@ 2023-08-12  5:04   ` Stefan Monnier
  2023-08-15 17:45   ` Hugo Thunnissen
  1 sibling, 0 replies; 8+ messages in thread
From: Stefan Monnier @ 2023-08-12  5:04 UTC (permalink / raw)
  To: Hugo Thunnissen; +Cc: emacs-devel

> Unable to activate package ‘zig-mode’.
> Required package ‘reformatter-0.6’ is unavailable
> Unable to activate package ‘evil-visualstar’.
> Required package ‘evil-0’ is unavailable
> Unable to activate package ‘evil-numbers’.
> Required package ‘evil-1.2.0’ is unavailable
> Unable to activate package ‘evil-lisp-state’.
> Required package ‘evil-1.0.9’ is unavailable
> Unable to activate package ‘evil-indent-plus’.
> Required package ‘evil-0’ is unavailable
> Unable to activate package ‘evil-iedit-state’.
> Required package ‘evil-1.0.9’ is unavailable
> Unable to activate package ‘evil-goggles’.
> Required package ‘evil-1.0.0’ is unavailable
> Unable to activate package ‘evil-exchange’.
> Required package ‘evil-1.2.8’ is unavailable
> Unable to activate package ‘evil-args’.
> Required package ‘evil-1.0.8’ is unavailable
> Unable to activate package ‘evil-anzu’.
> Required package ‘evil-1.0.0’ is unavailable

Sorry 'bout that noise, which you can disregard.


        Stefan




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [ELPA] New Package: phpinspect.el
  2023-08-12  4:56 ` Stefan Monnier
  2023-08-12  5:04   ` Stefan Monnier
@ 2023-08-15 17:45   ` Hugo Thunnissen
  2023-08-15 20:28     ` Philip Kaludercic
  2023-08-15 22:03     ` Stefan Monnier
  1 sibling, 2 replies; 8+ messages in thread
From: Hugo Thunnissen @ 2023-08-15 17:45 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel


On 8/12/23 06:56, Stefan Monnier wrote:
>> I would like to propose my package, phpinspect.el, to be added to GNU Elpa.
> Done.
>
> AFAICT the code has currently some significant problems in terms of
> dependencies which make its compilation fail because variables are used
> by macros during compilation when the var has not yet been defined, or
> macros are used before they're defined, etc...
>
> The patch below seems to make the compilation go through (and fixes
> various warnings), but there are a lot of compilation warnings left
> which you might want to check.  It also includes a few FIXMEs.
>
>
>          Stefan
>
>

And here I was thinking that I had fixed all of the byte compilation 
problems.. Turns out it was only working because I byte compiled 
everything within the same emacs session. I made some changes and think 
things should be in order now. At least, the following shell script 
doesn't seem to result in any errors:

for file in ./*.el; do
     cask emacs -batch -L . --eval '(setq byte-compile-error-on-warn t)' 
-f batch-byte-compile "$file" || break
done

I see some warnings in your log that concern files in the "benchmark" 
and "test" directories. These files are not required for the package to 
function. Can these be excluded from the ELPA build somehow? I have seen 
some projects use a "lisp" directory for their source code, is that the 
recommended approach for this?


Thanks,

- Hugo





^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [ELPA] New Package: phpinspect.el
  2023-08-15 17:45   ` Hugo Thunnissen
@ 2023-08-15 20:28     ` Philip Kaludercic
  2023-08-15 21:33       ` Hugo Thunnissen
  2023-08-15 22:03     ` Stefan Monnier
  1 sibling, 1 reply; 8+ messages in thread
From: Philip Kaludercic @ 2023-08-15 20:28 UTC (permalink / raw)
  To: Hugo Thunnissen; +Cc: Stefan Monnier, emacs-devel

Hugo Thunnissen <devel@hugot.nl> writes:

> On 8/12/23 06:56, Stefan Monnier wrote:
>>> I would like to propose my package, phpinspect.el, to be added to GNU Elpa.
>> Done.
>>
>> AFAICT the code has currently some significant problems in terms of
>> dependencies which make its compilation fail because variables are used
>> by macros during compilation when the var has not yet been defined, or
>> macros are used before they're defined, etc...
>>
>> The patch below seems to make the compilation go through (and fixes
>> various warnings), but there are a lot of compilation warnings left
>> which you might want to check.  It also includes a few FIXMEs.
>>
>>
>>          Stefan
>>
>>
>
> And here I was thinking that I had fixed all of the byte compilation
> problems.. Turns out it was only working because I byte compiled
> everything within the same emacs session. I made some changes and
> think things should be in order now. At least, the following shell
> script doesn't seem to result in any errors:
>
> for file in ./*.el; do
>     cask emacs -batch -L . --eval '(setq byte-compile-error-on-warn
> t)' -f batch-byte-compile "$file" || break
> done

I am not familiar with Cask, what does this provide over a simple
Makefile?

> I see some warnings in your log that concern files in the "benchmark"
> and "test" directories. These files are not required for the package
> to function. Can these be excluded from the ELPA build somehow? I have
> seen some projects use a "lisp" directory for their source code, is
> that the recommended approach for this?

You can add an .elpaignore file to your package root.  You can list all
files in there that you do not with to have added to a package tarball.
The file is passed to GNU tar's -X option (see (info "(tar) exclude")).

> Thanks,
>
> - Hugo



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [ELPA] New Package: phpinspect.el
  2023-08-15 20:28     ` Philip Kaludercic
@ 2023-08-15 21:33       ` Hugo Thunnissen
  2023-08-15 21:56         ` Philip Kaludercic
  0 siblings, 1 reply; 8+ messages in thread
From: Hugo Thunnissen @ 2023-08-15 21:33 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: Stefan Monnier, emacs-devel


On 8/15/23 22:28, Philip Kaludercic wrote:
>
> I am not familiar with Cask, what does this provide over a simple
> Makefile?


It locally installs the package's dependencies and starts emacs with a 
clean profile that only has those dependencies available. It doesn't do 
much, but it's easy to use and it seems to help prevent "it works with 
my setup" scenarios. I only started using it recently though so I'm not 
very familiar with it, nor am I very skilled with make for that matter ;)

What would a simple Makefile for a typical elisp package look like? Is 
it common practice to create clean environments like cask does?




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [ELPA] New Package: phpinspect.el
  2023-08-15 21:33       ` Hugo Thunnissen
@ 2023-08-15 21:56         ` Philip Kaludercic
  0 siblings, 0 replies; 8+ messages in thread
From: Philip Kaludercic @ 2023-08-15 21:56 UTC (permalink / raw)
  To: Hugo Thunnissen; +Cc: Stefan Monnier, emacs-devel

Hugo Thunnissen <devel@hugot.nl> writes:

> On 8/15/23 22:28, Philip Kaludercic wrote:
>>
>> I am not familiar with Cask, what does this provide over a simple
>> Makefile?
>
>
> It locally installs the package's dependencies and starts emacs with a
> clean profile that only has those dependencies available. It doesn't
> do much, but it's easy to use and it seems to help prevent "it works
> with my setup" scenarios. I only started using it recently though so
> I'm not very familiar with it, nor am I very skilled with make for
> that matter ;)
>
> What would a simple Makefile for a typical elisp package look like? Is
> it common practice to create clean environments like cask does?

This article goes into it https://nullprogram.com/blog/2020/01/22/,
though I understand now that it doesn't do the same thing (or at least
you would have to manually implement something like creating a clean
environment or installing dependencies).



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [ELPA] New Package: phpinspect.el
  2023-08-15 17:45   ` Hugo Thunnissen
  2023-08-15 20:28     ` Philip Kaludercic
@ 2023-08-15 22:03     ` Stefan Monnier
  1 sibling, 0 replies; 8+ messages in thread
From: Stefan Monnier @ 2023-08-15 22:03 UTC (permalink / raw)
  To: Hugo Thunnissen; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1316 bytes --]

> And here I was thinking that I had fixed all of the byte compilation
>  problems.. Turns out it was only working because I byte compiled everything
>  within the same Emacs session.

:-)

> I made some changes and think things should
> be in order now. At least, the following shell script doesn't seem to
> result in any errors:
>
> for file in ./*.el; do
>     cask emacs -batch -L . --eval '(setq byte-compile-error-on-warn t)' -f
> batch-byte-compile "$file" || break
> done

Yay!
And you even saved kittens along the way!!!

> I see some warnings in your log that concern files in the "benchmark" and
> "test" directories.  These files are not required for the package to
> function.  Can these be excluded from the ELPA build somehow?

The log was for a compilation from the Git, not from the ELPA tarball,
but you can indeed exclude them from the ELPA tarball by listing those
elements in the `.elpaignore` file at the root of your package.

You can check the result at http://elpa.gnu.org/devel/phpinspect.html
(once it builds a tarball successfully).

> I have seen some projects use a "lisp" directory for their source
> code, is that the recommended approach for this?

No, it's unrelated.

BTW, here's another set of patches in you're interested.


        Stefan

[-- Attachment #2: phpinspect.patch --]
[-- Type: text/x-diff, Size: 46523 bytes --]

diff --git a/benchmarks/appendage.el b/benchmarks/appendage.el
index 3cb48477b0..6c8a06f880 100644
--- a/benchmarks/appendage.el
+++ b/benchmarks/appendage.el
@@ -25,29 +25,29 @@
 
 (message "20000 appendages using nconc")
 (garbage-collect)
-(benchmark
- 1 '(let (list)
-      (dotimes (i 20000)
-        (setq list (nconc list (list i))))
+(benchmark-run 1
+  (let (list)
+    (dotimes (i 20000)
+      (setq list (nconc list (list i))))
 
-      list))
+    list))
 
 (message "20000 appendages using push + nreverse")
 (garbage-collect)
-(benchmark
- 1 '(let (list)
-      (dotimes (i 20000)
-        (push i list))
+(benchmark-run 1
+  (let (list)
+    (dotimes (i 20000)
+      (push i list))
 
-      (nreverse list)))
+    (nreverse list)))
 
 (message "20000 appendages using rear pointer")
 (garbage-collect)
-(benchmark
- 1 '(let* ((list (cons nil nil))
-           (rear list))
+(benchmark-run 1
+  (let* ((list (cons nil nil))
+         (rear list))
 
-      (dotimes (i 20000)
-        (setq rear (setcdr rear (cons i nil))))
+    (dotimes (i 20000)
+      (setq rear (setcdr rear (cons i nil))))
 
-      (cdr list)))
+    (cdr list)))
diff --git a/benchmarks/parse-file.el b/benchmarks/parse-file.el
index e135ce21c0..1416eedbb8 100644
--- a/benchmarks/parse-file.el
+++ b/benchmarks/parse-file.el
@@ -30,20 +30,20 @@
    (current-buffer)
    (point-max)))
 
-(let ((here (file-name-directory (or load-file-name buffer-file-name))))
+(let ((here (file-name-directory (macroexp-file-name))))
 
   (with-temp-buffer
-    (insert-file-contents (concat here "/Response.php"))
+    (insert-file-contents (expand-file-name "Response.php" here))
 
     (message "Incremental parse (warmup):")
     (phpinspect-with-parse-context (phpinspect-make-pctx :incremental t :bmap (phpinspect-make-bmap))
-      (benchmark 1 '(phpinspect-parse-current-buffer)))
+      (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
     (let ((bmap (phpinspect-make-bmap))
           (bmap2 (phpinspect-make-bmap)))
       (message "Incremental parse:")
       (phpinspect-with-parse-context (phpinspect-make-pctx :incremental t :bmap bmap)
-        (benchmark 1 '(phpinspect-parse-current-buffer)))
+        (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
       (garbage-collect)
 
@@ -52,7 +52,7 @@
                                                            :bmap bmap2
                                                            :previous-bmap bmap
                                                            :edtrack (phpinspect-make-edtrack))
-        (benchmark 1 '(phpinspect-parse-current-buffer)))
+        (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
       (garbage-collect)
 
@@ -61,7 +61,7 @@
                                                            :bmap (phpinspect-make-bmap)
                                                            :previous-bmap bmap2
                                                            :edtrack (phpinspect-make-edtrack))
-        (benchmark 1 '(phpinspect-parse-current-buffer)))
+        (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
       (garbage-collect)
 
@@ -75,13 +75,13 @@
         (message "Incremental parse after buffer edit:")
         ;; Removes closing curly brace of __construct
         (goto-char 9062)
-        (delete-backward-char 1)
+        (delete-char -1)
 
         (garbage-collect)
 
         (phpinspect-edtrack-register-edit edtrack 9061 9061 1)
         (phpinspect-with-parse-context (phpinspect-make-pctx :bmap bmap-after :incremental t :previous-bmap bmap :edtrack edtrack)
-          (benchmark 1 '(phpinspect-parse-current-buffer)))
+          (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
         (phpinspect-edtrack-clear edtrack)
         (insert "{")
@@ -98,22 +98,22 @@
                                                              :incremental t
                                                              :previous-bmap bmap-after
                                                              :edtrack edtrack)
-          (benchmark 1 '(phpinspect-parse-current-buffer)))
+          (benchmark-run 1 (phpinspect-parse-current-buffer)))
 
         ;; (save-current-buffer
         ;;   (profiler-stop)
         ;;   (profiler-report)
-        ;;   (profiler-report-write-profile (concat here "/profile.txt")))
+        ;;   (profiler-report-write-profile (expand-file-name "profile.txt" here)))
         )))
 
   (with-temp-buffer
-    (insert-file-contents (concat here "/Response.php"))
+    (insert-file-contents (expand-file-name "Response.php" here))
 
     (garbage-collect)
     (message "Bare (no token reuse) parse (warmup):")
-    (benchmark 1 '(phpinspect-parse-current-buffer))
+    (benchmark-run 1 (phpinspect-parse-current-buffer))
 
 
     (garbage-collect)
     (message "Bare (no token reuse) parse:")
-    (benchmark 1 '(phpinspect-parse-current-buffer))))
+    (benchmark-run 1 (phpinspect-parse-current-buffer))))
diff --git a/benchmarks/splay-tree.el b/benchmarks/splay-tree.el
index ffd8978f5e..9fc4d9eb38 100644
--- a/benchmarks/splay-tree.el
+++ b/benchmarks/splay-tree.el
@@ -25,49 +25,49 @@
 
 (require 'phpinspect-splayt)
 
-(let ((here (file-name-directory (or load-file-name buffer-file-name)))
+(let ((here (file-name-directory (macroexp-file-name)))
       (tree (phpinspect-make-splayt)))
   (message "Splay tree 10000 insertions:")
   (garbage-collect)
-  (benchmark
-   1 '(dotimes (i 10000)
-        (phpinspect-splayt-insert tree i 'value)))
+  (benchmark-run 1
+    (dotimes (i 10000)
+      (phpinspect-splayt-insert tree i 'value)))
 
   (message "Splay tree 10000 lookups:")
   (garbage-collect)
-  (benchmark
-   1 '(dotimes (i 10000)
-        (phpinspect-splayt-find tree i)))
+  (benchmark-run 1
+    (dotimes (i 10000)
+      (phpinspect-splayt-find tree i)))
 
   (message "Splay tree 10000 items traversal:")
   (garbage-collect)
-  (benchmark
-   1 '(phpinspect-splayt-traverse (i tree)
-        nil))
+  (benchmark-run 1
+    (phpinspect-splayt-traverse (i tree)
+                                nil))
 
   (message "Splay tree 10000 items LR traversal:")
   (garbage-collect)
-  (benchmark
-   1 '(phpinspect-splayt-traverse-lr (i tree)
-        nil)))
+  (benchmark-run 1
+    (phpinspect-splayt-traverse-lr (i tree)
+                                   nil)))
 
 
 (let (map)
   (message "Hashtable 10000 insertions:")
   (garbage-collect)
-  (benchmark
-   1 '(progn
-        (setq map (make-hash-table :test #'eq :size 10000 :rehash-size 1.5))
-        (dotimes (i 10000)
-        (puthash i 'value map))))
+  (benchmark-run
+   1 (progn
+       (setq map (make-hash-table :test #'eq :size 10000 :rehash-size 1.5))
+       (dotimes (i 10000)
+         (puthash i 'value map))))
 
   (message "Hashtable 10000 lookups:")
   (garbage-collect)
-  (benchmark
-   1 '(dotimes (i 10000)
-        (gethash i map)))
+  (benchmark-run 1
+    (dotimes (i 10000)
+      (gethash i map)))
 
   (message "Hashtable 10000 iterations:")
   (garbage-collect)
-  (benchmark
-   1 '(maphash (lambda (k v) nil) map)))
+  (benchmark-run 1
+    (maphash (lambda (_k _v) nil) map)))
diff --git a/phpinspect-parse-context.el b/phpinspect-parse-context.el
index f5c6401e1f..e56e5d1687 100644
--- a/phpinspect-parse-context.el
+++ b/phpinspect-parse-context.el
@@ -36,7 +36,7 @@ parsing. Usually used in combination with
   "Parser Context"
   (incremental nil)
   (meta-iterator nil)
-  (interrupt-threshold (time-convert '(0 0 2000 0))
+  (interrupt-threshold (time-convert '(0 0 2000 0) t)
                        :documentation
                        "After how much time `interrupt-predicate'
 should be polled. This is 2ms by default.")
diff --git a/phpinspect-parser.el b/phpinspect-parser.el
index ccef0e2f04..211dae59a0 100644
--- a/phpinspect-parser.el
+++ b/phpinspect-parser.el
@@ -144,116 +144,116 @@ HANDLERS must be a list of symbols referring to existing
 parser handlers defined using `phpinspect-defhandler'.
 
 DELIMITER-PREDICATE must be a function.  It is passed the last
-parsed token after every handler iteration.  If it evaluates to
+parsed token after every handler iteration.  If it returns
 something other than nil, parsing is deemed completed and the
 loop exits.  An example use case of this is to determine the end
 of a statement.  You can use `phpinspect-terminator-p` as
 delimiter predicate and have parsing stop when the last parsed
 token is \";\", which marks the end of a statement in PHP."
-    (let ((delimiter-predicate (if (symbolp delimiter-predicate)
-                                   `(quote ,delimiter-predicate)
-                                 delimiter-predicate)))
-      `(defsubst ,(phpinspect-parser-func-name name "simple") (buffer max-point &optional skip-over continue-condition &rest _ignored)
-         (with-current-buffer buffer
-           (let* ((tokens (cons ,tree-type nil))
-                  (tokens-rear tokens)
-                  token
-                  (delimiter-predicate (when (functionp ,delimiter-predicate) ,delimiter-predicate)))
-             (when skip-over (forward-char skip-over))
+    (cl-assert (symbolp delimiter-predicate))
+    ;; FIXME: Why `defsubst'?  Since there's a loop in this function,
+    ;; it seems unlikely that the function call overhead will make
+    ;; any measurable performance difference.
+    `(defsubst ,(phpinspect-parser-func-name name "simple") (buffer max-point &optional skip-over continue-condition &rest _ignored)
+       (with-current-buffer buffer
+         (let* ((tokens (cons ,tree-type nil))
+                (tokens-rear tokens)
+                token)
+           (when skip-over (forward-char skip-over))
+           (while (and (< (point) max-point)
+                       (if continue-condition (funcall continue-condition) t)
+                       (not ,(if delimiter-predicate
+                                   `(,delimiter-predicate (car (last tokens)))
+                                 nil)))
+             (cond ,@(mapcar
+                      (lambda (handler)
+                        `((looking-at (,(phpinspect-handler-regexp-func-name handler)))
+                          (setq token (,(phpinspect-handler-func-name handler) (match-string 0) max-point))
+                          (when token
+                            (setq tokens-rear (setcdr tokens-rear (cons token nil))))))
+                      handlers)
+                   (t (forward-char))))
+
+           ;; Return
+           tokens))))
+
+
+  (defun phpinspect-make-incremental-parser-function (name tree-type handlers &optional delimiter-predicate)
+    "Like `phpinspect-make-parser-function', but returned function
+is able to reuse an already parsed tree."
+    (cl-assert (symbolp delimiter-predicate))
+    ;; FIXME: Why `defsubst'?  Since there's a loop in this function,
+    ;; it seems unlikely that the function call overhead will make
+    ;; any measurable performance difference.
+    `(defsubst ,(phpinspect-parser-func-name name "incremental") (context buffer max-point &optional skip-over continue-condition root)
+       (with-current-buffer buffer
+         (let* ((tokens (cons ,tree-type nil))
+                (tokens-rear tokens)
+                (root-start (point))
+                (bmap (phpinspect-pctx-bmap context))
+                (previous-bmap (phpinspect-pctx-previous-bmap context))
+                (edtrack (phpinspect-pctx-edtrack context))
+                (taint-iterator (when edtrack (phpinspect-edtrack-make-taint-iterator edtrack)))
+                (check-interrupt (phpinspect-pctx-interrupt-predicate context))
+
+                ;; Loop variables
+                (start-position)
+                (original-position)
+                (current-end-position)
+                (existing-meta)
+                (delta)
+                (token))
+           (when skip-over (forward-char skip-over))
+           (phpinspect-pctx-save-whitespace context
              (while (and (< (point) max-point)
                          (if continue-condition (funcall continue-condition) t)
-                         (not (if delimiter-predicate
-                                  (funcall delimiter-predicate (car (last tokens)))
-                                nil)))
-               (cond ,@(mapcar
+                         (not ,(if delimiter-predicate
+                                   `(,delimiter-predicate (car (last tokens)))
+                                 nil)))
+               (when check-interrupt
+                 (phpinspect-pctx-check-interrupt context))
+
+               (setq start-position (point))
+               (cond ((and previous-bmap edtrack
+                           (setq existing-meta
+                                 (phpinspect-bmap-token-starting-at
+                                  previous-bmap
+                                  (setq original-position
+                                        (phpinspect-edtrack-original-position-at-point edtrack start-position))))
+                           (not (or (phpinspect-root-p (phpinspect-meta-token existing-meta))
+                                    (phpinspect-taint-iterator-token-is-tainted-p taint-iterator existing-meta))))
+                      (setq delta (- start-position original-position)
+                            current-end-position (+ (phpinspect-meta-end existing-meta) delta)
+                            token (phpinspect-meta-token existing-meta))
+
+                      ;;(message "Reusing token  %s at point %s" (phpinspect-meta-string existing-meta) (point))
+                      ;; Re-register existing token
+                      (phpinspect-bmap-overlay
+                       bmap previous-bmap existing-meta delta
+                       (phpinspect-pctx-consume-whitespace context))
+
+                      (goto-char current-end-position)
+
+                      ;; Skip over whitespace after so that we don't do a full
+                      ;; run down all of the handlers during the next iteration
+                      (when (looking-at (phpinspect-handler-regexp whitespace))
+                        (,(phpinspect-handler-func-name 'whitespace) (match-string 0))))
+                     ,@(mapcar
                         (lambda (handler)
                           `((looking-at (,(phpinspect-handler-regexp-func-name handler)))
                             (setq token (,(phpinspect-handler-func-name handler) (match-string 0) max-point))
                             (when token
-                              (setq tokens-rear (setcdr tokens-rear (cons token nil))))))
+                              (phpinspect-pctx-register-token context token start-position (point)))))
                         handlers)
-                     (t (forward-char))))
-
-             ;; Return
-             tokens)))))
-
-
-  (defun phpinspect-make-incremental-parser-function (name tree-type handlers &optional delimiter-predicate)
-    "Like `phpinspect-make-parser-function', but returned function
-is able to reuse an already parsed tree."
-    (let ((delimiter-predicate (if (symbolp delimiter-predicate)
-                                   `(quote ,delimiter-predicate)
-                                 delimiter-predicate)))
-      `(defsubst ,(phpinspect-parser-func-name name "incremental") (context buffer max-point &optional skip-over continue-condition root)
-         (with-current-buffer buffer
-           (let* ((tokens (cons ,tree-type nil))
-                  (tokens-rear tokens)
-                  (root-start (point))
-                  (bmap (phpinspect-pctx-bmap context))
-                  (previous-bmap (phpinspect-pctx-previous-bmap context))
-                  (edtrack (phpinspect-pctx-edtrack context))
-                  (taint-iterator (when edtrack (phpinspect-edtrack-make-taint-iterator edtrack)))
-                  (check-interrupt (phpinspect-pctx-interrupt-predicate context))
-
-                  ;; Loop variables
-                  (start-position)
-                  (original-position)
-                  (current-end-position)
-                  (existing-meta)
-                  (delta)
-                  (token)
-                  (delimiter-predicate (when (functionp ,delimiter-predicate) ,delimiter-predicate)))
-             (when skip-over (forward-char skip-over))
-             (phpinspect-pctx-save-whitespace context
-               (while (and (< (point) max-point)
-                           (if continue-condition (funcall continue-condition) t)
-                           (not (if delimiter-predicate
-                                    (funcall delimiter-predicate (car (last tokens)))
-                                  nil)))
-                 (when check-interrupt
-                   (phpinspect-pctx-check-interrupt context))
-
-                 (setq start-position (point))
-                 (cond ((and previous-bmap edtrack
-                             (setq existing-meta
-                                   (phpinspect-bmap-token-starting-at
-                                    previous-bmap
-                                    (setq original-position
-                                          (phpinspect-edtrack-original-position-at-point edtrack start-position))))
-                             (not (or (phpinspect-root-p (phpinspect-meta-token existing-meta))
-                                      (phpinspect-taint-iterator-token-is-tainted-p taint-iterator existing-meta))))
-                        (setq delta (- start-position original-position)
-                              current-end-position (+ (phpinspect-meta-end existing-meta) delta)
-                              token (phpinspect-meta-token existing-meta))
-
-                        ;;(message "Reusing token  %s at point %s" (phpinspect-meta-string existing-meta) (point))
-                        ;; Re-register existing token
-                        (phpinspect-bmap-overlay
-                         bmap previous-bmap existing-meta delta
-                         (phpinspect-pctx-consume-whitespace context))
-
-                        (goto-char current-end-position)
-
-                        ;; Skip over whitespace after so that we don't do a full
-                        ;; run down all of the handlers during the next iteration
-                        (when (looking-at (phpinspect-handler-regexp whitespace))
-                          (,(phpinspect-handler-func-name 'whitespace) (match-string 0))))
-                       ,@(mapcar
-                          (lambda (handler)
-                            `((looking-at (,(phpinspect-handler-regexp-func-name handler)))
-                              (setq token (,(phpinspect-handler-func-name handler) (match-string 0) max-point))
-                              (when token
-                                (phpinspect-pctx-register-token context token start-position (point)))))
-                          handlers)
-                       (t (forward-char)))
-                 (when token
-                   (setq tokens-rear (setcdr tokens-rear (cons token nil)))
-                   (setq token nil))))
-             (when root
-               (phpinspect-pctx-register-token context tokens root-start (point)))
-
-             ;; Return
-             tokens)))))
+                     (t (forward-char)))
+               (when token
+                 (setq tokens-rear (setcdr tokens-rear (cons token nil)))
+                 (setq token nil))))
+           (when root
+             (phpinspect-pctx-register-token context tokens root-start (point)))
+
+           ;; Return
+           tokens))))
 
   (cl-defstruct (phpinspect-parser (:constructor phpinspect-make-parser))
     (name 'root
diff --git a/phpinspect-pipeline.el b/phpinspect-pipeline.el
index c9c7cf2085..4e45150807 100644
--- a/phpinspect-pipeline.el
+++ b/phpinspect-pipeline.el
@@ -275,6 +275,7 @@ directories."
                (setq key (pop parameters)
                      value (pop parameters))
                (setq key (intern (string-replace ":with-" ":" (symbol-name key))))
+               ;; FIXME: There's an O(N²) complexity here :-(
                (setq construct-params (nconc construct-params (list key value)))))
            (push (apply #'phpinspect--make-pipeline-step `(,@construct-params :name ,name))
                  steps)))
diff --git a/phpinspect-splayt.el b/phpinspect-splayt.el
index 339bf3739a..15eac4e6f4 100644
--- a/phpinspect-splayt.el
+++ b/phpinspect-splayt.el
@@ -279,13 +279,15 @@ apeared to be a little more performant than using `let'."
        nil)))
 
 (defmacro phpinspect-splayt-traverse (place-and-splayt &rest body)
-  "Traverse splay tree in cadr of PLACE-AND-SPLAYT, executing BODY.
+  "Traverse SPLAYT, executing BODY.
 
-The car of PLACE-AND-SPLAYT is assigned the value of each node.
+The PLACE is assigned the value of each node.
 
-Traversal is breadth-first to take advantage of the splay trees
+Traversal is breadth-first to take advantage of the splay trees'
 main benefit: the most accessed interval of keys is likely to be
-near the top of the tee."
+near the top of the tee.
+
+(fn (PLACE SPLAYT) BODY...)"
   (declare (indent 1))
  (let* ((current (gensym))
          (code `(phpinspect-splayt-node-traverse
@@ -293,8 +295,15 @@ near the top of the tee."
                   (setf ,(car place-and-splayt) (phpinspect-splayt-node-value ,current))
                   ,@body)))
     (if (symbolp (car place-and-splayt))
+        ;; FIXME: You first use `let' to "declare" the var and then
+        ;; initialize it inside `code'.  This is marginally inefficient,
+        ;; but more importantly it means that if the var is not used in
+        ;; the rest of `code' the compiler will either complain that the var
+        ;; is not used or (if it starts with an underscore) complain that
+        ;; it's used!
         `(let (,(car place-and-splayt))
            ,code)
+      ;; FIXME: This branch is never used!
       code)))
 
 (defmacro phpinspect-splayt-node-traverse-lr (place-and-node &rest body)
diff --git a/phpinspect-util.el b/phpinspect-util.el
index 3c04f7f7fb..05c1f11dcc 100644
--- a/phpinspect-util.el
+++ b/phpinspect-util.el
@@ -51,7 +51,8 @@ PHP. Used to optimize string comparison.")
 
   (inline-quote
    (progn
-     (add-to-list 'phpinspect-log-groups (cons (or load-file-name buffer-file-name) ,group) nil #'equal))))
+     (add-to-list 'phpinspect-log-groups
+                  (cons (macroexp-file-name) ,group)))))
 
 (defun phpinspect-log-group-enabled-p (group)
   (seq-find (lambda (cons)
@@ -61,7 +62,8 @@ PHP. Used to optimize string comparison.")
 (phpinspect--declare-log-group 'bam)
 
 (defmacro phpinspect--log (&rest args)
-  (let ((log-group (alist-get (or load-file-name buffer-file-name) phpinspect-log-groups nil nil #'string=)))
+  (let ((log-group (alist-get (macroexp-file-name)
+                              phpinspect-log-groups nil nil #'string=)))
     `(when (and phpinspect--debug
                 (or (not phpinspect-enabled-log-groups)
                     ,(when log-group
@@ -77,7 +79,8 @@ PHP. Used to optimize string comparison.")
 (defun phpinspect-filter-logs (group-name)
   (interactive (list (completing-read "Log group: "
                                       (mapcar (lambda (g) (symbol-name (cdr g)))
-                                              phpinspect-log-groups) nil t)))
+                                              phpinspect-log-groups)
+                                      nil t)))
   (add-to-list 'phpinspect-enabled-log-groups (intern group-name)))
 
 (defun phpinspect-unfilter-logs ()
diff --git a/phpinspect.el b/phpinspect.el
index 6785f63e38..280193423e 100644
--- a/phpinspect.el
+++ b/phpinspect.el
@@ -173,57 +173,57 @@ Example configuration if you already have a completion
 UI (Company, Corfu) setup that can take advantage of completion
 at point (capf) functions:
 
-(defun my-php-personal-hook ()
-  ;; Shortcut to add use statements for classes you use.
-  (define-key php-mode-map (kbd \"C-c u\") #\\='phpinspect-fix-imports)
-
-  ;; Shortcuts to quickly search/open files of PHP classes.
-  ;; You can make these local to php-mode, but making them global
-  ;; like this makes them work in other modes/filetypes as well, which
-  ;; can be handy when jumping between templates, config files and PHP code.
-  (global-set-key (kbd \"C-c a\") #\\='phpinspect-find-class-file)
-  (global-set-key (kbd \"C-c c\") #\\='phpinspect-find-own-class-file)
-
-  ;; Enable phpinspect-mode
-  (phpinspect-mode))
-
-(add-hook 'php-mode-hook #'my-php-personal-hook)
+    (defun my-php-personal-hook ()
+      ;; Shortcut to add use statements for classes you use.
+      (define-key php-mode-map (kbd \"C-c u\") #\\='phpinspect-fix-imports)
+    
+      ;; Shortcuts to quickly search/open files of PHP classes.
+      ;; You can make these local to php-mode, but making them global
+      ;; like this makes them work in other modes/filetypes as well, which
+      ;; can be handy when jumping between templates, config files and PHP code.
+      (global-set-key (kbd \"C-c a\") #\\='phpinspect-find-class-file)
+      (global-set-key (kbd \"C-c c\") #\\='phpinspect-find-own-class-file)
+    
+      ;; Enable phpinspect-mode
+      (phpinspect-mode))
+    
+    (add-hook \\='php-mode-hook #\\='my-php-personal-hook)
 
 
 Example configuration for `company-mode':
 
-  (defun my-php-personal-hook ()
-    ;; Assuming you already have company-mode enabled, these settings
-    ;; add some IDE-like flair to it. This is of course not required, do
-    ;; with it what you like.
-    (setq-local company-minimum-prefix-length 0)
-    (setq-local company-tooltip-align-annotations t)
-    (setq-local company-idle-delay 0.1)
-
-    ;; If you don't have company-mode enabled by default, uncomment this line:
-    ;; (company-mode)
-
-    ;; By default, phpinspect-mode adds itself as a backend to
-    ;; the `company-backends' of the current buffer. You can completely
-    ;; disable all other backends with the statement below.
-    (setq-local company-backends '(phpinspect-company-backend))
-
-    ;; Shortcut to add use statements for classes you use.
-    (define-key php-mode-map (kbd \"C-c u\") 'phpinspect-fix-imports)
-
-    ;; Shortcuts to quickly search/open files of PHP classes.
-    ;; You can make these local to php-mode, but making them global
-    ;; like this makes them work in other modes/filetypes as well, which
-    ;; can be handy when jumping between templates, config files and PHP code.
-    (global-set-key (kbd \"C-c a\") 'phpinspect-find-class-file)
-    (global-set-key (kbd \"C-c c\") 'phpinspect-find-own-class-file)
-
-    ;; Enable phpinspect-mode
-    (phpinspect-mode))
-
-  (add-hook 'php-mode-hook #'my-php-personal-hook)
-
-;; End example configuration."
+    (defun my-php-personal-hook ()
+      ;; Assuming you already have company-mode enabled, these settings
+      ;; add some IDE-like flair to it. This is of course not required, do
+      ;; with it what you like.
+      (setq-local company-minimum-prefix-length 0)
+      (setq-local company-tooltip-align-annotations t)
+      (setq-local company-idle-delay 0.1)
+    
+      ;; If you don't have company-mode enabled by default, uncomment this line:
+      ;; (company-mode)
+    
+      ;; By default, phpinspect-mode adds itself as a backend to
+      ;; the `company-backends' of the current buffer. You can completely
+      ;; disable all other backends with the statement below.
+      (setq-local company-backends \\='(phpinspect-company-backend))
+    
+      ;; Shortcut to add use statements for classes you use.
+      (define-key php-mode-map (kbd \"C-c u\") #\\='phpinspect-fix-imports)
+    
+      ;; Shortcuts to quickly search/open files of PHP classes.
+      ;; You can make these local to php-mode, but making them global
+      ;; like this makes them work in other modes/filetypes as well, which
+      ;; can be handy when jumping between templates, config files and PHP code.
+      (global-set-key (kbd \"C-c a\") #\\='phpinspect-find-class-file)
+      (global-set-key (kbd \"C-c c\") #\\='phpinspect-find-own-class-file)
+    
+      ;; Enable phpinspect-mode
+      (phpinspect-mode))
+    
+    (add-hook \\='php-mode-hook #\\='my-php-personal-hook)
+
+    ;; End example configuration."
   :after-hook (phpinspect--mode-function))
 
 (defun phpinspect--suggest-at-point ()
diff --git a/test/phpinspect-test-env.el b/test/phpinspect-test-env.el
index 6bb0aef0da..8325721af8 100644
--- a/test/phpinspect-test-env.el
+++ b/test/phpinspect-test-env.el
@@ -2,6 +2,7 @@
 
 (require 'phpinspect-worker)
 (require 'phpinspect-cache)
+(require 'phpinspect-parser)
 
 ;; Make sure that the worker is running. TODO: fully encapsulate the worker the
 ;; data types that are used in tests so that we don't depend on some global
@@ -10,18 +11,12 @@
 (phpinspect-purge-cache)
 
 (defvar phpinspect-test-directory
-  (file-name-directory
-   (or load-file-name
-       buffer-file-name))
+  (file-name-directory (macroexp-file-name))
   "Directory that phpinspect tests reside in.")
 
 
 (defvar phpinspect-test-php-file-directory
-  (concat
-   (file-name-directory
-    (or load-file-name
-        buffer-file-name))
-   "/fixtures")
+  (expand-file-name "fixtures" phpinspect-test-directory)
   "Directory with syntax trees of example PHP files.")
 
 (defun phpinspect-test-read-fixture-data (name)
@@ -32,7 +27,7 @@
 (defun phpinspect-test-read-fixture-serialization (name)
   (with-temp-buffer
     (insert-file-contents-literally (concat phpinspect-test-php-file-directory "/" name ".eld"))
-    (eval (read (current-buffer)))))
+    (eval (read (current-buffer)) t)))
 
 (defun phpinspect-test-parse-fixture-code (name)
   (phpinspect-parse-file
diff --git a/test/phpinspect-test.el b/test/phpinspect-test.el
index 74435e30d1..aa82c488e3 100644
--- a/test/phpinspect-test.el
+++ b/test/phpinspect-test.el
@@ -27,8 +27,8 @@
 (require 'phpinspect)
 
 (require 'phpinspect-test-env
-         (concat (file-name-directory (or load-file-name buffer-file-name))
-                 "phpinspect-test-env.el"))
+         (expand-file-name "phpinspect-test-env.el"
+                           (file-name-directory (macroexp-file-name))))
 
 (ert-deftest phpinspect-get-variable-type-in-block ()
   (let* ((code "class Foo { function a(\\Thing $baz) { $foo = new \\DateTime(); $bar = $foo; Whatever comes after don't matter.")
diff --git a/test/test-autoload.el b/test/test-autoload.el
index 7f51a22020..42eb08db45 100644
--- a/test/test-autoload.el
+++ b/test/test-autoload.el
@@ -27,6 +27,7 @@
 (require 'ert)
 (require 'phpinspect-fs)
 (require 'phpinspect-autoload)
+(require 'phpinspect-resolvecontext)
 
 (ert-deftest phpinspect-filename-to-typename ()
   (should (eq (phpinspect-intern-name "\\Foo\\Bar") (phpinspect-filename-to-typename "src/" "src/Foo////////Bar.php")))
@@ -36,6 +37,7 @@
 
 (ert-deftest phpinspect-find-composer-json-files ()
   (let* ((fs (phpinspect-make-virtual-fs))
+         ;; FIXME: `autoloader' is not used?
          (autoloader (phpinspect-make-autoloader
                       :fs fs
                       :project-root-resolver (lambda () "/root")
@@ -57,12 +59,13 @@
 
     (let ((sorter (lambda (file1 file2) (string-lessp (cdr file1) (cdr file2)))))
 
-    (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))))))
+      (should (equal (sort (copy-sequence
+                            '((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-autoload-composer-json-iterator ()
   (let* ((fs (phpinspect-make-virtual-fs))
diff --git a/test/test-bmap.el b/test/test-bmap.el
index 613efaecfd..e0c17c7f52 100644
--- a/test/test-bmap.el
+++ b/test/test-bmap.el
@@ -1,3 +1,4 @@
+;; -*- lexical-binding: t; -*-
 
 (require 'phpinspect-bmap)
 
@@ -6,7 +7,6 @@
         (bmap2 (phpinspect-make-bmap))
         (bmap3 (phpinspect-make-bmap))
         (token '(:token))
-        (token1 '(:token1))
         (token2 '(:token2))
         (token3 '(:token3)))
 
@@ -69,13 +69,15 @@
     (phpinspect-bmap-register bmap 9  20 '(:node3))
     (phpinspect-bmap-register bmap 21  44 '(:node4))
 
-    (setq result (phpinspect-bmap-tokens-overlapping bmap 22))
-    (should (equal '((:node4) (:node2) (:node1)) (mapcar #'phpinspect-meta-token result)))))
+    (let ((result (phpinspect-bmap-tokens-overlapping bmap 22)))
+      (should (equal '((:node4) (:node2) (:node1))
+                     (mapcar #'phpinspect-meta-token result))))))
 
 (ert-deftest phpinspect-bmap-tokens-overlapping-overlayed ()
   (let ((bmap (phpinspect-make-bmap))
         (bmap2 (phpinspect-make-bmap))
-        (bmap3 (phpinspect-make-bmap)))
+        (bmap3 (phpinspect-make-bmap))
+        result)
     (phpinspect-bmap-register bmap 9 200 '(:token1))
     (phpinspect-bmap-register bmap 20 200 '(:token2))
     (phpinspect-bmap-register bmap 9 20 '(:token3))
diff --git a/test/test-buffer.el b/test/test-buffer.el
index 5d98719418..64442f9814 100644
--- a/test/test-buffer.el
+++ b/test/test-buffer.el
@@ -27,12 +27,11 @@
 (require 'phpinspect-parser)
 (require 'phpinspect-buffer)
 (require 'phpinspect-test-env
-         (concat (file-name-directory (or load-file-name buffer-file-name))
-                 "phpinspect-test-env.el"))
+         (expand-file-name "phpinspect-test-env.el"
+                           (file-name-directory (macroexp-file-name))))
 
 (ert-deftest phpinspect-buffer-region-lookups ()
-  (let* ((parsed)
-         (class))
+  (let* ((parsed))
     (with-temp-buffer
       (insert-file-contents (concat phpinspect-test-php-file-directory "/NamespacedClass.php"))
       (setq phpinspect-current-buffer
@@ -54,12 +53,11 @@
 (ert-deftest phpinspect-parse-buffer-no-current ()
   "Confirm that the parser is still functional with
 `phpinspect-current-buffer' unset."
-  (let*((buffer)
-        (parsed))
-    (with-temp-buffer
-      (should-not phpinspect-current-buffer)
-      (insert-file-contents (concat phpinspect-test-php-file-directory "/NamespacedClass.php"))
-      (setq parsed (phpinspect-parse-current-buffer)))
+  (let* ((parsed
+          (with-temp-buffer
+            (should-not phpinspect-current-buffer)
+            (insert-file-contents (expand-file-name "NamespacedClass.php" phpinspect-test-php-file-directory))
+            (phpinspect-parse-current-buffer))))
 
     (should (cdr parsed))))
 
diff --git a/test/test-edtrack.el b/test/test-edtrack.el
index b12ddc8360..adc2391578 100644
--- a/test/test-edtrack.el
+++ b/test/test-edtrack.el
@@ -106,8 +106,7 @@
     (should-not (phpinspect-taint-iterator-region-is-tainted-p iterator 30 35))))
 
 (ert-deftest phpinspect-edtrack-taint-overlapping-edits ()
-  (let ((track (phpinspect-make-edtrack))
-        iterator)
+  (let ((track (phpinspect-make-edtrack)))
     (phpinspect-edtrack-register-edit track 10 20 5)
 
     (should (equal (list (cons 10 15)) (phpinspect-edtrack-taint-pool track)))
diff --git a/test/test-index.el b/test/test-index.el
index 232cc1c9ae..bd2c2cde2c 100644
--- a/test/test-index.el
+++ b/test/test-index.el
@@ -24,6 +24,10 @@
 ;;; Code:
 (require 'ert)
 (require 'phpinspect-index)
+(require 'phpinspect-parse-context)
+(require 'phpinspect-bmap)
+(require 'phpinspect-parser)
+(require 'phpinspect-test-env)
 
 (ert-deftest phpinspect-index-static-methods ()
   (let* ((class-tokens
@@ -92,8 +96,9 @@ return StaticThing::create(new ThingFactory())->makeThing((((new Potato())->anti
     (should (equal
              (mapcar #'phpinspect-intern-name
                      (sort
-                      '("Cheese" "Bacon" "Ham" "Bagel" "Monkey" "ExtendedThing"
-                        "StaticThing" "Thing" "ThingFactory" "Potato" "OtherThing")
+                      (copy-sequence
+                       '("Cheese" "Bacon" "Ham" "Bagel" "Monkey" "ExtendedThing"
+                         "StaticThing" "Thing" "ThingFactory" "Potato" "OtherThing"))
                       #'string<))
              (sort used-types (lambda (s1 s2) (string< (symbol-name s1) (symbol-name s2))))))))
 
@@ -172,7 +177,7 @@ return StaticThing::create(new ThingFactory())->makeThing((((new Potato())->anti
   (let* ((pctx (phpinspect-make-pctx :incremental t :bmap (phpinspect-make-bmap)))
          (tree))
     (with-temp-buffer
-      (insert-file-contents (concat phpinspect-test-php-file-directory "/IndexClass1.php"))
+      (insert-file-contents (expand-file-name "IndexClass1.php" phpinspect-test-php-file-directory))
       (setf (phpinspect-pctx-bmap pctx) (phpinspect-make-bmap))
       (phpinspect-with-parse-context pctx (setq tree (phpinspect-parse-current-buffer))))
     (let* ((index1 (phpinspect--index-tokens tree
diff --git a/test/test-parse-context.el b/test/test-parse-context.el
index a9d69c2384..4fffdc4e61 100644
--- a/test/test-parse-context.el
+++ b/test/test-parse-context.el
@@ -26,6 +26,7 @@
 (require 'ert)
 (require 'phpinspect-parse-context)
 (require 'phpinspect-meta)
+(require 'phpinspect-bmap)
 
 (ert-deftest phpinspect-pctx-cancel ()
   (let ((meta (phpinspect-make-meta nil 10 20 "    " 'token 'overlay nil))
diff --git a/test/test-parser.el b/test/test-parser.el
index a7b3660d67..198998419e 100644
--- a/test/test-parser.el
+++ b/test/test-parser.el
@@ -24,20 +24,17 @@
 ;;; Code:
 
 (require 'phpinspect-parser)
+(require 'phpinspect-index)
+(require 'phpinspect-test-env)
 
+;; FIXME: Duplicate in phpinspect-test-env.el!
 (defvar phpinspect-test-directory
-  (file-name-directory
-   (or load-file-name
-       buffer-file-name))
+  (file-name-directory (macroexp-file-name))
   "Directory that phpinspect tests reside in.")
 
 
 (defvar phpinspect-test-php-file-directory
-  (concat
-   (file-name-directory
-    (or load-file-name
-        buffer-file-name))
-   "/fixtures")
+  (expand-file-name "fixtures" phpinspect-test-directory)
   "Directory with syntax trees of example PHP files.")
 
 
diff --git a/test/test-pipeline.el b/test/test-pipeline.el
index f9c1ed04a3..d7285825c1 100644
--- a/test/test-pipeline.el
+++ b/test/test-pipeline.el
@@ -25,14 +25,15 @@
 
 (require 'phpinspect-pipeline)
 
+(defun phpinspect--correct-the-record (input)
+  (phpinspect-pipeline-emit
+   (format "It's not %s, but GNU/%s" input input)))
+
 (ert-deftest phpinspect-pipeline ()
-  (let (result error thread)
-    (defun correct-the-record (input)
-      (phpinspect-pipeline-emit
-       (format "It's not %s, but GNU/%s" input input)))
+  (let (result error)
 
     (phpinspect-pipeline (list "Linux" "Emacs")
-      :into correct-the-record
+      :into phpinspect--correct-the-record
       :async (lambda (res err)
                (setq result res
                      error err)))
@@ -44,13 +45,14 @@
                    result))
     (should-not error)))
 
+(defun phpinspect--aah-it-broke (input)
+  (signal 'it-brokey input))
+
 (ert-deftest phpinspect-pipeline-error ()
-  (defun aah-it-broke (input)
-    (signal 'it-brokey input))
 
   (let (result error)
     (phpinspect-pipeline (list "Holy smokey")
-      :into aah-it-broke
+      :into phpinspect--aah-it-broke
       :async (lambda (res err)
                (setq result res
                      error err)))
diff --git a/test/test-project.el b/test/test-project.el
index b421eebc7c..0b03df5eb2 100644
--- a/test/test-project.el
+++ b/test/test-project.el
@@ -35,11 +35,11 @@
 (ert-deftest phpinspect-project-watch-file-and-purge ()
   (let* ((root (make-temp-file "phpinspect-test" 'dir))
          (fs (phpinspect-make-fs))
-         (worker (phpinspect-make-worker))
+         (_worker (phpinspect-make-worker))
          (watch-file (concat root "/watch1"))
          (project (phpinspect--make-project :fs fs :root root)))
     (phpinspect-project-watch-file project watch-file
-                                    (lambda (&rest ignored)))
+                                   #'ignore)
 
     (phpinspect-project-purge project)
 
diff --git a/test/test-resolvecontext.el b/test/test-resolvecontext.el
index 894f684080..72888cd845 100644
--- a/test/test-resolvecontext.el
+++ b/test/test-resolvecontext.el
@@ -1,5 +1,8 @@
+;; -*- lexical-binding: t; -*-
 
 (require 'phpinspect-resolvecontext)
+(require 'phpinspect)
+(require 'phpinspect-test-env)
 
 (ert-deftest phinspect-get-resolvecontext ()
   (let* ((ctx (phpinspect-make-pctx :incremental t :bmap (phpinspect-make-bmap)))
@@ -29,7 +32,7 @@ class TestClass {
 
 (ert-deftest phpinspect-type-resolver-for-resolvecontext ()
   (with-temp-buffer
-    (insert-file-contents (concat phpinspect-test-php-file-directory "/IncompleteClass.php"))
+    (insert-file-contents (expand-file-name "IncompleteClass.php" phpinspect-test-php-file-directory))
     (let* ((bmap (phpinspect-parse-string-to-bmap (buffer-string)))
            (resolvecontext (phpinspect-get-resolvecontext bmap (point-max)))
            (type-resolver (phpinspect--make-type-resolver-for-resolvecontext
@@ -81,8 +84,8 @@ class TestClass {
 
 (ert-deftest phpinspect-type-resolver-for-resolvecontext-multiple-namespace-blocks ()
   (with-temp-buffer
-    (insert-file-contents (concat phpinspect-test-php-file-directory "/IncompleteClassMultipleNamespaces.php"))
-    (let* ((bmap (phpinspect-parse-string-to-bmap (buffer-string)))
+    (insert-file-contents (expand-file-name "IncompleteClassMultipleNamespaces.php" phpinspect-test-php-file-directory))
+    (let* ((_bmap (phpinspect-parse-string-to-bmap (buffer-string)))
            (resolvecontext (phpinspect--get-resolvecontext
                           (phpinspect-test-read-fixture-data
                            "IncompleteClassMultipleNamespaces")))
diff --git a/test/test-splayt.el b/test/test-splayt.el
index 07f37c6e96..04db40f6fa 100644
--- a/test/test-splayt.el
+++ b/test/test-splayt.el
@@ -71,7 +71,7 @@
     (should (string= "twelve" (phpinspect-splayt-find tree 12)))
     (should (string= "eleven" (phpinspect-splayt-find tree 11)))
 
-    (let ((expected (sort '("nine" "three" "eleven" "eight" "twelve" "four" "one") #'string-lessp))
+    (let ((expected (sort (copy-sequence '("nine" "three" "eleven" "eight" "twelve" "four" "one")) #'string-lessp))
           (result))
 
       (phpinspect-splayt-traverse (item tree)
@@ -91,7 +91,7 @@
     (phpinspect-splayt-insert tree 4 "four")
     (phpinspect-splayt-insert tree 1 "one")
 
-    (let ((expected (sort '("nine" "three" "eleven" "eight" "twelve" "four" "one") #'string-lessp))
+    (let ((expected (sort (copy-sequence '("nine" "three" "eleven" "eight" "twelve" "four" "one")) #'string-lessp))
           (result))
 
       (phpinspect-splayt-traverse (item tree)
@@ -161,7 +161,7 @@
     (phpinspect-splayt-insert tree 1 "one")
 
 
-    (should (equal (sort '("eight" "nine" "eleven" "twelve") #'string-lessp)
+    (should (equal (sort (copy-sequence '("eight" "nine" "eleven" "twelve")) #'string-lessp)
                    (sort (phpinspect-splayt-find-all-after tree 7) #'string-lessp)))))
 
 (ert-deftest phpinspect-splayt-to-list ()
diff --git a/test/test-toc.el b/test/test-toc.el
index 99d758290b..4843da3b99 100644
--- a/test/test-toc.el
+++ b/test/test-toc.el
@@ -2,6 +2,7 @@
 
 (require 'phpinspect-toc)
 (require 'phpinspect-splayt)
+(require 'phpinspect-meta)
 
 (ert-deftest phpinspect-make-toc ()
   (let ((tokens (phpinspect-make-splayt))
diff --git a/test/test-type.el b/test/test-type.el
index 47b212e544..d5933cb93a 100644
--- a/test/test-type.el
+++ b/test/test-type.el
@@ -23,6 +23,8 @@
 
 ;;; Code:
 
+(require 'phpinspect-type)
+
 (ert-deftest phpinspect--resolve-late-static-binding ()
   (let* ((sets '(("\\bool" . "\\bool")
                  ("\\static" . "\\AType")
diff --git a/test/test-util.el b/test/test-util.el
index c10e7bd360..72ce39f966 100644
--- a/test/test-util.el
+++ b/test/test-util.el
@@ -23,6 +23,8 @@
 
 ;;; Code:
 
+(require 'phpinspect-util)
+
 (ert-deftest phpinspect--pattern ()
   (let* ((a "a")
          (pattern1 (phpinspect--make-pattern :m `(,a) :m * :m "b"))
diff --git a/test/util/generate-test-data.el b/test/util/generate-test-data.el
index 2211fcac97..a181080ecc 100644
--- a/test/util/generate-test-data.el
+++ b/test/util/generate-test-data.el
@@ -3,12 +3,10 @@
 (require 'phpinspect-index)
 (require 'phpinspect-serialize)
 
-(let ((here (file-name-directory
-             (or load-file-name
-                 buffer-file-name)))
+(let ((here (file-name-directory (macroexp-file-name)))
       (print-length 1000)
       (print-level 1000))
-  (dolist (file (directory-files (concat here "/../fixtures" ) t "\\.php\\'"))
+  (dolist (file (directory-files (expand-file-name "../fixtures" here) t "\\.php\\'"))
     (with-temp-buffer
       (insert-file-contents-literally file)
       (let ((result (phpinspect-parse-current-buffer)))

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2023-08-15 22:03 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-07 20:22 [ELPA] New Package: phpinspect.el Hugo Thunnissen
2023-08-12  4:56 ` Stefan Monnier
2023-08-12  5:04   ` Stefan Monnier
2023-08-15 17:45   ` Hugo Thunnissen
2023-08-15 20:28     ` Philip Kaludercic
2023-08-15 21:33       ` Hugo Thunnissen
2023-08-15 21:56         ` Philip Kaludercic
2023-08-15 22:03     ` Stefan Monnier

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).