export directive name can be an expression
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 30 Jan 2022 18:54:25 +0000 (12:54 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 30 Jan 2022 18:54:25 +0000 (12:54 -0600)
include/astnodes.h
src/checker.c
src/parser.c
src/symres.c

index a57e75b4f6bd4d692d94d3387c82dc33d3eed14a..02551a8a1dd4e524546f65f4d567bda00e43200a 100644 (file)
@@ -1234,6 +1234,7 @@ struct AstDirectiveExport {
     AstNode_base;
 
     OnyxToken* export_name;
+    AstTyped* export_name_expr;
     AstTyped* export;
 };
 
index c5231b89959e7b66f33ffc5179e4f187995f0436..3e1f70e4b7e96634811706b93ad3cabb195d4206 100644 (file)
@@ -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) {
index 905cc4e044662077e84e2f23370c251a03e85ea1..b4c9de03f0428ebe0464fb421553c205718a252b 100644 (file)
@@ -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);
 
index 9a1b8eb1b583b25dd037e725526d6dbeb8eb6a2b..9fdd9bfbacd9bbddb6a19a92028571f79bc69166 100644 (file)
@@ -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.");