summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md12
-rw-r--r--lua/nvim-treesitter/query.lua70
-rw-r--r--queries/cpp/folds.scm2
-rw-r--r--queries/cpp/highlights.scm2
-rw-r--r--queries/cpp/locals.scm2
-rw-r--r--queries/javascript/folds.scm1
-rw-r--r--queries/javascript/highlights.scm1
-rw-r--r--queries/javascript/locals.scm2
-rw-r--r--queries/ocaml_interface/folds.scm1
-rw-r--r--queries/ocaml_interface/highlights.scm1
-rw-r--r--queries/ocaml_interface/locals.scm1
-rw-r--r--queries/tsx/folds.scm1
-rw-r--r--queries/tsx/highlights.scm1
-rw-r--r--queries/tsx/locals.scm1
-rw-r--r--queries/typescript/folds.scm2
-rw-r--r--queries/typescript/highlights.scm1
-rw-r--r--queries/typescript/locals.scm2
17 files changed, 72 insertions, 31 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 9006308d..09ef589f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -67,6 +67,18 @@ Here are some global advices :
- Examples of queries can be found in [queries/](queries/)
- Matches in the bottom will override queries that are above of them.
+If your language is an extension of a language (TypeScript is an extension of JavaScript for
+example), you can include the queries from your base language by adding the following _as the first
+line of your file_.
+
+```scheme
+; inherits: lang1,(optionallang)
+```
+
+If you want to include a language for a given query, but don't want for the queries including the
+query you qre writing to include it too, you can mark the language as optional (by putting it
+between parenthesis).
+
### Highlights
As languages differ quite a lot, here is a set of captures available to you when building a `highlights.scm` query.
diff --git a/lua/nvim-treesitter/query.lua b/lua/nvim-treesitter/query.lua
index 9881cd2d..a123439f 100644
--- a/lua/nvim-treesitter/query.lua
+++ b/lua/nvim-treesitter/query.lua
@@ -8,19 +8,9 @@ local M = {}
local query_cache = caching.create_buffer_cache()
--- Some treesitter grammars extend others.
--- We can use that to import the queries of the base language
-M.base_language_map = {
- cpp = {'c'},
- typescript = {'javascript'},
- javascript = {'jsx'},
- tsx = {'typescript', 'javascript', 'jsx'},
- ocaml_interface = {'ocaml'},
-}
-
M.built_in_query_groups = {'highlights', 'locals', 'textobjects', 'folds'}
--- Creates a function that checks whether a certain query exists
+-- Creates a function that checks whether a given query exists
-- for a specific language.
local function get_query_guard(query)
return function(lang)
@@ -79,19 +69,45 @@ local function filtered_runtime_queries(lang, query_name)
return filter_files(api.nvim_get_runtime_file(string.format('queries/%s/%s.scm', lang, query_name), true) or {})
end
-local function runtime_query_exists(lang, query_name)
- local files = api.nvim_get_runtime_file(string.format('queries/%s/%s.scm', lang, query_name), false)
- return files and #files > 0
-end
+local function get_query_files(lang, query_name, is_included)
+ local lang_files = filtered_runtime_queries(lang, query_name)
+ local query_files = lang_files
-local function get_query_files(lang, query_name)
- local query_files = {}
+ if #query_files == 0 then return {} end
- local lang_files = filtered_runtime_queries(lang, query_name)
- vim.list_extend(query_files, lang_files)
+ local base_langs = {}
+
+ -- Now get the base languages by looking at the first line of every file
+ -- The syntax is the folowing :
+ -- ;+ inherits: ({language},)*{language}
+ --
+ -- {language} ::= {lang} | ({lang})
+ local MODELINE_FORMAT = "^;+%s*inherits%s*:?%s*([a-z_,()]+)%s*$"
+
+ for _, file in ipairs(query_files) do
+ local modeline = vim.fn.readfile(file, "", 1)
+
+ if #modeline == 1 then
+ local langlist = modeline[1]:match(MODELINE_FORMAT)
+
+ if langlist then
+ for _, lang in ipairs(vim.split(langlist, ',', true)) do
+ local is_optional = lang:match("%(.*%)")
+
+ if is_optional then
+ if not is_included then
+ table.insert(base_langs, lang:sub(2, #lang - 1))
+ end
+ else
+ table.insert(base_langs, lang)
+ end
+ end
+ end
+ end
+ end
- for _, base_lang in ipairs(M.base_language_map[lang] or {}) do
- local base_files = filtered_runtime_queries(base_lang, query_name)
+ for _, base_lang in ipairs(base_langs) do
+ local base_files = get_query_files(base_lang, query_name, true)
vim.list_extend(query_files, base_files)
end
@@ -99,16 +115,8 @@ local function get_query_files(lang, query_name)
end
function M.has_query_files(lang, query_name)
- local langs = {lang}
- vim.list_extend(langs, M.base_language_map[lang] or {})
-
- for _, lang in ipairs(langs) do
- if runtime_query_exists(lang, query_name) then
- return true
- end
- end
-
- return false
+ local files = get_query_files(lang, query_name)
+ return files and #files > 0
end
function M.get_query(lang, query_name)
diff --git a/queries/cpp/folds.scm b/queries/cpp/folds.scm
index f4341201..131be208 100644
--- a/queries/cpp/folds.scm
+++ b/queries/cpp/folds.scm
@@ -1,3 +1,5 @@
+; inherits: c
+
[
(for_range_loop)
(class_specifier)
diff --git a/queries/cpp/highlights.scm b/queries/cpp/highlights.scm
index 30c4b75d..128ecb9d 100644
--- a/queries/cpp/highlights.scm
+++ b/queries/cpp/highlights.scm
@@ -1,3 +1,5 @@
+; inherits: c
+
((identifier) @field
(#match? @field "^_"))
diff --git a/queries/cpp/locals.scm b/queries/cpp/locals.scm
index aa25a4cd..a109aabd 100644
--- a/queries/cpp/locals.scm
+++ b/queries/cpp/locals.scm
@@ -1,3 +1,5 @@
+; inherits: c
+
;; Parameters
(variadic_parameter_declaration
declarator: (variadic_declarator
diff --git a/queries/javascript/folds.scm b/queries/javascript/folds.scm
index 6bc76af8..0b33ba56 100644
--- a/queries/javascript/folds.scm
+++ b/queries/javascript/folds.scm
@@ -1,3 +1,4 @@
+; inherits: (jsx)
[
(for_in_statement)
(for_statement)
diff --git a/queries/javascript/highlights.scm b/queries/javascript/highlights.scm
index de505366..0b650496 100644
--- a/queries/javascript/highlights.scm
+++ b/queries/javascript/highlights.scm
@@ -1,3 +1,4 @@
+; inherits: (jsx)
; Types
; Javascript
diff --git a/queries/javascript/locals.scm b/queries/javascript/locals.scm
index 2f501f3a..99a40a6b 100644
--- a/queries/javascript/locals.scm
+++ b/queries/javascript/locals.scm
@@ -1,3 +1,5 @@
+; inherits: (jsx)
+
; Scopes
;-------
diff --git a/queries/ocaml_interface/folds.scm b/queries/ocaml_interface/folds.scm
new file mode 100644
index 00000000..6d3dfbcf
--- /dev/null
+++ b/queries/ocaml_interface/folds.scm
@@ -0,0 +1 @@
+; inherits: ocaml
diff --git a/queries/ocaml_interface/highlights.scm b/queries/ocaml_interface/highlights.scm
new file mode 100644
index 00000000..6d3dfbcf
--- /dev/null
+++ b/queries/ocaml_interface/highlights.scm
@@ -0,0 +1 @@
+; inherits: ocaml
diff --git a/queries/ocaml_interface/locals.scm b/queries/ocaml_interface/locals.scm
new file mode 100644
index 00000000..6d3dfbcf
--- /dev/null
+++ b/queries/ocaml_interface/locals.scm
@@ -0,0 +1 @@
+; inherits: ocaml
diff --git a/queries/tsx/folds.scm b/queries/tsx/folds.scm
new file mode 100644
index 00000000..07391231
--- /dev/null
+++ b/queries/tsx/folds.scm
@@ -0,0 +1 @@
+; inherits: typescript,jsx
diff --git a/queries/tsx/highlights.scm b/queries/tsx/highlights.scm
new file mode 100644
index 00000000..07391231
--- /dev/null
+++ b/queries/tsx/highlights.scm
@@ -0,0 +1 @@
+; inherits: typescript,jsx
diff --git a/queries/tsx/locals.scm b/queries/tsx/locals.scm
new file mode 100644
index 00000000..07391231
--- /dev/null
+++ b/queries/tsx/locals.scm
@@ -0,0 +1 @@
+; inherits: typescript,jsx
diff --git a/queries/typescript/folds.scm b/queries/typescript/folds.scm
index f08395f3..448f4d12 100644
--- a/queries/typescript/folds.scm
+++ b/queries/typescript/folds.scm
@@ -1,3 +1,5 @@
+; inherits: javascript
+
[
(interface_declaration)
(internal_module)
diff --git a/queries/typescript/highlights.scm b/queries/typescript/highlights.scm
index fa7db9d9..87272f98 100644
--- a/queries/typescript/highlights.scm
+++ b/queries/typescript/highlights.scm
@@ -1,3 +1,4 @@
+; inherits: javascript
[
"abstract"
"declare"
diff --git a/queries/typescript/locals.scm b/queries/typescript/locals.scm
index cb064b82..3e05f536 100644
--- a/queries/typescript/locals.scm
+++ b/queries/typescript/locals.scm
@@ -1,2 +1,4 @@
+; inherits: javascript
+
(required_parameter (identifier) @definition)
(optional_parameter (identifier) @definition)