From 966e9db2b83802dfb55d55bd3a26e69dced1bbd7 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 1 Aug 2018 10:40:07 +0300 Subject: Extract libeditor --- libeditor/src/lib.rs | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 libeditor/src/lib.rs (limited to 'libeditor/src/lib.rs') diff --git a/libeditor/src/lib.rs b/libeditor/src/lib.rs new file mode 100644 index 000000000..119bdb2d6 --- /dev/null +++ b/libeditor/src/lib.rs @@ -0,0 +1,53 @@ +extern crate libsyntax2; +extern crate text_unit; + +use libsyntax2::{ + algo::walk, + SyntaxKind::*, +}; +use text_unit::TextRange; + +pub struct File { + inner: libsyntax2::File +} + +pub struct HighlightedRange { + pub range: TextRange, + pub tag: &'static str, +} + +impl File { + pub fn new(text: &str) -> File { + File { + inner: libsyntax2::File::parse(text) + } + } + + pub fn highlight(&self) -> Vec { + let syntax = self.inner.syntax(); + let mut res = Vec::new(); + for node in walk::preorder(syntax.as_ref()) { + let tag = match node.kind() { + ERROR => "error", + COMMENT | DOC_COMMENT => "comment", + STRING | RAW_STRING | RAW_BYTE_STRING | BYTE_STRING => "string", + ATTR => "attribute", + NAME_REF => "text", + NAME => "function", + INT_NUMBER | FLOAT_NUMBER | CHAR | BYTE => "literal", + LIFETIME => "parameter", + k if k.is_keyword() => "keyword", + _ => continue, + }; + res.push(HighlightedRange { + range: node.range(), + tag + }) + } + res + } + + pub fn syntax_tree(&self) -> String { + ::libsyntax2::utils::dump_tree(&self.inner.syntax()) + } +} -- cgit v1.2.3