tree-sitter/lib/binding_web
Max Brunsfeld 3fc459a84b Reorganize language bindings
* Move rust binding: lib/binding -> lib/binding_rust
* Move wasm bindinig: lib/web -> lib/binding_web
* Add wasm readme
2019-05-07 10:41:49 -07:00
..
test Reorganize language bindings 2019-05-07 10:41:49 -07:00
binding.c Reorganize language bindings 2019-05-07 10:41:49 -07:00
binding.js Reorganize language bindings 2019-05-07 10:41:49 -07:00
exports.json Reorganize language bindings 2019-05-07 10:41:49 -07:00
imports.js Reorganize language bindings 2019-05-07 10:41:49 -07:00
package.json Reorganize language bindings 2019-05-07 10:41:49 -07:00
prefix.js Reorganize language bindings 2019-05-07 10:41:49 -07:00
README.md Reorganize language bindings 2019-05-07 10:41:49 -07:00

tree-sitter.wasm

Build Status

Wasm bindings to the Tree-sitter parsing library.

Basic Usage

You can either load the library as a standalone script:

<script src="/public/js/tree-sitter.js"/>

<script>
  const Parser = window.TreeSitter;
  Parser.init().then(() => { /* the library is ready */ });
</script>

or using a packaging system like Webpack:

const Parser = require('tree-sitter');
Parser.init().then(() => { /* the library is ready */ });

Create a parser:

const parser = new Parser;

Then assign a language to the parser. Tree-sitter languages are packaged as individual .wasm files:

const JavaScript = await Parser.Language.load('/path/to/tree-sitter-javascript.wasm');
parser.setLanguage(JavaScript);

Now you can parse source code:

const sourceCode = 'let x = 1; console.log(x);';
const tree = parser.parse(sourceCode);

and inspect the syntax tree.

console.log(tree.rootNode.toString());

// (program
//   (lexical_declaration
//     (variable_declarator (identifier) (number)))
//   (expression_statement
//     (call_expression
//       (member_expression (identifier) (property_identifier))
//       (arguments (identifier)))))

const callExpression = tree.rootNode.child(1).firstChild;
console.log(callExpression);

// { type: 'call_expression',
//   startPosition: {row: 0, column: 16},
//   endPosition: {row: 0, column: 30},
//   startIndex: 0,
//   endIndex: 30 }

Editing

If your source code changes, you can update the syntax tree. This will take less time than the first parse.

// Replace 'let' with 'const'
const newSourceCode = 'const x = 1; console.log(x);';

tree.edit({
  startIndex: 0,
  oldEndIndex: 3,
  newEndIndex: 5,
  startPosition: {row: 0, column: 0},
  oldEndPosition: {row: 0, column: 3},
  newEndPosition: {row: 0, column: 5},
});

const newTree = parser.parse(newSourceCode, tree);

Parsing Text From a Custom Data Structure

If your text is stored in a data structure other than a single string, you can parse it by supplying a callback to parse instead of a string:

const sourceLines = [
  'let x = 1;',
  'console.log(x);'
];

const tree = parser.parse((index, position) => {
  let line = sourceLines[position.row];
  if (line) return line.slice(position.column);
});