mirror of
https://github.com/neovim/neovim.git
synced 2025-10-26 12:27:24 +00:00
fix(treesitter): enforce lowercase language names (#28546)
* fix(treesitter): enforce lowercase language names Problem: On case-insensitive file systems (e.g., macOS), `has_parser` will return `true` for uppercase aliases, which will then try to inject the uppercase language unsuccessfully. Solution: Enforce and assume parser names to be lowercase when resolving language names.
This commit is contained in:
@@ -88,6 +88,9 @@ function M.add(lang, opts)
|
||||
filetype = { filetype, { 'string', 'table' }, true },
|
||||
})
|
||||
|
||||
-- parser names are assumed to be lowercase (consistent behavior on case-insensitive file systems)
|
||||
lang = lang:lower()
|
||||
|
||||
if vim._ts_has_language(lang) then
|
||||
M.register(lang, filetype)
|
||||
return
|
||||
|
||||
@@ -758,7 +758,6 @@ local has_parser = vim.func._memoize(1, function(lang)
|
||||
end)
|
||||
|
||||
--- Return parser name for language (if exists) or filetype (if registered and exists).
|
||||
--- Also attempts with the input lower-cased.
|
||||
---
|
||||
---@param alias string language or filetype name
|
||||
---@return string? # resolved parser name
|
||||
@@ -772,19 +771,10 @@ local function resolve_lang(alias)
|
||||
return alias
|
||||
end
|
||||
|
||||
if has_parser(alias:lower()) then
|
||||
return alias:lower()
|
||||
end
|
||||
|
||||
local lang = vim.treesitter.language.get_lang(alias)
|
||||
if lang and has_parser(lang) then
|
||||
return lang
|
||||
end
|
||||
|
||||
lang = vim.treesitter.language.get_lang(alias:lower())
|
||||
if lang and has_parser(lang) then
|
||||
return lang
|
||||
end
|
||||
end
|
||||
|
||||
---@private
|
||||
@@ -808,7 +798,7 @@ function LanguageTree:_get_injection(match, metadata)
|
||||
-- Lang should override any other language tag
|
||||
if name == 'injection.language' then
|
||||
local text = vim.treesitter.get_node_text(node, self._source, { metadata = metadata[id] })
|
||||
lang = resolve_lang(text)
|
||||
lang = resolve_lang(text:lower()) -- language names are always lower case
|
||||
elseif name == 'injection.filename' then
|
||||
local text = vim.treesitter.get_node_text(node, self._source, { metadata = metadata[id] })
|
||||
local ft = vim.filetype.match({ filename = text })
|
||||
|
||||
Reference in New Issue
Block a user