branch: externals/phpinspect
commit 1b1cf456380d67f1b5b1549768c2daeb0c217412
Author: Hugo Thunnissen <de...@hugot.nl>
Commit: Hugo Thunnissen <de...@hugot.nl>

    Fix bug in extended classes' method merging + add some tests
---
 phpinspect-class.el     | 30 ++++++++++++------------------
 phpinspect-project.el   |  5 +----
 test/phpinspect-test.el |  2 ++
 test/test-class.el      | 42 ++++++++++++++++++++++++++++++++++++++++++
 test/test-type.el       | 36 ++++++++++++++++++++++++++++++++++++
 5 files changed, 93 insertions(+), 22 deletions(-)

diff --git a/phpinspect-class.el b/phpinspect-class.el
index 199b1fb015..ff31ee1265 100644
--- a/phpinspect-class.el
+++ b/phpinspect-class.el
@@ -145,32 +145,26 @@
       (phpinspect--function-return-type method))))
 
 (cl-defmethod phpinspect--class-get-method-list ((class phpinspect--class))
-  (let ((methods))
-    (maphash (lambda (key method)
-               (push method methods))
-             (phpinspect--class-methods class))
-    methods))
+  (hash-table-values (phpinspect--class-methods class)))
 
 (cl-defmethod phpinspect--class-get-static-method-list ((class 
phpinspect--class))
-  (let ((methods))
-    (maphash (lambda (key method)
-               (push method methods))
-             (phpinspect--class-static-methods class))
-    methods))
+  (hash-table-values (phpinspect--class-static-methods class)))
+
 
 (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))))
+                          (phpinspect--function-return-type method)
+                          class-name)))
     (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))))
+          (phpinspect--function-arguments method)))
+  existing)
 
 (cl-defmethod phpinspect--class-update-static-method ((class phpinspect--class)
                                                       (method 
phpinspect--function))
@@ -194,12 +188,12 @@
 
 (cl-defmethod phpinspect--class-incorporate ((class phpinspect--class)
                                              (other-class phpinspect--class))
-  (let ((class-index (phpinspect--class-index other-class)))
-    (dolist (method (alist-get 'methods class-index))
-      (phpinspect--class-update-method class method))
 
-    (dolist (method (alist-get 'static-methods class-index))
-      (phpinspect--class-update-static-method class method))))
+  (dolist (method (phpinspect--class-get-method-list other-class))
+    (phpinspect--class-update-method class method))
+
+    (dolist (method (phpinspect--class-get-static-method-list other-class))
+      (phpinspect--class-update-static-method class method)))
 
 
 
diff --git a/phpinspect-project.el b/phpinspect-project.el
index 0f73122f2b..c1cadccdcc 100644
--- a/phpinspect-project.el
+++ b/phpinspect-project.el
@@ -143,10 +143,6 @@ indexed by the absolute paths of the files they're 
watching."))
     (puthash class-name class (phpinspect--project-class-index project))
     (phpinspect--project-add-class-attribute-types-to-index-queue project 
class)))
 
-(cl-defgeneric phpinspect--project-get-class
-    ((project phpinspect--project) (class-fqn phpinspect--type))
-  "Get indexed class by name of CLASS-FQN stored in PROJECT.")
-
 (cl-defmethod phpinspect--project-set-class
   ((project phpinspect--project) (class-fqn phpinspect--type) (class 
phpinspect--class))
   (puthash (phpinspect--type-name-symbol class-fqn)
@@ -171,6 +167,7 @@ indexed by the absolute paths of the files they're 
watching."))
 
 (cl-defmethod phpinspect--project-get-class
   ((project phpinspect--project) (class-fqn phpinspect--type))
+  "Get indexed class by name of CLASS-FQN stored in PROJECT."
   (gethash (phpinspect--type-name-symbol class-fqn)
            (phpinspect--project-class-index project)))
 
diff --git a/test/phpinspect-test.el b/test/phpinspect-test.el
index b1c531f5e4..684b667d89 100644
--- a/test/phpinspect-test.el
+++ b/test/phpinspect-test.el
@@ -462,6 +462,8 @@ class Thing
 (load-file (concat phpinspect-test-directory "/test-project.el"))
 (load-file (concat phpinspect-test-directory "/test-buffer.el"))
 (load-file (concat phpinspect-test-directory "/test-index.el"))
+(load-file (concat phpinspect-test-directory "/test-class.el"))
+(load-file (concat phpinspect-test-directory "/test-type.el"))
 
 
 (provide 'phpinspect-test)
diff --git a/test/test-class.el b/test/test-class.el
new file mode 100644
index 0000000000..4d69e867b7
--- /dev/null
+++ b/test/test-class.el
@@ -0,0 +1,42 @@
+;; test-class.el --- Unit tests for phpinspect.el  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; Author: Hugo Thunnissen <de...@hugot.nl>
+
+;; 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 'ert)
+(require 'phpinspect-class)
+
+(ert-deftest phpinspect--merge-method-return-type ()
+  (let* ((class-name (phpinspect--make-type :name "\\Something"))
+         (method1 (phpinspect--make-function
+                  :name "fun"
+                  :return-type (phpinspect--make-type :name "\\array")))
+         (method2 (phpinspect--make-function
+                   :name "fun"
+                   :return-type (phpinspect--make-type :name "\\bool")))
+         (result (phpinspect--merge-method class-name method1 method2)))
+
+    (should (phpinspect--type= (phpinspect--make-type :name "\\bool")
+                               (phpinspect--function-return-type result)))
+    (should (phpinspect--type= (phpinspect--make-type :name "\\bool")
+                               (phpinspect--function-return-type method1)))))
diff --git a/test/test-type.el b/test/test-type.el
new file mode 100644
index 0000000000..98ed1df981
--- /dev/null
+++ b/test/test-type.el
@@ -0,0 +1,36 @@
+;; test-type.el --- Unit tests for phpinspect.el  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; Author: Hugo Thunnissen <de...@hugot.nl>
+
+;; 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:
+
+(ert-deftest phpinspect--resolve-late-static-binding ()
+  (let* ((sets '(("\\bool" . "\\bool")
+                 ("\\static" . "\\AType")
+                 ("\\this" . "\\AType"))))
+    (dolist (set sets)
+      (should (phpinspect--type=
+               (phpinspect--resolve-late-static-binding
+                (phpinspect--make-type :name (car set))
+                (phpinspect--make-type :name "\\AType"))
+
+               (phpinspect--make-type :name (cdr set)))))))

Reply via email to