| author | |
| committer | |
| log | e509d21f39af726da3c6001b0c20f2c765be07a5 |
| tree | eff4c0f8081c81065a9bbf9d1ab0f4e3d7aec0ab |
| parent | b92f42d1f4b91bb343558f72af84ea052da4ac98 |
| signature |
4 files changed, 56 insertions(+), 1 deletions(-)
src/all_types.hpp+1| ... | ... | @@ -968,6 +968,7 @@ struct AstNodeContainerDecl { |
| 968 | 968 | AstNode *init_arg_expr; // enum(T), struct(endianness), or union(T), or union(enum(T)) |
| 969 | 969 | ZigList<AstNode *> fields; |
| 970 | 970 | ZigList<AstNode *> decls; |
| 971 | Buf doc_comments; | |
| 971 | 972 | |
| 972 | 973 | ContainerKind kind; |
| 973 | 974 | ContainerLayout layout; |
src/parser.cpp+22-1| ... | ... | @@ -493,6 +493,7 @@ static AstNode *ast_parse_root(ParseContext *pc) { |
| 493 | 493 | node->data.container_decl.layout = ContainerLayoutAuto; |
| 494 | 494 | node->data.container_decl.kind = ContainerKindStruct; |
| 495 | 495 | node->data.container_decl.is_root = true; |
| 496 | node->data.container_decl.doc_comments = members.doc_comments; | |
| 496 | 497 | |
| 497 | 498 | return node; |
| 498 | 499 | } |
| ... | ... | @@ -514,6 +515,21 @@ static Token *ast_parse_doc_comments(ParseContext *pc, Buf *buf) { |
| 514 | 515 | return first_doc_token; |
| 515 | 516 | } |
| 516 | 517 | |
| 518 | static void ast_parse_container_doc_comments(ParseContext *pc, Buf *buf) { | |
| 519 | if (buf_len(buf) != 0 && peek_token(pc)->id == TokenIdContainerDocComment) { | |
| 520 | buf_append_char(buf, '\n'); | |
| 521 | } | |
| 522 | Token *doc_token = nullptr; | |
| 523 | while ((doc_token = eat_token_if(pc, TokenIdContainerDocComment))) { | |
| 524 | if (buf->list.length == 0) { | |
| 525 | buf_resize(buf, 0); | |
| 526 | } | |
| 527 | // chops off '//!' but leaves '\n' | |
| 528 | buf_append_mem(buf, buf_ptr(pc->buf) + doc_token->start_pos + 3, | |
| 529 | doc_token->end_pos - doc_token->start_pos - 3); | |
| 530 | } | |
| 531 | } | |
| 532 | ||
| 517 | 533 | // ContainerMembers |
| 518 | 534 | // <- TestDecl ContainerMembers |
| 519 | 535 | // / TopLevelComptime ContainerMembers |
| ... | ... | @@ -523,7 +539,11 @@ static Token *ast_parse_doc_comments(ParseContext *pc, Buf *buf) { |
| 523 | 539 | // / |
| 524 | 540 | static AstNodeContainerDecl ast_parse_container_members(ParseContext *pc) { |
| 525 | 541 | AstNodeContainerDecl res = {}; |
| 542 | Buf tld_doc_comment_buf = BUF_INIT; | |
| 543 | buf_resize(&tld_doc_comment_buf, 0); | |
| 526 | 544 | for (;;) { |
| 545 | ast_parse_container_doc_comments(pc, &tld_doc_comment_buf); | |
| 546 | ||
| 527 | 547 | AstNode *test_decl = ast_parse_test_decl(pc); |
| 528 | 548 | if (test_decl != nullptr) { |
| 529 | 549 | res.decls.append(test_decl); |
| ... | ... | @@ -566,7 +586,7 @@ static AstNodeContainerDecl ast_parse_container_members(ParseContext *pc) { |
| 566 | 586 | |
| 567 | 587 | break; |
| 568 | 588 | } |
| 569 | ||
| 589 | res.doc_comments = tld_doc_comment_buf; | |
| 570 | 590 | return res; |
| 571 | 591 | } |
| 572 | 592 | |
| ... | ... | @@ -2797,6 +2817,7 @@ static AstNode *ast_parse_container_decl_auto(ParseContext *pc) { |
| 2797 | 2817 | |
| 2798 | 2818 | res->data.container_decl.fields = members.fields; |
| 2799 | 2819 | res->data.container_decl.decls = members.decls; |
| 2820 | res->data.container_decl.doc_comments = members.doc_comments; | |
| 2800 | 2821 | return res; |
| 2801 | 2822 | } |
| 2802 | 2823 |
src/tokenizer.cpp+32| ... | ... | @@ -198,6 +198,7 @@ enum TokenizeState { |
| 198 | 198 | TokenizeStateSawSlash, |
| 199 | 199 | TokenizeStateSawSlash2, |
| 200 | 200 | TokenizeStateSawSlash3, |
| 201 | TokenizeStateSawSlashBang, | |
| 201 | 202 | TokenizeStateSawBackslash, |
| 202 | 203 | TokenizeStateSawPercent, |
| 203 | 204 | TokenizeStateSawPlus, |
| ... | ... | @@ -209,6 +210,7 @@ enum TokenizeState { |
| 209 | 210 | TokenizeStateSawBar, |
| 210 | 211 | TokenizeStateSawBarBar, |
| 211 | 212 | TokenizeStateDocComment, |
| 213 | TokenizeStateContainerDocComment, | |
| 212 | 214 | TokenizeStateLineComment, |
| 213 | 215 | TokenizeStateLineString, |
| 214 | 216 | TokenizeStateLineStringEnd, |
| ... | ... | @@ -938,6 +940,9 @@ void tokenize(Buf *buf, Tokenization *out) { |
| 938 | 940 | case '/': |
| 939 | 941 | t.state = TokenizeStateSawSlash3; |
| 940 | 942 | break; |
| 943 | case '!': | |
| 944 | t.state = TokenizeStateSawSlashBang; | |
| 945 | break; | |
| 941 | 946 | case '\n': |
| 942 | 947 | cancel_token(&t); |
| 943 | 948 | t.state = TokenizeStateStart; |
| ... | ... | @@ -965,6 +970,19 @@ void tokenize(Buf *buf, Tokenization *out) { |
| 965 | 970 | break; |
| 966 | 971 | } |
| 967 | 972 | break; |
| 973 | case TokenizeStateSawSlashBang: | |
| 974 | switch (c) { | |
| 975 | case '\n': | |
| 976 | set_token_id(&t, t.cur_tok, TokenIdContainerDocComment); | |
| 977 | end_token(&t); | |
| 978 | t.state = TokenizeStateStart; | |
| 979 | break; | |
| 980 | default: | |
| 981 | set_token_id(&t, t.cur_tok, TokenIdContainerDocComment); | |
| 982 | t.state = TokenizeStateContainerDocComment; | |
| 983 | break; | |
| 984 | } | |
| 985 | break; | |
| 968 | 986 | case TokenizeStateSawBackslash: |
| 969 | 987 | switch (c) { |
| 970 | 988 | case '\\': |
| ... | ... | @@ -1055,6 +1073,17 @@ void tokenize(Buf *buf, Tokenization *out) { |
| 1055 | 1073 | break; |
| 1056 | 1074 | } |
| 1057 | 1075 | break; |
| 1076 | case TokenizeStateContainerDocComment: | |
| 1077 | switch (c) { | |
| 1078 | case '\n': | |
| 1079 | end_token(&t); | |
| 1080 | t.state = TokenizeStateStart; | |
| 1081 | break; | |
| 1082 | default: | |
| 1083 | // do nothing | |
| 1084 | break; | |
| 1085 | } | |
| 1086 | break; | |
| 1058 | 1087 | case TokenizeStateSymbolFirstC: |
| 1059 | 1088 | switch (c) { |
| 1060 | 1089 | case '"': |
| ... | ... | @@ -1545,6 +1574,7 @@ void tokenize(Buf *buf, Tokenization *out) { |
| 1545 | 1574 | case TokenizeStateSawBarBar: |
| 1546 | 1575 | case TokenizeStateLBracket: |
| 1547 | 1576 | case TokenizeStateDocComment: |
| 1577 | case TokenizeStateContainerDocComment: | |
| 1548 | 1578 | end_token(&t); |
| 1549 | 1579 | break; |
| 1550 | 1580 | case TokenizeStateSawDotDot: |
| ... | ... | @@ -1559,6 +1589,7 @@ void tokenize(Buf *buf, Tokenization *out) { |
| 1559 | 1589 | case TokenizeStateLineComment: |
| 1560 | 1590 | case TokenizeStateSawSlash2: |
| 1561 | 1591 | case TokenizeStateSawSlash3: |
| 1592 | case TokenizeStateSawSlashBang: | |
| 1562 | 1593 | break; |
| 1563 | 1594 | } |
| 1564 | 1595 | if (t.state != TokenizeStateError) { |
| ... | ... | @@ -1606,6 +1637,7 @@ const char * token_name(TokenId id) { |
| 1606 | 1637 | case TokenIdDash: return "-"; |
| 1607 | 1638 | case TokenIdDivEq: return "/="; |
| 1608 | 1639 | case TokenIdDocComment: return "DocComment"; |
| 1640 | case TokenIdContainerDocComment: return "ContainerDocComment"; | |
| 1609 | 1641 | case TokenIdDot: return "."; |
| 1610 | 1642 | case TokenIdDotStar: return ".*"; |
| 1611 | 1643 | case TokenIdEllipsis2: return ".."; |
src/tokenizer.hpp+1| ... | ... | @@ -43,6 +43,7 @@ enum TokenId { |
| 43 | 43 | TokenIdDash, |
| 44 | 44 | TokenIdDivEq, |
| 45 | 45 | TokenIdDocComment, |
| 46 | TokenIdContainerDocComment, | |
| 46 | 47 | TokenIdDot, |
| 47 | 48 | TokenIdDotStar, |
| 48 | 49 | TokenIdEllipsis2, |