diff --git a/phpinspect-buffer.el b/phpinspect-buffer.el index 354ec5e..4872aed 100644 --- a/phpinspect-buffer.el +++ b/phpinspect-buffer.el @@ -33,6 +33,8 @@ (require 'phpinspect-resolve) (require 'phpinspect-util) +(phpinspect--declare-log-group 'buffer) + (defvar-local phpinspect-current-buffer nil "An instance of `phpinspect-buffer' local to the active buffer. This variable is only set for buffers where @@ -106,11 +108,13 @@ linked with." (gethash token (phpinspect-buffer-token-index buffer))) (cl-defmethod phpinspect-buffer-set-index-reference-for-token ((buffer phpinspect-buffer) token index) + (phpinspect--log "Setting index reference for token %s" token) (unless (phpinspect-probably-token-p token) (error "%s does not seem to be a token" token)) (puthash token index (phpinspect-buffer-token-index buffer))) (cl-defmethod phpinspect-buffer-update-index-reference-for-token ((buffer phpinspect-buffer) old new) + (phpinspect--log "Updating index reference for old token %s to new token %s" old new) (unless (and (phpinspect-probably-token-p old) (phpinspect-probably-token-p new)) (when (and old new) (error "old and new parameters should be tokens"))) @@ -123,6 +127,7 @@ linked with." (unless (phpinspect-probably-token-p token) (error "%s does not seem to be a token" token)) + (phpinspect--log "Deleting index for token %s" token) (cond ((phpinspect-class-p token) (when-let ((class (gethash token (phpinspect-buffer-token-index buffer)))) (remhash token (phpinspect-buffer-token-index buffer)) @@ -299,9 +304,10 @@ linked with." type-resolver scope (and (phpinspect-comment-p comment-before) comment-before))) - (if static - (phpinspect--class-set-static-method class-obj indexed) - (phpinspect--class-set-method class-obj indexed)) + (unless (phpinspect--function-anonyous-p indexed) + (if static + (phpinspect--class-set-static-method class-obj indexed) + (phpinspect--class-set-method class-obj indexed))) (phpinspect-buffer-set-index-reference-for-token buffer (phpinspect-meta-token func) @@ -421,6 +427,10 @@ linked with." (setf (phpinspect-buffer-map buffer) (phpinspect-make-bmap)) (setf (phpinspect-buffer-declarations buffer) nil) (setf (phpinspect-buffer-imports buffer) nil) + (setf (phpinspect-buffer-namespaces buffer) nil) + (setf (phpinspect-buffer-classes buffer) nil) + (setf (phpinspect-buffer-class-variables buffer) nil) + (setf (phpinspect-buffer-functions buffer) nil) (setf (phpinspect-buffer-token-index buffer) (make-hash-table :test 'eq :size 100 :rehash-size 1.5)) (phpinspect-edtrack-clear (phpinspect-buffer-edit-tracker buffer))) @@ -429,6 +439,13 @@ linked with." (phpinspect-buffer-reset buffer) (phpinspect-buffer-parse buffer 'no-interrupt)) +(cl-defmethod phpinspect-buffer-reindex ((buffer phpinspect-buffer)) + (dolist (token (hash-table-keys (phpinspect-buffer-token-index buffer))) + (phpinspect-buffer-delete-index-for-token buffer token)) + + (phpinspect-buffer-reparse buffer) + (phpinspect-buffer-update-project-index buffer)) + (cl-defmethod phpinspect-buffer-update-project-index ((buffer phpinspect-buffer)) "Update project index using the last parsed token map of this buffer. When `phpinspect-buffer-parse' has been executed before @@ -440,12 +457,14 @@ continuing execution." (unless (phpinspect-buffer-map buffer) (phpinspect-buffer-parse buffer)) + (phpinspect--log "Preparing to update project index") ;; Use inhibit-quit to prevent index corruption though partial index ;; application. (let ((inhibit-quit t)) (when (phpinspect-buffer-project buffer) (let ((map (phpinspect-buffer-map buffer))) (unless (eq map (phpinspect-buffer--last-indexed-bmap buffer)) + (phpinspect--log "Updating project index") (phpinspect-buffer-index-imports buffer (phpinspect-bmap-imports map)) (phpinspect-buffer-index-declarations buffer (phpinspect-bmap-declarations map)) (phpinspect-buffer-index-namespaces buffer (phpinspect-bmap-namespaces map)) diff --git a/phpinspect-cache.el b/phpinspect-cache.el index 281ff75..eda831b 100644 --- a/phpinspect-cache.el +++ b/phpinspect-cache.el @@ -172,7 +172,7 @@ currently opened projects." (cl-defmethod phpinspect--cache-get-project-create ((cache phpinspect--cache) (project-root string)) - "Get a project that is located in PROJECT-ROOT from CACHE. + "Get a project that is located in PROJECT-ROOT from CACHE. If no such project exists in the cache yet, it is created and then returned." (let ((project (phpinspect--cache-get-project cache project-root))) diff --git a/phpinspect-project.el b/phpinspect-project.el index 01c8f12..f3cae30 100644 --- a/phpinspect-project.el +++ b/phpinspect-project.el @@ -241,29 +241,37 @@ indexation, but indexed synchronously before returning." (phpinspect-project-edit project (when (and no-enqueue (phpinspect--class-initial-index class)) (phpinspect--log "Indexing type file for %s" class-fqn) - (phpinspect-project-index-type-file project class-fqn))) + (phpinspect-project-add-index + project + (phpinspect-project-index-type-file project class-fqn)))) class)) (cl-defmethod phpinspect-project-get-class-extra-or-create ((project phpinspect-project) (class-fqn phpinspect--type) &optional no-enqueue) - (or (phpinspect-project-get-class-or-extra project class-fqn) + (or (phpinspect-project-get-class-or-extra project class-fqn no-enqueue) (phpinspect-project-get-class-create project class-fqn no-enqueue))) (cl-defmethod phpinspect-project-get-class - ((project phpinspect-project) (class-fqn phpinspect--type)) + ((project phpinspect-project) (class-fqn phpinspect--type) &optional index) "Get indexed class by name of CLASS-FQN stored in PROJECT." (let ((class (gethash (phpinspect--type-name-symbol class-fqn) (phpinspect-project-class-index project)))) - (when (and class (phpinspect-project-read-only-p project) - (not (phpinspect--class-read-only-p class))) - (setf (phpinspect--class-read-only-p class) t)) + (when class + (when (and (phpinspect-project-read-only-p project) + (not (phpinspect--class-read-only-p class))) + (setf (phpinspect--class-read-only-p class) t)) + + (when (and index (not (phpinspect--class-initial-index class))) + (phpinspect-project-add-index + project + (phpinspect-project-index-type-file project class-fqn)))) class)) (cl-defmethod phpinspect-project-get-class-or-extra - ((project phpinspect-project) (class-fqn phpinspect--type)) - (or (phpinspect-project-get-class project class-fqn) + ((project phpinspect-project) (class-fqn phpinspect--type) &optional index) + (or (phpinspect-project-get-class project class-fqn index) (and (phpinspect-project-extra-class-retriever project) (funcall (phpinspect-project-extra-class-retriever project) class-fqn)))) diff --git a/phpinspect-suggest.el b/phpinspect-suggest.el index d705811..0a56fd3 100644 --- a/phpinspect-suggest.el +++ b/phpinspect-suggest.el @@ -30,6 +30,8 @@ (require 'phpinspect-project) (require 'phpinspect-class) +(phpinspect--declare-log-group 'suggest) + (defun phpinspect-suggest-functions (rctx) (let* ((project (phpinspect--resolvecontext-project rctx))) (phpinspect-project-get-functions-with-extra project))) @@ -76,7 +78,6 @@ "Retrieved class index, starting method collection %s (%s)" "No class index found in %s for %s") project-root class-fqn) - (when class (if static (phpinspect--class-get-static-method-list class) @@ -138,9 +139,12 @@ static variables and static methods." (phpinspect--log "Statement type: %s" statement-type) (when statement-type (let ((type (funcall type-resolver statement-type))) - (append (phpinspect--get-variables-for-class - type - static) - (funcall method-lister type))))))) + (when-let ((result + (append (phpinspect--get-variables-for-class + type + static) + (funcall method-lister type)))) + (phpinspect--log "Returning attributes %s" result) + result)))))) (provide 'phpinspect-suggest) diff --git a/phpinspect-type.el b/phpinspect-type.el index 1ffee8a..5ffa0fa 100644 --- a/phpinspect-type.el +++ b/phpinspect-type.el @@ -248,6 +248,9 @@ as first element and the type as second element.") "A phpinspect--type object representing the the return type of the function.")) +(defun phpinspect--function-anonyous-p (fn) + (eq (phpinspect-intern-name "anonymous") (phpinspect--function-name-symbol fn))) + (defmacro phpinspect--make-function (&rest property-list) `(phpinspect--make-function-generated ,@(phpinspect--wrap-plist-name-in-symbol property-list))) @@ -269,6 +272,9 @@ return type of the function.")) "When the variable is an object attribute, this should contain the scope of the variable as returned by `phpinspect-parse-scope'") + (readonly nil + :documentation + "Whether or not the variable is readonly") (lifetime nil :documentation "The lifetime of the variable (e.g. whether it is static or not). Will diff --git a/phpinspect.el b/phpinspect.el index f78b5fe..bf8d413 100644 --- a/phpinspect.el +++ b/phpinspect.el @@ -112,7 +112,7 @@ Reparses the entire buffer without token reuse." (when (and (boundp 'phpinspect-mode) phpinspect-mode) - (phpinspect-buffer-reparse phpinspect-current-buffer))) + (phpinspect-buffer-reindex phpinspect-current-buffer))) (defun phpinspect--disable-mode () "Clean up the buffer environment for the mode to be disabled."