[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phpinspect 0bc9e795b2 043/126: Fix tests and patch bugs
From: |
ELPA Syncer |
Subject: |
[elpa] externals/phpinspect 0bc9e795b2 043/126: Fix tests and patch bugs that came to light in the process |
Date: |
Sat, 12 Aug 2023 00:58:40 -0400 (EDT) |
branch: externals/phpinspect
commit 0bc9e795b2d37551268ccdc7ac021dd535bffc89
Author: Hugo Thunnissen <devel@hugot.nl>
Commit: Hugo Thunnissen <devel@hugot.nl>
Fix tests and patch bugs that came to light in the process
---
phpinspect-class.el | 81 +++++++-------
phpinspect-index.el | 2 +-
phpinspect-serialize.el | 105 +++++++++++++++++++
phpinspect-type.el | 7 ++
phpinspect.el | 64 +++---------
test/fixtures/IndexClass1-indexed.eld | 2 +-
test/fixtures/IndexClass2-indexed.eld | 2 +-
test/phpinspect-test.el | 192 +++++++++++++++++++---------------
test/util/generate-test-data.el | 5 +-
9 files changed, 287 insertions(+), 173 deletions(-)
diff --git a/phpinspect-class.el b/phpinspect-class.el
index dba40450df..c524ad128b 100644
--- a/phpinspect-class.el
+++ b/phpinspect-class.el
@@ -106,28 +106,36 @@
(cl-defmethod phpinspect--class-get-static-method ((class phpinspect--class)
method-name)
(gethash method-name (phpinspect--class-static-methods class)))
-(cl-defmethod phpinspect--class-set-method ((class phpinspect--class)
- (method phpinspect--function))
- (phpinspect--log "Adding method by name %s to class"
- (phpinspect--function-name method))
+(cl-defmethod phpinspect--add-method-copy-to-map
+ ((map hash-table)
+ (class-name phpinspect--type)
+ (method phpinspect--function))
(setq method (phpinspect--copy-function method))
- (when (phpinspect--type-does-late-static-binding
- (phpinspect--function-return-type method))
+ (setf (phpinspect--function-return-type method)
+ (phpinspect--resolve-late-static-binding
+ (phpinspect--function-return-type method)
+ class-name))
- (setf (phpinspect--function-return-type method)
- (alist-get 'class-name (phpinspect--class-index class))))
+ (puthash (phpinspect--function-name-symbol method)
+ method
+ map))
- (puthash (phpinspect--function-name-symbol method)
- method
- (phpinspect--class-methods class)))
+(cl-defmethod phpinspect--class-set-method ((class phpinspect--class)
+ (method phpinspect--function))
+ (phpinspect--log "Adding method by name %s to class"
+ (phpinspect--function-name method))
+ (phpinspect--add-method-copy-to-map
+ (phpinspect--class-methods class)
+ (alist-get 'class-name (phpinspect--class-index class))
+ method))
(cl-defmethod phpinspect--class-set-static-method ((class phpinspect--class)
(method
phpinspect--function))
- (setq method (phpinspect--copy-function method))
- (puthash (phpinspect--function-name-symbol method)
- method
- (phpinspect--class-static-methods class)))
+ (phpinspect--add-method-copy-to-map
+ (phpinspect--class-static-methods class)
+ (alist-get 'class-name (phpinspect--class-index class))
+ method))
(cl-defmethod phpinspect--class-get-method-return-type
((class phpinspect--class) (method-name symbol))
@@ -155,39 +163,38 @@
(phpinspect--class-static-methods class))
methods))
+(cl-defmethod phpinspect--merge-method ((class-name phpinspect--type)
+ (existing phpinspect--function)
+ (method phpinspect--function))
+ (let ((new-return-type (phpinspect--resolve-late-static-binding
+ class-name
+ (phpinspect--function-return-type method))))
+ (unless (phpinspect--type= new-return-type phpinspect--null-type)
+ (phpinspect--log "method return type %s"
(phpinspect--function-return-type method))
+ (setf (phpinspect--function-return-type existing)
+ new-return-type))
+
+ (setf (phpinspect--function-arguments existing)
+ (phpinspect--function-arguments method))))
+
(cl-defmethod phpinspect--class-update-static-method ((class phpinspect--class)
(method
phpinspect--function))
(let ((existing (gethash (phpinspect--function-name-symbol method)
(phpinspect--class-static-methods class))))
(if existing
- (progn
- (unless (phpinspect--type= (phpinspect--function-return-type method)
- phpinspect--null-type)
- (setf (phpinspect--function-return-type existing)
- (phpinspect--function-return-type method)))
- (setf (phpinspect--function-arguments existing)
- (phpinspect--function-arguments method)))
+ (phpinspect--merge-method
+ (alist-get 'class-name (phpinspect--class-index class))
+ existing method)
(phpinspect--class-set-static-method class method))))
(cl-defmethod phpinspect--class-update-method ((class phpinspect--class)
(method phpinspect--function))
- (let ((existing (gethash (phpinspect--function-name-symbol method)
+ (let* ((existing (gethash (phpinspect--function-name-symbol method)
(phpinspect--class-methods class))))
(if existing
- (progn
- (unless (phpinspect--type= (phpinspect--function-return-type method)
- phpinspect--null-type)
- (phpinspect--log "method return type %s"
(phpinspect--function-return-type method))
- (setf (phpinspect--function-return-type existing)
- ;; The "static" return type returns the class that the method
- ;; is called on
- (if (phpinspect--type-does-late-static-binding
- (phpinspect--function-return-type method))
- (alist-get 'class-name (phpinspect--class-index class))
- (phpinspect--function-return-type method))))
-
- (setf (phpinspect--function-arguments existing)
- (phpinspect--function-arguments method)))
+ (phpinspect--merge-method
+ (alist-get 'class-name (phpinspect--class-index class))
+ existing method)
(phpinspect--class-set-method class method))))
(cl-defmethod phpinspect--class-incorporate ((class phpinspect--class)
diff --git a/phpinspect-index.el b/phpinspect-index.el
index 4cb4b6179a..a955eb870c 100644
--- a/phpinspect-index.el
+++ b/phpinspect-index.el
@@ -267,9 +267,9 @@
(let ((class-name (funcall type-resolver (phpinspect--make-type :name
class-name))))
`(,class-name .
(phpinspect--indexed-class
+ (class-name . ,class-name)
(imports . ,imports)
(methods . ,methods)
- (class-name . ,class-name)
(static-methods . ,static-methods)
(static-variables . ,static-variables)
(variables . ,variables)
diff --git a/phpinspect-serialize.el b/phpinspect-serialize.el
new file mode 100644
index 0000000000..45d61b8fb8
--- /dev/null
+++ b/phpinspect-serialize.el
@@ -0,0 +1,105 @@
+;;; phpinspect-index.el --- PHP parsing and completion package -*-
lexical-binding: t; -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc
+
+;; Author: Hugo Thunnissen <devel@hugot.nl>
+;; Keywords: php, languages, tools, convenience
+;; Version: 0
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'phpinspect-type)
+(require 'phpinspect-class)
+
+(cl-defmethod phpinspect--serialize-type ((type phpinspect--type))
+ `(phpinspect--make-type
+ :name ,(phpinspect--type-name type)
+ :collection ,(phpinspect--type-collection type)
+ :contains ,(when (phpinspect--type-contains type)
+ (phpinspect--serialize-type (phpinspect--type-contains type)))
+ :fully-qualified ,(phpinspect--type-fully-qualified type)))
+
+(cl-defmethod phpinspect--serialize-function ((func phpinspect--function))
+ `(phpinspect--make-function
+ :name ,(phpinspect--function-name func)
+ :scope (quote ,(phpinspect--function-scope func))
+ :arguments ,(append '(list)
+ (mapcar (lambda (arg)
+ `(list ,(car arg)
,(phpinspect--serialize-type (cadr arg))))
+ (phpinspect--function-arguments func)))
+ :return-type ,(when (phpinspect--function-return-type func)
+ (phpinspect--serialize-type
+ (phpinspect--function-return-type func)))))
+
+(cl-defmethod phpinspect--serialize-variable ((var phpinspect--variable))
+ `(phpinspect--make-variable :name ,(phpinspect--variable-name var)
+ :type ,(when (phpinspect--variable-type var)
+ (phpinspect--serialize-type
+ (phpinspect--variable-type var)))
+ :scope (quote ,(phpinspect--variable-scope
var))))
+
+
+(cl-defmethod phpinspect--serialize-indexed-class ((class (head
phpinspect--indexed-class)))
+ ``(phpinspect--indexed-class
+ (class-name . ,,(phpinspect--serialize-type (alist-get 'class-name
class)))
+ (imports . ,,(append '(list)
+ (mapcar #'phpinspect--serialize-import
+ (alist-get 'imports class))))
+ (methods . ,,(append '(list)
+ (mapcar #'phpinspect--serialize-function
+ (alist-get 'methods class))))
+ (static-methods . ,,(append '(list)
+ (mapcar #'phpinspect--serialize-function
+ (alist-get 'static-methods class))))
+ (static-variables . ,,(append '(list)
+ (mapcar #'phpinspect--serialize-variable
+ (alist-get 'static-variables
class))))
+ (variables . ,,(append '(list)
+ (mapcar #'phpinspect--serialize-variable
+ (alist-get 'variables class))))
+ (constants . ,,(append '(list)
+ (mapcar #'phpinspect--serialize-variable
+ (alist-get 'constants class))))
+ (extends . ,,(append '(list)
+ (mapcar #'phpinspect--serialize-type
+ (alist-get 'extends class))))
+ (implements . ,,(append '(list)
+ (mapcar #'phpinspect--serialize-type
+ (alist-get 'implements class))))))
+
+(cl-defmethod phpinspect--serialize-root-index ((index (head
phpinspect--root-index)))
+ ``(phpinspect--root-index
+ (imports . ,,(append '(list)
+ (mapcar #'phpinspect--serialize-import
+ (alist-get 'imports index))))
+ (classes ,,@(mapcar (lambda (cons-class)
+ `(list ,(phpinspect--serialize-type (car
cons-class))
+ ,(phpinspect--serialize-indexed-class (cdr
cons-class))))
+ (alist-get 'classes index)))
+ (functions . ,,(append '(list)
+ (mapcar #'phpinspect--serialize-function
+ (alist-get 'functions index))))))
+
+
+(defun phpinspect--serialize-import (import)
+ `(cons
+ (phpinspect-intern-name ,(symbol-name (car import)))
+ ,(phpinspect--serialize-type (cdr import))))
+
+(provide 'phpinspect-serialize)
+;;; phpinspect-serialize.el ends here
diff --git a/phpinspect-type.el b/phpinspect-type.el
index 7f55d4234b..c197cea9ec 100644
--- a/phpinspect-type.el
+++ b/phpinspect-type.el
@@ -84,6 +84,13 @@ See https://wiki.php.net/rfc/static_return_type ."
(or (phpinspect--type= type phpinspect--static-type)
(phpinspect--type= type phpinspect--this-type)))
+(cl-defmethod phpinspect--resolve-late-static-binding
+ ((type phpinspect--type)
+ (class-type phpinspect--type))
+ (if (phpinspect--type-does-late-static-binding type)
+ class-type
+ type))
+
(defsubst phpinspect--type-is-native (type)
(catch 'found
(dolist (native phpinspect-native-types)
diff --git a/phpinspect.el b/phpinspect.el
index 1a4482ee33..f1c7b9d757 100644
--- a/phpinspect.el
+++ b/phpinspect.el
@@ -359,7 +359,9 @@ TODO:
(phpinspect--resolvecontext-project-root resolvecontext))
type-of-previous-statement))
(method (when class
- (phpinspect--class-get-method class method-name-sym))))
+ (if static
+ (phpinspect--class-get-static-method class
method-name-sym)
+ (phpinspect--class-get-method class
method-name-sym)))))
(phpinspect--log "Eldoc method name: %s" method-name-sym)
(phpinspect--log "Eldoc type of previous statement: %s"
type-of-previous-statement)
@@ -418,20 +420,18 @@ TODO:
(phpinspect--find-assignments-in-token block-or-list)
assignments)))))
;; return
- (phpinspect--log "Yayo Returning %s" assignments)
- (phpinspect--log "Yayo had statements %s" statements)
+ (phpinspect--log "Found assignments in token: %s" assignments)
+ (phpinspect--log "Found statements in token: %s" statements)
assignments))
(cl-defmethod phpinspect--find-assignments-in-token ((token (head :list)))
"Find assignments that are in a list token."
(phpinspect--log "looking for assignments in list %s" token)
- (let ((ajaja (seq-filter
- (lambda (statement)
- (phpinspect--log "checking statement %s" statement)
- (seq-find #'phpinspect-maybe-assignment-p statement))
- (phpinspect--split-list #'phpinspect-end-of-statement-p (cdr
token)))))
- (phpinspect--log "Found ajaja %s" ajaja)
- ajaja))
+ (seq-filter
+ (lambda (statement)
+ (phpinspect--log "checking statement %s" statement)
+ (seq-find #'phpinspect-maybe-assignment-p statement))
+ (phpinspect--split-list #'phpinspect-end-of-statement-p (cdr token))))
(defsubst phpinspect-not-assignment-p (token)
"Inverse of applying `phpinspect-assignment-p to TOKEN."
@@ -595,6 +595,7 @@ resolve types of function argument variables."
(last-assignment-value (when assignments (car (last assignments)))))
(phpinspect--log "Last assignment: %s" last-assignment-value)
+ (phpinspect--log "Current block: %s" php-block)
;; When the right of an assignment is more than $variable; or
"string";(so
;; (:variable "variable") (:terminator ";") or (:string "string")
(:terminator ";")
;; in tokens), we're likely working with a derived assignment like
$object->method()
@@ -602,7 +603,7 @@ resolve types of function argument variables."
(cond ((and (phpinspect-word-p (car last-assignment-value))
(string= (cadar last-assignment-value) "new"))
(funcall type-resolver (phpinspect--make-type :name (cadadr
last-assignment-value))))
- ((and (> (length last-assignment-value) 2)
+ ((and (> (length last-assignment-value) 1)
(seq-find #'phpinspect-attrib-p last-assignment-value))
(phpinspect--log "Variable was assigned with a derived statement")
(phpinspect-get-derived-statement-type-in-block resolvecontext
@@ -613,7 +614,8 @@ resolve types of function argument variables."
;; If the right of an assignment is just $variable;, we can check
if it is a
;; function argument and otherwise recurse to find the type of
that variable.
((phpinspect-variable-p (car last-assignment-value))
- (phpinspect--log "Variable was assigned with the value of another
variable")
+ (phpinspect--log "Variable was assigned with the value of another
variable: %s"
+ last-assignment-value)
(or (when function-arg-list
(phpinspect-get-variable-type-in-function-arg-list (cadar
last-assignment-value)
type-resolver
@@ -852,44 +854,6 @@ level of a token. Nested variables are ignored."
(defun phpinspect--buffer-index (buffer)
(with-current-buffer buffer phpinspect--buffer-index))
-(cl-defgeneric phpinspect--merge-indexes (index1 index2)
- "Merge two phpinspect index types into one and return it")
-
-(cl-defmethod phpinspect--merge-indexes
- ((class1 (head phpinspect--indexed-class))
- (class2 (head phpinspect--indexed-class)))
- "Merge two indexed classes."
- (let* ((class1-methods (alist-get 'methods (cdr class1)))
- (class1-variables (alist-get 'variables (cdr class1))))
- (dolist (method (alist-get 'methods (cdr class2)))
- (cl-pushnew method class1-methods :test #'equal))
- (setf (alist-get 'methods (cdr class1)) class1-methods)
-
- (dolist (variable (alist-get 'variables (cdr class2)))
- (cl-pushnew variable class1-variables :test #'equal))
- (setf (alist-get 'variables (cdr class1)) class1-variables))
- class1)
-
-(cl-defmethod phpinspect--merge-indexes
- ((index1 (head phpinspect--root-index))
- (index2 (head phpinspect--root-index)))
- (let ((index1-classes (alist-get 'classes (cdr index1)))
- (index2-classes (alist-get 'classes (cdr index2))))
- (dolist (class index2-classes)
- (when class
- (let* ((class-name (alist-get 'class-name (cdr class)))
- (existing-class (alist-get class-name index1-classes nil nil
'phpinspect--type=)))
- (if existing-class
- (progn
- (phpinspect--log "Found existing class in root index: %s"
class-name)
- (setcdr (assoc class-name index1-classes)
- (phpinspect--merge-indexes existing-class (cdr
class))))
- ;; else
- (phpinspect--log "Didn't find existing class in root index: %s"
class-name)
- (push class index1-classes)))))
- (setf (alist-get 'classes index1) index1-classes)
- index1))
-
(defsubst phpinspect-not-variable-p (token)
(not (phpinspect-variable-p token)))
diff --git a/test/fixtures/IndexClass1-indexed.eld
b/test/fixtures/IndexClass1-indexed.eld
index 9e0aea2c27..53bcf3dac1 100644
--- a/test/fixtures/IndexClass1-indexed.eld
+++ b/test/fixtures/IndexClass1-indexed.eld
@@ -1 +1 @@
-(phpinspect--root-index (classes ("\\App\\Entity\\AuthToken" phpinspect--class
(methods #s(phpinspect--function "getCreationTime" (:public) nil "\\DateTime")
#s(phpinspect--function "isValid" (:public) nil "\\bool")
#s(phpinspect--function "hasStudentRole" (:public) nil "\\bool")
#s(phpinspect--function "getUser" (:public) nil "\\App\\Entity\\User")
#s(phpinspect--function "getToken" (:public) nil "\\string")
#s(phpinspect--function "__construct" (:public) (("token" "\\string") ("user" "
[...]
\ No newline at end of file
+`(phpinspect--root-index (imports \, (list)) (classes ,(list
(phpinspect--make-type :name "\\App\\Entity\\AuthToken" :collection nil
:contains nil :fully-qualified t) `(phpinspect--indexed-class (class-name \,
(phpinspect--make-type :name "\\App\\Entity\\AuthToken" :collection nil
:contains nil :fully-qualified t)) (imports \, (list (cons
(phpinspect-intern-name "ORM") (phpinspect--make-type :name
"\\Doctrine\\ORM\\Mapping" :collection nil :contains nil :fully-qualified t))))
(methods \, [...]
\ No newline at end of file
diff --git a/test/fixtures/IndexClass2-indexed.eld
b/test/fixtures/IndexClass2-indexed.eld
index 18459ecfc4..c6c276ff6e 100644
--- a/test/fixtures/IndexClass2-indexed.eld
+++ b/test/fixtures/IndexClass2-indexed.eld
@@ -1 +1 @@
-(phpinspect--root-index (classes ("\\App\\Entity\\AuthToken" phpinspect--class
(methods #s(phpinspect--function "getCreationTime" (:public) nil "\\DateTime")
#s(phpinspect--function "anAddedFunction" (:public) nil nil)
#s(phpinspect--function "isValid" (:public) nil "\\bool")
#s(phpinspect--function "hasStudentRole" (:public) nil "\\bool")
#s(phpinspect--function "getUser" (:public) nil "\\App\\Entity\\User")
#s(phpinspect--function "getToken" (:public) nil "\\bool") #s(phpinspect--funct
[...]
\ No newline at end of file
+`(phpinspect--root-index (imports \, (list)) (classes ,(list
(phpinspect--make-type :name "\\App\\Entity\\AuthToken" :collection nil
:contains nil :fully-qualified t) `(phpinspect--indexed-class (class-name \,
(phpinspect--make-type :name "\\App\\Entity\\AuthToken" :collection nil
:contains nil :fully-qualified t)) (imports \, (list (cons
(phpinspect-intern-name "ORM") (phpinspect--make-type :name
"\\Doctrine\\ORM\\Mapping" :collection nil :contains nil :fully-qualified t))))
(methods \, [...]
\ No newline at end of file
diff --git a/test/phpinspect-test.el b/test/phpinspect-test.el
index 3ae2e8ccf3..ff76475afa 100644
--- a/test/phpinspect-test.el
+++ b/test/phpinspect-test.el
@@ -39,6 +39,11 @@
(insert-file-contents-literally (concat phpinspect-test-php-file-directory
"/" name ".eld"))
(read (current-buffer))))
+(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)))))
+
(defun phpinspect-test-parse-fixture-code (name)
(phpinspect-parse-file
(concat phpinspect-test-php-file-directory "/" name ".php")))
@@ -113,21 +118,19 @@
(phpinspect-test-read-fixture-data "IndexClass1"))))
(should (equal index expected-result))))
-(ert-deftest phpinspect-index-tokens ()
- (should (equal
- (phpinspect--index-tokens
- (phpinspect-test-read-fixture-data "IndexClass1"))
- (phpinspect-test-read-fixture-data "IndexClass1-indexed"))))
-
-(ert-deftest phpinspect-merge-class-indexes ()
- (should (equal
- (phpinspect--merge-indexes
- (phpinspect-test-read-fixture-data "IndexClass1-indexed")
- (phpinspect-test-read-fixture-data "IndexClass2-indexed"))
- (phpinspect-test-read-fixture-data
- "class-index-1-2-undestructive-merge"))))
-
-(ert-deftest phpinspect--get-resolvecontext ()
+(ert-deftest phpinspect-index-tokens-class ()
+ (let* ((index1
+ (phpinspect--index-tokens
+ (phpinspect-test-read-fixture-data "IndexClass1")))
+ (index2
+ (phpinspect-test-read-fixture-serialization "IndexClass1-indexed"))
+ (index1-class (cdr (alist-get 'classes index1)))
+ (index2-class (cdr (alist-get 'classes index2))))
+ (dolist (key '(class-name imports methods static-methods static-variables
variables constants extends implements))
+ (should (equal (alist-get key index1-class)
+ (alist-get key index2-class))))))
+
+(ert-deftest phpinspect-get-resolvecontext ()
(let ((resolvecontext (phpinspect--get-resolvecontext
(phpinspect-test-read-fixture-data
"IncompleteClass"))))
@@ -158,15 +161,25 @@
(type-resolver (phpinspect--make-type-resolver-for-resolvecontext
resolvecontext)))
- (should (string= "\\array" (funcall type-resolver "array")))
- (should (string= "\\array" (funcall type-resolver "\\array")))
- (should (string= "\\Symfony\\Component\\HttpFoundation\\Response"
- (funcall type-resolver "Response")))
- (should (string= "\\Response" (funcall type-resolver "\\Response")))
- (should (string= "\\App\\Controller\\GastonLagaffe"
- (funcall type-resolver "GastonLagaffe")))
- (should (string= "\\App\\Controller\\Dupuis\\GastonLagaffe"
- (funcall type-resolver "Dupuis\\GastonLagaffe")))))
+ (should (phpinspect--type= (phpinspect--make-type :name "\\array")
+ (funcall type-resolver
+ (phpinspect--make-type :name
"array"))))
+ (should (phpinspect--type= (phpinspect--make-type :name "\\array")
+ (funcall type-resolver
+ (phpinspect--make-type :name
"\\array"))))
+ (should (phpinspect--type= (phpinspect--make-type
+ :name
"\\Symfony\\Component\\HttpFoundation\\Response")
+ (funcall type-resolver (phpinspect--make-type :name
"Response"))))
+ (should (phpinspect--type= (phpinspect--make-type :name "\\Response")
+ (funcall type-resolver
+ (phpinspect--make-type :name
"\\Response"))))
+ (should (phpinspect--type= (phpinspect--make-type :name
"\\App\\Controller\\GastonLagaffe")
+ (funcall type-resolver
+ (phpinspect--make-type :name
"GastonLagaffe"))))
+ (should (phpinspect--type=
+ (phpinspect--make-type :name
"\\App\\Controller\\Dupuis\\GastonLagaffe")
+ (funcall type-resolver
+ (phpinspect--make-type :name
"Dupuis\\GastonLagaffe"))))))
(ert-deftest phpinspect-type-resolver-for-resolvecontext-namespace-block ()
(let* ((resolvecontext (phpinspect--get-resolvecontext
@@ -175,15 +188,21 @@
(type-resolver (phpinspect--make-type-resolver-for-resolvecontext
resolvecontext)))
- (should (string= "\\array" (funcall type-resolver "array")))
- (should (string= "\\array" (funcall type-resolver "\\array")))
- (should (string= "\\Symfony\\Component\\HttpFoundation\\Response"
- (funcall type-resolver "Response")))
- (should (string= "\\Response" (funcall type-resolver "\\Response")))
- (should (string= "\\App\\Controller\\GastonLagaffe"
- (funcall type-resolver "GastonLagaffe")))
- (should (string= "\\App\\Controller\\Dupuis\\GastonLagaffe"
- (funcall type-resolver "Dupuis\\GastonLagaffe")))))
+ (should (phpinspect--type= (phpinspect--make-type :name "\\array")
+ (funcall type-resolver (phpinspect--make-type
:name "array"))))
+ (should (phpinspect--type= (phpinspect--make-type :name "\\array")
+ (funcall type-resolver (phpinspect--make-type
:name "\\array"))))
+ (should (phpinspect--type= (phpinspect--make-type
+ :name
"\\Symfony\\Component\\HttpFoundation\\Response")
+ (funcall type-resolver (phpinspect--make-type
:name "Response"))))
+ (should (phpinspect--type= (phpinspect--make-type :name "\\Response")
+ (funcall type-resolver (phpinspect--make-type
:name "\\Response"))))
+ (should (phpinspect--type= (phpinspect--make-type :name
"\\App\\Controller\\GastonLagaffe")
+ (funcall type-resolver (phpinspect--make-type
+ :name
"GastonLagaffe"))))
+ (should (phpinspect--type= (phpinspect--make-type
+ :name
"\\App\\Controller\\Dupuis\\GastonLagaffe")
+ (funcall type-resolver (phpinspect--make-type :name
"Dupuis\\GastonLagaffe"))))))
(ert-deftest
phpinspect-type-resolver-for-resolvecontext-multiple-namespace-blocks ()
(let* ((resolvecontext (phpinspect--get-resolvecontext
@@ -192,15 +211,24 @@
(type-resolver (phpinspect--make-type-resolver-for-resolvecontext
resolvecontext)))
- (should (string= "\\array" (funcall type-resolver "array")))
- (should (string= "\\array" (funcall type-resolver "\\array")))
- (should (string= "\\Symfony\\Component\\HttpFoundation\\Response"
- (funcall type-resolver "Response")))
- (should (string= "\\Response" (funcall type-resolver "\\Response")))
- (should (string= "\\App\\Controller\\GastonLagaffe"
- (funcall type-resolver "GastonLagaffe")))
- (should (string= "\\App\\Controller\\Dupuis\\GastonLagaffe"
- (funcall type-resolver "Dupuis\\GastonLagaffe")))))
+ (should (phpinspect--type= (phpinspect--make-type :name "\\array")
+ (funcall type-resolver
+ (phpinspect--make-type :name
"array"))))
+ (should (phpinspect--type= (phpinspect--make-type :name "\\array")
+ (funcall type-resolver
+ (phpinspect--make-type :name
"\\array"))))
+ (should (phpinspect--type= (phpinspect--make-type
+ :name
"\\Symfony\\Component\\HttpFoundation\\Response")
+ (funcall type-resolver (phpinspect--make-type :name
"Response"))))
+ (should (phpinspect--type= (phpinspect--make-type :name "\\Response")
+ (funcall type-resolver
+ (phpinspect--make-type :name
"\\Response"))))
+ (should (phpinspect--type= (phpinspect--make-type :name
"\\App\\Controller\\GastonLagaffe")
+ (funcall type-resolver (phpinspect--make-type :name
"GastonLagaffe"))))
+ (should (phpinspect--type= (phpinspect--make-type
+ :name
"\\App\\Controller\\Dupuis\\GastonLagaffe")
+ (funcall type-resolver (phpinspect--make-type
+ :name
"Dupuis\\GastonLagaffe"))))))
(ert-deftest phpinspect-index-static-methods ()
(let* ((class-tokens
@@ -219,22 +247,28 @@
(index (phpinspect--index-tokens class-tokens))
(expected-index
`(phpinspect--root-index
+ (imports)
(classes
- ("\\Potato" phpinspect--class
+ (,(phpinspect--make-type :name"\\Potato" :fully-qualified t)
+ phpinspect--indexed-class
+ (class-name . ,(phpinspect--make-type :name "\\Potato"
:fully-qualified t))
+ (imports)
(methods)
- (class-name . "\\Potato")
(static-methods . (,(phpinspect--make-function
:name "staticMethod"
:scope '(:public)
- :arguments '(("untyped" nil)
- ("things" "\\array"))
- :return-type nil)))
+ :arguments `(("untyped" nil)
+ ("things"
,(phpinspect--make-type :name "\\array"
+
:fully-qualified t)))
+ :return-type phpinspect--null-type)))
(static-variables)
(variables)
(constants)
(extends)
(implements)))
(functions))))
+ ;; (pp expected-index)
+ ;; (pp index))
(should (equal expected-index index))))
(ert-deftest phpinspect-resolve-type-from-context ()
@@ -256,7 +290,7 @@ class FluffBall
if ($ball) {
if(isset($ball->fluff()->poof->upFluff->"))
- (fluffer "
+ (fluffer (phpinspect-parse-string "
namespace Amazing;
use Vendor\\FluffLib\\Fluff;
@@ -266,8 +300,8 @@ class Fluffer
public function fluff(): Fluff
{
}
-}")
- (vendor-fluff "
+}"))
+ (vendor-fluff (phpinspect-parse-string "
namespace Vendor\\FluffLib;
class Fluff
{
@@ -275,8 +309,8 @@ class Fluff
* @var FlufferUpper
*/
public $poof;
-}")
- (vendor-fluffer-upper "
+}"))
+ (vendor-fluffer-upper (phpinspect-parse-string "
namespace Vendor\\FluffLib;
class FlufferUpper
{
@@ -285,33 +319,25 @@ class FlufferUpper
{
$this->upFluff = $upFluff;
}
-}")
+}"))
(phpinspect-project-root-function (lambda () "phpinspect-test"))
- (phpinspect-class-filepath-function
- (lambda (fqn)
- (pcase fqn
- ("\\Amazing\\Fluffer" "fluffer")
- ("\\Vendor\\FluffLib\\Fluff" "vendor-fluff")
- ("\\Vendor\\FluffLib\\FlufferUpper" "vendor-fluffer-upper")
- (_ (ert-fail (format "Unexpected class FQN filepath was
requested: %s" fqn))))))
- (phpinspect-insert-file-contents-function
- (lambda (filepath)
- (pcase filepath
- ("fluffer" (insert fluffer))
- ("vendor-fluff" (insert vendor-fluff))
- ("vendor-fluffer-upper" (insert vendor-fluffer-upper))
- (_ (ert-fail (format "Unexpected filepath was requested: %s"
filepath))))))
(context (phpinspect--get-resolvecontext token-tree)))
- (phpinspect-purge-cache)
- (phpinspect-cache-project-class
- (phpinspect-project-root)
- (cdar (alist-get 'classes (cdr (phpinspect--index-tokens token-tree)))))
- (should (equal "\\Vendor\\FluffLib\\DoubleFluffer"
- (phpinspect-resolve-type-from-context
- context
- (phpinspect--make-type-resolver-for-resolvecontext
- context))))))
+ (setf (phpinspect--resolvecontext-project-root context)
+ "phpinspect-test")
+
+ (phpinspect-purge-cache)
+ (dolist (tree (list token-tree fluffer vendor-fluff vendor-fluffer-upper))
+ (phpinspect-cache-project-class
+ "phpinspect-test"
+ (cdar (alist-get 'classes (cdr (phpinspect--index-tokens tree))))))
+
+ (should (phpinspect--type=
+ (phpinspect--make-type :name "\\Vendor\\FluffLib\\DoubleFluffer")
+ (phpinspect-resolve-type-from-context
+ context
+ (phpinspect--make-type-resolver-for-resolvecontext
+ context))))))
(ert-deftest phpinspect-eldoc-function-for-object-method ()
(let* ((php-code "
@@ -330,6 +356,7 @@ class Thing
(phpinspect-project-root-function (lambda () "phpinspect-test"))
(phpinspect-eldoc-word-width 100))
(phpinspect-purge-cache)
+ (phpinspect--ensure-index-thread)
(phpinspect-cache-project-class
(phpinspect-project-root)
(cdar (alist-get 'classes (cdr index))))
@@ -356,6 +383,7 @@ class Thing
(phpinspect-project-root-function (lambda () "phpinspect-test"))
(phpinspect-eldoc-word-width 100))
(phpinspect-purge-cache)
+ (phpinspect--ensure-index-thread)
(phpinspect-cache-project-class
(phpinspect-project-root)
(cdar (alist-get 'classes (cdr index))))
@@ -388,11 +416,11 @@ class Thing
(phpinspect-project-root)
(cdar (alist-get 'classes (cdr index))))
- (should (string= "\\Thing"
- (phpinspect-resolve-type-from-context
- context
- (phpinspect--make-type-resolver-for-resolvecontext
- context))))))
+ (should (phpinspect--type= (phpinspect--make-type :name "\\Thing")
+ (phpinspect-resolve-type-from-context
+ context
+
(phpinspect--make-type-resolver-for-resolvecontext
+ context))))))
(ert-deftest
phpinspect-resolve-type-from-context-static-method-with-preceding-words ()
(let* ((php-code "
@@ -417,7 +445,7 @@ class Thing
(phpinspect-project-root)
(cdar (alist-get 'classes (cdr index))))
- (should (string= "\\Thing"
+ (should (phpinspect--type= (phpinspect--make-type :name "\\Thing")
(phpinspect-resolve-type-from-context
context
(phpinspect--make-type-resolver-for-resolvecontext
diff --git a/test/util/generate-test-data.el b/test/util/generate-test-data.el
index 4da44047a0..26d3593a8c 100644
--- a/test/util/generate-test-data.el
+++ b/test/util/generate-test-data.el
@@ -1,5 +1,7 @@
(require 'phpinspect)
+(require 'phpinspect-index)
+(require 'phpinspect-serialize)
(let ((here (file-name-directory
(or load-file-name
@@ -20,5 +22,6 @@
(insert-file-contents-literally (concat here "/../fixtures/"
class ".eld"))
(read (current-buffer)))))
(with-temp-buffer
- (insert (prin1-to-string (phpinspect--index-tokens index-class)))
+ (insert (prin1-to-string (phpinspect--serialize-root-index
+ (phpinspect--index-tokens index-class))))
(write-file (concat here "/../fixtures/" class "-indexed.eld"))))))
- [elpa] externals/phpinspect 55413ea9fb 117/126: Implement basic support for function indexation and include dirs, (continued)
- [elpa] externals/phpinspect 55413ea9fb 117/126: Implement basic support for function indexation and include dirs, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect fbfcf4f928 119/126: Fix byte compilation warnings, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect e4b62c0230 120/126: Implement completion-at-point function, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect df821c4039 023/126: Add ticket tracker link to README, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 9f7931a7b6 100/126: Rework parser for ahead of time byte compilation, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 9513cbc917 125/126: Update README, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect e35caa7e15 118/126: Fix a variety of bugs, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect f7d88a90f4 009/126: Implement some general tests for the parser code, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 74bd0ad434 032/126: WIP: New data type for cached classes, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 3a3e2cd362 042/126: Update README with new development repository location, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 0bc9e795b2 043/126: Fix tests and patch bugs that came to light in the process,
ELPA Syncer <=
- [elpa] externals/phpinspect f030a685d2 060/126: Alter interpret-expression-type to interpret array-member assignment, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 8cd4dc2025 058/126: Remove commented code + tidy some formatting, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect e067a9e9dd 122/126: Remove obsolete function and add some documentation to mode doc string, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 5fe0b7bdc5 123/126: Add .cask directory to gitignore, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 15c175dc61 016/126: Only attempt to byte compile when the handler isn't already compiled, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect dbbc5927e4 022/126: Enable company-mode before changing its variables in README example, ELPA Syncer, 2023/08/12