mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	 f9080b24c4
			
		
	
	f9080b24c4
	
	
	
		
			
			When trying to load a language parser, escape the value of
the language.
With language injection, the language might be picked up from the
buffer. If this value is erroneous it can cause `nvim_get_runtime_file`
to hard error.
E.g., the markdown expression `~~~{` will extract '{' as a language and
then try to get the parser using `parser/{*` as the pattern.
		
	
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local a = vim.api
 | |
| 
 | |
| local M = {}
 | |
| 
 | |
| --- Asserts that the provided language is installed, and optionally provide a path for the parser
 | |
| ---
 | |
| --- Parsers are searched in the `parser` runtime directory.
 | |
| ---
 | |
| ---@param lang The language the parser should parse
 | |
| ---@param path Optional path the parser is located at
 | |
| ---@param silent Don't throw an error if language not found
 | |
| function M.require_language(lang, path, silent)
 | |
|   if vim._ts_has_language(lang) then
 | |
|     return true
 | |
|   end
 | |
|   if path == nil then
 | |
|     local fname = 'parser/' .. vim.fn.fnameescape(lang) .. '.*'
 | |
|     local paths = a.nvim_get_runtime_file(fname, false)
 | |
|     if #paths == 0 then
 | |
|       if silent then
 | |
|         return false
 | |
|       end
 | |
| 
 | |
|       -- TODO(bfredl): help tag?
 | |
|       error("no parser for '"..lang.."' language, see :help treesitter-parsers")
 | |
|     end
 | |
|     path = paths[1]
 | |
|   end
 | |
| 
 | |
|   if silent then
 | |
|     return pcall(function() vim._ts_add_language(path, lang) end)
 | |
|   else
 | |
|     vim._ts_add_language(path, lang)
 | |
|   end
 | |
| 
 | |
|   return true
 | |
| end
 | |
| 
 | |
| --- Inspects the provided language.
 | |
| ---
 | |
| --- Inspecting provides some useful information on the language like node names, ...
 | |
| ---
 | |
| ---@param lang The language.
 | |
| function M.inspect_language(lang)
 | |
|   M.require_language(lang)
 | |
|   return vim._ts_inspect_language(lang)
 | |
| end
 | |
| 
 | |
| return M
 |