mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
tree-sitter: fix lint, delete "demo" plugin (replaced by functional tests)
This commit is contained in:
parent
167a1cfdef
commit
06ee45b9b1
@ -1,58 +0,0 @@
|
|||||||
-- TODO: externalize this
|
|
||||||
local a = vim.api
|
|
||||||
_G.a = vim.api
|
|
||||||
|
|
||||||
if __treesitter_rt_ns == nil then
|
|
||||||
__treesitter_rt_ns = a.nvim_create_namespace("treesitter_demp")
|
|
||||||
end
|
|
||||||
local my_ns = __treesitter_rt_ns
|
|
||||||
|
|
||||||
function ts_inspect_pos(row,col)
|
|
||||||
local tree = theparser:parse_tree()
|
|
||||||
local root = tree:root()
|
|
||||||
local node = root:descendant_for_point_range(row,col,row,col)
|
|
||||||
show_node(node)
|
|
||||||
end
|
|
||||||
|
|
||||||
function show_node(node)
|
|
||||||
if node == nil then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
a.nvim_buf_clear_highlight(0, my_ns, 0, -1)
|
|
||||||
shown_node = node
|
|
||||||
print(node:type())
|
|
||||||
local start_row, start_col, end_row, end_col = node:range()
|
|
||||||
|
|
||||||
a.nvim_buf_add_highlight(0, my_ns, "ErrorMsg", start_row, start_col, start_col+1)
|
|
||||||
|
|
||||||
if end_col >= 1 then
|
|
||||||
end_col = end_col - 1
|
|
||||||
end
|
|
||||||
a.nvim_buf_add_highlight(0, my_ns, "ErrorMsg", end_row, end_col, end_col+1)
|
|
||||||
end
|
|
||||||
|
|
||||||
function ts_expand_node()
|
|
||||||
if shown_node == nil then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
parent = shown_node:parent()
|
|
||||||
show_node(parent)
|
|
||||||
end
|
|
||||||
|
|
||||||
function ts_cursor()
|
|
||||||
local row, col = unpack(a.nvim_win_get_cursor(0))
|
|
||||||
ts_inspect_pos(row-1, col)
|
|
||||||
end
|
|
||||||
|
|
||||||
if false then
|
|
||||||
ctree = theparser.tree
|
|
||||||
root = ctree:root()
|
|
||||||
cursor = root:to_cursor()
|
|
||||||
node = cursor:forward(5000) if true then return node end
|
|
||||||
print(#root)
|
|
||||||
c = root:child(50)
|
|
||||||
print(require'inspect'{c:extent()})
|
|
||||||
type(ctree.__tostring)
|
|
||||||
root:__tostring()
|
|
||||||
print(_tslua_debug())
|
|
||||||
end
|
|
@ -50,7 +50,7 @@ local function create_parser(bufnr, ft, id)
|
|||||||
self:parse()
|
self:parse()
|
||||||
-- TODO: use weakref to self, so that the parser is free'd is no plugin is
|
-- TODO: use weakref to self, so that the parser is free'd is no plugin is
|
||||||
-- using it.
|
-- using it.
|
||||||
local function lines_cb(ev, ...)
|
local function lines_cb(_, ...)
|
||||||
return on_lines(self, ...)
|
return on_lines(self, ...)
|
||||||
end
|
end
|
||||||
local detach_cb = nil
|
local detach_cb = nil
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
let g:ts_test_path = expand("<sfile>:p:h:h")
|
|
||||||
let g:has_ts = v:false
|
|
||||||
|
|
||||||
func! TSTest()
|
|
||||||
if g:has_ts
|
|
||||||
return
|
|
||||||
end
|
|
||||||
" TODO: module!
|
|
||||||
lua theparser = vim.treesitter.create_parser(0)
|
|
||||||
lua require'treesitter_demo'
|
|
||||||
let g:has_ts = v:true
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
func! TSCursor()
|
|
||||||
" disable matchparen
|
|
||||||
NoMatchParen
|
|
||||||
call TSTest()
|
|
||||||
au CursorMoved <buffer> lua ts_cursor()
|
|
||||||
au CursorMovedI <buffer> lua ts_cursor()
|
|
||||||
map <buffer> <Plug>(ts-expand) <cmd>lua ts_expand_node()<cr>
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
func! TSSyntax()
|
|
||||||
" disable matchparen
|
|
||||||
set syntax=
|
|
||||||
call TSTest()
|
|
||||||
lua ts_syntax()
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
command! TSTest call TSTest()
|
|
||||||
command! TSCursor call TSCursor()
|
|
||||||
command! TSSyntax call TSSyntax()
|
|
@ -839,9 +839,9 @@ static void nlua_add_treesitter(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
|
|||||||
lua_pushcfunction(lstate, create_tslua_parser);
|
lua_pushcfunction(lstate, create_tslua_parser);
|
||||||
lua_setfield(lstate, -2, "_create_ts_parser");
|
lua_setfield(lstate, -2, "_create_ts_parser");
|
||||||
|
|
||||||
lua_pushcfunction(lstate, ts_lua_register_lang);
|
lua_pushcfunction(lstate, tslua_register_lang);
|
||||||
lua_setfield(lstate, -2, "_ts_add_language");
|
lua_setfield(lstate, -2, "_ts_add_language");
|
||||||
|
|
||||||
lua_pushcfunction(lstate, ts_lua_inspect_lang);
|
lua_pushcfunction(lstate, tslua_inspect_lang);
|
||||||
lua_setfield(lstate, -2, "_ts_inspect_language");
|
lua_setfield(lstate, -2, "_ts_inspect_language");
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
// This is an open source non-commercial project. Dear PVS-Studio, please check
|
// This is an open source non-commercial project. Dear PVS-Studio, please check
|
||||||
// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
|
// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
|
||||||
|
|
||||||
// lua bindings for tree-siter.
|
// lua bindings for tree-sitter.
|
||||||
// NB: this file should contain a generic lua interface for
|
// NB: this file mostly contains a generic lua interface for tree-sitter
|
||||||
// tree-sitter trees and nodes, and could be broken out as a reusable library
|
// trees and nodes, and could be broken out as a reusable lua package
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -22,9 +22,9 @@
|
|||||||
#include "nvim/memline.h"
|
#include "nvim/memline.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
TSParser *parser;
|
TSParser *parser;
|
||||||
TSTree *tree; // internal tree, used for editing/reparsing
|
TSTree *tree; // internal tree, used for editing/reparsing
|
||||||
} Tslua_parser;
|
} TSLua_parser;
|
||||||
|
|
||||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||||
# include "lua/treesitter.c.generated.h"
|
# include "lua/treesitter.c.generated.h"
|
||||||
@ -68,9 +68,9 @@ static struct luaL_Reg node_meta[] = {
|
|||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
PMap(cstr_t) *langs;
|
static PMap(cstr_t) *langs;
|
||||||
|
|
||||||
void build_meta(lua_State *L, const char *tname, const luaL_Reg *meta)
|
static void build_meta(lua_State *L, const char *tname, const luaL_Reg *meta)
|
||||||
{
|
{
|
||||||
if (luaL_newmetatable(L, tname)) { // [meta]
|
if (luaL_newmetatable(L, tname)) { // [meta]
|
||||||
for (size_t i = 0; meta[i].name != NULL; i++) {
|
for (size_t i = 0; meta[i].name != NULL; i++) {
|
||||||
@ -84,8 +84,6 @@ void build_meta(lua_State *L, const char *tname, const luaL_Reg *meta)
|
|||||||
lua_pop(L, 1); // [] (don't use it now)
|
lua_pop(L, 1); // [] (don't use it now)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// init the tslua library
|
/// init the tslua library
|
||||||
///
|
///
|
||||||
/// all global state is stored in the regirstry of the lua_State
|
/// all global state is stored in the regirstry of the lua_State
|
||||||
@ -95,13 +93,11 @@ void tslua_init(lua_State *L)
|
|||||||
|
|
||||||
// type metatables
|
// type metatables
|
||||||
build_meta(L, "treesitter_parser", parser_meta);
|
build_meta(L, "treesitter_parser", parser_meta);
|
||||||
|
|
||||||
build_meta(L, "treesitter_tree", tree_meta);
|
build_meta(L, "treesitter_tree", tree_meta);
|
||||||
|
|
||||||
build_meta(L, "treesitter_node", node_meta);
|
build_meta(L, "treesitter_node", node_meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ts_lua_register_lang(lua_State *L)
|
int tslua_register_lang(lua_State *L)
|
||||||
{
|
{
|
||||||
if (lua_gettop(L) < 2 || !lua_isstring(L, 1) || !lua_isstring(L, 2)) {
|
if (lua_gettop(L) < 2 || !lua_isstring(L, 1) || !lua_isstring(L, 2)) {
|
||||||
return luaL_error(L, "string expected");
|
return luaL_error(L, "string expected");
|
||||||
@ -114,22 +110,27 @@ int ts_lua_register_lang(lua_State *L)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: unsafe!
|
#define BUFSIZE 128
|
||||||
char symbol_buf[128] = "tree_sitter_";
|
char symbol_buf[BUFSIZE];
|
||||||
STRCAT(symbol_buf, lang_name);
|
snprintf(symbol_buf, BUFSIZE, "tree_sitter_%s", lang_name);
|
||||||
|
#undef BUFSIZE
|
||||||
|
|
||||||
// TODO: we should maybe keep the uv_lib_t around, and close them
|
|
||||||
// at exit, to keep LeakSanitizer happy.
|
|
||||||
uv_lib_t lib;
|
uv_lib_t lib;
|
||||||
if (uv_dlopen(path, &lib)) {
|
if (uv_dlopen(path, &lib)) {
|
||||||
return luaL_error(L, "Failed to load parser: uv_dlopen: %s",
|
snprintf((char *)IObuff, IOSIZE, "Failed to load parser: uv_dlopen: %s",
|
||||||
uv_dlerror(&lib));
|
uv_dlerror(&lib));
|
||||||
|
uv_dlclose(&lib);
|
||||||
|
lua_pushstring(L, (char *)IObuff);
|
||||||
|
return lua_error(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
TSLanguage *(*lang_parser)(void);
|
TSLanguage *(*lang_parser)(void);
|
||||||
if (uv_dlsym(&lib, symbol_buf, (void **)&lang_parser)) {
|
if (uv_dlsym(&lib, symbol_buf, (void **)&lang_parser)) {
|
||||||
return luaL_error(L, "Failed to load parser: uv_dlsym: %s",
|
snprintf((char *)IObuff, IOSIZE, "Failed to load parser: uv_dlsym: %s",
|
||||||
uv_dlerror(&lib));
|
uv_dlerror(&lib));
|
||||||
|
uv_dlclose(&lib);
|
||||||
|
lua_pushstring(L, (char *)IObuff);
|
||||||
|
return lua_error(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
TSLanguage *lang = lang_parser();
|
TSLanguage *lang = lang_parser();
|
||||||
@ -143,7 +144,7 @@ int ts_lua_register_lang(lua_State *L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ts_lua_inspect_lang(lua_State *L)
|
int tslua_inspect_lang(lua_State *L)
|
||||||
{
|
{
|
||||||
if (lua_gettop(L) < 1 || !lua_isstring(L, 1)) {
|
if (lua_gettop(L) < 1 || !lua_isstring(L, 1)) {
|
||||||
return luaL_error(L, "string expected");
|
return luaL_error(L, "string expected");
|
||||||
@ -176,7 +177,6 @@ int ts_lua_inspect_lang(lua_State *L)
|
|||||||
|
|
||||||
lua_setfield(L, -2, "symbols"); // [retval]
|
lua_setfield(L, -2, "symbols"); // [retval]
|
||||||
|
|
||||||
// TODO: this seems to be empty, what langs have fields?
|
|
||||||
size_t nfields = (size_t)ts_language_field_count(lang);
|
size_t nfields = (size_t)ts_language_field_count(lang);
|
||||||
lua_createtable(L, nfields-1, 1); // [retval, fields]
|
lua_createtable(L, nfields-1, 1); // [retval, fields]
|
||||||
for (size_t i = 0; i < nfields; i++) {
|
for (size_t i = 0; i < nfields; i++) {
|
||||||
@ -190,14 +190,14 @@ int ts_lua_inspect_lang(lua_State *L)
|
|||||||
|
|
||||||
int tslua_push_parser(lua_State *L, const char *lang_name)
|
int tslua_push_parser(lua_State *L, const char *lang_name)
|
||||||
{
|
{
|
||||||
TSParser *parser = ts_parser_new();
|
|
||||||
TSLanguage *lang = pmap_get(cstr_t)(langs, lang_name);
|
TSLanguage *lang = pmap_get(cstr_t)(langs, lang_name);
|
||||||
if (!lang) {
|
if (!lang) {
|
||||||
return luaL_error(L, "no such language: %s", lang_name);
|
return luaL_error(L, "no such language: %s", lang_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TSParser *parser = ts_parser_new();
|
||||||
ts_parser_set_language(parser, lang);
|
ts_parser_set_language(parser, lang);
|
||||||
Tslua_parser *p = lua_newuserdata(L, sizeof(Tslua_parser)); // [udata]
|
TSLua_parser *p = lua_newuserdata(L, sizeof(TSLua_parser)); // [udata]
|
||||||
p->parser = parser;
|
p->parser = parser;
|
||||||
p->tree = NULL;
|
p->tree = NULL;
|
||||||
|
|
||||||
@ -206,14 +206,14 @@ int tslua_push_parser(lua_State *L, const char *lang_name)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Tslua_parser *parser_check(lua_State *L)
|
static TSLua_parser *parser_check(lua_State *L)
|
||||||
{
|
{
|
||||||
return luaL_checkudata(L, 1, "treesitter_parser");
|
return luaL_checkudata(L, 1, "treesitter_parser");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parser_gc(lua_State *L)
|
static int parser_gc(lua_State *L)
|
||||||
{
|
{
|
||||||
Tslua_parser *p = parser_check(L);
|
TSLua_parser *p = parser_check(L);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -238,6 +238,7 @@ static const char *input_cb(void *payload, uint32_t byte_index,
|
|||||||
buf_T *bp = payload;
|
buf_T *bp = payload;
|
||||||
#define BUFSIZE 256
|
#define BUFSIZE 256
|
||||||
static char buf[BUFSIZE];
|
static char buf[BUFSIZE];
|
||||||
|
|
||||||
if ((linenr_T)position.row >= bp->b_ml.ml_line_count) {
|
if ((linenr_T)position.row >= bp->b_ml.ml_line_count) {
|
||||||
*bytes_read = 0;
|
*bytes_read = 0;
|
||||||
return "";
|
return "";
|
||||||
@ -246,10 +247,13 @@ static const char *input_cb(void *payload, uint32_t byte_index,
|
|||||||
size_t len = STRLEN(line);
|
size_t len = STRLEN(line);
|
||||||
size_t tocopy = MIN(len-position.column, BUFSIZE);
|
size_t tocopy = MIN(len-position.column, BUFSIZE);
|
||||||
|
|
||||||
// TODO: translate embedded \n to \000
|
|
||||||
memcpy(buf, line+position.column, tocopy);
|
memcpy(buf, line+position.column, tocopy);
|
||||||
|
// Translate embedded \n to NUL
|
||||||
|
memchrsub(buf, '\n', '\0', tocopy);
|
||||||
*bytes_read = (uint32_t)tocopy;
|
*bytes_read = (uint32_t)tocopy;
|
||||||
if (tocopy < 200) {
|
if (tocopy < BUFSIZE) {
|
||||||
|
// now add the final \n. If it didn't fit, input_cb will be called again
|
||||||
|
// on the same line with advanced column.
|
||||||
buf[tocopy] = '\n';
|
buf[tocopy] = '\n';
|
||||||
(*bytes_read)++;
|
(*bytes_read)++;
|
||||||
}
|
}
|
||||||
@ -259,7 +263,7 @@ static const char *input_cb(void *payload, uint32_t byte_index,
|
|||||||
|
|
||||||
static int parser_parse_buf(lua_State *L)
|
static int parser_parse_buf(lua_State *L)
|
||||||
{
|
{
|
||||||
Tslua_parser *p = parser_check(L);
|
TSLua_parser *p = parser_check(L);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -282,7 +286,7 @@ static int parser_parse_buf(lua_State *L)
|
|||||||
|
|
||||||
static int parser_tree(lua_State *L)
|
static int parser_tree(lua_State *L)
|
||||||
{
|
{
|
||||||
Tslua_parser *p = parser_check(L);
|
TSLua_parser *p = parser_check(L);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -298,7 +302,7 @@ static int parser_edit(lua_State *L)
|
|||||||
return lua_error(L);
|
return lua_error(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
Tslua_parser *p = parser_check(L);
|
TSLua_parser *p = parser_check(L);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
#ifndef NVIM_LUA_TREESITTER_H
|
#ifndef NVIM_LUA_TREESITTER_H
|
||||||
#define NVIM_LUA_TREESITTER_H
|
#define NVIM_LUA_TREESITTER_H
|
||||||
|
|
||||||
|
#include <lua.h>
|
||||||
|
#include <lualib.h>
|
||||||
|
#include <lauxlib.h>
|
||||||
|
|
||||||
#include "tree_sitter/api.h"
|
#include "tree_sitter/api.h"
|
||||||
|
|
||||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
-- Test suite for testing interactions with API bindings
|
-- Test suite for testing interactions with API bindings
|
||||||
local helpers = require('test.functional.helpers')(after_each)
|
local helpers = require('test.functional.helpers')(after_each)
|
||||||
|
|
||||||
local meths = helpers.meths
|
|
||||||
local clear = helpers.clear
|
local clear = helpers.clear
|
||||||
local eq = helpers.eq
|
local eq = helpers.eq
|
||||||
local insert = helpers.insert
|
local insert = helpers.insert
|
||||||
local meth_pcall = helpers.meth_pcall
|
|
||||||
local exec_lua = helpers.exec_lua
|
local exec_lua = helpers.exec_lua
|
||||||
local iswin = helpers.iswin
|
local iswin = helpers.iswin
|
||||||
local feed = helpers.feed
|
local feed = helpers.feed
|
||||||
|
Loading…
Reference in New Issue
Block a user