aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2023-03-03 09:19:29 -0500
committerGitHub <noreply@github.com>2023-03-03 09:19:29 -0500
commitef52592cf8bc158a91b276017d1d2e68a620e7e0 (patch)
tree42517d66fece641478f8b739364eec4d97bba576
parent506ffde1a7dd819f2a917907b024f42d32e3ad49 (diff)
parent57f26e0903af0e4569a70d310ca18696e7680c74 (diff)
downloadrneovim-ef52592cf8bc158a91b276017d1d2e68a620e7e0.tar.gz
rneovim-ef52592cf8bc158a91b276017d1d2e68a620e7e0.tar.bz2
rneovim-ef52592cf8bc158a91b276017d1d2e68a620e7e0.zip
Merge #22493 lua2dox.lua, vim.treesitter tags
-rw-r--r--runtime/doc/deprecated.txt2
-rw-r--r--runtime/doc/news.txt10
-rw-r--r--runtime/doc/treesitter.txt69
-rw-r--r--runtime/lua/vim/treesitter/highlighter.lua4
-rw-r--r--runtime/lua/vim/treesitter/languagetree.lua20
-rw-r--r--runtime/lua/vim/treesitter/query.lua5
-rwxr-xr-xscripts/gen_vimdoc.py18
-rw-r--r--scripts/lua2dox.lua102
8 files changed, 114 insertions, 116 deletions
diff --git a/runtime/doc/deprecated.txt b/runtime/doc/deprecated.txt
index 42dfb53e77..3d861b07b3 100644
--- a/runtime/doc/deprecated.txt
+++ b/runtime/doc/deprecated.txt
@@ -120,7 +120,7 @@ LSP FUNCTIONS
or |vim.lsp.buf.format()| instead.
TREESITTER FUNCTIONS
-- *vim.treesitter.language.require_language()* Use |vim.treesitter.language.add()|
+- *vim.treesitter.language.require_language()* Use |vim.treesitter.add()|
instead.
- *vim.treesitter.get_node_at_pos()* Use |vim.treesitter.get_node()|
instead.
diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt
index 0ffd335520..cda4792c9e 100644
--- a/runtime/doc/news.txt
+++ b/runtime/doc/news.txt
@@ -162,11 +162,10 @@ The following new APIs or features were added.
• Treesitter captures can now be transformed by directives. This will allow
more complicated dynamic language injections.
-• |vim.treesitter.query.get_node_text()| now accepts a `metadata` option for
- writing custom directives using |vim.treesitter.query.add_directive()|.
+• |vim.treesitter.get_node_text()| now accepts a `metadata` option for
+ writing custom directives using |vim.treesitter.add_directive()|.
-• |vim.treesitter.language.add()| as a new replacement for
- `vim.treesitter.language.require_language`.
+• |vim.treesitter.add()| replaces `vim.treesitter.language.require_language`.
• `require'bit'` is now always available |lua-bit|
@@ -225,8 +224,7 @@ DEPRECATIONS *news-deprecations*
The following functions are now deprecated and will be removed in the next
release.
-• `vim.treesitter.language.require_language()` has been deprecated in favour
- of |vim.treesitter.language.add()|.
+• |vim.treesitter.add()| replaces `vim.treesitter.language.require_language()`
• |vim.treesitter.get_node_at_pos()| and |vim.treesitter.get_node_at_cursor()|
are both deprecated in favor of |vim.treesitter.get_node()|.
diff --git a/runtime/doc/treesitter.txt b/runtime/doc/treesitter.txt
index 5ac24de70a..94a93bdbbb 100644
--- a/runtime/doc/treesitter.txt
+++ b/runtime/doc/treesitter.txt
@@ -272,9 +272,8 @@ The following predicates are built in:
Each predicate has a `not-` prefixed predicate that is just the negation of
the predicate.
-Further predicates can be added via |vim.treesitter.query.add_predicate()|.
-Use |vim.treesitter.query.list_predicates()| to list all available
-predicates.
+Further predicates can be added via |vim.treesitter.add_predicate()|.
+Use |vim.treesitter.list_predicates()| to list all available predicates.
TREESITTER QUERY DIRECTIVES *treesitter-directives*
@@ -316,9 +315,8 @@ The following directives are built in:
((identifier) @constant (#offset! @constant 0 1 0 -1))
<
-Further directives can be added via |vim.treesitter.query.add_directive()|.
-Use |vim.treesitter.query.list_directives()| to list all available
-directives.
+Further directives can be added via |vim.treesitter.add_directive()|.
+Use |vim.treesitter.list_directives()| to list all available directives.
TREESITTER QUERY MODELINES *treesitter-query-modeline*
@@ -690,7 +688,7 @@ stop({bufnr}) *vim.treesitter.stop()*
==============================================================================
Lua module: vim.treesitter.language *lua-treesitter-language*
-add({lang}, {opts}) *vim.treesitter.language.add()*
+add({lang}, {opts}) *vim.treesitter.add()*
Asserts that a parser for the language {lang} is installed.
Parsers are searched in the `parser` runtime directory, or the provided
@@ -708,14 +706,14 @@ add({lang}, {opts}) *vim.treesitter.language.add()*
• symbol_name (string|nil) Internal symbol name for the
language to load
-get_lang({filetype}) *vim.treesitter.language.get_lang()*
+get_lang({filetype}) *vim.treesitter.get_lang()*
Parameters: ~
• {filetype} (string)
Return: ~
(string|nil)
-inspect_language({lang}) *vim.treesitter.language.inspect_language()*
+inspect_language({lang}) *vim.treesitter.inspect_language()*
Inspects the provided language.
Inspecting provides some useful information on the language like node
@@ -727,7 +725,7 @@ inspect_language({lang}) *vim.treesitter.language.inspect_language()*
Return: ~
(table)
-register({lang}, {filetype}) *vim.treesitter.language.register()*
+register({lang}, {filetype}) *vim.treesitter.register()*
Register a lang to be used for a filetype (or list of filetypes).
Parameters: ~
@@ -738,7 +736,7 @@ register({lang}, {filetype}) *vim.treesitter.language.register()*
==============================================================================
Lua module: vim.treesitter.query *lua-treesitter-query*
- *vim.treesitter.query.add_directive()*
+ *vim.treesitter.add_directive()*
add_directive({name}, {handler}, {force})
Adds a new directive to be used in queries
@@ -760,7 +758,7 @@ add_directive({name}, {handler}, {force})
the predicate `{ "#set!", "conceal", "-" }`
• {force} (boolean|nil)
- *vim.treesitter.query.add_predicate()*
+ *vim.treesitter.add_predicate()*
add_predicate({name}, {handler}, {force})
Adds a new predicate to be used in queries
@@ -768,11 +766,11 @@ add_predicate({name}, {handler}, {force})
• {name} (string) Name of the predicate, without leading #
• {handler} function(match:table<string,|TSNode|>, pattern:string,
bufnr:number, predicate:string[])
- • see |vim.treesitter.query.add_directive()| for argument
+ • see |vim.treesitter.add_directive()| for argument
meanings
• {force} (boolean|nil)
- *vim.treesitter.query.get_node_text()*
+ *vim.treesitter.get_node_text()*
get_node_text({node}, {source}, {opts})
Gets the text corresponding to a given node
@@ -785,12 +783,12 @@ get_node_text({node}, {source}, {opts})
true)
• metadata (table) Metadata of a specific capture. This
would be set to `metadata[capture_id]` when using
- |vim.treesitter.query.add_directive()|.
+ |vim.treesitter.add_directive()|.
Return: ~
(string[]|string|nil)
-get_query({lang}, {query_name}) *vim.treesitter.query.get_query()*
+get_query({lang}, {query_name}) *vim.treesitter.get_query()*
Returns the runtime query {query_name} for {lang}.
Parameters: ~
@@ -800,7 +798,7 @@ get_query({lang}, {query_name}) *vim.treesitter.query.get_query()*
Return: ~
Query|nil Parsed query
- *vim.treesitter.query.get_query_files()*
+ *vim.treesitter.get_query_files()*
get_query_files({lang}, {query_name}, {is_included})
Gets the list of files used to make up a query
@@ -814,19 +812,19 @@ get_query_files({lang}, {query_name}, {is_included})
string[] query_files List of files to load for given query and
language
-list_directives() *vim.treesitter.query.list_directives()*
+list_directives() *vim.treesitter.list_directives()*
Lists the currently available directives to use in queries.
Return: ~
string[] List of supported directives.
-list_predicates() *vim.treesitter.query.list_predicates()*
+list_predicates() *vim.treesitter.list_predicates()*
Lists the currently available predicates to use in queries.
Return: ~
string[] List of supported predicates.
-parse_query({lang}, {query}) *vim.treesitter.query.parse_query()*
+parse_query({lang}, {query}) *vim.treesitter.parse_query()*
Parse {query} as a string. (If the query is in a file, the caller should
read the contents into a string before calling).
@@ -915,8 +913,7 @@ Query:iter_matches({self}, {node}, {source}, {start}, {stop})
(fun(): integer, table<integer,TSNode>, table): pattern id, match,
metadata
- *vim.treesitter.query.set_query()*
-set_query({lang}, {query_name}, {text})
+set_query({lang}, {query_name}, {text}) *vim.treesitter.set_query()*
Sets the runtime query named {query_name} for {lang}
This allows users to override any runtime files and/or configuration set
@@ -931,17 +928,6 @@ set_query({lang}, {query_name}, {text})
==============================================================================
Lua module: vim.treesitter.highlighter *lua-treesitter-highlighter*
-new({tree}, {opts}) *vim.treesitter.highlighter.new()*
- Creates a new highlighter using
-
- Parameters: ~
- • {tree} |LanguageTree| parser object to use for highlighting
- • {opts} (table|nil) Configuration of the highlighter:
- • queries table overwrite queries used by the highlighter
-
- Return: ~
- TSHighlighter Created highlighter object
-
TSHighlighter:destroy({self}) *TSHighlighter:destroy()*
Removes all internal references to the highlighter
@@ -1103,21 +1089,4 @@ LanguageTree:trees({self}) *LanguageTree:trees()*
Parameters: ~
• {self}
-new({source}, {lang}, {opts}) *vim.treesitter.languagetree.new()*
- A |LanguageTree| holds the treesitter parser for a given language {lang}
- used to parse a buffer. As the buffer may contain injected languages, the LanguageTree needs to store parsers for these child languages as well (which in turn
- may contain child languages themselves, hence the name).
-
- Parameters: ~
- • {source} (integer|string) Buffer or a string of text to parse
- • {lang} (string) Root language this tree represents
- • {opts} (table|nil) Optional keyword arguments:
- • injections table Mapping language to injection query
- strings. This is useful for overriding the built-in
- runtime file searching for the injection language query
- per language.
-
- Return: ~
- |LanguageTree| parser object
-
vim:tw=78:ts=8:sw=4:sts=4:et:ft=help:norl:
diff --git a/runtime/lua/vim/treesitter/highlighter.lua b/runtime/lua/vim/treesitter/highlighter.lua
index 8adaa4ef2f..e3deaf6ba6 100644
--- a/runtime/lua/vim/treesitter/highlighter.lua
+++ b/runtime/lua/vim/treesitter/highlighter.lua
@@ -58,7 +58,9 @@ function TSHighlighterQuery:query()
return self._query
end
---- Creates a new highlighter using @param tree
+---@private
+---
+--- Creates a highlighter for `tree`.
---
---@param tree LanguageTree parser object to use for highlighting
---@param opts (table|nil) Configuration of the highlighter:
diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua
index 43fb866896..1bc7971eba 100644
--- a/runtime/lua/vim/treesitter/languagetree.lua
+++ b/runtime/lua/vim/treesitter/languagetree.lua
@@ -38,18 +38,16 @@ local LanguageTree = {}
LanguageTree.__index = LanguageTree
---- A |LanguageTree| holds the treesitter parser for a given language {lang} used
---- to parse a buffer. As the buffer may contain injected languages, the LanguageTree
---- needs to store parsers for these child languages as well (which in turn may contain
---- child languages themselves, hence the name).
+--- @private
---
----@param source (integer|string) Buffer or a string of text to parse
----@param lang string Root language this tree represents
----@param opts (table|nil) Optional keyword arguments:
---- - injections table Mapping language to injection query strings.
---- This is useful for overriding the built-in
---- runtime file searching for the injection language
---- query per language.
+--- |LanguageTree| contains a tree of parsers: the root treesitter parser for {lang} and any
+--- "injected" language parsers, which themselves may inject other languages, recursively.
+---
+---@param source (integer|string) Buffer or text string to parse
+---@param lang string Root language of this tree
+---@param opts (table|nil) Optional arguments:
+--- - injections table Map of language to injection query strings. Overrides the
+--- built-in runtime file searching for language injections.
---@return LanguageTree parser object
function LanguageTree.new(source, lang, opts)
language.add(lang)
diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua
index 13d98a0625..4e9871b59d 100644
--- a/runtime/lua/vim/treesitter/query.lua
+++ b/runtime/lua/vim/treesitter/query.lua
@@ -273,8 +273,7 @@ end
---@param opts (table|nil) Optional parameters.
--- - concat: (boolean) Concatenate result in a string (default true)
--- - metadata (table) Metadata of a specific capture. This would be
---- set to `metadata[capture_id]` when using
---- |vim.treesitter.query.add_directive()|.
+--- set to `metadata[capture_id]` when using |vim.treesitter.add_directive()|.
---@return (string[]|string|nil)
function M.get_node_text(node, source, opts)
opts = opts or {}
@@ -486,7 +485,7 @@ local directive_handlers = {
---
---@param name string Name of the predicate, without leading #
---@param handler function(match:table<string,TSNode>, pattern:string, bufnr:number, predicate:string[])
---- - see |vim.treesitter.query.add_directive()| for argument meanings
+--- - see |vim.treesitter.add_directive()| for argument meanings
---@param force boolean|nil
function M.add_predicate(name, handler, force)
if predicate_handlers[name] and not force then
diff --git a/scripts/gen_vimdoc.py b/scripts/gen_vimdoc.py
index dd593475e2..9e9e966627 100755
--- a/scripts/gen_vimdoc.py
+++ b/scripts/gen_vimdoc.py
@@ -265,6 +265,7 @@ CONFIG = {
'query.lua',
'highlighter.lua',
'languagetree.lua',
+ 'playground.lua',
],
'files': [
'runtime/lua/vim/treesitter.lua',
@@ -286,7 +287,7 @@ CONFIG = {
if fstem == 'treesitter'
else f'*{name}()*'
if name[0].isupper()
- else f'*vim.treesitter.{fstem}.{name}()*'),
+ else f'*vim.treesitter.{name}()*'),
'module_override': {},
'append_only': [],
}
@@ -1171,10 +1172,12 @@ def main(doxygen_config, args):
msg_report()
-def filter_source(filename):
+def filter_source(filename, keep_tmpfiles):
+ output_dir = out_dir.format(target='lua2dox')
name, extension = os.path.splitext(filename)
if extension == '.lua':
- p = subprocess.run([str(nvim), '-l', lua2dox, filename], stdout=subprocess.PIPE)
+ args = [str(nvim), '-l', lua2dox, filename] + (['--outdir', output_dir] if keep_tmpfiles else [])
+ p = subprocess.run(args, stdout=subprocess.PIPE)
op = ('?' if 0 != p.returncode else p.stdout.decode('utf-8'))
print(op)
else:
@@ -1197,7 +1200,7 @@ def parse_args():
ap.add_argument('source_filter', nargs='*',
help="Filter source file(s)")
ap.add_argument('-k', '--keep-tmpfiles', action='store_true',
- help="Keep temporary files")
+ help="Keep temporary files (tmp-xx-doc/ directories, including tmp-lua2dox-doc/ for lua2dox.lua quasi-C output)")
ap.add_argument('-t', '--target',
help=f'One of ({targets}), defaults to "all"')
return ap.parse_args()
@@ -1245,8 +1248,13 @@ if __name__ == "__main__":
log.setLevel(args.log_level)
log.addHandler(logging.StreamHandler())
+ # When invoked as a filter, args won't be passed, so use an env var.
+ if args.keep_tmpfiles:
+ os.environ['NVIM_KEEP_TMPFILES'] = '1'
+ keep_tmpfiles = ('NVIM_KEEP_TMPFILES' in os.environ)
+
if len(args.source_filter) > 0:
- filter_source(args.source_filter[0])
+ filter_source(args.source_filter[0], keep_tmpfiles)
else:
main(Doxyfile, args)
diff --git a/scripts/lua2dox.lua b/scripts/lua2dox.lua
index 17de0ea9b4..b99cd955f4 100644
--- a/scripts/lua2dox.lua
+++ b/scripts/lua2dox.lua
@@ -24,11 +24,18 @@ Lua-to-Doxygen converter
Partially from lua2dox
http://search.cpan.org/~alec/Doxygen-Lua-0.02/lib/Doxygen/Lua.pm
-Running
+RUNNING
-------
This script "lua2dox.lua" gets called by "gen_vimdoc.py".
+DEBUGGING/DEVELOPING
+---------------------
+
+1. To debug, run gen_vimdoc.py with --keep-tmpfiles:
+ python3 scripts/gen_vimdoc.py -t treesitter --keep-tmpfiles
+2. The filtered result will be written to ./tmp-lua2dox-doc/….lua.c
+
Doxygen must be on your system. You can experiment like so:
- Run "doxygen -g" to create a default Doxyfile.
@@ -49,6 +56,9 @@ However I have put in a hack that will insert the "missing" close paren.
The effect is that you will get the function documented, but not with the parameter list you might expect.
]]
+local _debug_outfile = nil
+local _debug_output = {}
+
local function class()
local newClass = {} -- a new class newClass
-- the class will be the metatable for all its newInstanceects,
@@ -71,27 +81,28 @@ local function class()
return newClass
end
---! \brief write to stdout
+-- write to stdout
local function TCore_IO_write(Str)
if Str then
io.write(Str)
+ if _debug_outfile then
+ table.insert(_debug_output, Str)
+ end
end
end
---! \brief write to stdout
+-- write to stdout
local function TCore_IO_writeln(Str)
- if Str then
- io.write(Str)
- end
- io.write('\n')
+ TCore_IO_write(Str)
+ TCore_IO_write('\n')
end
---! \brief trims a string
+-- trims a string
local function string_trim(Str)
return Str:match('^%s*(.-)%s*$')
end
---! \brief split a string
+-- split a string
--!
--! \param Str
--! \param Pattern
@@ -117,12 +128,12 @@ local function string_split(Str, Pattern)
end
-------------------------------
---! \brief file buffer
+-- file buffer
--!
--! an input file buffer
local TStream_Read = class()
---! \brief get contents of file
+-- get contents of file
--!
--! \param Filename name of file to read (or nil == stdin)
function TStream_Read.getContents(this, Filename)
@@ -143,12 +154,12 @@ function TStream_Read.getContents(this, Filename)
return filecontents
end
---! \brief get lineno
+-- get lineno
function TStream_Read.getLineNo(this)
return this.currentLineNo
end
---! \brief get a line
+-- get a line
function TStream_Read.getLine(this)
local line
if this.currentLine then
@@ -166,12 +177,12 @@ function TStream_Read.getLine(this)
return line
end
---! \brief save line fragment
+-- save line fragment
function TStream_Read.ungetLine(this, LineFrag)
this.currentLine = LineFrag
end
---! \brief is it eof?
+-- is it eof?
function TStream_Read.eof(this)
if this.currentLine or this.currentLineNo <= this.contentsLen then
return false
@@ -179,31 +190,31 @@ function TStream_Read.eof(this)
return true
end
---! \brief output stream
+-- output stream
local TStream_Write = class()
---! \brief constructor
+-- constructor
function TStream_Write.init(this)
this.tailLine = {}
end
---! \brief write immediately
+-- write immediately
function TStream_Write.write(_, Str)
TCore_IO_write(Str)
end
---! \brief write immediately
+-- write immediately
function TStream_Write.writeln(_, Str)
TCore_IO_writeln(Str)
end
---! \brief write immediately
+-- write immediately
function TStream_Write.writelnComment(_, Str)
TCore_IO_write('// ZZ: ')
TCore_IO_writeln(Str)
end
---! \brief write to tail
+-- write to tail
function TStream_Write.writelnTail(this, Line)
if not Line then
Line = ''
@@ -211,7 +222,7 @@ function TStream_Write.writelnTail(this, Line)
table.insert(this.tailLine, Line)
end
---! \brief output tail lines
+-- output tail lines
function TStream_Write.write_tailLines(this)
for _, line in ipairs(this.tailLine) do
TCore_IO_writeln(line)
@@ -219,17 +230,17 @@ function TStream_Write.write_tailLines(this)
TCore_IO_write('// Lua2DoX new eof')
end
---! \brief input filter
+-- input filter
local TLua2DoX_filter = class()
---! \brief allow us to do errormessages
+-- allow us to do errormessages
function TLua2DoX_filter.warning(this, Line, LineNo, Legend)
this.outStream:writelnTail(
'//! \todo warning! ' .. Legend .. ' (@' .. LineNo .. ')"' .. Line .. '"'
)
end
---! \brief trim comment off end of string
+-- trim comment off end of string
--!
--! If the string has a comment on the end, this trims it off.
--!
@@ -243,7 +254,7 @@ local function TString_removeCommentFromLine(Line)
return Line, tailComment
end
---! \brief get directive from magic
+-- get directive from magic
local function getMagicDirective(Line)
local macro, tail
local macroStr = '[\\@]'
@@ -264,7 +275,7 @@ local function getMagicDirective(Line)
return macro, tail
end
---! \brief check comment for fn
+-- check comment for fn
local function checkComment4fn(Fn_magic, MagicLines)
local fn_magic = Fn_magic
-- TCore_IO_writeln('// checkComment4fn "' .. MagicLines .. '"')
@@ -293,8 +304,8 @@ local tagged_types = { 'TSNode', 'LanguageTree' }
-- Document these as 'table'
local alias_types = { 'Range4', 'Range6' }
---! \brief run the filter
-function TLua2DoX_filter.readfile(this, AppStamp, Filename)
+-- Processes the file and writes filtered output to stdout.
+function TLua2DoX_filter.filter(this, AppStamp, Filename)
local inStream = TStream_Read()
local outStream = TStream_Write()
this.outStream = outStream -- save to this obj
@@ -524,10 +535,10 @@ function TLua2DoX_filter.readfile(this, AppStamp, Filename)
end
end
---! \brief this application
+-- this application
local TApp = class()
---! \brief constructor
+-- constructor
function TApp.init(this)
this.timestamp = os.date('%c %Z', os.time())
this.name = 'Lua2DoX'
@@ -551,8 +562,7 @@ local This_app = TApp()
--main
-local argv1 = arg[1]
-if argv1 == '--help' then
+if arg[1] == '--help' then
TCore_IO_writeln(This_app:getVersion())
TCore_IO_writeln(This_app:getCopyright())
TCore_IO_writeln([[
@@ -563,16 +573,30 @@ if argv1 == '--help' then
<filename> : interprets filename
--version : show version/copyright info
--help : this help text]])
-elseif argv1 == '--version' then
+elseif arg[1] == '--version' then
TCore_IO_writeln(This_app:getVersion())
TCore_IO_writeln(This_app:getCopyright())
-else
- -- it's a filter
- local appStamp = This_app:getRunStamp()
- local filename = argv1
+else -- It's a filter.
+ local filename = arg[1]
+
+ if arg[2] == '--outdir' then
+ local outdir = arg[3]
+ if type(outdir) ~= 'string' or (0 ~= vim.fn.filereadable(outdir) and 0 == vim.fn.isdirectory(outdir)) then
+ error(('invalid --outdir: "%s"'):format(tostring(outdir)))
+ end
+ vim.fn.mkdir(outdir, 'p')
+ _debug_outfile = string.format('%s/%s.c', outdir, vim.fs.basename(filename))
+ end
+ local appStamp = This_app:getRunStamp()
local filter = TLua2DoX_filter()
- filter:readfile(appStamp, filename)
+ filter:filter(appStamp, filename)
+
+ if _debug_outfile then
+ local f = assert(io.open(_debug_outfile, 'w'))
+ f:write(table.concat(_debug_output))
+ f:close()
+ end
end
--eof