Refactored transpiler LSP

This commit is contained in:
2026-05-23 09:50:04 +02:00
parent 77b6991226
commit b149bcde4a
+16 -15
View File
@@ -5,7 +5,7 @@ use std::{
time::Instant, time::Instant,
}; };
use mist_parser::error::ParseError; use mist_parser::{ast::TopLevel, error::ParseError};
pub fn build(force: bool) -> PathBuf { pub fn build(force: bool) -> PathBuf {
let start = Instant::now(); let start = Instant::now();
@@ -110,13 +110,16 @@ fn build_dir(root: &Path, base_src: &Path, current_dir: &Path, out_dir: &Path, f
} }
}; };
let parser_result = mist_parser::parse(&source).map_err(|e| match e { let output = match transpile_file(&source) {
Ok(ast) => ast,
Err(e) => {
match e {
ParseError::Ast(e) => { ParseError::Ast(e) => {
let start_pos = e.span.start_pos().line_col(); let start_pos = e.span.start_pos().line_col();
let span = e.span.as_str(); let span = e.span.as_str();
format!( eprintln!(
"\n{}:{}:{}\n \x1b[31mError\x1b[0m: {}\n\t{}{}\t{}", "\n{}:{}:{}\n \x1b[31mError\x1b[0m: {}\n\t{}{}\t{}",
path.as_os_str().display(), path.as_os_str().display(),
start_pos.0, start_pos.0,
@@ -127,23 +130,15 @@ fn build_dir(root: &Path, base_src: &Path, current_dir: &Path, out_dir: &Path, f
"^".repeat(span.trim().len()), "^".repeat(span.trim().len()),
) )
} }
ParseError::PreAst(e) => format!("{e}"), ParseError::PreAst(e) => {
}); eprintln!("error: parse failed in {}\n{}", path.display(), e)
}
let ast = match parser_result { }
Ok(ast) => ast,
Err(e) => {
eprintln!("error: parse failed in {}\n{}", path.display(), e);
process::exit(1); process::exit(1);
} }
}; };
// semantic::walk_ast(semantic::scope::Scope::from_top(root, &ast), &mut ast);
let mut gc = mist_codegen::RustCodegen::new();
let output = gc.generate(ast);
if let Err(e) = fs::write(&output_path, output) { if let Err(e) = fs::write(&output_path, output) {
eprintln!( eprintln!(
"error: failed to write output {}\n {}", "error: failed to write output {}\n {}",
@@ -156,6 +151,12 @@ fn build_dir(root: &Path, base_src: &Path, current_dir: &Path, out_dir: &Path, f
} }
} }
pub fn transpile_file<'a>(source: &'a str) -> Result<String, ParseError<'a, Vec<TopLevel>>> {
let mut gc = mist_codegen::RustCodegen::new();
Ok(gc.generate(mist_parser::parse(&source)?))
}
fn should_skip(source: &Path, output: &Path) -> bool { fn should_skip(source: &Path, output: &Path) -> bool {
if let (Ok(src_meta), Ok(out_meta)) = (fs::metadata(source), fs::metadata(output)) { if let (Ok(src_meta), Ok(out_meta)) = (fs::metadata(source), fs::metadata(output)) {
if let (Ok(src_time), Ok(out_time)) = (src_meta.modified(), out_meta.modified()) { if let (Ok(src_time), Ok(out_time)) = (src_meta.modified(), out_meta.modified()) {