use crate::{ParseState, ScriptParser};
use nargo_ir::{JsExpr, JsProgram, JsStmt, Trivia};
use nargo_types::{Position, Result, Span};
use oak_core::{parser::ParseSession, tree::RedTree, Parser, SourceText};
use oak_typescript::{TypeScriptElementType, TypeScriptLanguage, TypeScriptParser};
pub struct OakTypeScriptParser;
impl ScriptParser for OakTypeScriptParser {
fn parse(&self, state: &mut ParseState, _lang: &str) -> Result<JsProgram> {
let source = SourceText::new(state.cursor.source.to_string());
let language = TypeScriptLanguage::default();
let parser = TypeScriptParser::new(&language);
let mut session = ParseSession::default();
let parse_output = parser.parse(&source, &[], &mut session);
let green_node = parse_output.result.map_err(|e| nargo_types::Error::parse_error(format!("TypeScript parsing error: {:?}", e), Span::default()))?;
let red_tree = RedTree::new(green_node);
let program = self.convert_to_ir(&red_tree, &source);
Ok(program)
}
}
impl OakTypeScriptParser {
fn convert_to_ir(&self, tree: &RedTree<'_, TypeScriptLanguage>, source: &SourceText) -> JsProgram {
let mut body = Vec::new();
self.convert_node(tree, source, &mut body);
let span = if let RedTree::Node(node) = tree { Span { start: Position::new(1, 1, node.span().start as u32), end: Position::new(1, 1, node.span().end as u32) } } else { Span { start: Position::new(1, 1, 0), end: Position::new(1, 1, 0) } };
JsProgram { body, span, trivia: Trivia::default() }
}
fn convert_node(&self, tree: &RedTree<'_, TypeScriptLanguage>, source: &SourceText, result: &mut Vec<JsStmt>) {
match tree {
RedTree::Node(node) => {
match node.element_type() {
_ => {
let span = Span { start: Position::new(1, 1, node.span().start as u32), end: Position::new(1, 1, node.span().end as u32) };
result.push(JsStmt::Expr(JsExpr::Other("".to_string(), Span::default(), Trivia::default()), span, Trivia::default()));
}
}
}
RedTree::Leaf(_) => {
}
}
}
}