All Projects β†’ viktorstrate β†’ swift-tree-sitter

viktorstrate / swift-tree-sitter

Licence: MIT license
Swift bindings for the tree-sitter parsing library

Programming Languages

swift
15916 projects
shell
77523 projects

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

tree-sitter-clojure
No description or website provided.
Stars: ✭ 71 (+144.83%)
Mutual labels:  tree-sitter
difftastic
a syntax-aware diff πŸŸ₯🟩
Stars: ✭ 1,701 (+5765.52%)
Mutual labels:  tree-sitter
mapbox-ios-binding
Xamarin binding library for Mapbox iOS SDK
Stars: ✭ 15 (-48.28%)
Mutual labels:  bindings
tree-sitter-sql
SQL syntax highlighting for tree-sitter
Stars: ✭ 33 (+13.79%)
Mutual labels:  tree-sitter
tree-sitter-yaml
YAML grammar for tree-sitter
Stars: ✭ 29 (+0%)
Mutual labels:  tree-sitter
RubyGateway
Embed Ruby in Swift: load Gems, run scripts, call APIs seamlessly in both directions.
Stars: ✭ 108 (+272.41%)
Mutual labels:  bindings
tree-sitter-verilog
Verilog grammar for tree-sitter
Stars: ✭ 49 (+68.97%)
Mutual labels:  tree-sitter
hoedown
rust bindings for hoedown
Stars: ✭ 16 (-44.83%)
Mutual labels:  bindings
tree-sitter-kotlin
Kotlin grammar for Tree-Sitter
Stars: ✭ 35 (+20.69%)
Mutual labels:  tree-sitter
tree-sitter.el
An Emacs dynamic module exposing tree-sitter.
Stars: ✭ 59 (+103.45%)
Mutual labels:  tree-sitter
tree-edit
🌲 Structural editing in Emacs for anyβ„’ language!
Stars: ✭ 211 (+627.59%)
Mutual labels:  tree-sitter
spellsitter.nvim
Treesitter powered spellchecker
Stars: ✭ 251 (+765.52%)
Mutual labels:  tree-sitter
tree-sitter-php
PHP grammar for tree-sitter
Stars: ✭ 83 (+186.21%)
Mutual labels:  tree-sitter
tree-sitter-vue
Vue grammar for tree-sitter
Stars: ✭ 38 (+31.03%)
Mutual labels:  tree-sitter
tree-sitter-rust
Rust grammar for tree-sitter
Stars: ✭ 199 (+586.21%)
Mutual labels:  tree-sitter
canonix
Experiment in Nix formatting
Stars: ✭ 18 (-37.93%)
Mutual labels:  tree-sitter
Tree Sitter
An incremental parsing system for programming tools
Stars: ✭ 7,083 (+24324.14%)
Mutual labels:  tree-sitter
tree-sitter-cli
CLI tool for creating and testing tree-sitter parsers
Stars: ✭ 43 (+48.28%)
Mutual labels:  tree-sitter
haskell-tree-sitter
Haskell bindings for tree-sitter
Stars: ✭ 123 (+324.14%)
Mutual labels:  tree-sitter
samp-rs
SA:MP SDK written in Rust
Stars: ✭ 36 (+24.14%)
Mutual labels:  bindings

Swift Tree Sitter

This module provides Swift bindings for the tree-sitter parsing library

Installation

Using Swift Package Manager

Add it as a dependency in the Package.swift file.

.package(url: "https://github.com/viktorstrate/swift-tree-sitter", from: "1.0.0")

Or from Xcode navigate to File -> Swift Packages -> Add Package Dependency..., then enter this url:

https://github.com/viktorstrate/swift-tree-sitter

Import directly to Xcode

If you want to load languages from .bundles dynamically at runtime, you'll have to import it directly to Xcode as Mac bundles aren't supported using the Swift Package Manager.

To do this, download the project and drag the folder with the SwiftTreeSitter.xcodeproj file into the sidebar of your Xcode project.

Usage

First you'll need to setup the Parser and specify what language to use.

let javascript = try STSLanguage(fromPreBundle: .javascript)
let parser = STSParser(language: javascript)

Then you can parse some source code.

let sourceCode = "let x = 1; console.log(x);";
let tree = parser.parse(string: sourceCode, oldTree: nil)!
print(tree.rootNode.sExpressionString!)

// (program
//   (lexical_declaration
//     (variable_declarator name: (identifier) value: (number)))
//   (expression_statement
//     (call_expression function:
//       (member_expression object: (identifier)
//         property: (property_identifier))
//         arguments: (arguments (identifier)))))

Inspect the syntax tree.

let callExpression = tree.rootNode.child(at: 1).firstChild(forOffset: 0)
print("type:\t\(callExpression.type)")
print("start point:\t\(callExpression.startPoint)")
print("end point:\t\(callExpression.endPoint)")
print("start byte:\t\(callExpression.startByte)")
print("end byte:\t\(callExpression.endByte)")

// type:        call_expression
// start point: STSPoint(row: 0, column: 11)
// end point:   STSPoint(row: 0, column: 25)
// start byte:  11
// end byte:    25

If your source code changes you can update the syntax tree. This will take less time than to recompute the tree from scratch again.

// replace let with const
let newSourceCode = "const x = 1; console.log(x);";

tree.edit(
  STSInputEdit(
    startByte: 0,
    oldEndByte: 3,
    newEndByte: 5,
    startPoint: STSPoint(row: 0, column: 0),
    oldEndPoint: STSPoint(row: 0, column: 3),
    newEndPoint: STSPoint(row: 0, column: 5)
))

let newTree = parser.parse(string: newSourceCode, oldTree: tree)

Parsing text from a custom data source

If your text is stored in a custom data source, you can parse it by passing a callback to .parse() instead of a String.

let sourceLines = [
  "let x = 1;\n",
  "console.log(x);\n"
]

let tree = parser.parse(callback: { (byte, point) -> [Int8] in
  if (point.row >= sourceLines.count) {
    return []
  }

  let line = sourceLines[Int(point.row)]

  let index = line.index(line.startIndex, offsetBy: Int(point.column))
  let slice = line[index...]
  let array = Array(slice.utf8).map { Int8($0) }

  return array
}, oldTree: nil)
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].