mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	fix(lua2dox): filter out the entire ---@alias block
				
					
				
			Problem: Any preceding luadocs block that define alias types with `@alias` magic would be prepended to the documentation of functions that follow, despite the "blank line" separator. For example: ``` --- @alias some.type.between.functions --- Blah blah long documentation for alias --- | "foo" # foo --- | "bar" # bar --- The documentation that should appear in vimdoc. function M.function_to_include_in_doc() ... end ``` then the vimdoc generated for `function_to_include_in_doc` would include the text from the alias block (e.g., "Blah blah ... for alias"). Solution: - refactor: Lua2DoxFilter should maintain its own internal state `generics`, rather than carrying it as a parameter to local helper functions. - Add another boolean state `boolean_state` which represents whether to ignore the current docstring block (magic lines). This flag will be reset as soon as the block is end. Note: As expected, there is no change at all in the current docs generated, because we have been working around and writing luadoc comments so that such erroneous docstring resulting from preceding `@alias` blocks won't appear.
This commit is contained in:
		 Jongwook Choi
					Jongwook Choi
				
			
				
					committed by
					
						 Lewis Russell
						Lewis Russell
					
				
			
			
				
	
			
			
			 Lewis Russell
						Lewis Russell
					
				
			
						parent
						
							2cdea852e8
						
					
				
				
					commit
					a7df0415ab
				
			| @@ -136,9 +136,17 @@ end | |||||||
|  |  | ||||||
| -- input filter | -- input filter | ||||||
| --- @class Lua2DoxFilter | --- @class Lua2DoxFilter | ||||||
| local Lua2DoxFilter = {} | local Lua2DoxFilter = { | ||||||
|  |   generics = {}, --- @type table<string,string> | ||||||
|  |   block_ignore = false, --- @type boolean | ||||||
|  | } | ||||||
| setmetatable(Lua2DoxFilter, { __index = Lua2DoxFilter }) | setmetatable(Lua2DoxFilter, { __index = Lua2DoxFilter }) | ||||||
|  |  | ||||||
|  | function Lua2DoxFilter:reset() | ||||||
|  |   self.generics = {} | ||||||
|  |   self.block_ignore = false | ||||||
|  | end | ||||||
|  |  | ||||||
| --- trim comment off end of string | --- trim comment off end of string | ||||||
| --- | --- | ||||||
| --- @param line string | --- @param line string | ||||||
| @@ -239,13 +247,16 @@ end | |||||||
| --- Processes "@…" directives in a docstring line. | --- Processes "@…" directives in a docstring line. | ||||||
| --- | --- | ||||||
| --- @param line string | --- @param line string | ||||||
| --- @param generics table<string,string> |  | ||||||
| --- @return string? | --- @return string? | ||||||
| local function process_magic(line, generics) | function Lua2DoxFilter:process_magic(line) | ||||||
|   line = line:gsub('^%s+@', '@') |   line = line:gsub('^%s+@', '@') | ||||||
|   line = line:gsub('@package', '@private') |   line = line:gsub('@package', '@private') | ||||||
|   line = line:gsub('@nodoc', '@private') |   line = line:gsub('@nodoc', '@private') | ||||||
|  |  | ||||||
|  |   if self.block_ignore then | ||||||
|  |     return '// gg:" ' .. line .. '"' | ||||||
|  |   end | ||||||
|  |  | ||||||
|   if not vim.startswith(line, '@') then -- it's a magic comment |   if not vim.startswith(line, '@') then -- it's a magic comment | ||||||
|     return '/// ' .. line |     return '/// ' .. line | ||||||
|   end |   end | ||||||
| @@ -269,6 +280,12 @@ local function process_magic(line, generics) | |||||||
|     return '/// ' .. line:gsub('%.', '-dot-') |     return '/// ' .. line:gsub('%.', '-dot-') | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |   if directive == '@alias' then | ||||||
|  |     -- this contiguous block should be all ignored. | ||||||
|  |     self.block_ignore = true | ||||||
|  |     return '// gg:"' .. line .. '"' | ||||||
|  |   end | ||||||
|  |  | ||||||
|   -- preprocess line before parsing |   -- preprocess line before parsing | ||||||
|   if directive == '@param' or directive == '@return' then |   if directive == '@param' or directive == '@return' then | ||||||
|     for _, type in ipairs(TYPES) do |     for _, type in ipairs(TYPES) do | ||||||
| @@ -289,12 +306,12 @@ local function process_magic(line, generics) | |||||||
|   local kind = parsed.kind |   local kind = parsed.kind | ||||||
|  |  | ||||||
|   if kind == 'generic' then |   if kind == 'generic' then | ||||||
|     generics[parsed.name] = parsed.type or 'any' |     self.generics[parsed.name] = parsed.type or 'any' | ||||||
|     return |     return | ||||||
|   elseif kind == 'param' then |   elseif kind == 'param' then | ||||||
|     return process_param(parsed --[[@as luacats.Param]], generics) |     return process_param(parsed --[[@as luacats.Param]], self.generics) | ||||||
|   elseif kind == 'return' then |   elseif kind == 'return' then | ||||||
|     return process_return(parsed --[[@as luacats.Return]], generics) |     return process_return(parsed --[[@as luacats.Return]], self.generics) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   error(string.format('unhandled parsed line %q: %s', line, parsed)) |   error(string.format('unhandled parsed line %q: %s', line, parsed)) | ||||||
| @@ -303,7 +320,7 @@ end | |||||||
| --- @param line string | --- @param line string | ||||||
| --- @param in_stream StreamRead | --- @param in_stream StreamRead | ||||||
| --- @return string | --- @return string | ||||||
| local function process_block_comment(line, in_stream) | function Lua2DoxFilter:process_block_comment(line, in_stream) | ||||||
|   local comment_parts = {} --- @type string[] |   local comment_parts = {} --- @type string[] | ||||||
|   local done --- @type boolean? |   local done --- @type boolean? | ||||||
|  |  | ||||||
| @@ -337,7 +354,7 @@ end | |||||||
|  |  | ||||||
| --- @param line string | --- @param line string | ||||||
| --- @return string | --- @return string | ||||||
| local function process_function_header(line) | function Lua2DoxFilter:process_function_header(line) | ||||||
|   local pos_fn = assert(line:find('function')) |   local pos_fn = assert(line:find('function')) | ||||||
|   -- we've got a function |   -- we've got a function | ||||||
|   local fn = removeCommentFromLine(vim.trim(line:sub(pos_fn + 8))) |   local fn = removeCommentFromLine(vim.trim(line:sub(pos_fn + 8))) | ||||||
| @@ -385,18 +402,17 @@ end | |||||||
|  |  | ||||||
| --- @param line string | --- @param line string | ||||||
| --- @param in_stream StreamRead | --- @param in_stream StreamRead | ||||||
| --- @param generics table<string,string>> |  | ||||||
| --- @return string? | --- @return string? | ||||||
| local function process_line(line, in_stream, generics) | function Lua2DoxFilter:process_line(line, in_stream) | ||||||
|   local line_raw = line |   local line_raw = line | ||||||
|   line = vim.trim(line) |   line = vim.trim(line) | ||||||
|  |  | ||||||
|   if vim.startswith(line, '---') then |   if vim.startswith(line, '---') then | ||||||
|     return process_magic(line:sub(4), generics) |     return Lua2DoxFilter:process_magic(line:sub(4)) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   if vim.startswith(line, '--' .. '[[') then -- it's a long comment |   if vim.startswith(line, '--' .. '[[') then -- it's a long comment | ||||||
|     return process_block_comment(line:sub(5), in_stream) |     return Lua2DoxFilter:process_block_comment(line:sub(5), in_stream) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   -- Hax... I'm sorry |   -- Hax... I'm sorry | ||||||
| @@ -406,7 +422,7 @@ local function process_line(line, in_stream, generics) | |||||||
|   line = line:gsub('^(.+) = .*_memoize%([^,]+, function%((.*)%)$', 'function %1(%2)') |   line = line:gsub('^(.+) = .*_memoize%([^,]+, function%((.*)%)$', 'function %1(%2)') | ||||||
|  |  | ||||||
|   if line:find('^function') or line:find('^local%s+function') then |   if line:find('^function') or line:find('^local%s+function') then | ||||||
|     return process_function_header(line) |     return Lua2DoxFilter:process_function_header(line) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   if not line:match('^local') then |   if not line:match('^local') then | ||||||
| @@ -429,15 +445,13 @@ end | |||||||
| function Lua2DoxFilter:filter(filename) | function Lua2DoxFilter:filter(filename) | ||||||
|   local in_stream = StreamRead.new(filename) |   local in_stream = StreamRead.new(filename) | ||||||
|  |  | ||||||
|   local generics = {} --- @type table<string,string> |  | ||||||
|  |  | ||||||
|   while not in_stream:eof() do |   while not in_stream:eof() do | ||||||
|     local line = in_stream:getLine() |     local line = in_stream:getLine() | ||||||
|  |  | ||||||
|     local out_line = process_line(line, in_stream, generics) |     local out_line = self:process_line(line, in_stream) | ||||||
|  |  | ||||||
|     if not vim.startswith(vim.trim(line), '---') then |     if not vim.startswith(vim.trim(line), '---') then | ||||||
|       generics = {} |       self:reset() | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     if out_line then |     if out_line then | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user