aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/lua/executor.c
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2018-10-29 19:11:41 +0100
committerBjörn Linse <bjorn.linse@gmail.com>2019-09-28 14:31:03 +0200
commitcd100963866b2c33a286cbf6aac8e42cd16fd248 (patch)
treef9cf8260a16a749c5f8b995b59d1d96c481eeb06 /src/nvim/lua/executor.c
parent8ff2f193bb3ed94ee215c83c13431d45d382949b (diff)
downloadrneovim-cd100963866b2c33a286cbf6aac8e42cd16fd248.tar.gz
rneovim-cd100963866b2c33a286cbf6aac8e42cd16fd248.tar.bz2
rneovim-cd100963866b2c33a286cbf6aac8e42cd16fd248.zip
tree-sitter: initial tree-sitter support
Diffstat (limited to 'src/nvim/lua/executor.c')
-rw-r--r--src/nvim/lua/executor.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index f51aa3c6d4..8b0140f794 100644
--- a/src/nvim/lua/executor.c
+++ b/src/nvim/lua/executor.c
@@ -31,6 +31,7 @@
#include "nvim/lua/executor.h"
#include "nvim/lua/converter.h"
+#include "nvim/lua/tree_sitter.h"
#include "luv/luv.h"
@@ -310,7 +311,11 @@ static int nlua_state_init(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
lua_setfield(lstate, -2, "luv");
lua_pop(lstate, 3);
+ // internal vim._treesitter... API
+ nlua_add_treesitter(lstate);
+
lua_setglobal(lstate, "vim");
+
return 0;
}
@@ -816,3 +821,40 @@ void ex_luafile(exarg_T *const eap)
return;
}
}
+
+static int unsafe_ptr_to_ts_tree(lua_State *L)
+{
+ if (!lua_gettop(L)) {
+ return 0;
+ }
+ TSTree *const *ptr = lua_topointer(L,1);
+ tslua_push_tree(L, *ptr);
+ return 1;
+}
+
+static int create_tslua_parser(lua_State *L)
+{
+ TSLanguage *tree_sitter_c(void), *tree_sitter_javascript(void);
+
+ if (!lua_gettop(L)) {
+ return 0;
+ }
+ char *str = lua_tostring(L,1);
+
+ TSLanguage *lang = tree_sitter_c();
+ if (str && striequal(str, "javascript")) {
+ lang = tree_sitter_javascript();
+ }
+ tslua_push_parser(L, lang);
+ return 1;
+}
+
+static void nlua_add_treesitter(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
+{
+ tslua_init(lstate);
+ lua_pushcfunction(lstate, unsafe_ptr_to_ts_tree);
+ lua_setfield(lstate, -2, "unsafe_ts_tree");
+
+ lua_pushcfunction(lstate, create_tslua_parser);
+ lua_setfield(lstate, -2, "ts_parser");
+}