use std::{collections::HashMap, path::PathBuf, sync::Arc}; use rowan::ast::{AstNode, AstPtr}; use self::{ error::{Error, WorldCreationError}, mod_tree::{Module, ModuleTree}, source_file::SourceFile, }; mod error; mod mod_tree; mod nodes; mod source_file; struct Loc { file: PathBuf, syntax_el: AstPtr, } impl Loc { pub fn new(file: PathBuf, syntax_el: &T) -> Self { Self { file, syntax_el: AstPtr::new(syntax_el), } } } pub struct World { entry_point: PathBuf, files: HashMap, errors: Vec, module_tree: ModuleTree, } impl World { pub fn new(entry_point: PathBuf) -> Result { let entry_point = entry_point.canonicalize().unwrap(); let source = match std::fs::read_to_string(&entry_point) { Ok(f) => f, Err(e) => return Err(WorldCreationError::FailedToOpenEntryPoint(entry_point, e)), }; let (src, mut errors) = SourceFile::parse_from(entry_point.clone(), source); let (module_tree, mut files, new_errors) = ModuleTree::parse_from_main(&entry_point, &src); errors.extend(new_errors); module_tree.print_tree(&src.tree()); dbg!(&errors); let _ = files.insert(entry_point.clone(), src); Ok(Self { files, entry_point, errors, module_tree, }) } // fn parse_mod_tree(files: &mut HashMap) } // struct SourceFile { // tree: SyntaxNode, // items: Vec, // }