changeset 698: | 96958d3eb5b0 |
parent: | 32995daa9a07 |
author: | Richard Westhaver <ellis@rwest.io> |
date: | Fri, 04 Oct 2024 22:04:59 -0400 |
permissions: | -rw-r--r-- |
description: | fixes |
140 | 1 | ;;; ffi/tree-sitter/lang.lisp --- Tree-sitter Languages |
2 | ||
3 | ;; Tree-sitter language bindings. |
|
4 | ||
5 | ;; in subdirs of *TREE-SITTER-LANGUAGE-DIRECTORY*, there are two json |
|
6 | ;; files: node-types.json and grammar.json. |
|
7 | ||
8 | ;; node-types: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types |
|
9 | ||
10 | ;; parsers: https://tree-sitter.github.io/tree-sitter/#available-parsers |
|
11 | ||
12 | ;; ref: https://github.com/death/cl-tree-sitter |
|
13 | ||
14 | ;;; Code: |
|
15 | (in-package :tree-sitter) |
|
16 | ||
567 | 17 | (defvar *ts-langs* (make-hash-table)) |
18 | ||
140 | 19 | (defun language-module (name) |
20 | (funcall |
|
21 | (or (gethash (sb-int:keywordicate name) *ts-langs*) ;; symbol -> keyword, string must be UPCASE |
|
22 | (error "tree-sitter language module not found: ~s." name)))) |
|
23 | ||
148
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
24 | (macrolet ((def-ts-lang-loader (lang) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
25 | (let ((name (symbolicate 'tree-sitter- lang))) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
26 | (let ((fname (symbolicate 'load- name))) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
27 | `(prog1 |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
28 | (defun ,fname (&optional save) |
229 | 29 | (prog1 (sb-alien:load-shared-object ,(format nil "/usr/local/lib/libtree-sitter-~(~a~).so" lang) |
148
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
30 | :dont-save (not save)) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
31 | (pushnew ,(sb-int:keywordicate name) *features*))) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
32 | (define-alien-routine ,name (* ts-language)) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
33 | (setf (gethash ,(sb-int:keywordicate lang) *ts-langs*) ',name) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
34 | (export '(,fname ,name))))))) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
35 | (def-ts-lang-loader rust) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
36 | (def-ts-lang-loader json) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
37 | (def-ts-lang-loader c) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
38 | (def-ts-lang-loader bash) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
39 | (def-ts-lang-loader commonlisp) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
40 | (def-ts-lang-loader cpp) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
41 | (def-ts-lang-loader css) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
42 | (def-ts-lang-loader go) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
43 | (def-ts-lang-loader html) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
44 | (def-ts-lang-loader javascript) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
45 | (def-ts-lang-loader jsdoc) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
46 | (def-ts-lang-loader python) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
47 | (def-ts-lang-loader regex) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
48 | (def-ts-lang-loader typescript-tsx) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
49 | (def-ts-lang-loader typescript-typescript) |
0d9d5cd46af5
added net/stream.rs, change def-ts-lang to macrolet form
ellis <ellis@rwest.io>
parents:
147
diff
changeset
|
50 | (def-ts-lang-loader yaml)) |
140 | 51 | |
52 | (defun list-ts-langs () (loop for name being each hash-key of *ts-langs* collect name)) |
|
53 | ||
54 | (defvar *tree-sitter-language-directory* #P"/usr/local/share/tree-sitter/") |
|
55 | ||
56 | (defun tree-sitter-language-files () |
|
57 | (let ((res)) |
|
58 | (sb-ext:map-directory |
|
59 | (lambda (dir) (push (uiop:directory-files dir "*.json") res)) |
|
60 | *tree-sitter-language-directory*) |
|
61 | (flatten res))) |