From a89183c8c8097e5b54a130b4c1ddbd07c89cde2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20R=C3=B6ger?= Date: Mon, 28 Oct 2024 22:44:17 +0100 Subject: [PATCH] Home Gen390 @ 2024-10-28-22:44 --- modules/home/doom/doom.nix | 3 ++ modules/home/doom/static/config.el | 2 + .../doom/static/packages/treesit-docgen.el | 50 +++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 modules/home/doom/static/packages/treesit-docgen.el diff --git a/modules/home/doom/doom.nix b/modules/home/doom/doom.nix index de909f9..e95a118 100644 --- a/modules/home/doom/doom.nix +++ b/modules/home/doom/doom.nix @@ -118,6 +118,9 @@ in { "doom-config/config.el" = { source = ./static/config.el; }; + "doom-config/packages/treesit-docgen.el" = { + source = ./static/packages/treesit-docgen.el; + }; "doom-config/init.el" = { source = ./static/init.el; onChange = "${doom-setup} sync --force -e"; diff --git a/modules/home/doom/static/config.el b/modules/home/doom/static/config.el index b95ef95..dde5c16 100644 --- a/modules/home/doom/static/config.el +++ b/modules/home/doom/static/config.el @@ -151,6 +151,7 @@ ;;Use TS-modes (after! treesit + (load! "packages/treesit-docgen.el") (setq treesit-font-lock-level 4)) (defconst mode-ts-mode-mapping @@ -194,6 +195,7 @@ ;; Integrate with legacy tree-sitter mode (after! tree-sitter + (add-hook! 'c++-ts-mode-hook #'tree-sitter-mode) (add-hook! 'tree-sitter-mode-hook #'tree-sitter-hl-mode) (dolist (mapping tree-sitter-major-mode-language-alist) (let* ((pre-mode (car mapping)) diff --git a/modules/home/doom/static/packages/treesit-docgen.el b/modules/home/doom/static/packages/treesit-docgen.el new file mode 100644 index 0000000..121704e --- /dev/null +++ b/modules/home/doom/static/packages/treesit-docgen.el @@ -0,0 +1,50 @@ +(defun treesit-docgen--get-function-node (node) + "Get the function node the given NODE belongs to. Or nil" + (treesit-parent-until node + (lambda (n) + (or (equal (treesit-node-type n) "function_definition") + (and (equal (treesit-node-type n) "declaration")) + (equal (treesit-node-type (treesit-node-child-by-field-name n "declarator")) + "function_declarator"))) + t) + ) + +(defun treesit-docgen--fn-template-node (fn-node) + "Get the template node of a function or nil" + (let* ((par (treesit-node-parent fn-node)) + (par-t (treesit-node-type par))) + (when (string= par-t "template_declaration") par) + )) + +(defun treesit-docgen--fn-tpars (fn-node) + "Get the template parameters of the function node or nil" + (let* ((template (treesit-docgen--fn-template-node fn-node)) + (tpars (treesit-node-child-by-field-name template "parameters"))) + (when tpars + (mapcar (lambda (tpar) (treesit-node-text tpar)) (treesit-node-children tpars))) + )) + +(defun treesit-docgen--fn-type (fn-node) + "Get the return type of the function node" + (let ((fn-type-node (treesit-node-child-by-field-name fn-node "type"))) + (treesit-node-text fn-type-node))) + +(defun treesit-docgen--fn-pars (fn-node) + "Get the parameter names of the function node" + (let* ((fn-node-decl (treesit-node-child-by-field-name fn-node "declarator")) + (fn-node-pars (treesit-node-child-by-field-name fn-node-decl "parameters")) + ) + (mapcar (lambda (par) (treesit-node-text par)) (treesit-node-children fn-node-pars)))) + +(defun treesit-docgen-insert-doc () + "Insert a documentation template for the function at point" + (interactive) + (let* ((node (treesit-node-at (point))) + (fn-node (treesit-docgen--get-function-node node)) + ) + (when fn-node + (message "FN-Type: %s, FN-Pars: %s, FN-TPars: %s" + (or (treesit-docgen--fn-type fn-node) "none") + (or (treesit-docgen--fn-pars fn-node) "none") + (or (treesit-docgen--fn-tpars fn-node) "none") + ))))