native/src/java_api.c (137 lines of code) (raw):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <tree_sitter/api.h>
#include <string.h>
#include "subtree.h"
/* Header for class jsitter_interop_JSitter */
/*
* Class: jsitter_interop_JSitter
* Method: getSymbolName
* Signature: (JS)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jsitter_interop_JSitter_getSymbolName
(JNIEnv *env, jclass cl, jlong language_ptr, jint ts_symbol) {
const char *name = ts_language_symbol_name((TSLanguage *)language_ptr, (TSSymbol)ts_symbol);
return (*env)->NewStringUTF(env, name);
}
/*
* Class: jsitter_interop_JSitter
* Method: isTerminal
* Signature: (JS)Z
*/
JNIEXPORT jboolean JNICALL Java_jsitter_interop_JSitter_isTerminal
(JNIEnv *env, jclass class, jlong language_ptr, jint ts_symbol) {
return ts_language_symbol_type((TSLanguage*)language_ptr, (TSSymbol)ts_symbol) == TSSymbolTypeAnonymous;
}
JNIEXPORT jboolean JNICALL JavaCritical_jsitter_interop_JSitter_isTerminal
(jlong language_ptr, jint ts_symbol) {
return ts_language_symbol_type((TSLanguage*)language_ptr, (TSSymbol)ts_symbol) == TSSymbolTypeAnonymous;
}
/*
* Class: jsitter_interop_JSitter
* Method: getSymbolByName
* Signature: (JLjava/lang/String;)S
*/
JNIEXPORT jint JNICALL Java_jsitter_interop_JSitter_getSymbolByName
(JNIEnv *env, jclass class, jlong language_ptr, jstring name) {
jboolean copy;
const char *chars = (*env)->GetStringUTFChars(env, name, ©);
TSSymbol symbol = ts_language_symbol_for_name((TSLanguage *)language_ptr, chars);
if (copy) {
(*env)->ReleaseStringUTFChars(env, name, chars);
}
return symbol;
}
JNIEXPORT void JNICALL Java_jsitter_interop_JSitter_releaseSubtree
(JNIEnv *env , jclass class, jlong subtree_ptr) {
SubtreePool pool = ts_subtree_pool_new(0);
ts_subtree_release(&pool, *(Subtree *)(&subtree_ptr));
ts_subtree_pool_delete(&pool);
}
JNIEXPORT void JNICALL Java_jsitter_interop_JSitter_retainSubtree
(JNIEnv *env , jclass class, jlong subtree_ptr) {
ts_subtree_retain(*(Subtree *)(&subtree_ptr));
}
/*
* Class: jsitter_interop_JSitter
* Method: releaseTree
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_jsitter_interop_JSitter_releaseTree
(JNIEnv *env , jclass class, jlong tree_ptr) {
ts_tree_delete((TSTree *)tree_ptr);
}
/*
* Class: jsitter_interop_JSitter
* Method: releaseParser
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_jsitter_interop_JSitter_releaseParser
(JNIEnv *env , jclass class, jlong parser_ptr) {
ts_parser_delete((TSParser *)parser_ptr);
}
struct Input {
JNIEnv *env;
jobject input;
jmethodID read_mtd;
const char *reading_addr;
};
const char *input_jni_read(void *payload, uint32_t byte_index, TSPoint position, uint32_t *bytes_read) {
struct Input *input = (struct Input *)payload;
jint read = (*input->env)->CallIntMethod(input->env, input->input, input->read_mtd, byte_index);
*bytes_read = read;
return input->reading_addr;
}
/*
* Class: jsitter_interop_JSitter
* Method: parse
* Signature: (JJLjsitter/interop/JSitter/Input;JIII)J
*/
JNIEXPORT jlong JNICALL Java_jsitter_interop_JSitter_parse
(JNIEnv *env, jclass class, jlong parser_ptr, jlong old_tree_ptr, jobject input, jint encoding, jobject reading_buffer) {
static jmethodID read_mtd = 0;
if (read_mtd == 0) {
jclass input_class = (*env)->FindClass(env, "jsitter/interop/JSitter$Input");
read_mtd = (*env)->GetMethodID(env, input_class, "read", "(I)I");
}
void *reading_addr = (*env)->GetDirectBufferAddress(env, reading_buffer);
struct Input input_ctx;
input_ctx.env = env;
input_ctx.input = input;
input_ctx.read_mtd = read_mtd;
input_ctx.reading_addr = (const char *)reading_addr;
TSInput ts_input;
ts_input.encoding = (TSInputEncoding)encoding;
ts_input.payload = &input_ctx;
ts_input.read = &input_jni_read;
TSTree *old_tree = (TSTree *)old_tree_ptr;
TSParser *parser = (TSParser *)parser_ptr;
TSTree *new_tree = ts_parser_parse(parser, old_tree, ts_input);
return (jlong)new_tree;
}
JNIEXPORT void JNICALL Java_jsitter_interop_JSitter_editTree
(JNIEnv *env, jclass class, jlong tree_ptr, jint start_byte, jint old_end_byte, jint new_end_byte) {
TSInputEdit edit;
edit.start_byte = start_byte;
edit.old_end_byte = old_end_byte;
edit.new_end_byte = new_end_byte;
ts_tree_edit((TSTree *)tree_ptr, &edit);
}
JNIEXPORT jlong JNICALL Java_jsitter_interop_JSitter_editSubtree
(JNIEnv *env, jclass class, jlong subtree_ptr, jint start_byte, jint old_end_byte, jint new_end_byte) {
Subtree subtree = *(Subtree *)(&subtree_ptr);
TSInputEdit edit;
edit.start_byte = start_byte;
edit.old_end_byte = old_end_byte;
edit.new_end_byte = new_end_byte;
SubtreePool pool = ts_subtree_pool_new(0);
Subtree result = ts_subtree_edit(subtree, &edit, &pool);
ts_subtree_pool_delete(&pool);
return *((jlong *)&result);
}
JNIEXPORT jlong JNICALL Java_jsitter_interop_JSitter_copyTree
(JNIEnv *env, jclass class, jlong tree_ptr) {
return (jlong)ts_tree_copy((TSTree *)tree_ptr);
}
JNIEXPORT jintArray JNICALL Java_jsitter_interop_JSitter_getChangedRanges
(JNIEnv *env, jclass class, jlong edited_tree_ptr, jlong new_tree_ptr) {
uint32_t length;
TSRange *ranges = ts_tree_get_changed_ranges((TSTree *)edited_tree_ptr, (TSTree *)new_tree_ptr, &length);
if (length == 0) {
return NULL;
} else {
uint32_t *res = (uint32_t*)malloc(2 * length);
for (uint32_t i = 0; i < length; ++i) {
res[2*i] = ranges[i].start_byte;
res[2*i + 1] = ranges[i].end_byte;
}
jintArray result = (*env)->NewIntArray(env, 2 * length);
(*env)->SetIntArrayRegion(env, result, 0, 2 * length, (const jint*)res);
return result;
}
}
JNIEXPORT void JNICALL Java_jsitter_interop_JSitter_parserReset
(JNIEnv * env, jclass class, jlong parser_ptr) {
ts_parser_reset((TSParser *)parser_ptr);
}
/*
* Class: jsitter_interop_JSitter
* Method: newParser
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL Java_jsitter_interop_JSitter_newParser
(JNIEnv * env, jclass class, jlong language_ptr, jlong cancellationFlagPtr) {
TSParser *parser = ts_parser_new();
ts_parser_set_cancellation_flag(parser, (size_t *)cancellationFlagPtr);
ts_parser_set_language(parser, (TSLanguage *)language_ptr);
return (jlong) parser;
}
JNIEXPORT jlong JNICALL JavaCritical_jsitter_interop_JSitter_newParser
(jlong language_ptr) {
TSParser *parser = ts_parser_new();
ts_parser_set_language(parser, (TSLanguage *)language_ptr);
return (jlong) parser;
}