feat: add the semantic version to TSLanguage, and expose an API for retrieving it
This commit is contained in:
parent
f0222107b8
commit
8bb1448a6f
24 changed files with 371 additions and 77 deletions
|
|
@ -25,7 +25,7 @@ uint32_t ts_language_state_count(const TSLanguage *self) {
|
|||
}
|
||||
|
||||
const TSSymbol *ts_language_supertypes(const TSLanguage *self, uint32_t *length) {
|
||||
if (self->version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) {
|
||||
if (self->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) {
|
||||
*length = self->supertype_count;
|
||||
return self->supertype_symbols;
|
||||
} else {
|
||||
|
|
@ -39,7 +39,7 @@ const TSSymbol *ts_language_subtypes(
|
|||
TSSymbol supertype,
|
||||
uint32_t *length
|
||||
) {
|
||||
if (self->version < LANGUAGE_VERSION_WITH_RESERVED_WORDS || !ts_language_symbol_metadata(self, supertype).supertype) {
|
||||
if (self->abi_version < LANGUAGE_VERSION_WITH_RESERVED_WORDS || !ts_language_symbol_metadata(self, supertype).supertype) {
|
||||
*length = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -50,11 +50,19 @@ const TSSymbol *ts_language_subtypes(
|
|||
}
|
||||
|
||||
uint32_t ts_language_version(const TSLanguage *self) {
|
||||
return self->version;
|
||||
return self->abi_version;
|
||||
}
|
||||
|
||||
uint32_t ts_language_abi_version(const TSLanguage *self) {
|
||||
return self->abi_version;
|
||||
}
|
||||
|
||||
const TSLanguageMetadata *ts_language_metadata(const TSLanguage *self) {
|
||||
return self->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS ? &self->metadata : NULL;
|
||||
}
|
||||
|
||||
const char *ts_language_name(const TSLanguage *self) {
|
||||
return self->version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS ? self->name : NULL;
|
||||
return self->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS ? self->name : NULL;
|
||||
}
|
||||
|
||||
uint32_t ts_language_field_count(const TSLanguage *self) {
|
||||
|
|
@ -85,7 +93,7 @@ TSLexerMode ts_language_lex_mode_for_state(
|
|||
const TSLanguage *self,
|
||||
TSStateId state
|
||||
) {
|
||||
if (self->version < 15) {
|
||||
if (self->abi_version < 15) {
|
||||
TSLexMode mode = ((const TSLexMode *)self->lex_modes)[state];
|
||||
return (TSLexerMode) {
|
||||
.lex_state = mode.lex_state,
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ static inline bool ts_language_state_is_primary(
|
|||
const TSLanguage *self,
|
||||
TSStateId state
|
||||
) {
|
||||
if (self->version >= LANGUAGE_VERSION_WITH_PRIMARY_STATES) {
|
||||
if (self->abi_version >= LANGUAGE_VERSION_WITH_PRIMARY_STATES) {
|
||||
return state == self->primary_state_ids[state];
|
||||
} else {
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -1977,8 +1977,8 @@ bool ts_parser_set_language(TSParser *self, const TSLanguage *language) {
|
|||
|
||||
if (language) {
|
||||
if (
|
||||
language->version > TREE_SITTER_LANGUAGE_VERSION ||
|
||||
language->version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION
|
||||
language->abi_version > TREE_SITTER_LANGUAGE_VERSION ||
|
||||
language->abi_version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION
|
||||
) return false;
|
||||
|
||||
if (ts_language_is_wasm(language)) {
|
||||
|
|
|
|||
|
|
@ -18,6 +18,12 @@ typedef uint16_t TSStateId;
|
|||
typedef uint16_t TSSymbol;
|
||||
typedef uint16_t TSFieldId;
|
||||
typedef struct TSLanguage TSLanguage;
|
||||
typedef struct TSLanguageMetadata TSLanguageMetadata;
|
||||
typedef struct TSLanguageMetadata {
|
||||
uint8_t major_version;
|
||||
uint8_t minor_version;
|
||||
uint8_t patch_version;
|
||||
} TSLanguageMetadata;
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
|
|
@ -100,7 +106,7 @@ typedef struct {
|
|||
} TSCharacterRange;
|
||||
|
||||
struct TSLanguage {
|
||||
uint32_t version;
|
||||
uint32_t abi_version;
|
||||
uint32_t symbol_count;
|
||||
uint32_t alias_count;
|
||||
uint32_t token_count;
|
||||
|
|
@ -143,6 +149,7 @@ struct TSLanguage {
|
|||
const TSSymbol *supertype_symbols;
|
||||
const TSMapSlice *supertype_map_slices;
|
||||
const TSSymbol *supertype_map_entries;
|
||||
TSLanguageMetadata metadata;
|
||||
};
|
||||
|
||||
static inline bool set_contains(const TSCharacterRange *ranges, uint32_t len, int32_t lookahead) {
|
||||
|
|
|
|||
|
|
@ -2433,7 +2433,7 @@ static TSQueryError ts_query__parse_pattern(
|
|||
|
||||
// Get all the possible subtypes for the given supertype,
|
||||
// and check if the given subtype is valid.
|
||||
if (self->language->version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) {
|
||||
if (self->language->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) {
|
||||
uint32_t subtype_length;
|
||||
const TSSymbol *subtypes = ts_language_subtypes(
|
||||
self->language,
|
||||
|
|
@ -2774,8 +2774,8 @@ TSQuery *ts_query_new(
|
|||
) {
|
||||
if (
|
||||
!language ||
|
||||
language->version > TREE_SITTER_LANGUAGE_VERSION ||
|
||||
language->version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION
|
||||
language->abi_version > TREE_SITTER_LANGUAGE_VERSION ||
|
||||
language->abi_version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION
|
||||
) {
|
||||
*error_type = TSQueryErrorLanguage;
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ typedef Array(char) StringData;
|
|||
// LanguageInWasmMemory - The memory layout of a `TSLanguage` when compiled to
|
||||
// wasm32. This is used to copy static language data out of the wasm memory.
|
||||
typedef struct {
|
||||
uint32_t version;
|
||||
uint32_t abi_version;
|
||||
uint32_t symbol_count;
|
||||
uint32_t alias_count;
|
||||
uint32_t token_count;
|
||||
|
|
@ -160,6 +160,7 @@ typedef struct {
|
|||
int32_t supertype_symbols;
|
||||
int32_t supertype_map_slices;
|
||||
int32_t supertype_map_entries;
|
||||
TSLanguageMetadata metadata;
|
||||
} LanguageInWasmMemory;
|
||||
|
||||
// LexerInWasmMemory - The memory layout of a `TSLexer` when compiled to wasm32.
|
||||
|
|
@ -1258,7 +1259,7 @@ const TSLanguage *ts_wasm_store_load_language(
|
|||
StringData field_name_buffer = array_new();
|
||||
|
||||
*language = (TSLanguage) {
|
||||
.version = wasm_language.version,
|
||||
.abi_version = wasm_language.abi_version,
|
||||
.symbol_count = wasm_language.symbol_count,
|
||||
.alias_count = wasm_language.alias_count,
|
||||
.token_count = wasm_language.token_count,
|
||||
|
|
@ -1270,6 +1271,7 @@ const TSLanguage *ts_wasm_store_load_language(
|
|||
.supertype_count = wasm_language.supertype_count,
|
||||
.max_alias_sequence_length = wasm_language.max_alias_sequence_length,
|
||||
.keyword_capture_token = wasm_language.keyword_capture_token,
|
||||
.metadata = wasm_language.metadata,
|
||||
.parse_table = copy(
|
||||
&memory[wasm_language.parse_table],
|
||||
wasm_language.large_state_count * wasm_language.symbol_count * sizeof(uint16_t)
|
||||
|
|
@ -1396,14 +1398,14 @@ const TSLanguage *ts_wasm_store_load_language(
|
|||
);
|
||||
}
|
||||
|
||||
if (language->version >= LANGUAGE_VERSION_WITH_PRIMARY_STATES) {
|
||||
if (language->abi_version >= LANGUAGE_VERSION_WITH_PRIMARY_STATES) {
|
||||
language->primary_state_ids = copy(
|
||||
&memory[wasm_language.primary_state_ids],
|
||||
wasm_language.state_count * sizeof(TSStateId)
|
||||
);
|
||||
}
|
||||
|
||||
if (language->version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) {
|
||||
if (language->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) {
|
||||
language->name = copy_string(memory, wasm_language.name);
|
||||
language->reserved_words = copy(
|
||||
&memory[wasm_language.reserved_words],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue