diff --git a/packages/language-c/grammars/modern-tree-sitter-c.cson b/packages/language-c/grammars/modern-tree-sitter-c.cson index ea096b2707..99e62ea807 100644 --- a/packages/language-c/grammars/modern-tree-sitter-c.cson +++ b/packages/language-c/grammars/modern-tree-sitter-c.cson @@ -17,3 +17,6 @@ fileTypes: [ 'c' 'h.in' ] + +comments: + start: '// ' diff --git a/packages/language-c/grammars/modern-tree-sitter-cpp.cson b/packages/language-c/grammars/modern-tree-sitter-cpp.cson index 38a8bcb5a0..98352d101f 100644 --- a/packages/language-c/grammars/modern-tree-sitter-cpp.cson +++ b/packages/language-c/grammars/modern-tree-sitter-cpp.cson @@ -6,6 +6,7 @@ parser: 'tree-sitter-cpp' injectionRegex: '^(c|C)(\\+\\+|pp|PP)$' treeSitter: + parserSource: 'github:tree-sitter/tree-sitter-cpp#a90f170f92d5d70e7c2d4183c146e61ba5f3a457' grammar: 'tree-sitter-cpp/tree-sitter-cpp.wasm' highlightsQuery: 'tree-sitter-cpp/highlights.scm' tagsQuery: 'tree-sitter-cpp/tags.scm' @@ -33,3 +34,6 @@ fileTypes: [ ] contentRegex: '\n\\s*(namespace|class|template)\\s+' + +comments: + start: '// ' diff --git a/packages/language-c/grammars/tree-sitter-cpp/highlights.scm b/packages/language-c/grammars/tree-sitter-cpp/highlights.scm index c829a2d2ee..f6a745189d 100644 --- a/packages/language-c/grammars/tree-sitter-cpp/highlights.scm +++ b/packages/language-c/grammars/tree-sitter-cpp/highlights.scm @@ -51,12 +51,14 @@ (primitive_type) @support.type.builtin.cpp -; Type parameters -(template_argument_list - (type_descriptor - type: (type_identifier) @variable.parameter.type.cpp - (#set! capture.final true))) +; Mark all function definition types with data… +(function_definition + type: (_) @_IGNORE_ + (#set! functionDefinitionType true)) +; …so that we can detect when a type identifier is part of a template/generic. +((type_identifier) @variable.parameter.type.cpp + (#is? test.descendantOfNodeWithData functionDefinitionType)) (class_specifier (type_identifier) @entity.name.class.cpp @@ -124,6 +126,15 @@ (function_declarator (identifier) @entity.name.function.cpp) +(function_declarator + (destructor_name + (identifier) @entity.name.function.cpp)) + +; The "foo" in `void Bar::foo () {`. +(function_declarator + declarator: (qualified_identifier + name: (identifier) @entity.name.function.cpp)) + (function_declarator (field_identifier) @entity.name.function.method.cpp) @@ -139,6 +150,19 @@ field: (field_identifier) @support.other.function.cpp) (#set! capture.final true)) +; The "foo" in `troz::foo(...)`. +(call_expression + function: (qualified_identifier + name: (identifier) @support.other.function.cpp) + (#set! capture.final true)) + +; The "foo" in `troz::foo(...)`. +(call_expression + function: (qualified_identifier + name: (template_function + name: (identifier) @support.other.function.cpp)) + (#set! capture.final true)) + (call_expression (identifier) @support.other.function.cpp (#set! capture.final true)) @@ -206,8 +230,14 @@ (assignment_expression left: (identifier) @variable.other.assignment.cpp) -(reference_declarator +; The "foo" in `bar.foo = "baz"`. +(assignment_expression + left: (field_expression + field: (field_identifier) @variable.other.member.assignment.cpp)) + +((reference_declarator (identifier) @variable.declaration.cpp) + (#is-not? test.descendantOfType parameter_declaration)) ; Function parameters ; ------------------- @@ -222,6 +252,11 @@ declarator: (pointer_declarator declarator: (identifier) @variable.parameter.cpp)) +(parameter_declaration + declarator: (reference_declarator + (identifier) @variable.parameter.cpp)) + + ; The "foo" in `const char foo[]` within a parameter list. (parameter_declaration declarator: (array_declarator @@ -256,7 +291,6 @@ (null) (true) (false) - (nullptr) ] @constant.language._TYPE_.cpp ((identifier) @constant.cpp @@ -315,6 +349,7 @@ "throw" "using" "namespace" + "class" ] @keyword.control._TYPE_.cpp ; OPERATORS @@ -324,6 +359,7 @@ (abstract_pointer_declarator "*" @keyword.operator.pointer.cpp) (pointer_expression "*" @keyword.operator.pointer.cpp) +(destructor_name "~" @keyword.operator.destructor.cpp) "sizeof" @keyword.operator.sizeof.cpp (pointer_expression "&" @keyword.operator.pointer.cpp) diff --git a/packages/language-c/grammars/tree-sitter-cpp/tree-sitter-cpp.wasm b/packages/language-c/grammars/tree-sitter-cpp/tree-sitter-cpp.wasm index e841559654..ae93e20ae2 100755 Binary files a/packages/language-c/grammars/tree-sitter-cpp/tree-sitter-cpp.wasm and b/packages/language-c/grammars/tree-sitter-cpp/tree-sitter-cpp.wasm differ diff --git a/src/wasm-tree-sitter-language-mode.js b/src/wasm-tree-sitter-language-mode.js index d9c7a31df5..c931ecad8c 100644 --- a/src/wasm-tree-sitter-language-mode.js +++ b/src/wasm-tree-sitter-language-mode.js @@ -3838,13 +3838,13 @@ class LanguageLayer { if (existingInjectionMarkers.length > 0) { // Enlarge our range to contain all of the injection zones in the // affected buffer range. - let earliest, latest; + let earliest = range.start, latest = range.end; for (let marker of existingInjectionMarkers) { range = marker.getRange(); - if (!earliest || range.start.compare(earliest) === -1) { + if (range.start.compare(earliest) === -1) { earliest = range.start; } - if (!latest || range.end.compare(latest) === 1) { + if (range.end.compare(latest) === 1) { latest = range.end; } }