typeck.rs: Add file-loading mode
This commit is contained in:
parent
a462dd2be3
commit
479efbad73
@ -7,7 +7,10 @@ use cl_ast::{
|
|||||||
use cl_lexer::Lexer;
|
use cl_lexer::Lexer;
|
||||||
use cl_parser::{inliner::ModuleInliner, Parser};
|
use cl_parser::{inliner::ModuleInliner, Parser};
|
||||||
use repline::{error::Error as RlError, prebaked::*};
|
use repline::{error::Error as RlError, prebaked::*};
|
||||||
use std::{error::Error, path};
|
use std::{
|
||||||
|
error::Error,
|
||||||
|
path::{self, PathBuf},
|
||||||
|
};
|
||||||
|
|
||||||
// Path to display in standard library errors
|
// Path to display in standard library errors
|
||||||
const STDLIB_DISPLAY_PATH: &str = "stdlib/lib.cl";
|
const STDLIB_DISPLAY_PATH: &str = "stdlib/lib.cl";
|
||||||
@ -19,6 +22,7 @@ const C_MAIN: &str = C_LISTING;
|
|||||||
const C_RESV: &str = "\x1b[35m";
|
const C_RESV: &str = "\x1b[35m";
|
||||||
const C_CODE: &str = "\x1b[36m";
|
const C_CODE: &str = "\x1b[36m";
|
||||||
const C_BYID: &str = "\x1b[95m";
|
const C_BYID: &str = "\x1b[95m";
|
||||||
|
const C_ERROR: &str = "\x1b[31m";
|
||||||
const C_LISTING: &str = "\x1b[38;5;117m";
|
const C_LISTING: &str = "\x1b[38;5;117m";
|
||||||
|
|
||||||
/// A home for immutable intermediate ASTs
|
/// A home for immutable intermediate ASTs
|
||||||
@ -52,6 +56,7 @@ fn main_menu(prj: &mut Table) -> Result<(), RlError> {
|
|||||||
"c" | "code" => enter_code(prj)?,
|
"c" | "code" => enter_code(prj)?,
|
||||||
"clear" => clear()?,
|
"clear" => clear()?,
|
||||||
"e" | "exit" => return Ok(Response::Break),
|
"e" | "exit" => return Ok(Response::Break),
|
||||||
|
"f" | "file" => import_files(prj)?,
|
||||||
"l" | "list" => list_types(prj),
|
"l" | "list" => list_types(prj),
|
||||||
"q" | "query" => query_type_expression(prj)?,
|
"q" | "query" => query_type_expression(prj)?,
|
||||||
"i" | "id" => get_by_id(prj)?,
|
"i" | "id" => get_by_id(prj)?,
|
||||||
@ -61,6 +66,7 @@ fn main_menu(prj: &mut Table) -> Result<(), RlError> {
|
|||||||
println!(
|
println!(
|
||||||
"Valid commands are:
|
"Valid commands are:
|
||||||
code (c): Enter code to type-check
|
code (c): Enter code to type-check
|
||||||
|
file (f): Load files from disk
|
||||||
list (l): List all known types
|
list (l): List all known types
|
||||||
query (q): Query the type system
|
query (q): Query the type system
|
||||||
id (i): Get a type by its type ID
|
id (i): Get a type by its type ID
|
||||||
@ -182,6 +188,35 @@ fn list_types(table: &mut Table) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn import_files(table: &mut Table) -> Result<(), RlError> {
|
||||||
|
read_and(C_RESV, "fi>", "? >", |line| {
|
||||||
|
let line = line.trim();
|
||||||
|
if line.is_empty() {
|
||||||
|
return Ok(Response::Break);
|
||||||
|
}
|
||||||
|
let Ok(file) = std::fs::read_to_string(line) else {
|
||||||
|
for file in std::fs::read_dir(line)? {
|
||||||
|
println!("{}", file?.path().display())
|
||||||
|
}
|
||||||
|
return Ok(Response::Accept);
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut parser = Parser::new(Lexer::new(&file));
|
||||||
|
let code = match parser.file() {
|
||||||
|
Ok(code) => inline_modules(code, PathBuf::from(line).parent().unwrap_or("".as_ref())),
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("{C_ERROR}{line}:{e}\x1b[0m");
|
||||||
|
return Ok(Response::Deny);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Populator::new(table).visit_file(unsafe { TREES.push(code) });
|
||||||
|
|
||||||
|
println!("...Imported!");
|
||||||
|
Ok(Response::Accept)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fn pretty_handle(entry: Entry) -> Result<(), std::io::Error> {
|
fn pretty_handle(entry: Entry) -> Result<(), std::io::Error> {
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
let mut out = std::io::stdout().lock();
|
let mut out = std::io::stdout().lock();
|
||||||
|
Loading…
Reference in New Issue
Block a user