From ac0d8c48f7a277d4a43448fe7dd4279383bc53f0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 30 Jul 2018 21:58:49 +0300 Subject: JS plugin --- code/native/src/lib.rs | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 code/native/src/lib.rs (limited to 'code/native/src') diff --git a/code/native/src/lib.rs b/code/native/src/lib.rs new file mode 100644 index 000000000..dcf478cf5 --- /dev/null +++ b/code/native/src/lib.rs @@ -0,0 +1,80 @@ +#[macro_use] +extern crate neon; +extern crate libsyntax2; + +use libsyntax2::{ + TextRange, + File, + utils::dump_tree, + SyntaxKind::*, +}; +use neon::prelude::*; + +pub struct Wrapper { + inner: File, +} + +impl Wrapper { + fn highlight(&self) -> Vec<(TextRange, &'static str)> { + let mut res = Vec::new(); + self.inner.for_each_node(|node| { + if node.kind() == ERROR { + res.push((node.range(), "error")) + } + }); + res + } +} + + + +declare_types! { + /// A class for generating greeting strings. + pub class RustFile for Wrapper { + init(mut cx) { + let text = cx.argument::(0)?.value(); + Ok(Wrapper { + inner: File::parse(&text) + }) + } + + method syntaxTree(mut cx) { + let this = cx.this(); + let tree = { + let guard = cx.lock(); + let wrapper = this.borrow(&guard); + dump_tree(&wrapper.inner.syntax()) + }; + Ok(cx.string(tree.as_str()).upcast()) + } + + method highlight(mut cx) { + let this = cx.this(); + let highlights = { + let guard = cx.lock(); + let wrapper = this.borrow(&guard); + wrapper.highlight() + }; + let res = cx.empty_array(); + for (i, (range, tag)) in highlights.into_iter().enumerate() { + let start: u32 = range.start().into(); + let end: u32 = range.end().into(); + let start = cx.number(start); + let end = cx.number(end); + let tag = cx.string(tag); + let hl = cx.empty_array(); + hl.set(&mut cx, 0, start)?; + hl.set(&mut cx, 1, end)?; + hl.set(&mut cx, 2, tag)?; + res.set(&mut cx, i as u32, hl)?; + } + + Ok(res.upcast()) + } + } + +} + +register_module!(mut cx, { + cx.export_class::("RustFile") +}); -- cgit v1.2.3