aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKiyan Yazdani <yazdani.kiyan@protonmail.com>2020-06-15 12:07:16 +0200
committerGitHub <noreply@github.com>2020-06-15 12:07:16 +0200
commitc452d4a91c341a1057b638d520e7cc75999a6b3b (patch)
tree49db122ce1f1b5ce1a9b77724c96a085c4a60710
parentMerge pull request #80 from steelsojka/feat/user-query-overrides (diff)
parentChange regexes in C/C++ highlights (diff)
downloadnvim-treesitter-c452d4a91c341a1057b638d520e7cc75999a6b3b.tar
nvim-treesitter-c452d4a91c341a1057b638d520e7cc75999a6b3b.tar.gz
nvim-treesitter-c452d4a91c341a1057b638d520e7cc75999a6b3b.tar.bz2
nvim-treesitter-c452d4a91c341a1057b638d520e7cc75999a6b3b.tar.lz
nvim-treesitter-c452d4a91c341a1057b638d520e7cc75999a6b3b.tar.xz
nvim-treesitter-c452d4a91c341a1057b638d520e7cc75999a6b3b.tar.zst
nvim-treesitter-c452d4a91c341a1057b638d520e7cc75999a6b3b.zip
Merge pull request #63 from theHamsta/cpp-locals
Introduce base languages for queries (for C++ locals)
-rw-r--r--README.md2
-rw-r--r--lua/nvim-treesitter/query.lua22
-rw-r--r--queries/c/highlights.scm45
-rw-r--r--queries/c/locals.scm3
-rw-r--r--queries/cpp/highlights.scm97
-rw-r--r--queries/cpp/locals.scm49
6 files changed, 210 insertions, 8 deletions
diff --git a/README.md b/README.md
index 1b4fe210d..95bb5ae91 100644
--- a/README.md
+++ b/README.md
@@ -156,7 +156,7 @@ List of currently supported languages:
- [x] ruby (maintained by @TravonteD)
- [x] c (maintained by @vigoux)
- [x] go (maintained by @theHamsta)
-- [ ] cpp
+- [x] cpp (maintained by @theHamsta, extends C queries)
- [ ] rust
- [x] python (maintained by @theHamsta)
- [ ] javascript
diff --git a/lua/nvim-treesitter/query.lua b/lua/nvim-treesitter/query.lua
index b914e5d7d..788bfa126 100644
--- a/lua/nvim-treesitter/query.lua
+++ b/lua/nvim-treesitter/query.lua
@@ -13,11 +13,31 @@ local function read_query_files(filenames)
return table.concat(contents, '\n')
end
+-- 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'},
+ tsx = {'typescript', 'javascript'},
+}
+
function M.get_query(ft, query_name)
local query_files = api.nvim_get_runtime_file(string.format('queries/%s/%s.scm', ft, query_name), true)
+ local query_string = ''
if #query_files > 0 then
- return ts.parse_query(ft, read_query_files(query_files))
+ query_string = read_query_files(query_files)..query_string
+ end
+
+ for _, base_lang in ipairs(M.base_language_map[ft] or {}) do
+ local base_files = api.nvim_get_runtime_file(string.format('queries/%s/%s.scm', base_lang, query_name), false)
+ if base_files and #base_files > 0 then
+ query_string = read_query_files(base_files)..query_string
+ end
+ end
+
+ if #query_string > 0 then
+ return ts.parse_query(ft, query_string)
end
end
diff --git a/queries/c/highlights.scm b/queries/c/highlights.scm
index 4cfb042cc..0d718c223 100644
--- a/queries/c/highlights.scm
+++ b/queries/c/highlights.scm
@@ -31,22 +31,42 @@
"--" @operator
"-" @operator
-"-=" @operator
"->" @operator
"!=" @operator
"*" @operator
+"/" @operator
"&" @operator
"&&" @operator
"+" @operator
"++" @operator
-"+=" @operator
"<" @operator
+"<=" @operator
"==" @operator
+"=" @operator
+"~" @operator
">" @operator
+">=" @operator
+"!" @operator
"||" @operator
-"." @delimiter
-";" @delimiter
+"-=" @operator
+"+=" @operator
+"*=" @operator
+"/=" @operator
+"|=" @operator
+"&=" @operator
+
+"." @punctuation.delimiter
+";" @punctuation.delimiter
+":" @punctuation.delimiter
+"," @punctuation.delimiter
+
+"(" @punctuation.bracket
+")" @punctuation.bracket
+"[" @punctuation.bracket
+"]" @punctuation.bracket
+"{" @punctuation.bracket
+"}" @punctuation.bracket
(string_literal) @string
(system_lib_string) @string
@@ -64,6 +84,8 @@
declarator: (identifier) @function)
(preproc_function_def
name: (identifier) @function.macro)
+(preproc_arg) @function.macro
+; TODO (preproc_arg) @embedded
(field_identifier) @property
(statement_identifier) @label
@@ -71,7 +93,20 @@
(primitive_type) @type
(sized_type_specifier) @type
+((identifier) @type
+ (#match? @type "^[A-Z]"))
+
((identifier) @constant
- (match? @constant "^[A-Z][A-Z\\d_]+$"))
+ (#match? @constant "^[A-Z][A-Z0-9_]+$"))
(comment) @comment
+
+;; Parameters
+(parameter_list
+ (parameter_declaration) @parameter)
+
+(preproc_params
+ (identifier)) @parameter
+
+(ERROR) @error
+
diff --git a/queries/c/locals.scm b/queries/c/locals.scm
index b08d706ee..505db5b57 100644
--- a/queries/c/locals.scm
+++ b/queries/c/locals.scm
@@ -17,7 +17,7 @@
(declaration
declarator: (identifier) @definition.var)
(enum_specifier
- name: (*) @definition.type
+ name: (_) @definition.type
(enumerator_list
(enumerator name: (identifier) @definition.var)))
@@ -36,3 +36,4 @@
(while_statement) @scope
(translation_unit) @scope
(function_definition) @scope
+(compound_statement) @scope ; a block in curly braces
diff --git a/queries/cpp/highlights.scm b/queries/cpp/highlights.scm
new file mode 100644
index 000000000..92909f4d9
--- /dev/null
+++ b/queries/cpp/highlights.scm
@@ -0,0 +1,97 @@
+((identifier) @field
+ (#match? @field "^_"))
+
+((identifier) @field
+ (#match? @field "^m_"))
+
+((identifier) @field
+ (#match? @field "_$"))
+
+;(field_expression) @parameter ;; How to highlight this?
+(template_function
+ name: (identifier) @function)
+
+(template_method
+ name: (field_identifier) @method)
+
+(template_function
+ name: (scoped_identifier
+ name: (identifier) @function))
+
+(namespace_identifier) @constant
+
+((namespace_identifier) @type
+ (#match? @type "^[A-Z]"))
+((namespace_identifier) @constant
+ (#match? @constant "^[A-Z][A-Z_0-9]*$"))
+
+(destructor_name
+ name: (_) @function)
+
+(function_declarator
+ declarator: (scoped_identifier
+ name: (identifier) @function))
+((function_declarator
+ declarator: (scoped_identifier
+ name: (identifier) @constructor))
+ (#match? @constructor "^[A-Z]"))
+
+(call_expression
+ function: (scoped_identifier
+ name: (identifier) @function))
+
+(call_expression
+ function: (field_expression
+ field: (field_identifier) @function))
+
+((call_expression
+ function: (scoped_identifier
+ name: (identifier) @constructor))
+(#match? @constructor "^[A-Z]"))
+
+((call_expression
+ function: (field_expression
+ field: (field_identifier) @constructor))
+(#match? @function "^[A-Z]"))
+
+;; constructing a type in a intizializer list: Constructor (): **SuperType (1)**
+((field_initializer
+ (field_identifier) @constructor
+ (argument_list))
+ (#match? @constructor "^[A-Z]"))
+
+(auto) @keyword
+
+; Constants
+
+;(this) @constant.builtin
+(this) @keyword
+(nullptr) @constant
+
+(true) @boolean
+(false) @boolean
+
+; Keywords
+
+"catch" @exception
+"class" @keyword
+"constexpr" @keyword
+"delete" @keyword
+"explicit" @keyword
+"final" @exception
+"friend" @keyword
+"mutable" @keyword
+"namespace" @keyword
+"noexcept" @keyword
+"new" @keyword
+"override" @keyword
+"private" @keyword
+"protected" @keyword
+"public" @keyword
+"template" @keyword
+"throw" @keyword
+"try" @exception
+"typename" @keyword
+"using" @keyword
+"virtual" @keyword
+"::" @operator
diff --git a/queries/cpp/locals.scm b/queries/cpp/locals.scm
new file mode 100644
index 000000000..061153c04
--- /dev/null
+++ b/queries/cpp/locals.scm
@@ -0,0 +1,49 @@
+
+;; Class / struct defintions
+(class_specifier) @scope
+(struct_specifier) @scope
+
+
+(struct_specifier
+ name: (type_identifier) @definition.type)
+
+(struct_specifier
+ name: (scoped_type_identifier
+ name: (type_identifier) @definition.type) )
+
+(class_specifier
+ name: (type_identifier) @definition.type)
+
+(class_specifier
+ name: (scoped_type_identifier
+ name: (type_identifier) @definition.type) )
+
+;; Function defintions
+(template_function
+ name: (identifier) @definition.function) @scope
+
+(template_method
+ name: (field_identifier) @definition.method) @scope
+
+(template_function
+ name: (scoped_identifier
+ name: (identifier) @definition.function)) @scope
+
+(function_declarator
+ declarator: (scoped_identifier
+ name: (type_identifier) @definition.function)) @scope
+
+(field_declaration
+ declarator: (function_declarator
+ (field_identifier) @definition.method))
+
+(lambda_expression) @scope
+
+;; Control structures
+(try_statement
+ body: (_) @scope)
+
+(catch_clause) @scope
+
+(destructor_name
+ name: (_) @constructor)