Getting packages out of resolve_name

This commit is contained in:
Krzosa Karol
2022-06-10 17:07:58 +02:00
parent 957dbbd5cc
commit ab663d0b01
7 changed files with 31 additions and 26 deletions

View File

@@ -82,7 +82,6 @@ struct Ast_Atom: Ast_Expr{
struct Ast_Call_Item: Ast_Expr{ struct Ast_Call_Item: Ast_Expr{
Ast_Atom *name; // index | name Ast_Atom *name; // index | name
Ast_Expr *index;
Ast_Expr *item; Ast_Expr *item;
}; };
@@ -293,10 +292,9 @@ ast_call(Token *pos, Ast_Expr *name, Array<Ast_Call_Item *> exprs){
} }
function Ast_Call_Item * function Ast_Call_Item *
ast_call_item(Token *pos, Ast_Expr *index, Ast_Atom *name, Ast_Expr *item){ ast_call_item(Token *pos, Ast_Atom *name, Ast_Expr *item){
AST_NEW(Call_Item, CALL_ITEM, pos, AST_EXPR); AST_NEW(Call_Item, CALL_ITEM, pos, AST_EXPR);
result->name = name; result->name = name;
result->index = index;
result->item = item; result->item = item;
return result; return result;
} }

View File

@@ -536,7 +536,7 @@ compile_files(Array<String> filename){
parse_init(&ctx, scratch, &heap); parse_init(&ctx, scratch, &heap);
F64 parse_begin = os_time(); F64 parse_begin = os_time();
Array<Ast_Package *> packages = {&heap}; pctx->packages = {&heap};
For(files){ For(files){
Scratch file_scratch; Scratch file_scratch;
lex_restream(pctx, it.filecontent, it.filename); lex_restream(pctx, it.filecontent, it.filename);
@@ -545,7 +545,8 @@ compile_files(Array<String> filename){
// by default it's name of the file // by default it's name of the file
// but if you add [package name] then it's overwritten // but if you add [package name] then it's overwritten
Token *token = token_get(); Token *token = token_get();
it.name = token->file; String filename_without_ext = string_chop_last_period(token->file.s);
it.name = pctx->intern(filename_without_ext);
if(token_is(SAME_SCOPE) && token_is_keyword(keyword_package, 1)){ if(token_is(SAME_SCOPE) && token_is_keyword(keyword_package, 1)){
token_next(); token_next(); token_next(); token_next();
@@ -553,13 +554,13 @@ compile_files(Array<String> filename){
it.name = package_token->intern_val; it.name = package_token->intern_val;
} }
Ast_Package *package = find_package(it.name, &packages); Ast_Package *package = find_package(it.name, &pctx->packages);
if(package){ if(package){
package->decls.add(it.decls); package->decls.add(it.decls);
} else { } else {
package = ast_package(token, &heap, it.name); package = ast_package(token, &heap, it.name);
insert_builtin_types_into_package(package); insert_builtin_types_into_package(package);
packages.add(package); pctx->packages.add(package);
} }
@@ -582,7 +583,7 @@ compile_files(Array<String> filename){
} }
F64 parse_end = os_time(); F64 parse_end = os_time();
For(packages){ For(pctx->packages){
resolve_package(it); resolve_package(it);
} }

View File

@@ -176,6 +176,7 @@ struct Parse_Ctx:Lexer{
U64 unique_ids; U64 unique_ids;
Map type_map; Map type_map;
Array<Ast_Package *> packages;
Ast_Scope *currently_parsed_scope; Ast_Scope *currently_parsed_scope;
Ast_Package *resolving_package; Ast_Package *resolving_package;
Array<Ast_Decl *> ordered_decls; Array<Ast_Decl *> ordered_decls;

View File

@@ -17,3 +17,4 @@ CONSTANT_VAL :: 10
global_thing: a_type = 10 global_thing: a_type = 10
arena: order2.Arena

View File

@@ -1,7 +1,8 @@
Str16 :: String16 Str16 :: String16
arena_pointer: *Arena = 0 arena_pointer: *Arena = 0
thing: Arena order2_arena: Arena
no_type := thing no_type := order2_arena
Arena :: struct Arena :: struct
next: *Arena next: *Arena
@@ -15,7 +16,7 @@ String16 :: struct
data: *void data: *void
len : S64 len : S64
with_type: Arena = thing with_type: Arena = order2_arena
pointer := &with_type pointer := &with_type
deref := *pointer deref := *pointer

View File

@@ -153,22 +153,16 @@ parse_expr_call(Ast_Expr *left){
while(!token_is(TK_CloseParen)){ while(!token_is(TK_CloseParen)){
Token *token = token_get(); Token *token = token_get();
Ast_Expr *index = 0;
Ast_Atom *name = 0; Ast_Atom *name = 0;
if(token_match(TK_OpenBracket)){
index = parse_expr();
token_expect(TK_CloseBracket);
token_expect(TK_Assign);
}
Ast_Expr *item = parse_expr(); Ast_Expr *item = parse_expr();
if(!index && token_match(TK_Assign)){ if(token_match(TK_Assign)){
assert(is_flag_set(item->flags, AST_ATOM)); assert(is_flag_set(item->flags, AST_ATOM));
name = (Ast_Atom *)item; name = (Ast_Atom *)item;
item = parse_expr(); item = parse_expr();
} }
Ast_Call_Item *item_comp = ast_call_item(token, index, name, item); Ast_Call_Item *item_comp = ast_call_item(token, name, item);
exprs.add(item_comp); exprs.add(item_comp);
if(!token_match(TK_Comma)){ if(!token_match(TK_Comma)){

View File

@@ -520,6 +520,14 @@ search_for_decl(Ast_Scope *scope, Intern_String name){
result = _search_for_decl(it, name); result = _search_for_decl(it, name);
if(result) break; if(result) break;
} }
if(!result){
For(pctx->packages){
if(name == it->name){
result = (Ast_Decl *)it;
break;
}
}
}
return result; return result;
} }
@@ -648,8 +656,7 @@ resolve_stmt(Ast *ast, Ast_Resolved_Type *ret){
resolve_expr(node->init, AST_CAN_BE_NULL); resolve_expr(node->init, AST_CAN_BE_NULL);
resolve_and_require_bool("Conditional in a for loop condition", node->cond, AST_CAN_BE_NULL); resolve_and_require_bool("Conditional in a for loop condition", node->cond, AST_CAN_BE_NULL);
resolve_expr(node->iter, AST_CAN_BE_NULL); resolve_expr(node->iter, AST_CAN_BE_NULL);
For(node->scope->stmts) For(node->scope->stmts) resolve_stmt(it, ret);
resolve_stmt(it, ret);
BREAK(); BREAK();
} }
@@ -681,7 +688,6 @@ resolve_cast(Ast_Cast *node){
Ast_Resolved_Type *original_type = expr.type; Ast_Resolved_Type *original_type = expr.type;
node->before_type = expr.type; node->before_type = expr.type;
// @todo: cleanup, probably just want one big if
switch(expr.type->kind){ switch(expr.type->kind){
case TYPE_POINTER:{ case TYPE_POINTER:{
if(is_pointer(type)) if(is_pointer(type))
@@ -865,7 +871,6 @@ resolve_expr(Ast_Expr *ast, B32 flags){
Ast_Call_Item *item = 0; Ast_Call_Item *item = 0;
For(node->exprs){ For(node->exprs){
if(it->index) compiler_error(it->index->pos, "Function call indexing is illegal");
if(it->name){ if(it->name){
Ast_Atom *name = it->name; Ast_Atom *name = it->name;
@@ -892,10 +897,9 @@ resolve_expr(Ast_Expr *ast, B32 flags){
items.add(item); items.add(item);
} }
else{ else{
// default values are typechecked when they get resolved // @note: default values are typechecked when they get resolved
if(lambda_arg->expr){ if(lambda_arg->expr){
Ast_Call_Item *item_default = ast_call_item(lambda_arg->expr->pos, 0, 0, lambda_arg->expr); items.add(ast_call_item(lambda_arg->expr->pos, 0, lambda_arg->expr));
items.add(item_default);
} }
else compiler_error(lambda_arg->pos, "Required value in lambda call was not passed"); else compiler_error(lambda_arg->pos, "Required value in lambda call was not passed");
} }
@@ -919,8 +923,13 @@ resolve_expr(Ast_Expr *ast, B32 flags){
invalid_return; invalid_return;
} }
// @todo: I hate this, package is a scope so it cant
// be a DECL, I don't personally like this meme
function void function void
resolve_decl(Ast_Decl *ast){ resolve_decl(Ast_Decl *ast){
if(ast->kind == AST_PACKAGE){
return;
}
if(ast->state == DECL_RESOLVED){ if(ast->state == DECL_RESOLVED){
return; return;
} }