aboutsummaryrefslogtreecommitdiff
path: root/src/tree_sitter/language.c
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2019-09-28 18:41:49 +0200
committerBjörn Linse <bjorn.linse@gmail.com>2019-12-22 10:35:00 +0100
commit79bd8d2ab6cae1c0be3233a9a7551d0b7bcc5944 (patch)
tree5335e3950295d4342322976a07a76d9a1a642ed9 /src/tree_sitter/language.c
parent781c708c27816b07f1d20a333151886044534fab (diff)
downloadrneovim-79bd8d2ab6cae1c0be3233a9a7551d0b7bcc5944.tar.gz
rneovim-79bd8d2ab6cae1c0be3233a9a7551d0b7bcc5944.tar.bz2
rneovim-79bd8d2ab6cae1c0be3233a9a7551d0b7bcc5944.zip
tree-sitter: update vendored tree-sitter runtime
tree-sitter/tree-sitter commit edb569310005c66838b7d69fa60850acac6abeee Included files are: lib/include/tree-sitter/*.h lib/src/*.[ch] lib/src/unicode/* LICENSE
Diffstat (limited to 'src/tree_sitter/language.c')
-rw-r--r--src/tree_sitter/language.c102
1 files changed, 71 insertions, 31 deletions
diff --git a/src/tree_sitter/language.c b/src/tree_sitter/language.c
index 1bfb1a8d03..e240ef2a53 100644
--- a/src/tree_sitter/language.c
+++ b/src/tree_sitter/language.c
@@ -3,8 +3,28 @@
#include "./error_costs.h"
#include <string.h>
-void ts_language_table_entry(const TSLanguage *self, TSStateId state,
- TSSymbol symbol, TableEntry *result) {
+uint32_t ts_language_symbol_count(const TSLanguage *self) {
+ return self->symbol_count + self->alias_count;
+}
+
+uint32_t ts_language_version(const TSLanguage *self) {
+ return self->version;
+}
+
+uint32_t ts_language_field_count(const TSLanguage *self) {
+ if (self->version >= TREE_SITTER_LANGUAGE_VERSION_WITH_FIELDS) {
+ return self->field_count;
+ } else {
+ return 0;
+ }
+}
+
+void ts_language_table_entry(
+ const TSLanguage *self,
+ TSStateId state,
+ TSSymbol symbol,
+ TableEntry *result
+) {
if (symbol == ts_builtin_sym_error || symbol == ts_builtin_sym_error_repeat) {
result->action_count = 0;
result->is_reusable = false;
@@ -19,48 +39,72 @@ void ts_language_table_entry(const TSLanguage *self, TSStateId state,
}
}
-uint32_t ts_language_symbol_count(const TSLanguage *language) {
- return language->symbol_count + language->alias_count;
-}
-
-uint32_t ts_language_version(const TSLanguage *language) {
- return language->version;
-}
-
-TSSymbolMetadata ts_language_symbol_metadata(const TSLanguage *language, TSSymbol symbol) {
+TSSymbolMetadata ts_language_symbol_metadata(
+ const TSLanguage *self,
+ TSSymbol symbol
+) {
if (symbol == ts_builtin_sym_error) {
return (TSSymbolMetadata){.visible = true, .named = true};
} else if (symbol == ts_builtin_sym_error_repeat) {
return (TSSymbolMetadata){.visible = false, .named = false};
} else {
- return language->symbol_metadata[symbol];
+ return self->symbol_metadata[symbol];
+ }
+}
+
+TSSymbol ts_language_public_symbol(
+ const TSLanguage *self,
+ TSSymbol symbol
+) {
+ if (symbol == ts_builtin_sym_error) return symbol;
+ if (self->version >= TREE_SITTER_LANGUAGE_VERSION_WITH_SYMBOL_DEDUPING) {
+ return self->public_symbol_map[symbol];
+ } else {
+ return symbol;
}
}
-const char *ts_language_symbol_name(const TSLanguage *language, TSSymbol symbol) {
+const char *ts_language_symbol_name(
+ const TSLanguage *self,
+ TSSymbol symbol
+) {
if (symbol == ts_builtin_sym_error) {
return "ERROR";
} else if (symbol == ts_builtin_sym_error_repeat) {
return "_ERROR";
} else {
- return language->symbol_names[symbol];
+ return self->symbol_names[symbol];
}
}
-TSSymbol ts_language_symbol_for_name(const TSLanguage *self, const char *name) {
- if (!strcmp(name, "ERROR")) return ts_builtin_sym_error;
-
+TSSymbol ts_language_symbol_for_name(
+ const TSLanguage *self,
+ const char *string,
+ uint32_t length,
+ bool is_named
+) {
+ if (!strncmp(string, "ERROR", length)) return ts_builtin_sym_error;
uint32_t count = ts_language_symbol_count(self);
for (TSSymbol i = 0; i < count; i++) {
- if (!strcmp(self->symbol_names[i], name)) {
- return i;
+ TSSymbolMetadata metadata = ts_language_symbol_metadata(self, i);
+ if (!metadata.visible || metadata.named != is_named) continue;
+ const char *symbol_name = self->symbol_names[i];
+ if (!strncmp(symbol_name, string, length) && !symbol_name[length]) {
+ if (self->version >= TREE_SITTER_LANGUAGE_VERSION_WITH_SYMBOL_DEDUPING) {
+ return self->public_symbol_map[i];
+ } else {
+ return i;
+ }
}
}
return 0;
}
-TSSymbolType ts_language_symbol_type(const TSLanguage *language, TSSymbol symbol) {
- TSSymbolMetadata metadata = ts_language_symbol_metadata(language, symbol);
+TSSymbolType ts_language_symbol_type(
+ const TSLanguage *self,
+ TSSymbol symbol
+) {
+ TSSymbolMetadata metadata = ts_language_symbol_metadata(self, symbol);
if (metadata.named) {
return TSSymbolTypeRegular;
} else if (metadata.visible) {
@@ -70,15 +114,10 @@ TSSymbolType ts_language_symbol_type(const TSLanguage *language, TSSymbol symbol
}
}
-uint32_t ts_language_field_count(const TSLanguage *self) {
- if (self->version >= TREE_SITTER_LANGUAGE_VERSION_WITH_FIELDS) {
- return self->field_count;
- } else {
- return 0;
- }
-}
-
-const char *ts_language_field_name_for_id(const TSLanguage *self, TSFieldId id) {
+const char *ts_language_field_name_for_id(
+ const TSLanguage *self,
+ TSFieldId id
+) {
uint32_t count = ts_language_field_count(self);
if (count) {
return self->field_names[id];
@@ -96,7 +135,8 @@ TSFieldId ts_language_field_id_for_name(
for (TSSymbol i = 1; i < count + 1; i++) {
switch (strncmp(name, self->field_names[i], name_length)) {
case 0:
- return i;
+ if (self->field_names[i][name_length] == 0) return i;
+ break;
case -1:
return 0;
default: