branch: externals/phps-mode commit 5686703a6bbcf9757ba745fcae16d4a70e2dd5bf Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Passing bookkeeping via AST for $this inside arrow function body inside class method --- phps-mode-ast-bookkeeping.el | 75 +++++++++++++++++++++++++++----------------- phps-mode-parser-sdt.el | 4 +-- test/phps-mode-test-ast.el | 22 ++++++------- 3 files changed, 59 insertions(+), 42 deletions(-) diff --git a/phps-mode-ast-bookkeeping.el b/phps-mode-ast-bookkeeping.el index a5b2d6953e..e0b7ec01b7 100644 --- a/phps-mode-ast-bookkeeping.el +++ b/phps-mode-ast-bookkeeping.el @@ -773,40 +773,57 @@ (plist-get subject 'end)) 1 bookkeeping) - - (let* ((sub-scope (cdr scope)) - (predefined) - (variable-ids - (phps-mode-ast-bookkeeping--generate-variable-scope-string - sub-scope - (concat "$" property-name) - t)) - (symbol-id - (phps-mode-ast-bookkeeping--generate-symbol-scope-string - sub-scope - property-name)) - (bookkeeping-object - (list - (plist-get item 'property-start) - (plist-get item 'property-end)))) - (when (gethash symbol-id bookkeeping) + ;; When current scope is arrow function + ;; we should go up in scope until we get out of + ;; arrow functions scope + (let ((sub-scope scope) + (head-scope) + (is-arrow-function-scope t)) + (while (and + sub-scope + is-arrow-function-scope) (setq - predefined - t)) - (dolist (variable-id variable-ids) - (when (gethash variable-id bookkeeping) + head-scope + (car sub-scope)) + (setq + sub-scope + (cdr sub-scope)) + (unless (equal + (plist-get head-scope 'type) + 'arrow-function) + (setq is-arrow-function-scope nil))) + (let* ((predefined) + (variable-ids + (phps-mode-ast-bookkeeping--generate-variable-scope-string + sub-scope + (concat "$" property-name) + t)) + (symbol-id + (phps-mode-ast-bookkeeping--generate-symbol-scope-string + sub-scope + property-name)) + (bookkeeping-object + (list + (plist-get item 'property-start) + (plist-get item 'property-end)))) + (when (gethash symbol-id bookkeeping) (setq predefined - t))) - (if predefined + t)) + (dolist (variable-id variable-ids) + (when (gethash variable-id bookkeeping) + (setq + predefined + t))) + (if predefined + (puthash + bookkeeping-object + 1 + bookkeeping) (puthash bookkeeping-object - 1 - bookkeeping) - (puthash - bookkeeping-object - 0 - bookkeeping)))) + 0 + bookkeeping))))) (t (let ((variable-ids diff --git a/phps-mode-parser-sdt.el b/phps-mode-parser-sdt.el index 1ecb0b778c..3485fdf0ac 100644 --- a/phps-mode-parser-sdt.el +++ b/phps-mode-parser-sdt.el @@ -830,7 +830,7 @@ ast-type logical-xor-expression a - (phps-mode-parser-sdt--get-list-of-object ,(nth 0 args)) + ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args)) b ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args)))) phps-mode-parser--table-translations) @@ -843,7 +843,7 @@ ast-type concat-expression a - (phps-mode-parser-sdt--get-list-of-object ,(nth 0 args)) + ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args)) b ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args)))) phps-mode-parser--table-translations) diff --git a/test/phps-mode-test-ast.el b/test/phps-mode-test-ast.el index e5b07e2737..1f223b9484 100644 --- a/test/phps-mode-test-ast.el +++ b/test/phps-mode-test-ast.el @@ -37,17 +37,17 @@ buffer-contents name (lambda() - (let ((parse (phps-mode-parser-parse))) - (message "Left-to-right with right-most derivation:\n%S\n" parse) - (dolist (production-number (reverse parse)) - (let ((production - (phps-mode-parser--get-grammar-production-by-number - production-number))) - (message - "%d: %S -> %S" - production-number - (car (car production)) - (car (cdr production)))))) + ;; (let ((parse (phps-mode-parser-parse))) + ;; (message "Left-to-right with right-most derivation:\n%S\n" parse) + ;; (dolist (production-number (reverse parse)) + ;; (let ((production + ;; (phps-mode-parser--get-grammar-production-by-number + ;; production-number))) + ;; (message + ;; "%d: %S -> %S" + ;; production-number + ;; (car (car production)) + ;; (car (cdr production)))))) (phps-mode-ast--generate) (phps-mode-ast-bookkeeping--generate) (should