authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-11-15 14:12:14+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-11-15 15:02:51+02:00
loge509d21f39af726da3c6001b0c20f2c765be07a5
treeeff4c0f8081c81065a9bbf9d1ab0f4e3d7aec0ab
parentb92f42d1f4b91bb343558f72af84ea052da4ac98
signaturelock-open Commit is signed but in an unrecognized format.

implemented container doc comments in stage 1


4 files changed, 56 insertions(+), 1 deletions(-)

src/all_types.hpp+1
......@@ -968,6 +968,7 @@ struct AstNodeContainerDecl {
968968 AstNode *init_arg_expr; // enum(T), struct(endianness), or union(T), or union(enum(T))
969969 ZigList<AstNode *> fields;
970970 ZigList<AstNode *> decls;
971 Buf doc_comments;
971972
972973 ContainerKind kind;
973974 ContainerLayout layout;
src/parser.cpp+22-1
......@@ -493,6 +493,7 @@ static AstNode *ast_parse_root(ParseContext *pc) {
493493 node->data.container_decl.layout = ContainerLayoutAuto;
494494 node->data.container_decl.kind = ContainerKindStruct;
495495 node->data.container_decl.is_root = true;
496 node->data.container_decl.doc_comments = members.doc_comments;
496497
497498 return node;
498499}
......@@ -514,6 +515,21 @@ static Token *ast_parse_doc_comments(ParseContext *pc, Buf *buf) {
514515 return first_doc_token;
515516}
516517
518static 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
517533// ContainerMembers
518534// <- TestDecl ContainerMembers
519535// / TopLevelComptime ContainerMembers
......@@ -523,7 +539,11 @@ static Token *ast_parse_doc_comments(ParseContext *pc, Buf *buf) {
523539// /
524540static AstNodeContainerDecl ast_parse_container_members(ParseContext *pc) {
525541 AstNodeContainerDecl res = {};
542 Buf tld_doc_comment_buf = BUF_INIT;
543 buf_resize(&tld_doc_comment_buf, 0);
526544 for (;;) {
545 ast_parse_container_doc_comments(pc, &tld_doc_comment_buf);
546
527547 AstNode *test_decl = ast_parse_test_decl(pc);
528548 if (test_decl != nullptr) {
529549 res.decls.append(test_decl);
......@@ -566,7 +586,7 @@ static AstNodeContainerDecl ast_parse_container_members(ParseContext *pc) {
566586
567587 break;
568588 }
569
589 res.doc_comments = tld_doc_comment_buf;
570590 return res;
571591}
572592
......@@ -2797,6 +2817,7 @@ static AstNode *ast_parse_container_decl_auto(ParseContext *pc) {
27972817
27982818 res->data.container_decl.fields = members.fields;
27992819 res->data.container_decl.decls = members.decls;
2820 res->data.container_decl.doc_comments = members.doc_comments;
28002821 return res;
28012822}
28022823
src/tokenizer.cpp+32
......@@ -198,6 +198,7 @@ enum TokenizeState {
198198 TokenizeStateSawSlash,
199199 TokenizeStateSawSlash2,
200200 TokenizeStateSawSlash3,
201 TokenizeStateSawSlashBang,
201202 TokenizeStateSawBackslash,
202203 TokenizeStateSawPercent,
203204 TokenizeStateSawPlus,
......@@ -209,6 +210,7 @@ enum TokenizeState {
209210 TokenizeStateSawBar,
210211 TokenizeStateSawBarBar,
211212 TokenizeStateDocComment,
213 TokenizeStateContainerDocComment,
212214 TokenizeStateLineComment,
213215 TokenizeStateLineString,
214216 TokenizeStateLineStringEnd,
......@@ -938,6 +940,9 @@ void tokenize(Buf *buf, Tokenization *out) {
938940 case '/':
939941 t.state = TokenizeStateSawSlash3;
940942 break;
943 case '!':
944 t.state = TokenizeStateSawSlashBang;
945 break;
941946 case '\n':
942947 cancel_token(&t);
943948 t.state = TokenizeStateStart;
......@@ -965,6 +970,19 @@ void tokenize(Buf *buf, Tokenization *out) {
965970 break;
966971 }
967972 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;
968986 case TokenizeStateSawBackslash:
969987 switch (c) {
970988 case '\\':
......@@ -1055,6 +1073,17 @@ void tokenize(Buf *buf, Tokenization *out) {
10551073 break;
10561074 }
10571075 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;
10581087 case TokenizeStateSymbolFirstC:
10591088 switch (c) {
10601089 case '"':
......@@ -1545,6 +1574,7 @@ void tokenize(Buf *buf, Tokenization *out) {
15451574 case TokenizeStateSawBarBar:
15461575 case TokenizeStateLBracket:
15471576 case TokenizeStateDocComment:
1577 case TokenizeStateContainerDocComment:
15481578 end_token(&t);
15491579 break;
15501580 case TokenizeStateSawDotDot:
......@@ -1559,6 +1589,7 @@ void tokenize(Buf *buf, Tokenization *out) {
15591589 case TokenizeStateLineComment:
15601590 case TokenizeStateSawSlash2:
15611591 case TokenizeStateSawSlash3:
1592 case TokenizeStateSawSlashBang:
15621593 break;
15631594 }
15641595 if (t.state != TokenizeStateError) {
......@@ -1606,6 +1637,7 @@ const char * token_name(TokenId id) {
16061637 case TokenIdDash: return "-";
16071638 case TokenIdDivEq: return "/=";
16081639 case TokenIdDocComment: return "DocComment";
1640 case TokenIdContainerDocComment: return "ContainerDocComment";
16091641 case TokenIdDot: return ".";
16101642 case TokenIdDotStar: return ".*";
16111643 case TokenIdEllipsis2: return "..";
src/tokenizer.hpp+1
......@@ -43,6 +43,7 @@ enum TokenId {
4343 TokenIdDash,
4444 TokenIdDivEq,
4545 TokenIdDocComment,
46 TokenIdContainerDocComment,
4647 TokenIdDot,
4748 TokenIdDotStar,
4849 TokenIdEllipsis2,