Subject: [PATCH 00/31] Tree-sitter, node-gyp addon support and emacs-tree-sitter

From: Pierre Langlois <[email-masked]>
Date: Sun, 08 Aug 2021 23:29:43 +0100

Hi Guix!

Here's a patch series that adds support for the Tree-sitter library,
command-line tool and its support in emacs:
https://tree-sitter.github.io/tree-sitter

The series in split into multiple parts:

1. Add the tree-sitter package, which is both a command-line tool for
   generating parsers and a runtime library.  The runtime is written in
   C but the tooling in Rust.

  * gnu: rust-chunked-transfer: Update to 1.4.0.
  * gnu: Add rust-fdlimit.
  * gnu: Add rust-html-escape.
  * gnu: Add rust-smallbitvec.
  * gnu: rust-tiny-http: Update to 0.8.
  * gnu: rust-spin: Update to 0.7.
  * gnu: Add tree-sitter.

2. Add support for native addons to the node build-system.

  * gnu: node: Patch /usr/bin/env in node-gyp.
  * guix: node-build-system: Support compiling addons with node-gyp.

  I've not touched the node build system before so it'd be great to get
  some review here!

  The idea is that when a package has a `binding.gyp' file then there's
  native code that needs to be compiled against node.  This uses
  node-gyp, which is a build system written in python.
  Normally, there shouldn't be anything to do, the package.json file
  should invoke `node-gyp` tp compile C code.  However, `node-gyp' needs
  node headers to compile against, packaged as a tarball, which it tries
  to download.  Instead, we can run a `node-gyp --tarball <> configure'
  step to manually provide the tarball, which we can package separately
  for any given node version.

  I could have added this into the packages themselves, but I thought it
  made more sense to be a part of the build system, let me know what you
  think!

3. Packaging grammars for multiple languages.

  Tree-sitter grammars are Nodejs packages, they consist of a grammar.js
  file which the tree-sitter command-line program uses to generate C
  code for the parser/scanner.  Using npm as a packaging mechanism for
  this seems overkill, but it's true some grammars depend on each other
  (cpp on c, typescript and javascript).

  * gnu: Add node-nan.
  * gnu: Add tree-sitter-c.
  * gnu: Add tree-sitter-cpp.
  * gnu: Add tree-sitter-css.
  * gnu: Add tree-sitter-go.
  * gnu: Add tree-sitter-html.
  * gnu: Add tree-sitter-java.
  * gnu: Add tree-sitter-javascript.
  * gnu: Add tree-sitter-json.
  * gnu: Add tree-sitter-julia.
  * gnu: Add tree-sitter-php.
  * gnu: Add tree-sitter-python.
  * gnu: Add tree-sitter-rust.
  * gnu: Add tree-sitter-typescript.

4. Finally, emacs support!

  emacs-tree-sitter can be used for syntax highlighting, replacing
  font-lock.  The tree-sitter runtime library is built as a Rust crate
  and exposed to emacs using a module thanks to the rust-emacs crate.

  Then emacs-tree-sitter-core provides just the core APIs as exposed by
  the rust module, then emacs-tree-sitter integrates it with emacs'
  syntax highlighting (and probably other things).

  Finally, we bundle together the various language grammars into a
  single emacs-tree-sitter-langs package so that they can get loaded
  along with their respective major modes.  Note that there are grammars
  left to support which I've not yet managed to package, but what we
  have already is a good start I think :-). So far I've tested C++,
  Rust, Python and JavaScript and JSON.

  * gnu: Add [email-masked].
  * gnu: Add rust-tree-sitter.
  * gnu: rust-emacs-module: Update to 0.16.
  * gnu: rust-emacs-macros: Update to 0.17.
  * gnu: rust-emacs: Update to 0.17.
  * gnu: Add emacs-tree-sitter-core.
  * gnu: Add emacs-tree-sitter.
  * gnu: Add emacs-tree-sitter-langs.

Let me know what you think! This rebuilds all node packages, but there
aren't that many so hopefully that'll be ok on master.

Thanks,
Pierre

Pierre Langlois (31):
  gnu: rust-chunked-transfer: Update to 1.4.0.
  gnu: Add rust-fdlimit.
  gnu: Add rust-html-escape.
  gnu: Add rust-smallbitvec.
  gnu: rust-tiny-http: Update to 0.8.
  gnu: rust-spin: Update to 0.7.
  gnu: Add tree-sitter.
  gnu: node: Patch /usr/bin/env in node-gyp.
  guix: node-build-system: Support compiling addons with node-gyp.
  gnu: Add node-nan.
  gnu: Add tree-sitter-c.
  gnu: Add tree-sitter-cpp.
  gnu: Add tree-sitter-css.
  gnu: Add tree-sitter-go.
  gnu: Add tree-sitter-html.
  gnu: Add tree-sitter-java.
  gnu: Add tree-sitter-javascript.
  gnu: Add tree-sitter-json.
  gnu: Add tree-sitter-julia.
  gnu: Add tree-sitter-php.
  gnu: Add tree-sitter-python.
  gnu: Add tree-sitter-rust.
  gnu: Add tree-sitter-typescript.
  gnu: Add [email-masked].
  gnu: Add rust-tree-sitter.
  gnu: rust-emacs-module: Update to 0.16.
  gnu: rust-emacs-macros: Update to 0.17.
  gnu: rust-emacs: Update to 0.17.
  gnu: Add emacs-tree-sitter-core.
  gnu: Add emacs-tree-sitter.
  gnu: Add emacs-tree-sitter-langs.

 gnu/local.mk                     |   1 +
 gnu/packages/crates-io.scm       | 290 +++++++++++--
 gnu/packages/node-xyz.scm        |  30 ++
 gnu/packages/node.scm            |  29 +-
 gnu/packages/tree-sitter.scm     | 716 +++++++++++++++++++++++++++++++
 guix/build-system/node.scm       |  16 +
 guix/build/node-build-system.scm |  15 +
 7 files changed, 1064 insertions(+), 33 deletions(-)
 create mode 100644 gnu/packages/tree-sitter.scm

-- 
2.32.0