|
|
|
@ -53,14 +53,15 @@ If STRING has text properties, they are stripped."
|
|
|
|
|
(set-text-properties 0 length nil value)
|
|
|
|
|
(list token-keyword value)))
|
|
|
|
|
|
|
|
|
|
(defun phpinspect-handler-func-name (handler-name)
|
|
|
|
|
(eval-when-compile
|
|
|
|
|
(defun phpinspect-handler-func-name (handler-name)
|
|
|
|
|
(intern (concat "phpinspect--" (symbol-name handler-name) "-handler")))
|
|
|
|
|
|
|
|
|
|
(defun phpinspect-handler-regexp-func-name (handler-name)
|
|
|
|
|
(defun phpinspect-handler-regexp-func-name (handler-name)
|
|
|
|
|
(intern (concat "phpinspect--" (symbol-name handler-name) "-handler-regexp")))
|
|
|
|
|
|
|
|
|
|
(defun phpinspect-parser-func-name (name &optional suffix)
|
|
|
|
|
(intern (concat "phpinspect--parse-" (symbol-name name) (if suffix (concat "-" suffix) ""))))
|
|
|
|
|
(defun phpinspect-parser-func-name (name &optional suffix)
|
|
|
|
|
(intern (concat "phpinspect--parse-" (symbol-name name) (if suffix (concat "-" suffix) "")))))
|
|
|
|
|
|
|
|
|
|
(defmacro phpinspect-defhandler (name arguments docstring attribute-alist &rest body)
|
|
|
|
|
"Define a parser handler that becomes available for use with phpinspect-parse.
|
|
|
|
@ -130,7 +131,8 @@ You can purge the parser cache with \\[phpinspect-purge-parser-cache]."
|
|
|
|
|
|
|
|
|
|
(put (quote ,inline-name) 'phpinspect--handler t))))
|
|
|
|
|
|
|
|
|
|
(defun phpinspect-make-parser-function (name tree-type handlers &optional delimiter-predicate)
|
|
|
|
|
(eval-when-compile
|
|
|
|
|
(defun phpinspect-make-parser-function (name tree-type handlers &optional delimiter-predicate)
|
|
|
|
|
"Create a parser function using the handlers by names defined in HANDLER-LIST.
|
|
|
|
|
|
|
|
|
|
See also `phpinspect-defhandler`.
|
|
|
|
@ -176,10 +178,10 @@ token is \";\", which marks the end of a statement in PHP."
|
|
|
|
|
tokens)))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(defun phpinspect-make-incremental-parser-function (name tree-type handlers &optional delimiter-predicate)
|
|
|
|
|
(defun phpinspect-make-incremental-parser-function (name tree-type handlers &optional delimiter-predicate)
|
|
|
|
|
"Like `phpinspect-make-parser-function', but returned function
|
|
|
|
|
is able to reuse an already parsed tree."
|
|
|
|
|
(let ((delimiter-predicate (if (symbolp delimiter-predicate)
|
|
|
|
|
(let ((delimiter-predicate (if (symbolp delimiter-predicate)
|
|
|
|
|
`(quote ,delimiter-predicate)
|
|
|
|
|
delimiter-predicate)))
|
|
|
|
|
`(defsubst ,(phpinspect-parser-func-name name "incremental") (context buffer max-point &optional skip-over continue-condition root)
|
|
|
|
@ -253,7 +255,7 @@ is able to reuse an already parsed tree."
|
|
|
|
|
;; Return
|
|
|
|
|
tokens)))))
|
|
|
|
|
|
|
|
|
|
(cl-defstruct (phpinspect-parser (:constructor phpinspect-make-parser))
|
|
|
|
|
(cl-defstruct (phpinspect-parser (:constructor phpinspect-make-parser))
|
|
|
|
|
(name 'root
|
|
|
|
|
:type symbol
|
|
|
|
|
:read-only t)
|
|
|
|
@ -285,7 +287,7 @@ executing.")
|
|
|
|
|
:type function
|
|
|
|
|
:documentation "Incemental parser function"))
|
|
|
|
|
|
|
|
|
|
(cl-defmethod phpinspect-parser-compile ((parser phpinspect-parser))
|
|
|
|
|
(cl-defmethod phpinspect-parser-compile ((parser phpinspect-parser))
|
|
|
|
|
"Create/return parser function."
|
|
|
|
|
(or (phpinspect-parser-func parser)
|
|
|
|
|
(setf (phpinspect-parser-func parser)
|
|
|
|
@ -295,7 +297,7 @@ executing.")
|
|
|
|
|
(phpinspect-parser-handlers parser)
|
|
|
|
|
(phpinspect-parser-delimiter-predicate parser)))))
|
|
|
|
|
|
|
|
|
|
(cl-defmethod phpinspect-parser-compile-incremental ((parser phpinspect-parser))
|
|
|
|
|
(cl-defmethod phpinspect-parser-compile-incremental ((parser phpinspect-parser))
|
|
|
|
|
"Like `phpinspect-parser-compile', but for an incremental
|
|
|
|
|
version of the parser function."
|
|
|
|
|
(or (phpinspect-parser-incremental-func parser)
|
|
|
|
@ -306,7 +308,7 @@ version of the parser function."
|
|
|
|
|
(phpinspect-parser-handlers parser)
|
|
|
|
|
(phpinspect-parser-delimiter-predicate parser)))))
|
|
|
|
|
|
|
|
|
|
(cl-defmethod phpinspect-parser-compile-entry ((parser phpinspect-parser))
|
|
|
|
|
(cl-defmethod phpinspect-parser-compile-entry ((parser phpinspect-parser))
|
|
|
|
|
(let ((func-name (phpinspect-parser-func-name (phpinspect-parser-name parser)))
|
|
|
|
|
(incremental-name (phpinspect-parser-func-name (phpinspect-parser-name parser) "incremental"))
|
|
|
|
|
(simple-name (phpinspect-parser-func-name (phpinspect-parser-name parser) "simple")))
|
|
|
|
@ -331,6 +333,8 @@ parsing incrementally."
|
|
|
|
|
(,incremental-name phpinspect-parse-context buffer max-point skip-over continue-condition root)
|
|
|
|
|
(,simple-name buffer max-point skip-over continue-condition root)))))
|
|
|
|
|
|
|
|
|
|
) ;; End of eval-when-compile
|
|
|
|
|
|
|
|
|
|
(defmacro phpinspect-defparser (name &rest parameters)
|
|
|
|
|
(declare (indent 1))
|
|
|
|
|
(unless (symbolp name)
|
|
|
|
@ -342,7 +346,8 @@ parsing incrementally."
|
|
|
|
|
(simple-name (phpinspect-parser-func-name name "simple"))
|
|
|
|
|
(incremental-name (phpinspect-parser-func-name name "incremental")))
|
|
|
|
|
|
|
|
|
|
`(let ((parser (phpinspect-make-parser ,@parameters)))
|
|
|
|
|
`(eval-when-compile
|
|
|
|
|
(let ((parser (phpinspect-make-parser ,@parameters)))
|
|
|
|
|
(defconst ,simple-name nil)
|
|
|
|
|
(defconst ,incremental-name nil)
|
|
|
|
|
|
|
|
|
@ -354,7 +359,7 @@ parsing incrementally."
|
|
|
|
|
|
|
|
|
|
;; Stub function to please the byte compiler (real function will be
|
|
|
|
|
;; defined by `phpinspect-define-parser-functions'.
|
|
|
|
|
(defun ,func-name (_buffer _max-point &optional _continue-condition _root)))))
|
|
|
|
|
(defun ,func-name (_buffer _max-point &optional _skip-over _continue-condition _root))))))
|
|
|
|
|
|
|
|
|
|
(define-inline phpinspect-parser-func-bound-p (symbol)
|
|
|
|
|
(inline-quote (get ,symbol 'phpinspect--parser)))
|
|
|
|
@ -410,6 +415,40 @@ parsing incrementally."
|
|
|
|
|
(let ((name (phpinspect-handler-regexp-func-name handler-name)))
|
|
|
|
|
`(,name)))
|
|
|
|
|
|
|
|
|
|
(phpinspect-defhandler variable (start-token &rest _ignored)
|
|
|
|
|
"Handler for tokens indicating reference to a variable"
|
|
|
|
|
((regexp . "\\$"))
|
|
|
|
|
(forward-char (length start-token))
|
|
|
|
|
(if (looking-at (phpinspect-handler-regexp word))
|
|
|
|
|
(phpinspect-munch-token-without-attribs (match-string 0) :variable)
|
|
|
|
|
(list :variable nil)))
|
|
|
|
|
|
|
|
|
|
(phpinspect-defparser list
|
|
|
|
|
:tree-keyword "list"
|
|
|
|
|
:handlers '(array tag equals list comma
|
|
|
|
|
attribute-reference variable assignment-operator
|
|
|
|
|
whitespace function-keyword word terminator here-doc
|
|
|
|
|
string comment block-without-scopes))
|
|
|
|
|
|
|
|
|
|
(phpinspect-defhandler list (start-token max-point)
|
|
|
|
|
"Handler for php syntactic lists (Note: this does not include
|
|
|
|
|
datatypes like arrays, merely lists that are of a syntactic
|
|
|
|
|
nature like argument lists"
|
|
|
|
|
((regexp . "("))
|
|
|
|
|
(let* ((complete-list nil)
|
|
|
|
|
(php-list (phpinspect--parse-list
|
|
|
|
|
(current-buffer)
|
|
|
|
|
max-point
|
|
|
|
|
(length start-token)
|
|
|
|
|
(lambda () (not (and (char-equal (char-after) ?\)) (setq complete-list t)))))))
|
|
|
|
|
|
|
|
|
|
(if complete-list
|
|
|
|
|
;; Prevent parent-lists (if any) from exiting by skipping over the
|
|
|
|
|
;; ")" character
|
|
|
|
|
(forward-char)
|
|
|
|
|
(setcar php-list :incomplete-list))
|
|
|
|
|
php-list))
|
|
|
|
|
|
|
|
|
|
(defsubst phpinspect--parse-annotation-parameters (parameter-amount)
|
|
|
|
|
(let* ((words)
|
|
|
|
|
(list-regexp (phpinspect-handler-regexp list))
|
|
|
|
@ -498,13 +537,6 @@ parsing incrementally."
|
|
|
|
|
(let ((end-position (line-end-position)))
|
|
|
|
|
(phpinspect--parse-comment (current-buffer) end-position)))))
|
|
|
|
|
|
|
|
|
|
(phpinspect-defhandler variable (start-token &rest _ignored)
|
|
|
|
|
"Handler for tokens indicating reference to a variable"
|
|
|
|
|
((regexp . "\\$"))
|
|
|
|
|
(forward-char (length start-token))
|
|
|
|
|
(if (looking-at (phpinspect-handler-regexp word))
|
|
|
|
|
(phpinspect-munch-token-without-attribs (match-string 0) :variable)
|
|
|
|
|
(list :variable nil)))
|
|
|
|
|
|
|
|
|
|
(phpinspect-defhandler class-variable (start-token &rest _ignored)
|
|
|
|
|
"Handler for tokens indicating reference to a variable"
|
|
|
|
@ -703,31 +735,6 @@ Returns the consumed text string without face properties."
|
|
|
|
|
nil t)
|
|
|
|
|
(buffer-substring-no-properties start-point (- (point) 1)))))))))
|
|
|
|
|
|
|
|
|
|
(phpinspect-defparser list
|
|
|
|
|
:tree-keyword "list"
|
|
|
|
|
:handlers '(array tag equals list comma
|
|
|
|
|
attribute-reference variable assignment-operator
|
|
|
|
|
whitespace function-keyword word terminator here-doc
|
|
|
|
|
string comment block-without-scopes))
|
|
|
|
|
|
|
|
|
|
(phpinspect-defhandler list (start-token max-point)
|
|
|
|
|
"Handler for php syntactic lists (Note: this does not include
|
|
|
|
|
datatypes like arrays, merely lists that are of a syntactic
|
|
|
|
|
nature like argument lists"
|
|
|
|
|
((regexp . "("))
|
|
|
|
|
(let* ((complete-list nil)
|
|
|
|
|
(php-list (phpinspect--parse-list
|
|
|
|
|
(current-buffer)
|
|
|
|
|
max-point
|
|
|
|
|
(length start-token)
|
|
|
|
|
(lambda () (not (and (char-equal (char-after) ?\)) (setq complete-list t)))))))
|
|
|
|
|
|
|
|
|
|
(if complete-list
|
|
|
|
|
;; Prevent parent-lists (if any) from exiting by skipping over the
|
|
|
|
|
;; ")" character
|
|
|
|
|
(forward-char)
|
|
|
|
|
(setcar php-list :incomplete-list))
|
|
|
|
|
php-list))
|
|
|
|
|
|
|
|
|
|
(phpinspect-defparser declaration
|
|
|
|
|
:tree-keyword "declaration"
|
|
|
|
@ -855,13 +862,6 @@ the properties of the class"
|
|
|
|
|
function-keyword word terminator here-doc string comment
|
|
|
|
|
tag block))
|
|
|
|
|
|
|
|
|
|
(defun phpinspect-parse-buffer-until-point (buffer point)
|
|
|
|
|
(with-current-buffer buffer
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(re-search-forward "<\\?php\\|<\\?" nil t)
|
|
|
|
|
(phpinspect--parse-root (current-buffer) point nil nil 'root))))
|
|
|
|
|
|
|
|
|
|
(defun phpinspect-parse-current-buffer ()
|
|
|
|
|
(phpinspect-parse-buffer-until-point
|
|
|
|
|
(current-buffer)
|
|
|
|
@ -878,7 +878,15 @@ the properties of the class"
|
|
|
|
|
(phpinspect-parse-current-buffer)))
|
|
|
|
|
|
|
|
|
|
;; Define all registered parser functions
|
|
|
|
|
(phpinspect-define-parser-functions)
|
|
|
|
|
(eval-and-compile
|
|
|
|
|
(phpinspect-define-parser-functions))
|
|
|
|
|
|
|
|
|
|
(defun phpinspect-parse-buffer-until-point (buffer point)
|
|
|
|
|
(with-current-buffer buffer
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(re-search-forward "<\\?php\\|<\\?" nil t)
|
|
|
|
|
(phpinspect--parse-root (current-buffer) point nil nil 'root))))
|
|
|
|
|
|
|
|
|
|
(provide 'phpinspect-parser)
|
|
|
|
|
;;; phpinspect-parser.el ends here
|
|
|
|
|