[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phps-mode a65c8af308 008/212: Extract ast code into sep
From: |
Christian Johansson |
Subject: |
[elpa] externals/phps-mode a65c8af308 008/212: Extract ast code into separate file and test |
Date: |
Wed, 26 Jan 2022 01:50:11 -0500 (EST) |
branch: externals/phps-mode
commit a65c8af30899890ce1564313f9371e46c4c7eedd
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Extract ast code into separate file and test
---
Makefile | 6 +-
phps-mode-ast.el | 291 ++++++++++++++++++++++++++++++++++
test/phps-mode-test-ast.el | 148 ++++++++++++++++++
test/phps-mode-test-parser.el | 351 ------------------------------------------
4 files changed, 444 insertions(+), 352 deletions(-)
diff --git a/Makefile b/Makefile
index 7207e62119..f425653679 100644
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,11 @@ compile:
find . -name "*.el" -exec $(EMACS_CMD) -f batch-byte-compile {} \;
.PHONY: tests
-tests: test-integration test-lexer test-lex-analyzer test-parser
test-syntax-table
+tests: test-integration test-lexer test-lex-analyzer test-parser
test-syntax-table test-ast
+
+.PHONY: test-ast
+test-ast:
+ $(EMACS_CMD) -l test/phps-mode-test-ast.el
.PHONY: test-integration
test-integration:
diff --git a/phps-mode-ast.el b/phps-mode-ast.el
new file mode 100644
index 0000000000..66e7f44091
--- /dev/null
+++ b/phps-mode-ast.el
@@ -0,0 +1,291 @@
+;;; phps-mode-ast.el --- Abstract Syntax Tree functions -*- lexical-binding: t
-*-
+
+;; Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+;; This file is not part of GNU Emacs.
+
+;; 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 2, 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+(require 'phps-mode-parser)
+
+
+;;; Variables:
+
+
+(defvar-local
+ phps-mode-ast--current-namespace
+ nil
+ "Current namespace for AST.")
+
+(defvar-local
+ phps-mode-ast--current-namespace-children
+ nil
+ "Children for current namespace for AST.")
+
+(defvar-local
+ phps-mode-ast--tree
+ nil
+ "Tree for current buffer.")
+
+(defvar-local
+ phps-mode-ast--imenu
+ nil
+ "Imenu for current buffer.")
+
+;; top_statement_list -> (top_statement_list top_statement)
+(puthash
+ 79
+ (lambda(args _terminals)
+ ;; (message "top_statement_list: %S" args)
+ (let ((ast-object))
+ (if (car args)
+ (setq ast-object (append (car args) (cdr args)))
+ (setq ast-object (cdr args)))
+ ;; (message "ast-object: %S" ast-object)
+ ast-object))
+ phps-mode-parser--table-translations)
+
+;; top_statement -> (T_NAMESPACE namespace_declaration_name ";")
+(puthash
+ 106
+ (lambda(args terminals)
+ (let ((ast-object
+ (list
+ 'type
+ 'namespace
+ 'name
+ (nth 1 args)
+ 'index
+ (car (cdr (nth 1 terminals)))
+ 'start
+ (car (cdr (nth 2 terminals)))
+ 'end
+ 'max)))
+ ;; (message "Namespace %S" ast-object)
+ ;; (message "args: %S" args)
+ ;; (message "terminals: %S" terminals)
+ (setq
+ phps-mode-ast--current-namespace
+ ast-object)
+ ast-object))
+ phps-mode-parser--table-translations)
+
+;; top_statement -> (T_NAMESPACE namespace_declaration_name "{"
top_statement_list "}")
+(puthash
+ 107
+ (lambda(args terminals)
+ (let ((ast-object
+ (list
+ 'type
+ 'namespace
+ 'name
+ (nth 1 args)
+ 'index
+ (car (cdr (nth 1 terminals)))
+ 'start
+ (car (cdr (nth 2 terminals)))
+ 'end
+ (car (cdr (nth 4 terminals)))
+ 'children
+ (nth 3 args))))
+ ;; (message "Namespace %S" ast-object)
+ ;; (message "args: %S" args)
+ ;; (message "terminals: %S" terminals)
+ ;; (message "ast-object: %S" ast-object)
+ (push
+ ast-object
+ phps-mode-ast--tree)
+ ast-object))
+ phps-mode-parser--table-translations)
+
+;; top_statement -> (T_NAMESPACE "{" top_statement_list "}")
+(puthash
+ 108
+ (lambda(args _terminals)
+ ;; (message "T_NAMESPACE: %S" args)
+ (when (nth 2 args)
+ (setq
+ phps-mode-ast--tree
+ (append phps-mode-ast--tree (nth 2 args))))
+ (nth 2 args))
+ phps-mode-parser--table-translations)
+
+;; function_declaration_statement -> (function returns_ref T_STRING
backup_doc_comment "(" parameter_list ")" return_type backup_fn_flags "{"
inner_statement_list "}" backup_fn_flags)
+(puthash
+ 174
+ (lambda(args terminals)
+ (let ((ast-object
+ (list
+ 'type
+ 'function
+ 'name
+ (nth 2 args)
+ 'index
+ (car (cdr (nth 2 terminals)))
+ 'start
+ (car (cdr (nth 9 terminals)))
+ 'end
+ (car (cdr (nth 11 terminals))))))
+ ;; (message "Function: %S" ast-object)
+ ;; (message "args: %S" args)
+ ;; (message "terminals: %S" terminals)
+ (when phps-mode-ast--current-namespace
+ (push
+ ast-object
+ phps-mode-ast--current-namespace-children))
+ ast-object))
+ phps-mode-parser--table-translations)
+
+;; class_declaration_statement -> (T_CLASS T_STRING extends_from
implements_list backup_doc_comment "{" class_statement_list "}")
+(puthash
+ 180
+ (lambda(args terminals)
+ (let ((ast-object
+ (list
+ 'type
+ 'class
+ 'name
+ (nth 1 args)
+ 'index
+ (car (cdr (nth 1 terminals)))
+ 'start
+ (car (cdr (nth 5 terminals)))
+ 'end
+ (car (cdr (nth 7 terminals)))
+ 'children
+ (nth 6 args))))
+ ;; (message "Class %S" ast-object)
+ ;; (message "args: %S" args)
+ ;; (message "terminals: %S" terminals)
+ (when phps-mode-ast--current-namespace
+ (push
+ ast-object
+ phps-mode-ast--current-namespace-children))
+ ast-object))
+ phps-mode-parser--table-translations)
+
+;; class_statement_list -> (class_statement_list class_statement)
+(puthash
+ 276
+ (lambda(args _terminals)
+ ;; (message "class_statement_list: %S" args)
+ (let ((ast-object))
+ (if (car args)
+ (setq ast-object (append (car args) (cdr args)))
+ (setq ast-object (cdr args)))
+ ;; (message "ast-object: %S" ast-object)
+ ast-object))
+ phps-mode-parser--table-translations)
+
+;; attributed_class_statement -> (method_modifiers function returns_ref
identifier backup_doc_comment "(" parameter_list ")" return_type
backup_fn_flags method_body backup_fn_flags)
+(puthash
+ 280
+ (lambda(args terminals)
+ (let ((ast-object
+ (list
+ 'type
+ 'method
+ 'name
+ (nth 3 args)
+ 'index
+ (car (cdr (nth 3 terminals)))
+ 'start
+ (car (cdr (car (nth 10 terminals))))
+ 'end
+ (cdr (cdr (car (cdr (cdr (nth 10 terminals)))))))))
+ ;; (message "Method: %S" ast-object)
+ ;; (message "args: %S" args)
+ ;; (message "terminals: %S" terminals)
+ ast-object))
+ phps-mode-parser--table-translations)
+
+
+;; Functions:
+
+
+(defun phps-mode-ast-generate ()
+ "Generate AST for current buffer."
+ (setq
+ phps-mode-ast--current-namespace
+ nil)
+ (setq
+ phps-mode-ast--tree
+ nil)
+ (let ((_translation (phps-mode-parser-translate)))
+
+ ;; (message "translation: %S" translation)
+
+ (when phps-mode-ast--current-namespace
+ (plist-put
+ phps-mode-ast--current-namespace
+ 'children
+ (reverse phps-mode-ast--current-namespace-children))
+ (push
+ phps-mode-ast--current-namespace
+ phps-mode-ast--tree))
+
+ (let ((imenu-index))
+ (dolist (item phps-mode-ast--tree)
+ (let ((children (plist-get item 'children))
+ (item-type (plist-get item 'type))
+ (parent))
+ (if (and
+ (or
+ (equal item-type 'namespace)
+ (equal item-type 'class))
+ children)
+ (progn
+ (dolist (child children)
+ (let ((grand-children (plist-get child 'children))
+ (child-type (plist-get child 'type))
+ (subparent))
+ (if (and
+ (equal child-type 'class)
+ grand-children)
+ (progn
+ (dolist (grand-child grand-children)
+ (push
+ `(,(plist-get grand-child 'name) . ,(plist-get
grand-child 'index))
+ subparent))
+ (push
+ (append
+ (list (plist-get child 'name))
+ (reverse subparent))
+ parent))
+ (push
+ `(,(plist-get child 'name) . ,(plist-get child 'index))
+ parent)))
+ )
+ (push
+ (append
+ (list (plist-get item 'name))
+ (reverse parent))
+ imenu-index))
+ (push
+ `(,(plist-get item 'name) . ,(plist-get item 'index))
+ imenu-index))))
+ (setq
+ phps-mode-ast--imenu
+ (reverse imenu-index)))))
+
+
+(provide 'phps-mode-ast)
+;;; phps-mode-ast.el ends here
diff --git a/test/phps-mode-test-ast.el b/test/phps-mode-test-ast.el
new file mode 100644
index 0000000000..544cc8d5b8
--- /dev/null
+++ b/test/phps-mode-test-ast.el
@@ -0,0 +1,148 @@
+;;; phps-mode-test-ast.el --- Tests for AST -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017-2021 Free Software Foundation, Inc.
+
+;; This file is not part of GNU Emacs.
+
+;; 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 2, 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+
+;; Run from terminal make test-parser
+
+
+;;; Code:
+
+(require 'ert)
+(require 'phps-mode)
+(require 'phps-mode-ast)
+
+(defun phps-mode-test-ast--buffer-contents (buffer-contents name logic)
+ (with-temp-buffer
+ ;; Setup buffer
+ (insert buffer-contents)
+ (message
+ "Testing buffer %S with buffer-contents:\n%S\n"
+ name
+ (buffer-substring-no-properties (point-min) (point-max)))
+
+ ;; Setup lexer
+ (setq
+ phps-mode-lexer--generated-tokens
+ nil)
+ (setq
+ phps-mode-lexer--state
+ 'ST_INITIAL)
+ (setq
+ phps-mode-lexer--states
+ nil)
+ (setq
+ phps-mode-lexer--state-stack
+ nil)
+ (setq
+ phps-mode-lexer--heredoc-label
+ nil)
+ (setq
+ phps-mode-lexer--heredoc-label-stack
+ nil)
+ (setq
+ phps-mode-lexer--nest-location-stack
+ nil)
+
+ ;; Run lexer
+ (setq
+ semantic-lex-analyzer
+ #'phps-mode-lex-analyzer--re2c-lex)
+ (setq
+ semantic-lex-syntax-table
+ phps-mode-syntax-table)
+ (semantic-lex-buffer)
+ (setq
+ phps-mode-parser-tokens
+ (phps-mode-lex-analyzer--generate-parser-tokens
+ phps-mode-lexer--generated-tokens))
+
+ ;; Run test
+ (funcall logic)
+ (message "Passed %s" name)))
+
+(defun phps-mode-test-ast-imenu ()
+ "Run test for imenu generation."
+ (message "-- Running tests for imenu generation... --\n")
+
+ (phps-mode-test-ast--buffer-contents
+ "<?php\n\nnamespace MyNamespace;\n\nfunction aFunction() {\n /**\n *
With some contents\n */\n}\n\nclass MyClass\n{\n\n /**\n *\n
*/\n public function __construct()\n {\n if ($test) {\n }\n
}\n\n /**\n *\n */\n public function myFunction1()\n {\n
$this->addMessage(\"My random {$message} here\" . ($random > 1 ? \"A\" :
\"\") . \" was here.\");\n }\n \n /**\n *\n */\n public
function myFunction2()\n [...]
+ "Passed imenu-generation via parser AST for basic object oriented file"
+ (lambda()
+ ;; (let ((parse (phps-mode-parser-parse)))
+ ;; (message "Left-to-right with left-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)
+ ;; (message "\nAST:\n%S\n" phps-mode-ast--tree)
+ ;; (message "imenu-index:\n%S\n" phps-mode-ast--imenu)
+
+ (should
+ (equal
+ phps-mode-ast--imenu
+ '(("MyNamespace" ("aFunction" . 41) ("MyClass" ("__construct" . 160)
("myFunction1" . 261) ("myFunction2" . 433) ("myFunction3" . 513)
("myFunction4" . 583))))))))
+
+ (phps-mode-test-ast--buffer-contents
+ "<?php\n\nnamespace MyNamespaceA\n{\n function aFunctionA() {\n
/**\n * With some contents\n */\n }\n class MyClass\n
{\n\n /**\n *\n */\n public function
__construct()\n {\n if ($test) {\n }\n
}\n\n /**\n *\n */\n public function
myFunction1()\n {\n $this->addMessage(\"My random {$message}
here\" . ($random > 1 ? \"A\" : \"\") . \" was h [...]
+ "Passed imenu-generation via parser AST for advanced object oriented file"
+ (lambda()
+ ;; (let ((parse (phps-mode-parser-parse)))
+ ;; (message "Left-to-right with left-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)
+ ;; (message "\nAST:\n%S\n" phps-mode-ast--tree)
+ ;; (message "imenu-index:\n%S\n" phps-mode-ast--imenu)
+ (should
+ (equal
+ phps-mode-ast--imenu
+ '(("MyNamespaceA" ("aFunctionA" . 46) ("MyClass" ("__construct" . 205)
("myFunction1" . 338) ("myFunction2" . 542) ("myFunction3" . 646)
("myFunction4" . 740))) ("aFunctionB" . 807) ("MyClass" ("__construct" . 925)
("myFunction1" . 1058) ("myFunction2" . 1262) ("myFunction3" . 1366)
("myFunction4" . 1460)))))))
+
+ (message "\n-- Ran tests for imenu generation. --"))
+
+(defun phps-mode-test-ast ()
+ "Run test for ast."
+ (message "-- Running all tests for ast... --\n")
+
+ (phps-mode-test-ast-imenu)
+
+ (message "\n-- Ran all tests for ast. --"))
+
+(phps-mode-test-ast)
+
+(provide 'phps-mode-test-ast)
+
+
+;;; phps-mode-test-ast.el ends here
diff --git a/test/phps-mode-test-parser.el b/test/phps-mode-test-parser.el
index d7de43b546..f6648b92af 100644
--- a/test/phps-mode-test-parser.el
+++ b/test/phps-mode-test-parser.el
@@ -27,8 +27,6 @@
(require 'ert)
(require 'phps-mode)
-(require 'phps-mode-lex-analyzer)
-(require 'phps-mode-parser)
(defun phps-mode-test-parser--buffer-contents (buffer-contents name logic)
(with-temp-buffer
@@ -306,359 +304,10 @@
(message "\n-- Ran tests for parser parse. --"))
-(defun phps-mode-test-parser-translate ()
- "Run test for parse translation."
- (message "-- Running tests for parser translation... --\n")
-
- (let ((ast)
- (ast-current-namespace)
- (ast-current-namespace-children))
-
- ;; top_statement_list -> (top_statement_list top_statement)
- (puthash
- 79
- (lambda(args _terminals)
- ;; (message "top_statement_list: %S" args)
- (let ((ast-object))
- (if (car args)
- (setq ast-object (append (car args) (cdr args)))
- (setq ast-object (cdr args)))
- ;; (message "ast-object: %S" ast-object)
- ast-object))
- phps-mode-parser--table-translations)
-
- ;; top_statement -> (T_NAMESPACE namespace_declaration_name ";")
- (puthash
- 106
- (lambda(args terminals)
- (let ((ast-object
- (list
- 'type
- 'namespace
- 'name
- (nth 1 args)
- 'index
- (car (cdr (nth 1 terminals)))
- 'start
- (car (cdr (nth 2 terminals)))
- 'end
- 'max)))
- ;; (message "Namespace %S" ast-object)
- ;; (message "args: %S" args)
- ;; (message "terminals: %S" terminals)
- (setq
- ast-current-namespace
- ast-object)
- ast-object))
- phps-mode-parser--table-translations)
-
- ;; top_statement -> (T_NAMESPACE namespace_declaration_name "{"
top_statement_list "}")
- (puthash
- 107
- (lambda(args terminals)
- (let ((ast-object
- (list
- 'type
- 'namespace
- 'name
- (nth 1 args)
- 'index
- (car (cdr (nth 1 terminals)))
- 'start
- (car (cdr (nth 2 terminals)))
- 'end
- (car (cdr (nth 4 terminals)))
- 'children
- (nth 3 args))))
- ;; (message "Namespace %S" ast-object)
- ;; (message "args: %S" args)
- ;; (message "terminals: %S" terminals)
- ;; (message "ast-object: %S" ast-object)
- (push
- ast-object
- ast)
- ast-object))
- phps-mode-parser--table-translations)
-
- ;; top_statement -> (T_NAMESPACE "{" top_statement_list "}")
- (puthash
- 108
- (lambda(args _terminals)
- (message "T_NAMESPACE: %S" args)
- (when (nth 2 args)
- (setq
- ast
- (append ast (nth 2 args))))
- (nth 2 args))
- phps-mode-parser--table-translations)
-
- ;; function_declaration_statement -> (function returns_ref T_STRING
backup_doc_comment "(" parameter_list ")" return_type backup_fn_flags "{"
inner_statement_list "}" backup_fn_flags)
- (puthash
- 174
- (lambda(args terminals)
- (let ((ast-object
- (list
- 'type
- 'function
- 'name
- (nth 2 args)
- 'index
- (car (cdr (nth 2 terminals)))
- 'start
- (car (cdr (nth 9 terminals)))
- 'end
- (car (cdr (nth 11 terminals))))))
- ;; (message "Function: %S" ast-object)
- ;; (message "args: %S" args)
- ;; (message "terminals: %S" terminals)
- (when ast-current-namespace
- (push
- ast-object
- ast-current-namespace-children))
- ast-object))
- phps-mode-parser--table-translations)
-
- ;; class_declaration_statement -> (T_CLASS T_STRING extends_from
implements_list backup_doc_comment "{" class_statement_list "}")
- (puthash
- 180
- (lambda(args terminals)
- (let ((ast-object
- (list
- 'type
- 'class
- 'name
- (nth 1 args)
- 'index
- (car (cdr (nth 1 terminals)))
- 'start
- (car (cdr (nth 5 terminals)))
- 'end
- (car (cdr (nth 7 terminals)))
- 'children
- (nth 6 args))))
- ;; (message "Class %S" ast-object)
- ;; (message "args: %S" args)
- ;; (message "terminals: %S" terminals)
- (when ast-current-namespace
- (push
- ast-object
- ast-current-namespace-children))
- ast-object))
- phps-mode-parser--table-translations)
-
- ;; class_statement_list -> (class_statement_list class_statement)
- (puthash
- 276
- (lambda(args _terminals)
- ;; (message "class_statement_list: %S" args)
- (let ((ast-object))
- (if (car args)
- (setq ast-object (append (car args) (cdr args)))
- (setq ast-object (cdr args)))
- ;; (message "ast-object: %S" ast-object)
- ast-object))
- phps-mode-parser--table-translations)
-
- ;; attributed_class_statement -> (method_modifiers function returns_ref
identifier backup_doc_comment "(" parameter_list ")" return_type
backup_fn_flags method_body backup_fn_flags)
- (puthash
- 280
- (lambda(args terminals)
- (let ((ast-object
- (list
- 'type
- 'method
- 'name
- (nth 3 args)
- 'index
- (car (cdr (nth 3 terminals)))
- 'start
- (car (cdr (car (nth 10 terminals))))
- 'end
- (cdr (cdr (car (cdr (cdr (nth 10 terminals)))))))))
- ;; (message "Method: %S" ast-object)
- ;; (message "args: %S" args)
- ;; (message "terminals: %S" terminals)
- ast-object))
- phps-mode-parser--table-translations)
-
- (phps-mode-test-parser--buffer-contents
- "<?php\n\nnamespace MyNamespace;\n\nfunction aFunction() {\n /**\n
* With some contents\n */\n}\n\nclass MyClass\n{\n\n /**\n *\n
*/\n public function __construct()\n {\n if ($test) {\n }\n
}\n\n /**\n *\n */\n public function myFunction1()\n {\n
$this->addMessage(\"My random {$message} here\" . ($random > 1 ? \"A\" :
\"\") . \" was here.\");\n }\n \n /**\n *\n */\n public
function myFunction2() [...]
- "Imenu with double quoted string with variable inside it and concatenated
string"
- (lambda()
- (let ((parse (phps-mode-parser-parse)))
- (message "Left-to-right with left-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 ((_translation (phps-mode-parser-translate))
- (imenu-index))
- ;; (message "translation: %S" translation)
-
- (when ast-current-namespace
- (plist-put
- ast-current-namespace
- 'children
- (reverse ast-current-namespace-children))
- (push
- ast-current-namespace
- ast))
-
- (message "\nAST:\n%S\n" ast)
-
- (dolist (item ast)
- (let ((children (plist-get item 'children))
- (item-type (plist-get item 'type))
- (parent))
- (if (and
- (or
- (equal item-type 'namespace)
- (equal item-type 'class))
- children)
- (progn
- (dolist (child children)
- (let ((grandchildren (plist-get child 'children))
- (child-type (plist-get child 'type))
- (subparent))
- (if (and
- (equal child-type 'class)
- grandchildren)
- (progn
- (dolist (grandchild grandchildren)
- (push
- `(,(plist-get grandchild 'name) . ,(plist-get
grandchild 'index))
- subparent))
- (push
- (append
- (list (plist-get child 'name))
- (reverse subparent))
- parent))
- (push
- `(,(plist-get child 'name) . ,(plist-get child
'index))
- parent)))
- )
- (push
- (append
- (list (plist-get item 'name))
- (reverse parent))
- imenu-index))
- (push
- `(,(plist-get item 'name) . ,(plist-get item 'index))
- imenu-index))))
-
- (message "imenu-index:\n%S\n" imenu-index)
-
- (should
- (equal
- imenu-index
- '(("MyNamespace" ("aFunction" . 41) ("MyClass" ("__construct" .
160) ("myFunction1" . 261) ("myFunction2" . 433) ("myFunction3" . 513)
("myFunction4" . 583))))))
- )))
-
- (setq
- ast-current-namespace
- nil)
- (setq
- ast-current-namespace-children
- nil)
- (setq
- ast
- nil)
-
- (phps-mode-test-parser--buffer-contents
- "<?php\n\nnamespace MyNamespaceA\n{\n function aFunctionA() {\n
/**\n * With some contents\n */\n }\n class MyClass\n
{\n\n /**\n *\n */\n public function
__construct()\n {\n if ($test) {\n }\n
}\n\n /**\n *\n */\n public function
myFunction1()\n {\n $this->addMessage(\"My random {$message}
here\" . ($random > 1 ? \"A\" : \"\") . \" was [...]
- "Imenu with double quoted string with variable inside it and concatenated
string in two namespaces"
- (lambda()
- (let ((parse (phps-mode-parser-parse)))
- (message "Left-to-right with left-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 ((_translation (phps-mode-parser-translate)))
- ;; (message "translation: %S" translation)
-
- (when ast-current-namespace
- (plist-put
- ast-current-namespace
- 'children
- (reverse ast-current-namespace-children))
- (push
- ast-current-namespace
- ast))
-
- (message "\nAST:\n%S\n" ast)
-
- (let ((imenu-index))
- (dolist (item ast)
- (let ((children (plist-get item 'children))
- (item-type (plist-get item 'type))
- (parent))
- (if (and
- (or
- (equal item-type 'namespace)
- (equal item-type 'class))
- children)
- (progn
- (dolist (child children)
- (let ((grandchildren (plist-get child 'children))
- (child-type (plist-get child 'type))
- (subparent))
- (if (and
- (equal child-type 'class)
- grandchildren)
- (progn
- (dolist (grandchild grandchildren)
- (push
- `(,(plist-get grandchild 'name) .
,(plist-get grandchild 'index))
- subparent))
- (push
- (append
- (list (plist-get child 'name))
- (reverse subparent))
- parent))
- (push
- `(,(plist-get child 'name) . ,(plist-get child
'index))
- parent)))
- )
- (push
- (append
- (list (plist-get item 'name))
- (reverse parent))
- imenu-index))
- (push
- `(,(plist-get item 'name) . ,(plist-get item 'index))
- imenu-index))))
- (setq
- imenu-index
- (reverse imenu-index))
-
- (message "imenu-index:\n%S\n" imenu-index)
-
- (should
- (equal
- imenu-index
- '(("MyNamespaceA" ("aFunctionA" . 46) ("MyClass" ("__construct" .
205) ("myFunction1" . 338) ("myFunction2" . 542) ("myFunction3" . 646)
("myFunction4" . 740))) ("aFunctionB" . 807) ("MyClass" ("__construct" . 925)
("myFunction1" . 1058) ("myFunction2" . 1262) ("myFunction3" . 1366)
("myFunction4" . 1460)))))
- ))))
-
- )
-
- (message "\n-- Ran tests for parser translation. --"))
-
(defun phps-mode-test-parser ()
"Run test for lexer."
(message "-- Running all tests for parser... --\n")
- (phps-mode-test-parser-translate)
(phps-mode-test-parser-parse)
(message "\n-- Ran all tests for parser. --"))
- [elpa] externals/phps-mode a1af5b11fb 040/212: More work on bookkeeping of class properties via AST, (continued)
- [elpa] externals/phps-mode a1af5b11fb 040/212: More work on bookkeeping of class properties via AST, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode 4dc07c9041 050/212: Bookkeeping via AST working with assigned variables from array, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode 4d226f18cc 048/212: Bookkeeping via AST working with referenced foreach variables, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode 5603e6266b 047/212: SDT for array values, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode 787d82313e 045/212: Bookkeeping via AST now tracks variables around inline-functions, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode a629baba89 053/212: More work on bookkeeping via AST for arrow function variables, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode df0b707a61 044/212: Added parser SDT for inline-function, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode 432382eddb 051/212: Added bookkeeping support for global variables in functions, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode bb381d8127 041/212: Bookkeeping of class properties via AST passed test, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode e95df1027b 042/212: Reverted old tests for imenu and bookkeeping for lex-analyzer, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode a65c8af308 008/212: Extract ast code into separate file and test,
Christian Johansson <=
- [elpa] externals/phps-mode 23c001c33f 037/212: Moved parser SDT to separate file, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode 261121f096 056/212: Fixed incorrect information in debug output in test, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode e8a47de694 052/212: Work on supported arrow functions for bookkeeping via AST, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode 5686703a6b 074/212: Passing bookkeeping via AST for $this inside arrow function body inside class method, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode a9d0e941df 066/212: Started on SDT for static variables statement, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode a8fecdfd68 055/212: Bookkeeping of variables inside arrow functions now working, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode e42646dc3a 058/212: Added SDT for isset() and empty(), Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode 9ad46d061e 057/212: Bookkeeping via AST passing two more tests, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode 806bb902b3 122/212: Improved indentation for chaining objects, Christian Johansson, 2022/01/26
- [elpa] externals/phps-mode cc3bf03786 123/212: Improved indentation after ending assignment expression, Christian Johansson, 2022/01/26