From 0acc94805f65fac68514d45bec21c06e3c0ff163 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 30 Jan 2022 12:54:25 -0600 Subject: [PATCH] export directive name can be an expression --- include/astnodes.h | 1 + src/checker.c | 15 ++++++++++++--- src/parser.c | 4 +++- src/symres.c | 1 + 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/include/astnodes.h b/include/astnodes.h index a57e75b4..02551a8a 100644 --- a/include/astnodes.h +++ b/include/astnodes.h @@ -1234,6 +1234,7 @@ struct AstDirectiveExport { AstNode_base; OnyxToken* export_name; + AstTyped* export_name_expr; AstTyped* export; }; diff --git a/src/checker.c b/src/checker.c index c5231b89..3e1f70e4 100644 --- a/src/checker.c +++ b/src/checker.c @@ -2516,9 +2516,18 @@ CheckStatus check_static_if(AstIf* static_if) { CheckStatus check_process_directive(AstNode* directive) { if (directive->kind == Ast_Kind_Directive_Export) { - AstTyped* export = ((AstDirectiveExport *) directive)->export; - if (export->entity && export->entity->state <= Entity_State_Check_Types) - YIELD(directive->token->pos, "Waiting for export type to be known."); + AstDirectiveExport *export = (AstDirectiveExport *) directive; + AstTyped *exported = export->export; + if (exported->entity && exported->entity->state <= Entity_State_Check_Types) + YIELD(directive->token->pos, "Waiting for exported type to be known."); + + CHECK(expression, &export->export_name_expr); + + if (export->export_name_expr->kind != Ast_Kind_StrLit) { + ERROR_(export->token->pos, "Expected export name to be a string literal, got '%s'.", onyx_ast_node_kind_string(export->export_name_expr->kind)); + } + + export->export_name = export->export_name_expr->token; } if (directive->kind == Ast_Kind_Directive_Tag) { diff --git a/src/parser.c b/src/parser.c index 905cc4e0..b4c9de03 100644 --- a/src/parser.c +++ b/src/parser.c @@ -3088,7 +3088,9 @@ static void parse_top_level_statement(OnyxParser* parser) { else if (parse_possible_directive(parser, "export")) { AstDirectiveExport *export = make_node(AstDirectiveExport, Ast_Kind_Directive_Export); export->token = dir_token; - export->export_name = expect_token(parser, Token_Type_Literal_String); + parser->parse_calls = 0; + export->export_name_expr = parse_expression(parser, 0); // expect_token(parser, Token_Type_Literal_String); + parser->parse_calls = 1; export->export = parse_expression(parser, 0); diff --git a/src/symres.c b/src/symres.c index 9a1b8eb1..9fdd9bfb 100644 --- a/src/symres.c +++ b/src/symres.c @@ -1289,6 +1289,7 @@ static SymresStatus symres_process_directive(AstNode* directive) { case Ast_Kind_Directive_Export: { AstDirectiveExport *export = (AstDirectiveExport *) directive; SYMRES(expression, &export->export); + SYMRES(expression, &export->export_name_expr); if (export->export->kind == Ast_Kind_Polymorphic_Proc) { onyx_report_error(export->token->pos, Error_Critical, "Cannot export a polymorphic function."); -- 2.25.1