branch: externals/matlab-mode
commit db39756b7d970c36470cf6f9006c371faa6512cc
Author: John Ciolfi <[email protected]>
Commit: John Ciolfi <[email protected]>
t-utils: improve the parse tree presentation
---
tests/t-utils.el | 105 ++++++++++++++++-----
...binary_operator_continued_issue107_expected.txt | 2 -
.../parser_cell_expected.txt | 2 -
.../parser_comments_expected.txt | 2 -
.../parser_line_cont_extra_dot_expected.txt | 2 -
.../parser_simple_expected.txt | 2 -
.../parser_simple_with_error_expected.txt | 2 -
.../parser_variable_ids_expected.txt | 2 -
tests/test-matlab-ts-mode-parser.el | 5 +-
9 files changed, 87 insertions(+), 37 deletions(-)
diff --git a/tests/t-utils.el b/tests/t-utils.el
index 076d6b63d6..dcb04fa85b 100644
--- a/tests/t-utils.el
+++ b/tests/t-utils.el
@@ -2677,6 +2677,8 @@ otherwise the result is displayed on stdout."
(t-utils--log log-file (format "FINISHED: %s %s\n" test-name
(t-utils--took start-time)))))
+(defvar t-utils--parse-tree-max-text-chars-to-show 50)
+
(defun t-utils--parse-tree-draw-node (node)
"Draw the parse tree of NODE in the current buffer.
@@ -2802,8 +2804,11 @@ Similar `treesit--explorer-draw-node' but designed for
test baselines."
'("{" . "\\\\{")
'("}" . "\\\\}")))
(setq node-text (replace-regexp-in-string (car pair) (cdr
pair) node-text)))
- (when (> (length node-text) 50)
- (setq node-text (concat (substring node-text 0 50) "...")))
+ (when (> (length node-text)
t-utils--parse-tree-max-text-chars-to-show)
+ (setq node-text (concat (substring node-text
+ 0
+
t-utils--parse-tree-max-text-chars-to-show)
+ "...")))
(insert (format "[%d,%d]@{%s}@"
(treesit-node-start node)
(treesit-node-end node)
@@ -2842,22 +2847,22 @@ Similar `treesit--explorer-draw-node' but designed for
test baselines."
(let ((root (or (treesit-buffer-root-node)
(error "No tree-sitter root node"))))
(with-temp-buffer
+ (indent-tabs-mode 0)
(insert "# -*- t-utils-ts-parse-tree -*-\n")
- (insert "# tree-sitter parse tree annotated with
[NODE_START,NODE_END]@{NODE_TEXT}@\n")
- (insert "# where NODE_TEXT is of length NODE-END - NODE_START\n")
(t-utils--parse-tree-draw-node root)
(goto-char (point-max))
(insert "\n")
(buffer-string))))
-(defvar t-utils--ts-parse-tree-mode-syntax-table
- (let ((table (make-syntax-table)))
- (modify-syntax-entry ?\# "<" table)
- (modify-syntax-entry ?\n ">" table)
- (modify-syntax-entry ?' "_" table)
- (modify-syntax-entry ?\" "_" table)
- table)
- "Syntax table for `t-utils-ts-parse-tree-mode'.")
+;;xxx
+;; (defvar t-utils--ts-parse-tree-mode-syntax-table
+;; (let ((table (make-syntax-table)))
+;; (modify-syntax-entry ?\# "<" table)
+;; (modify-syntax-entry ?\n ">" table)
+;; (modify-syntax-entry ?' "_" table)
+;; (modify-syntax-entry ?\" "_" table)
+;; table)
+;; "Syntax table for `t-utils-ts-parse-tree-mode'.")
(defface t-utils-ts-parse-tree-code-face
'((t
@@ -2868,6 +2873,10 @@ Similar `treesit--explorer-draw-node' but designed for
test baselines."
(defvar t-utils--ts-parse-tree-font-lock-keywords
(list
+ ;; # comment lines. Note we don't use the syntax-table comment entries
because
+ ;; the '#' character can appear in node text
+ (list "^\\(#.+\\)$"
+ '(1 'font-lock-comment-face))
;; (NODE_TYPE[NODE_START,NODE_END)@{NODE_TEXT}@
(list (concat "\\((\\)" ;; 1 (
"\\([a-zA-Z][^[ \t\n\r]+\\)" ;; 2 NODE_TYPE
@@ -2883,9 +2892,8 @@ Similar `treesit--explorer-draw-node' but designed for
test baselines."
'(2 'font-lock-function-name-face)
'(3 'font-lock-constant-face)
'(4 'shadow)
- ;; prepend to cover when code text has a # which are header comments,
but not when in code.
- '(5 't-utils-ts-parse-tree-code-face prepend)
- '(6 'shadow prepend))
+ '(5 't-utils-ts-parse-tree-code-face)
+ '(6 'shadow))
;; FIELD:
(list "\\([a-zA-Z]+:\\)"
'(1 'font-lock-property-name-face))
@@ -2909,26 +2917,79 @@ Similar `treesit--explorer-draw-node' but designed for
test baselines."
)
"Keywords to fontify in `t-utils-ts-parse-tree-mode'.")
+(defvar-local t-utils-ts-parse-tree--code-buf nil)
+
+(defun t-utils-ts-parse-tree-update ()
+ "Update the parse tree shown by `t-utils-view-parse-tree'."
+ (interactive)
+ (unless t-utils-ts-parse-tree--code-buf
+ (error "No previously parsed buffer"))
+ (when (not (buffer-live-p t-utils-ts-parse-tree--code-buf))
+ (error "Previously parsed buffer was killed"))
+ (with-current-buffer t-utils-ts-parse-tree--code-buf
+ (t-utils-view-parse-tree 'no-pop-to-buffer)))
+
+(defvar-keymap t-utils-ts-parse-tree-mode-map
+ "g" #'t-utils-ts-parse-tree-update)
+
(define-derived-mode t-utils-ts-parse-tree-mode fundamental-mode
"ts-parse-tree" ()
"Major mode for treesit parse trees created by `t-utils--get-parse-tree'."
- (set-syntax-table t-utils--ts-parse-tree-mode-syntax-table)
+;;xxx (set-syntax-table t-utils--ts-parse-tree-mode-syntax-table)
(setq-local font-lock-defaults '((t-utils--ts-parse-tree-font-lock-keywords)
nil nil nil))
(read-only-mode 1))
-(defun t-utils-view-parse-tree ()
- "View the tree-sitter parse/syntax tree for the current buffer."
+(defun t-utils-view-parse-tree (&optional no-pop-to-buffer)
+ "View the tree-sitter parse tree for the current buffer.
+
+Optional NO-POP-TO-BUFFER, if non-nil will not run `pop-to-buffer'.
+
+The parse tree is a concrete syntax tree for the current buffer.
+The tree contains named and anonymous nodes. Consider:
+
+ a = 1;
+ b = 2;
+ c = a + b;
+
+The parse tree is:
+
+ (source_file
+ (assignment left: (identifier[1,2]@{a}@) =[3,4] right: (number[5,6]@{1}@))
+ ;[6,7]
+ (assignment left: (identifier[8,9]@{b}@) =[10,11] right:
(number[12,13]@{2}@))
+ ;[13,14]
+ (binary_operator left: (identifier[16,17]@{a}@) +[18,19] right:
+
(identifier[20,21]@{b}@))
+ ;[21,22] \n[22,24])
+
+Named nodes : source_file assignment identifier number binary_operator
+Anonymous nodes: = +
+
+Notice that near each node we have a range of form [START,END] where the
+node text starts at START point and ends one before END point. The
+length of text for the node is END-START. For named nodes, the first
+`t-utils--parse-tree-max-text-chars-to-show' characters of the node text
+is shown in @{NODE_TEXT}@.
+
+The program code node text is shown using
+`t-utils-ts-parse-tree-code-face', which by default uses a font that
+places a box around the text if that font is available."
+
(interactive)
- (let* ((parse-tree (t-utils--get-parse-tree))
+ (let* ((code-buf (current-buffer))
+ (parse-tree (t-utils--get-parse-tree))
(view-buf-name (concat "*" (buffer-name) "-parse-tree*"))
(view-buf (get-buffer-create view-buf-name)))
(with-current-buffer view-buf
(read-only-mode -1)
+ (auto-revert-mode 0) ;; no need to save history
(buffer-disable-undo)
(erase-buffer)
(insert parse-tree)
(goto-char (point-min))
- (t-utils-ts-parse-tree-mode))
- (pop-to-buffer view-buf)
+ (t-utils-ts-parse-tree-mode)
+ (setq-local t-utils-ts-parse-tree--code-buf code-buf))
+ (when (not no-pop-to-buffer)
+ (pop-to-buffer view-buf 'other-window))
view-buf))
(defun t-utils--test-parser-error-node-checker (lang-file _got _got-file
_expected _expected-file)
@@ -3059,4 +3120,4 @@ To debug a specific -parser test file
;; LocalWords: consp listp cdr CRLF impl tmp xr boundp SPC kbd prin progn
defmacro sexp stdlib locs
;; LocalWords: showall repeat:nil kkk fff Dkkkk kkkkkk mapcar eobp trim'd bol
NPS prev puthash
;; LocalWords: maphash lessp gethash nbutlast mapconcat ppss imenu pcase eow
NAME's darwin libtree
-;; LocalWords: defface fontify
+;; LocalWords: defface fontify keymap
diff --git
a/tests/test-matlab-ts-mode-parser-files/parser_binary_operator_continued_issue107_expected.txt
b/tests/test-matlab-ts-mode-parser-files/parser_binary_operator_continued_issue107_expected.txt
index b430c01db6..7343a82bff 100644
---
a/tests/test-matlab-ts-mode-parser-files/parser_binary_operator_continued_issue107_expected.txt
+++
b/tests/test-matlab-ts-mode-parser-files/parser_binary_operator_continued_issue107_expected.txt
@@ -1,6 +1,4 @@
# -*- t-utils-ts-parse-tree -*-
-# tree-sitter parse tree annotated with [NODE_START,NODE_END]@{NODE_TEXT}@
-# where NODE_TEXT is of length NODE-END - NODE_START
(source_file (comment[1,20]@{% -*- matlab-ts -*-}@) (comment[22,89]@{% See
https://github.com/acristoffers/tree-sitter-...}@)
(assignment left: (identifier[91,93]@{v1}@) =[94,95]
right:
diff --git a/tests/test-matlab-ts-mode-parser-files/parser_cell_expected.txt
b/tests/test-matlab-ts-mode-parser-files/parser_cell_expected.txt
index a93c88c866..9061f0a8d3 100644
--- a/tests/test-matlab-ts-mode-parser-files/parser_cell_expected.txt
+++ b/tests/test-matlab-ts-mode-parser-files/parser_cell_expected.txt
@@ -1,6 +1,4 @@
# -*- t-utils-ts-parse-tree -*-
-# tree-sitter parse tree annotated with [NODE_START,NODE_END]@{NODE_TEXT}@
-# where NODE_TEXT is of length NODE-END - NODE_START
(source_file (comment[1,20]@{% -*- matlab-ts -*-}@)
(assignment left: (identifier[22,23]@{a}@) =[24,25]
right:
diff --git
a/tests/test-matlab-ts-mode-parser-files/parser_comments_expected.txt
b/tests/test-matlab-ts-mode-parser-files/parser_comments_expected.txt
index fc4474d988..c42dfcd7c3 100644
--- a/tests/test-matlab-ts-mode-parser-files/parser_comments_expected.txt
+++ b/tests/test-matlab-ts-mode-parser-files/parser_comments_expected.txt
@@ -1,6 +1,4 @@
# -*- t-utils-ts-parse-tree -*-
-# tree-sitter parse tree annotated with [NODE_START,NODE_END]@{NODE_TEXT}@
-# where NODE_TEXT is of length NODE-END - NODE_START
(source_file (comment[1,20]@{% -*- matlab-ts -*-}@)
(function_definition function[22,30]
(function_output (identifier[31,34]@{out}@) =[35,36])
diff --git
a/tests/test-matlab-ts-mode-parser-files/parser_line_cont_extra_dot_expected.txt
b/tests/test-matlab-ts-mode-parser-files/parser_line_cont_extra_dot_expected.txt
index 81a13648c3..c4247bcc5b 100644
---
a/tests/test-matlab-ts-mode-parser-files/parser_line_cont_extra_dot_expected.txt
+++
b/tests/test-matlab-ts-mode-parser-files/parser_line_cont_extra_dot_expected.txt
@@ -1,6 +1,4 @@
# -*- t-utils-ts-parse-tree -*-
-# tree-sitter parse tree annotated with [NODE_START,NODE_END]@{NODE_TEXT}@
-# where NODE_TEXT is of length NODE-END - NODE_START
(source_file (comment[1,20]@{% -*- matlab-ts -*-}@)
(function_call name: (identifier[21,24]@{foo}@) ([24,25]
(arguments argument: (identifier[25,26]@{x}@) ,[26,27]
diff --git a/tests/test-matlab-ts-mode-parser-files/parser_simple_expected.txt
b/tests/test-matlab-ts-mode-parser-files/parser_simple_expected.txt
index 61c6ee39ef..2486bc58e7 100644
--- a/tests/test-matlab-ts-mode-parser-files/parser_simple_expected.txt
+++ b/tests/test-matlab-ts-mode-parser-files/parser_simple_expected.txt
@@ -1,6 +1,4 @@
# -*- t-utils-ts-parse-tree -*-
-# tree-sitter parse tree annotated with [NODE_START,NODE_END]@{NODE_TEXT}@
-# where NODE_TEXT is of length NODE-END - NODE_START
(source_file (comment[1,20]@{% -*- matlab-ts -*-}@)
(assignment left: (identifier[22,23]@{a}@) =[24,25]
right: (binary_operator left: (number[26,27]@{1}@) +[28,29] right:
(number[30,31]@{2}@)))
diff --git
a/tests/test-matlab-ts-mode-parser-files/parser_simple_with_error_expected.txt
b/tests/test-matlab-ts-mode-parser-files/parser_simple_with_error_expected.txt
index d43843869e..00771c30b0 100644
---
a/tests/test-matlab-ts-mode-parser-files/parser_simple_with_error_expected.txt
+++
b/tests/test-matlab-ts-mode-parser-files/parser_simple_with_error_expected.txt
@@ -1,6 +1,4 @@
# -*- t-utils-ts-parse-tree -*-
-# tree-sitter parse tree annotated with [NODE_START,NODE_END]@{NODE_TEXT}@
-# where NODE_TEXT is of length NODE-END - NODE_START
(source_file (comment[1,20]@{% -*- matlab-ts -*-}@)
(ERROR (identifier[22,23]@{a}@) =[24,25]
(binary_operator left: (number[26,27]@{1}@) +[28,29] right:
(number[30,31]@{2}@))
diff --git
a/tests/test-matlab-ts-mode-parser-files/parser_variable_ids_expected.txt
b/tests/test-matlab-ts-mode-parser-files/parser_variable_ids_expected.txt
index 53572d8799..da623b9b1c 100644
--- a/tests/test-matlab-ts-mode-parser-files/parser_variable_ids_expected.txt
+++ b/tests/test-matlab-ts-mode-parser-files/parser_variable_ids_expected.txt
@@ -1,6 +1,4 @@
# -*- t-utils-ts-parse-tree -*-
-# tree-sitter parse tree annotated with [NODE_START,NODE_END]@{NODE_TEXT}@
-# where NODE_TEXT is of length NODE-END - NODE_START
(source_file (comment[1,20]@{% -*- matlab-ts -*-}@)
(function_definition function[22,30]
(function_output (identifier[31,35]@{out1}@) =[36,37])
diff --git a/tests/test-matlab-ts-mode-parser.el
b/tests/test-matlab-ts-mode-parser.el
index 174268e03b..cf11e65967 100644
--- a/tests/test-matlab-ts-mode-parser.el
+++ b/tests/test-matlab-ts-mode-parser.el
@@ -52,7 +52,10 @@ To add a test, create
and run this function. The baseline is saved for you as
./test-matlab-ts-mode-parser-files/NAME_expected.txt~
after validating it, rename it to
- ./test-matlab-ts-mode-parser-files/NAME_expected.txt"
+ ./test-matlab-ts-mode-parser-files/NAME_expected.txt
+
+To understand the format of NAME_expected.txt files, see
+`t-utils-view-parse-tree'."
(let* ((test-name "test-matlab-ts-mode-parser")
(m-files (t-utils-get-files