11local parser = {};
2- local health = require (" helpview.health" );
32
3+ local health = require (" helpview.health" );
44parser .vimdoc = require (" helpview.parsers.vimdoc" );
55
6- parser .ignore_ranges = {};
7-
8- parser .create_ignore_range = function (language , items )
9- local _r = {};
10-
11- if language == " vimdoc" then
12- for _ , item in ipairs (items [" vimdoc_code_block" ] or {}) do
13- table.insert (_r , { item .range .row_start , item .range .row_end })
14- end
15- end
16-
17- parser .ignore_ranges = vim .list_extend (parser .ignore_ranges , _r );
18- return _r ;
19- end
20-
216--- Custom `tbl_deep_extend()` that also works on lists.
227--- @param tbl_1 table
238--- @param tbl_2 table
@@ -40,7 +25,6 @@ parser.deep_extend = function (tbl_1, tbl_2)
4025 return tbl_1 ;
4126end
4227
43- parser .should_ignore = function (TSTree )
4428--- Should a TSTree be ignored.
4529--- @param TSTree TSTree
4630--- @param ignore_ranges [ integer , integer ][]
@@ -57,8 +41,6 @@ parser.should_ignore = function (TSTree, ignore_ranges)
5741 return false ;
5842end
5943
60- parser .content = {};
61- parser .sorted = {};
6244--- Initializes the parsers on the specified buffer.
6345--- Parsed data is stored as a "view" in renderer.lua
6446---
@@ -70,18 +52,35 @@ parser.sorted = {};
7052--- @return table
7153parser .init = function (buffer , from , to )
7254 -- Clear the previous contents
73- parser .content = {};
74- parser .sorted = {};
75- parser .ignore_ranges = {};
55+
56+ local content = {};
57+ local sorted = {};
58+ local ignore_ranges = {};
7659
7760 if
7861 not pcall (vim .treesitter .get_parser , buffer ) or
7962 not vim .treesitter .get_parser (buffer )
8063 then
81- return parser .content , parser .sorted ;
64+ return content , sorted ;
65+ end
66+
67+ --- Creates a range of lines to ignore.
68+ --- @param language string
69+ --- @param items table[]
70+ --- @return [ integer , integer ][]
71+ local function create_ignore_range (language , items )
72+ local _r = {};
73+
74+ if language == " vimdoc" then
75+ for _ , item in ipairs (items [" vimdoc_code_block" ] or {}) do
76+ table.insert (_r , { item .range .row_start , item .range .row_end })
77+ end
78+ end
79+
80+ ignore_ranges = vim .list_extend (ignore_ranges , _r );
81+ return _r ;
8282 end
8383
84- --- +${lua, Announce start of parsing}
8584 --- @type integer Start time
8685 --- @diagnostic disable-next-line : undefined-field
8786 local start = vim .uv .hrtime ();
@@ -91,27 +90,29 @@ parser.init = function (buffer, from, to)
9190 message = string.format (" Parsing(start): %d" , buffer )
9291 });
9392 health .__child_indent_in ();
94- --- _
9593
9694 vim .treesitter .get_parser (buffer ):parse (true );
9795 local root_parser = vim .treesitter .get_parser (buffer );
9896
97+ if not root_parser then
98+ return parser .content , parser .parsed ;
99+ end
100+
99101 root_parser :for_each_tree (function (TSTree , language_tree )
100102 language_tree :parse (true );
101103
102104 local language = language_tree :lang ();
103- local content , sorted = {}, {};
105+ local _content , _sorted = {}, {};
104106
105- if parser [language ] and not parser .should_ignore (TSTree ) then
106- content , sorted = parser [language ].parse (buffer , TSTree , from , to );
107- parser . create_ignore_range (language , sorted )
107+ if parser [language ] and not parser .should_ignore (TSTree , ignore_ranges ) then
108+ _content , _sorted = parser [language ].parse (buffer , TSTree , from , to );
109+ create_ignore_range (language , _sorted )
108110 end
109111
110- parser . content [language ] = vim .list_extend (parser . content [language ] or {}, content );
111- parser . sorted [language ] = parser .deep_extend (parser . sorted [language ] or {}, sorted );
112- end )
112+ content [language ] = vim .list_extend (content [language ] or {}, _content );
113+ sorted [language ] = parser .deep_extend (sorted [language ] or {}, _sorted );
114+ end );
113115
114- --- +${lua, Announce end of parsing}
115116 --- @type integer End time
116117 --- @diagnostic disable-next-line : undefined-field
117118 local now = vim .uv .hrtime ();
@@ -121,9 +122,8 @@ parser.init = function (buffer, from, to)
121122 level = 3 ,
122123 message = string.format (" Parsing(end, %dms): %d" , (now - start ) / 1e6 , buffer )
123124 });
124- --- _
125125
126- return parser . content , parser . sorted ;
126+ return content , sorted ;
127127end
128128
129129parser .parse = parser .init ;
0 commit comments