Go to file
2018-09-16 00:00:05 +03:00
.cargo cmd to install code extension 2018-07-30 22:17:33 +03:00
code move 2018-08-30 12:52:21 +03:00
crates fix dep tracking 2018-09-16 00:00:05 +03:00
.gitignore More symbols 2018-08-11 16:20:37 +03:00
.travis.yml no time to explain, disable clippy checks 2018-08-29 11:16:28 +03:00
appveyor.yml Don\'t block on rustfmt 2018-07-30 15:07:41 +03:00
bors.toml Let bors to cleanup branches 2018-01-28 12:49:42 +03:00
Cargo.toml matching brace 2018-08-16 00:23:22 +03:00
CONTRIBUTING.md Fix link 2018-01-28 00:35:17 +03:00
LICENSE-APACHE Licenses 2018-01-10 22:47:04 +03:00
LICENSE-MIT Licenses 2018-01-10 22:47:04 +03:00
README.md note about symbol search 2018-09-08 19:23:52 +03:00
rustfmt.toml Enforce rustfmt format 2018-01-27 18:31:23 -05:00

libsyntax2.0

Build Status Build status

libsyntax2.0 is an experimental parser of the Rust language, intended for the use in IDEs. RFC.

Quick Start

$ cargo test
$ cargo parse < crates/libsyntax2/src/lib.rs

Trying It Out

This installs experimental VS Code plugin

$ cargo install-code

It's better to remove existing Rust plugins to avoid interference. Warning: plugin is not intended for general use, has a lot of rough edges and missing features (notably, no code completion). That said, while originally libsyntax2 was developed in IntelliJ, @matklad now uses this plugin (and thus, libsytax2) to develop libsyntax2, and it doesn't hurt too much :-)

Features:

  • syntax highlighting (LSP does not have API for it, so impl is hacky and sometimes fall-backs to the horrible built-in highlighting)

  • commands (ctrl+shift+p or keybindings)

    • Show Rust Syntax Tree (use it to verify that plugin works)
    • Rust Extend Selection (works with multiple cursors)
    • Rust Matching Brace (knows the difference between < and <)
    • Rust Parent Module
    • Rust Join Lines (deals with trailing commas)
  • Go to symbol in file

  • Go to symbol in workspace

    • #Foo searches for Foo type in the current workspace
    • #foo# searches for foo function in the current workspace
    • #Foo* searches for Foo type among dependencies, excluding stdlib
    • Sorry for a weired UI, neither LSP, not VSCode have any sane API for filtering! :)
  • code actions:

    • Flip , in comma separated lists
    • Add #[derive] to struct/enum
    • Add impl block to struct/enum
    • Run tests at caret
  • Go to definition ("correct" for mod foo; decls, index-based for functions).

Code Walk-Through

crates/libsyntax2

  • yellow, red/green syntax tree, heavily inspired by this
  • grammar, the actual parser
  • parser_api/parser_impl bridges the tree-agnostic parser from grammar with yellow trees
  • grammar.ron RON description of the grammar, which is used to generate syntax_kinds and ast modules.
  • algo: generic tree algorithms, including walk for O(1) stack space tree traversal (this is cool) and visit for type-driven visiting the nodes (this is double plus cool, if you understand how Visitor works, you understand libsyntax2).

crates/libeditor

Most of IDE features leave here, unlike libanalysis, libeditor is single-file and is basically a bunch of pure functions.

crates/libanalysis

A stateful library for analyzing many Rust files as they change. WorldState is a mutable entity (clojure's atom) which holds current state, incorporates changes and handles out Worlds --- immutable consistent snapshots of WorldState, which actually power analysis.

crates/server

An LSP implementation which uses libanalysis for managing state and libeditor for actually doing useful stuff.

crates/cli

A CLI interface to libsyntax

crate/tools

Code-gen tasks, used to develop libsyntax2:

  • cargo gen-kinds -- generate ast and syntax_kinds
  • cargo gen-tests -- collect inline tests from grammar
  • cargo install-code -- build and install VS Code extension and server

code

VS Code plugin

Performance

Non-incremental, but seems pretty fast:

$ cargo build --release --package cli
$ wc -l ~/projects/rust/src/libsyntax/parse/parser.rs
7546 /home/matklad/projects/rust/src/libsyntax/parse/parser.rs
$ ./target/release/cli parse < ~/projects/rust/src/libsyntax/parse/parser.rs --no-dump  > /dev/null
parsing: 21.067065ms

Getting in touch

@matklad can be found at Rust discord, in #ides-and-editors.

License

libsyntax2 is primarily distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See LICENSE-APACHE and LICENSE-MIT for details.