All Projects → tree-sitter → rust-tree-sitter

tree-sitter / rust-tree-sitter

Licence: MIT license
Rust bindings to Tree-sitter

Programming Languages

rust
11053 projects
shell
77523 projects
Batchfile
5799 projects

Projects that are alternatives of or similar to rust-tree-sitter

haskell-tree-sitter
Haskell bindings for tree-sitter
Stars: ✭ 123 (+324.14%)
Mutual labels:  tree-sitter, binding
tree-sitter.el
An Emacs dynamic module exposing tree-sitter.
Stars: ✭ 59 (+103.45%)
Mutual labels:  tree-sitter, binding
ruby-tree-sitter
Ruby bindings to tree-sitter
Stars: ✭ 48 (+65.52%)
Mutual labels:  tree-sitter, binding
go-tree-sitter
Golang bindings for tree-sitter https://github.com/tree-sitter/tree-sitter
Stars: ✭ 137 (+372.41%)
Mutual labels:  tree-sitter, binding
raylib-zig
Manually tweaked, auto generated raylib bindings for zig. https://github.com/raysan5/raylib
Stars: ✭ 122 (+320.69%)
Mutual labels:  binding
tree-sitter-typescript
TypeScript grammar for tree-sitter
Stars: ✭ 154 (+431.03%)
Mutual labels:  tree-sitter
skinner
Skin export / import tools for Autodesk Maya
Stars: ✭ 68 (+134.48%)
Mutual labels:  binding
tree-sitter-julia
Julia grammar for Tree-sitter
Stars: ✭ 53 (+82.76%)
Mutual labels:  tree-sitter
tree-sitter-tlaplus
A tree-sitter grammar for TLA+
Stars: ✭ 31 (+6.9%)
Mutual labels:  tree-sitter
pyguetzli
Python bindings for Google's Guetzli, a JPEG encoder that optimises JPEG compression
Stars: ✭ 28 (-3.45%)
Mutual labels:  binding
tree-hugger
A light-weight, extendable, high level, universal code parser built on top of tree-sitter
Stars: ✭ 96 (+231.03%)
Mutual labels:  tree-sitter
tree-sitter-elisp
tree-sitter grammar for emacs lisp
Stars: ✭ 20 (-31.03%)
Mutual labels:  tree-sitter
imgui-java
JNI based binding for Dear ImGui
Stars: ✭ 270 (+831.03%)
Mutual labels:  binding
playground
Treesitter playground integrated into Neovim
Stars: ✭ 467 (+1510.34%)
Mutual labels:  tree-sitter
janetrs
Rust high level bindings for Janet
Stars: ✭ 36 (+24.14%)
Mutual labels:  binding
nuklear4j
Java binding for nuklear
Stars: ✭ 61 (+110.34%)
Mutual labels:  binding
tree-sitter-legesher-python
✨ Legesher's Python grammar for Tree-Sitter 🌳
Stars: ✭ 40 (+37.93%)
Mutual labels:  tree-sitter
tree-sitter-toml
TOML grammar for tree-sitter
Stars: ✭ 23 (-20.69%)
Mutual labels:  tree-sitter
codegen
Generator for dart_native bindings. Codegen can transform native SDK to Flutter plugin.
Stars: ✭ 75 (+158.62%)
Mutual labels:  binding
zee
A modern text editor for the terminal written in Rust
Stars: ✭ 1,120 (+3762.07%)
Mutual labels:  tree-sitter

Rust Tree-sitter


⚠️ This repository is deprecated ⚠️

The Rust binding to Tree-sitter has been moved to the main Tree-sitter repo.


Build Status Build status Crates.io

Rust bindings to the Tree-sitter parsing library.

Basic Usage

First, create a parser:

use tree_sitter::{Parser, Language};

// ...

let mut parser = Parser::new();

Then assign a language to the parser. Tree-sitter languages consist of generated C code. To use them from rust, you must declare them as extern "C" functions and invoke them with unsafe:

extern "C" { fn tree_sitter_c() -> Language; }
extern "C" { fn tree_sitter_rust() -> Language; }
extern "C" { fn tree_sitter_javascript() -> Language; }

let language = unsafe { tree_sitter_rust() };
parser.set_language(language).unwrap();

Now you can parse source code:

let source_code = "fn test() {}";
let tree = parser.parse_str(source_code, None);
let root_node = tree.root_node();

assert_eq!(root_node.kind(), "source_file");
assert_eq!(root_node.start_position().column, 0);
assert_eq!(root_node.end_position().column, 12);

Editing

Once you have a syntax tree, you can update it when your source code changes. Passing in the previous edited tree makes parse run much more quickly:

let new_source_code = "fn test(a: u32) {}"

tree.edit(InputEdit {
  start_byte: 8,
  old_end_byte: 8,
  new_end_byte: 14,
  start_position: Point::new(0, 8),
  old_end_position: Point::new(0, 8),
  new_end_position: Point::new(0, 14),
});

let new_tree = parser.parse_str(new_source_code, Some(&tree));

Text Input

The source code to parse can be provided either as a string or as a function that returns text encoded as either UTF8 or UTF16:

// Store some source code in an array of lines.
let lines = &[
    "pub fn foo() {",
    "  1",
    "}",
];

// Parse the source code using a custom callback. The callback is called
// with both a byte offset and a row/column offset.
let tree = parser.parse_utf8(&mut |_byte: u32, position: Point| -> &[u8] {
    let row = position.row as usize;
    let column = position.column as usize;
    if row < lines.len() {
        if column < lines[row].as_bytes().len() {
            &lines[row].as_bytes()[column..]
        } else {
            "\n".as_bytes()
        }
    } else {
        &[]
    }
}, None).unwrap();

assert_eq!(
  tree.root_node().to_sexp(),
  "(source_file (function_item (visibility_modifier) (identifier) (parameters) (block (number_literal))))"
);
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].