[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phpinspect e111df4ca9 4/6: Completion: filter out attri
From: |
ELPA Syncer |
Subject: |
[elpa] externals/phpinspect e111df4ca9 4/6: Completion: filter out attributes that are not accessible from the current scope |
Date: |
Tue, 20 Aug 2024 15:58:51 -0400 (EDT) |
branch: externals/phpinspect
commit e111df4ca9902328b2fb87a906faf198c51fc7e2
Author: Hugo Thunnissen <devel@hugot.nl>
Commit: Hugo Thunnissen <devel@hugot.nl>
Completion: filter out attributes that are not accessible from the current
scope
---
phpinspect-class.el | 54 ++++++++++++++++++++++++++-------------
phpinspect-suggest.el | 58 ++++++++++++++++++++++++++++++++----------
phpinspect-token-predicates.el | 6 +++++
test/test-class.el | 4 +--
4 files changed, 90 insertions(+), 32 deletions(-)
diff --git a/phpinspect-class.el b/phpinspect-class.el
index 478f175603..90059fcd71 100644
--- a/phpinspect-class.el
+++ b/phpinspect-class.el
@@ -155,25 +155,35 @@ Conditionally executes BODY depending on
(puthash (phpinspect--function-name-symbol method)
method
- map))
+ map)
+ method)
(cl-defmethod phpinspect--class-set-method ((class phpinspect--class)
- (method phpinspect--function))
+ (method phpinspect--function)
+ &optional extended)
(phpinspect--class-edit class
(phpinspect--log "Adding method by name %s to class"
(phpinspect--function-name method))
- (phpinspect--add-method-copy-to-map
- (phpinspect--class-methods class)
- (phpinspect--class-name class)
- method)))
+ (setq method (phpinspect--add-method-copy-to-map
+ (phpinspect--class-methods class)
+ (phpinspect--class-name class)
+ method))
+ (when extended
+ (setf (phpinspect--function--inherited method) extended))))
(cl-defmethod phpinspect--class-set-static-method ((class phpinspect--class)
- (method
phpinspect--function))
+ (method
phpinspect--function)
+ &optional extended)
(phpinspect--class-edit class
- (phpinspect--add-method-copy-to-map
- (phpinspect--class-static-methods class)
- (phpinspect--class-name class)
- method)))
+ (setq method (phpinspect--add-method-copy-to-map
+ (phpinspect--class-static-methods class)
+ (phpinspect--class-name class)
+ method))
+
+ (when extended
+ (setf (phpinspect--function--inherited method) extended))))
+
+
(cl-defmethod phpinspect--class-delete-method ((class phpinspect--class)
(method phpinspect--function))
(phpinspect--class-edit class
@@ -226,8 +236,7 @@ Conditionally executes BODY depending on
(phpinspect--class-static-methods class))))
(if existing
(phpinspect--merge-method (phpinspect--class-name class) existing
method extended)
- (setf (phpinspect--function--inherited method) extended)
- (phpinspect--class-set-static-method class method)))))
+ (phpinspect--class-set-static-method class method extended)))))
(cl-defmethod phpinspect--class-update-method ((class phpinspect--class)
(method phpinspect--function)
@@ -238,19 +247,30 @@ Conditionally executes BODY depending on
(if existing
(phpinspect--merge-method (phpinspect--class-name class) existing
method extended)
- (setf (phpinspect--function--inherited method) extended)
- (phpinspect--class-set-method class method)))))
+ (phpinspect--class-set-method class method extended)))))
+
+(define-inline phpinspect--scope-inherits-p (scope)
+ "Returns non-nil when FN has a public or protected scope."
+ (inline-letevals (fn)
+ (inline-quote (or (phpinspect-public-p ,scope)
+ (phpinspect-protected-p ,scope)))))
+
+(define-inline phpinspect--function-inherits-p (fn)
+ (inline-quote (phpinspect--scope-inherits-p (phpinspect--function-scope
,fn))))
;; FIXME: Remove inherited methods when they no longer exist in parent classes
;; (and/or the current class in the case of abstract methods).
+;; TODO: Check if above comment is still accurate ^^
(cl-defmethod phpinspect--class-incorporate ((class phpinspect--class)
(other-class phpinspect--class))
(phpinspect--class-edit class
(dolist (method (phpinspect--class-get-method-list other-class))
- (phpinspect--class-update-method class method 'extended))
+ (when (phpinspect--function-inherits-p method)
+ (phpinspect--class-update-method class method 'extended)))
(dolist (method (phpinspect--class-get-static-method-list other-class))
- (phpinspect--class-update-static-method class method 'extended))
+ (when (phpinspect--function-inherits-p method)
+ (phpinspect--class-update-static-method class method 'extended)))
(phpinspect--class-subscribe class other-class)))
diff --git a/phpinspect-suggest.el b/phpinspect-suggest.el
index 5748d5c11b..8319bd483e 100644
--- a/phpinspect-suggest.el
+++ b/phpinspect-suggest.el
@@ -105,6 +105,19 @@
(lambda (fqn)
(phpinspect--get-methods-for-class resolvecontext fqn static)))
+(cl-defmethod phpinspect--candidate-scope ((candidate phpinspect--function))
+ (phpinspect--function-scope candidate))
+
+(cl-defmethod phpinspect--candidate-scope ((candidate phpinspect--variable))
+ (phpinspect--variable-scope candidate))
+
+(cl-defmethod phpinspect--candiate-inherited ((candidate phpinspect--function))
+ (phpinspect--function--inherited candidate))
+
+;; FIXME: when inheriting of variables is implemented
+(cl-defmethod phpinspect--candidate-inherited ((candidate
phpinspect--variable))
+ nil)
+
(defun phpinspect-suggest-attributes-at-point
(resolvecontext &optional static)
"Suggest object or class attributes at point.
@@ -129,22 +142,41 @@ static variables and static methods."
(setf (phpinspect--resolvecontext-subject resolvecontext)
(butlast (phpinspect--resolvecontext-subject resolvecontext))))
- (let* ((type-resolver (phpinspect--make-type-resolver-for-resolvecontext
+ (let* ((enclosing-class (seq-find #'phpinspect-class-p
+
(phpinspect--resolvecontext-enclosing-tokens resolvecontext)))
+ (type-resolver (phpinspect--make-type-resolver-for-resolvecontext
resolvecontext))
(method-lister (phpinspect--make-method-lister
resolvecontext
- static)))
- (let ((statement-type (phpinspect-resolve-type-from-context
+ static))
+ (statement-type (phpinspect-resolve-type-from-context
resolvecontext
- type-resolver)))
- (phpinspect--log "Statement type: %s" statement-type)
- (when statement-type
- (let ((type (funcall type-resolver statement-type)))
- (when-let ((result
- (append (phpinspect--get-variables-for-class
- resolvecontext type static)
- (funcall method-lister type))))
- (phpinspect--log "Returning attributes %s" result)
- result))))))
+ type-resolver))
+ enclosing-class-name)
+
+ (phpinspect--log "Statement type: %s" statement-type)
+ (when statement-type
+ (when-let* ((type (funcall type-resolver statement-type))
+ (result
+ (append (phpinspect--get-variables-for-class
+ resolvecontext type static)
+ (funcall method-lister type))))
+
+ ;; Filter out candidates according to scoping rules
+ (when (and enclosing-class
+ (setq enclosing-class-name
+ (phpinspect--get-class-name-from-token
enclosing-class)))
+ (let* ((enclosing-type (funcall type-resolver (phpinspect--make-type
:name enclosing-class-name)))
+ (allow-protected (phpinspect--type= type enclosing-type))
+ filtered-result)
+ (dolist (candidate result)
+ (if allow-protected
+ (push candidate filtered-result)
+ (when (phpinspect-public-p (phpinspect--candidate-scope
candidate))
+ (push candidate filtered-result))))
+ (setq result filtered-result))
+
+ (phpinspect--log "Returning attributes %s" result)
+ result)))))
(provide 'phpinspect-suggest)
diff --git a/phpinspect-token-predicates.el b/phpinspect-token-predicates.el
index b27e5d8d48..ffdb8dcae2 100644
--- a/phpinspect-token-predicates.el
+++ b/phpinspect-token-predicates.el
@@ -81,6 +81,12 @@ Type can be any of the token types returned by
(or (phpinspect-token-type-p token :const)
(phpinspect-incomplete-const-p token)))
+(define-inline phpinspect-public-p (token)
+ (inline-quote (phpinspect-token-type-p ,token :public)))
+
+(define-inline phpinspect-protected-p (token)
+ (inline-quote (phpinspect-token-type-p ,token :protected)))
+
(define-inline phpinspect-scope-p (token)
(inline-letevals (token)
(inline-quote
diff --git a/test/test-class.el b/test/test-class.el
index 670feddbe9..154336c302 100644
--- a/test/test-class.el
+++ b/test/test-class.el
@@ -52,10 +52,10 @@
(phpinspect--class-set-index class `(phpinspect--indexed-class (class-name
. ,(phpinspect--make-type :name "Class"))))
(phpinspect--class-set-index other-class `(phpinspect--indexed-class
(class-name . ,(phpinspect--make-type :name "OtherClass"))))
(phpinspect--class-update-method
- class (phpinspect--make-function :name "test" :return-type
phpinspect--null-type))
+ class (phpinspect--make-function :scope '(:private) :name "test"
:return-type phpinspect--null-type))
(phpinspect--class-update-method
- other-class (phpinspect--make-function :name "other-test" :return-type
phpinspect--null-type))
+ other-class (phpinspect--make-function :scope '(:protected) :name
"other-test" :return-type phpinspect--null-type))
(phpinspect--class-incorporate class other-class)
- [elpa] externals/phpinspect updated (855529095a -> f84327523b), ELPA Syncer, 2024/08/20
- [elpa] externals/phpinspect 2c82e844d3 1/6: Require project when resolving class property type, ELPA Syncer, 2024/08/20
- [elpa] externals/phpinspect 25ae878cfc 3/6: Implement indexation of functions nested within blocks/lists, ELPA Syncer, 2024/08/20
- [elpa] externals/phpinspect e111df4ca9 4/6: Completion: filter out attributes that are not accessible from the current scope,
ELPA Syncer <=
- [elpa] externals/phpinspect c77decb3ea 5/6: fix reference to free variable, ELPA Syncer, 2024/08/20
- [elpa] externals/phpinspect f84327523b 6/6: prefix unused lexical argument, ELPA Syncer, 2024/08/20
- [elpa] externals/phpinspect 7eed1d57e9 2/6: Fix a bug in the incremental parsing of function tokens, ELPA Syncer, 2024/08/20