TreeSitter (TreeSitter v0.0.1-dev)

View Source

Bindings for TreeSitter

It is NIF library

This library uses NIF to provide tree-sitter bindings, so if there will be segmentation faults or any errors on the NIF side - it will crash whole Erlang VM

So wrap this library in a separate OS process using Ports or something else to prevent VM crashes.

Usage example:

# Create parser
parser = TreeSitter.new()

# Create a language (check new_language/2 docs for more info)
language = TreeSitter.new_language("./languages/libtree-sitter-css.dylib", "tree_sitter_css")

# Set language to parser
:ok = TreeSitter.set_language(parser, language)

# Parse!
{:ok, tree} = TreeSitter.parse_string(parser, "body {color: red}")

# Covert to map or do queries
{:ok, tree_map} = TreeSitter.to_map(tree)

Summary

Functions

Execute query for given tree

Initialize new parser

Create language from compiled library (.so or .dylib).

Create new query for given language

Parse string with given parser

Set lagnuage for given parser

Convert native tree sitter tree to elixir map

Types

capture()

@type capture() :: {atom(), map()}

capture_result()

@type capture_result() :: {:ok, captures()} | {:error, map()}

captures()

@type captures() :: [[capture()]]

language()

@type language() :: reference()

parser()

@type parser() :: reference()

query()

@type query() :: reference()

string_like()

@type string_like() :: binary() | charlist()

tree()

@type tree() :: reference()

Functions

exec_query(query, tree)

@spec exec_query(query(), tree()) :: capture_result()

Execute query for given tree

load_nif()

new()

Initialize new parser

You must set language (see new_language/2 and set_language/2) to use it for parsing

new_langauge(library, function)

Create language from compiled library (.so or .dylib).

You can get it by running 'make' in root of some parser for tree sitter.

Params

library - path to the compiled library file

function - function name, based on library name. For example tree-sitter-css lib must have 'tree_sitter_css' function name

new_language(library, function)

@spec new_language(string_like(), string_like()) :: language()

new_query(language, source)

@spec new_query(language(), binary()) :: query()

Create new query for given language

parse_string(parser, source_code)

@spec parse_string(parser(), binary()) :: tree()

Parse string with given parser

Remember that you should do set_language/2 before

set_language(parser, language)

@spec set_language(parser(), language()) :: :ok

Set lagnuage for given parser

Params

parser - parser reference

language - language reference, that you created with new_language/2

to_map(tree)

@spec to_map(tree()) :: {:ok, map()} | {:error, map()}

Convert native tree sitter tree to elixir map