From ac0d8c48f7a277d4a43448fe7dd4279383bc53f0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 30 Jul 2018 21:58:49 +0300 Subject: JS plugin --- src/ast.rs | 30 ++++++++++++++++++++++++++++++ src/lib.rs | 4 +++- src/yellow/mod.rs | 4 ++-- 3 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/ast.rs (limited to 'src') diff --git a/src/ast.rs b/src/ast.rs new file mode 100644 index 000000000..3a9287466 --- /dev/null +++ b/src/ast.rs @@ -0,0 +1,30 @@ +use std::sync::Arc; +use {SyntaxNode, TreeRoot, SyntaxRoot, SyntaxNodeRef}; + +#[derive(Debug)] +pub struct File> { + syntax: SyntaxNode +} + +impl File> { + pub fn parse(text: &str) -> Self { + File { syntax: ::parse(text.to_owned()) } + } +} + +impl File { + pub fn syntax(&self) -> SyntaxNode { + self.syntax.clone() + } + + pub fn for_each_node(&self, mut f: impl FnMut(SyntaxNodeRef)) { + let syntax = self.syntax(); + let syntax = syntax.borrow(); + go(syntax, &mut f); + + fn go(syntax: SyntaxNodeRef, f: &mut FnMut(SyntaxNodeRef)) { + f(syntax); + syntax.children().into_iter().for_each(f) + } + } +} diff --git a/src/lib.rs b/src/lib.rs index f85ee1eef..3a8e6fa64 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,12 +29,14 @@ mod syntax_kinds; mod yellow; /// Utilities for simple uses of the parser. pub mod utils; +pub mod ast; pub use { lexer::{tokenize, Token}, syntax_kinds::SyntaxKind, text_unit::{TextRange, TextUnit}, - yellow::{SyntaxNode, SyntaxNodeRef}, + yellow::{SyntaxNode, SyntaxNodeRef, TreeRoot, SyntaxRoot}, + ast::File, }; pub(crate) use yellow::SyntaxError; diff --git a/src/yellow/mod.rs b/src/yellow/mod.rs index cada65d2f..0cc90adbd 100644 --- a/src/yellow/mod.rs +++ b/src/yellow/mod.rs @@ -3,10 +3,10 @@ mod green; mod red; mod syntax; -pub use self::syntax::{SyntaxNode, SyntaxNodeRef}; +pub use self::syntax::{SyntaxNode, SyntaxNodeRef, SyntaxRoot, TreeRoot}; pub(crate) use self::{ builder::GreenBuilder, green::{GreenNode, GreenNodeBuilder}, red::RedNode, - syntax::{SyntaxError, SyntaxRoot}, + syntax::{SyntaxError}, }; -- cgit v1.2.3