diff --git a/phpinspect-class.el b/phpinspect-class.el index 199b1fb..ff31ee1 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 0f73122..c1cadcc 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 b1c531f..684b667 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 0000000..4d69e86 --- /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 + +;; 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 . + +;;; 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 0000000..98ed1df --- /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 + +;; 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 . + +;;; 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)))))))