Module relative folders working

This commit is contained in:
Krzosa Karol
2022-06-27 10:24:58 +02:00
parent 6644a2c5ae
commit 15d452cae3
8 changed files with 42 additions and 21 deletions

View File

@@ -241,6 +241,7 @@ enum Ast_Module_State{
struct Ast_Module: Ast_Scope{ struct Ast_Module: Ast_Scope{
Ast_Module_State state; Ast_Module_State state;
String base_folder;
Array<Ast_File *> all_loaded_files; Array<Ast_File *> all_loaded_files;
}; };

View File

@@ -785,7 +785,7 @@ parse_all_modules(){
} }
function Ast_Module * function Ast_Module *
add_module(Token *pos, Intern_String filename){ add_module(Token *pos, Intern_String filename, B32 command_line_module){
For(pctx->modules){ For(pctx->modules){
if(it->name == filename){ if(it->name == filename){
log_info("Returning registered module: %Q\n", filename); log_info("Returning registered module: %Q\n", filename);
@@ -793,8 +793,41 @@ add_module(Token *pos, Intern_String filename){
} }
} }
log_info("Adding module: %Q\n", filename);
Scratch scratch;
Ast_Module *result = ast_new(Ast_Module, AST_MODULE, pos, 0); Ast_Module *result = ast_new(Ast_Module, AST_MODULE, pos, 0);
//
// Find in working directory
//
if(command_line_module){
if(os_does_file_exist(filename.s)){
String path = os_get_absolute_path(scratch, filename.s);
string_path_normalize(path);
path = string_chop_last_slash(path);
result->base_folder = string_copy(pctx->perm, path);
}
}
//
// Find in module folder
//
else{
For(pctx->module_folders){
String path = string_fmt(scratch, "%Q/%Q", it, filename);
if(os_does_file_exist(path)){
path = string_chop_last_slash(path);
result->base_folder = string_copy(pctx->perm, path);
break;
}
}
}
if(result->base_folder.len == 0){
compiler_error(pos, "Couldn't find the module with name %Q", filename);
}
log_info("Adding module: %Q\n", filename);
result->name = filename; result->name = filename;
result->module = result; // @warning: self referential result->module = result; // @warning: self referential
result->file = result; // @warning: self referential result->file = result; // @warning: self referential

View File

@@ -203,6 +203,7 @@ struct Parse_Ctx:Lexer{
Array<String> module_folders; Array<String> module_folders;
String module_folder; String module_folder;
String exe_folder; String exe_folder;
String working_folder;
S64 indent; S64 indent;
String_Builder gen; String_Builder gen;
@@ -269,6 +270,7 @@ parse_init(Parse_Ctx *ctx, Allocator *perm_allocator, Allocator *heap_allocator)
// Init paths // Init paths
ctx->exe_folder = os_get_exe_dir(ctx->perm); ctx->exe_folder = os_get_exe_dir(ctx->perm);
ctx->working_folder = os_get_working_dir(ctx->perm);
ctx->module_folders = {ctx->heap}; ctx->module_folders = {ctx->heap};
String main_module = string_fmt(ctx->perm, "%Q/modules", ctx->exe_folder); String main_module = string_fmt(ctx->perm, "%Q/modules", ctx->exe_folder);

View File

@@ -246,7 +246,7 @@ int main(int argument_count, char **arguments){
} }
Ast_Module *module = add_module(0, pctx->intern(program_name)); Ast_Module *module = add_module(0, pctx->intern(program_name), true);
parse_all_modules(); parse_all_modules();
assert(module); assert(module);
resolve_everything_in_module(module); resolve_everything_in_module(module);

View File

@@ -712,26 +712,11 @@ add_implicit_import(Ast_Scope *scope, Ast_Scope *add){
} }
} }
function String
find_module(Intern_String filename){
Scratch scratch;
For(pctx->module_folders){
String path = string_fmt(scratch, "%Q/%Q", it, filename);
if(os_does_file_exist(path)){
String result = string_copy(pctx->perm, path);
return result;
}
}
return {};
}
enum{ GLOBAL_IMPLICIT_LOAD = 1 }; enum{ GLOBAL_IMPLICIT_LOAD = 1 };
function Ast_File * function Ast_File *
register_ast_file(Token *pos, Intern_String filename, Ast_Module *module, B32 global_implicit_load){ register_ast_file(Token *pos, Intern_String filename, Ast_Module *module, B32 global_implicit_load){
String absolute_path = find_module(filename); String absolute_path = string_fmt(pctx->perm, "%Q/%Q", module->base_folder, filename);
if(absolute_path.len == 0) absolute_path = os_get_absolute_path(pctx->perm, filename.s);
Ast_File *file = 0; Ast_File *file = 0;
For(pctx->files){ For(pctx->files){
@@ -777,7 +762,7 @@ parse_load(B32 global_implicit_load){
return result; return result;
} }
function Ast_Module *add_module(Token *pos, Intern_String filename); function Ast_Module *add_module(Token *pos, Intern_String filename, B32 command_line_module = false);
function Ast_Module * function Ast_Module *
parse_import(B32 global_implicit_import){ parse_import(B32 global_implicit_import){
Token *file = token_expect(TK_StringLit); Token *file = token_expect(TK_StringLit);