From 7b5536ad8700eaddc049e45318e1611680909f11 Mon Sep 17 00:00:00 2001 From: "Jip J. Dekker" Date: Fri, 15 Jan 2021 15:39:00 +1100 Subject: [PATCH] Add bindings for Rust --- .gitignore | 2 ++ .prettierignore | 2 ++ Cargo.toml | 28 +++++++++++++++++++ bindings/rust/build.rs | 17 ++++++++++++ bindings/rust/lib.rs | 63 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 112 insertions(+) create mode 100644 Cargo.toml create mode 100644 bindings/rust/build.rs create mode 100644 bindings/rust/lib.rs diff --git a/.gitignore b/.gitignore index ad15b4f..81578b9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ node_modules build *.log package-lock.json +Cargo.lock +/target/ diff --git a/.prettierignore b/.prettierignore index af2e405..364156f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,5 @@ build/ node_modules/ src/ +target/ +package-lock.json diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8f78df4 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "tree-sitter-minizinc" +description = "MiniZinc grammar for the tree-sitter parsing library" +version = "0.1.0" +authors = ["Jip J. Dekker "] +license = "MPL-2.0" +readme = "bindings/rust/README.md" +keywords = ["incremental", "parsing", "minizinc"] +categories = ["parsing", "text-editors"] +repository = "https://github.com/Dekker1/tree-sitter-minizinc" +edition = "2018" + +build = "bindings/rust/build.rs" +include = [ + "bindings/rust/*", + "grammar.js", + "queries/*", + "src/*", +] + +[lib] +path = "bindings/rust/lib.rs" + +[dependencies] +tree-sitter = "0.17" + +[build-dependencies] +cc = "1.0" diff --git a/bindings/rust/build.rs b/bindings/rust/build.rs new file mode 100644 index 0000000..3efc628 --- /dev/null +++ b/bindings/rust/build.rs @@ -0,0 +1,17 @@ +use std::path::Path; +extern crate cc; + +fn main() { + let src_dir = Path::new("src"); + + let mut c_config = cc::Build::new(); + c_config.include(&src_dir); + c_config + .flag_if_supported("-Wno-unused-parameter") + .flag_if_supported("-Wno-unused-but-set-variable") + .flag_if_supported("-Wno-trigraphs"); + let parser_path = src_dir.join("parser.c"); + c_config.file(&parser_path); + println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap()); + c_config.compile("parser"); +} diff --git a/bindings/rust/lib.rs b/bindings/rust/lib.rs new file mode 100644 index 0000000..4e1ddda --- /dev/null +++ b/bindings/rust/lib.rs @@ -0,0 +1,63 @@ +//! This crate provides a MiniZinc grammar for the [tree-sitter][] parsing library. +//! +//! Typically, you will use the [language][language func] function to add this grammar to a +//! tree-sitter [Parser][], and then use the parser to parse some code: +//! +//! ``` +//! use tree_sitter::Parser; +//! +//! let code = r#" +//! var int: x; +//! constraint x in {1,3,5}; +//! output ["x has value \(x)"] +//! "#; +//! let mut parser = Parser::new(); +//! parser.set_language(tree_sitter_minizinc::language()).expect("Error loading MiniZinc grammar"); +//! let parsed = parser.parse(code, None); +//! # let parsed = parsed.unwrap(); +//! # let root = parsed.root_node(); +//! # assert!(!root.has_error()); +//! ``` +//! +//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html +//! [language func]: fn.language.html +//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html +//! [tree-sitter]: https://tree-sitter.github.io/ + +use tree_sitter::Language; + +extern "C" { + fn tree_sitter_minizinc() -> Language; +} + +/// Returns the tree-sitter [Language][] for this grammar. +/// +/// [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html +pub fn language() -> Language { + unsafe { tree_sitter_minizinc() } +} + +/// The source of the MiniZinc tree-sitter grammar description. +pub const GRAMMAR: &'static str = include_str!("../../grammar.js"); + +/// The syntax highlighting query for this language. +pub const HIGHLIGHT_QUERY: &'static str = include_str!("../../queries/highlights.scm"); + +/// The content of the [`node-types.json`][] file for this grammar. +/// +/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types +pub const NODE_TYPES: &'static str = include_str!("../../src/node-types.json"); + +/// The symbol tagging query for this language. +pub const TAGGING_QUERY: &'static str = include_str!("../../queries/tags.scm"); + +#[cfg(test)] +mod tests { + #[test] + fn can_load_grammar() { + let mut parser = tree_sitter::Parser::new(); + parser + .set_language(super::language()) + .expect("Error loading MiniZinc grammar"); + } +}