feat(bindings): add Java bindings
This commit is contained in:
parent
8ca17d1bb1
commit
b9c2d1dc89
9 changed files with 369 additions and 22 deletions
65
crates/cli/src/templates/binding.java
Normal file
65
crates/cli/src/templates/binding.java
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
package PARSER_NS_CLEANED.jtreesitter.LOWER_PARSER_NAME;
|
||||
|
||||
import java.lang.foreign.*;
|
||||
|
||||
public final class PARSER_CLASS_NAME {
|
||||
private static final ValueLayout VOID_PTR =
|
||||
ValueLayout.ADDRESS.withTargetLayout(MemoryLayout.sequenceLayout(Long.MAX_VALUE, ValueLayout.JAVA_BYTE));
|
||||
private static final FunctionDescriptor FUNC_DESC = FunctionDescriptor.of(VOID_PTR);
|
||||
private static final Linker LINKER = Linker.nativeLinker();
|
||||
private static final PARSER_CLASS_NAME INSTANCE = new PARSER_CLASS_NAME();
|
||||
|
||||
private final Arena arena = Arena.ofAuto();
|
||||
private volatile SymbolLookup lookup = null;
|
||||
|
||||
private PARSER_CLASS_NAME() {}
|
||||
|
||||
/**
|
||||
* Get the tree-sitter language for this grammar.
|
||||
*/
|
||||
public static MemorySegment language() {
|
||||
if (INSTANCE.lookup == null)
|
||||
INSTANCE.lookup = INSTANCE.findLibrary();
|
||||
return language(INSTANCE.lookup);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the tree-sitter language for this grammar.
|
||||
*
|
||||
* <strong>The {@linkplain Arena} used in the {@code lookup}
|
||||
* must not be closed while the language is being used.</strong>
|
||||
*/
|
||||
public static MemorySegment language(SymbolLookup lookup) {
|
||||
return call(lookup, "tree_sitter_PARSER_NAME");
|
||||
}
|
||||
|
||||
private SymbolLookup findLibrary() {
|
||||
try {
|
||||
var library = System.mapLibraryName("tree-sitter-KEBAB_PARSER_NAME");
|
||||
return SymbolLookup.libraryLookup(library, arena);
|
||||
} catch (IllegalArgumentException ex1) {
|
||||
try {
|
||||
System.loadLibrary("tree-sitter-KEBAB_PARSER_NAME");
|
||||
return SymbolLookup.loaderLookup();
|
||||
} catch (UnsatisfiedLinkError ex2) {
|
||||
ex1.addSuppressed(ex2);
|
||||
throw ex1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static UnsatisfiedLinkError unresolved(String name) {
|
||||
return new UnsatisfiedLinkError("Unresolved symbol: %s".formatted(name));
|
||||
}
|
||||
|
||||
@SuppressWarnings("SameParameterValue")
|
||||
private static MemorySegment call(SymbolLookup lookup, String name) throws UnsatisfiedLinkError {
|
||||
var address = lookup.find(name).orElseThrow(() -> unresolved(name));
|
||||
try {
|
||||
var function = LINKER.downcallHandle(address, FUNC_DESC);
|
||||
return (MemorySegment) function.invokeExact();
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException("Call to %s failed".formatted(name), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue