From c5ee0ac070f29eda2bce5af53fe1bd4e3a68e8ab Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sun, 17 Mar 2024 10:53:06 +0200 Subject: [PATCH] feat(lib): add the language name --- cli/generate/src/render.rs | 6 ++++++ lib/include/tree_sitter/api.h | 5 +++++ lib/src/language.c | 4 ++++ lib/src/language.h | 1 + lib/src/parser.h | 1 + 5 files changed, 17 insertions(+) diff --git a/cli/generate/src/render.rs b/cli/generate/src/render.rs index 71577380..f4fb140f 100644 --- a/cli/generate/src/render.rs +++ b/cli/generate/src/render.rs @@ -20,6 +20,7 @@ const SMALL_STATE_THRESHOLD: usize = 64; const ABI_VERSION_MIN: usize = 14; const ABI_VERSION_MAX: usize = tree_sitter::LANGUAGE_VERSION; const BUILD_VERSION: &str = env!("CARGO_PKG_VERSION"); +const ABI_VERSION_WITH_METADATA: usize = 15; macro_rules! add { ($this: tt, $($arg: tt)*) => {{ @@ -1436,6 +1437,11 @@ impl Generator { } add_line!(self, ".primary_state_ids = ts_primary_state_ids,"); + + if self.abi_version >= ABI_VERSION_WITH_METADATA { + add_line!(self, ".name = \"{}\",", self.language_name); + } + dedent!(self); add_line!(self, "}};"); add_line!(self, "return &language;"); diff --git a/lib/include/tree_sitter/api.h b/lib/include/tree_sitter/api.h index 63ff0cc2..443a8114 100644 --- a/lib/include/tree_sitter/api.h +++ b/lib/include/tree_sitter/api.h @@ -1142,6 +1142,11 @@ uint32_t ts_language_version(const TSLanguage *self); */ TSStateId ts_language_next_state(const TSLanguage *self, TSStateId state, TSSymbol symbol); +/** + * Get the name of this language. This returns `NULL` in older parsers. + */ +const char *ts_language_name(const TSLanguage *self); + /********************************/ /* Section - Lookahead Iterator */ /********************************/ diff --git a/lib/src/language.c b/lib/src/language.c index 880d2f23..c783e0db 100644 --- a/lib/src/language.c +++ b/lib/src/language.c @@ -28,6 +28,10 @@ uint32_t ts_language_version(const TSLanguage *self) { return self->version; } +const char *ts_language_name(const TSLanguage *self) { + return self->version >= LANGUAGE_VERSION_WITH_METADATA ? self->name : NULL; +} + uint32_t ts_language_field_count(const TSLanguage *self) { return self->field_count; } diff --git a/lib/src/language.h b/lib/src/language.h index 1e308122..a19ec0f6 100644 --- a/lib/src/language.h +++ b/lib/src/language.h @@ -10,6 +10,7 @@ extern "C" { #define ts_builtin_sym_error_repeat (ts_builtin_sym_error - 1) +#define LANGUAGE_VERSION_WITH_METADATA 15 #define LANGUAGE_VERSION_WITH_PRIMARY_STATES 14 typedef struct { diff --git a/lib/src/parser.h b/lib/src/parser.h index 799f599b..2338b4a2 100644 --- a/lib/src/parser.h +++ b/lib/src/parser.h @@ -129,6 +129,7 @@ struct TSLanguage { void (*deserialize)(void *, const char *, unsigned); } external_scanner; const TSStateId *primary_state_ids; + const char *name; }; static inline bool set_contains(TSCharacterRange *ranges, uint32_t len, int32_t lookahead) {