Fix bug in extended classes' method merging + add some tests
continuous-integration/drone/push Build is passing Details

master
Hugo Thunnissen 7 months ago
parent e65b268cea
commit 1b1cf45638

@ -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)))

@ -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)))

@ -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)

@ -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 <devel@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)))))

@ -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 <devel@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)))))))
Loading…
Cancel
Save