diff options
| author | Ginger Bill <bill@gingerbill.org> | 2017-06-18 23:41:13 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2017-06-18 23:41:13 +0100 |
| commit | 178236d1ff3c588f544e56258d3c27c6bbc23996 (patch) | |
| tree | c060f8f6303f8ea014166d088569cd7c96456ff3 /src/docs.cpp | |
| parent | 736c880ba9f19e18540eb8c8d839d87cfe1c93d6 (diff) | |
Barebones layout for the documentation declarations
Diffstat (limited to 'src/docs.cpp')
| -rw-r--r-- | src/docs.cpp | 151 |
1 files changed, 108 insertions, 43 deletions
diff --git a/src/docs.cpp b/src/docs.cpp index a8347b392..6478f490f 100644 --- a/src/docs.cpp +++ b/src/docs.cpp @@ -2,57 +2,122 @@ gbString expr_to_string(AstNode *expression); -void print_declaration(Parser *parser, AstNode *decl) { - switch (decl->kind) { - case_ast_node(pd, ProcDecl, decl); - GB_ASSERT(pd->name->kind == AstNode_Ident); - String name = pd->name->Ident.string; - if (name.len == 0) { - break; - } - if (name[0] == '_') { - break; +String alloc_comment_group_string(gbAllocator a, CommentGroup g) { + isize len = 0; + for_array(i, g.list) { + String comment = g.list[i].string; + len += comment.len; + len += 1; // for \n + } + if (len == 0) { + return make_string(NULL, 0); + } + + u8 *text = gb_alloc_array(a, u8, len+1); + len = 0; + for_array(i, g.list) { + String comment = g.list[i].string; + if (comment[1] == '/') { + comment.text += 2; + comment.len -= 2; + } else if (comment[1] == '*') { + comment.text += 2; + comment.len -= 4; } + comment = string_trim_whitespace(comment); + gb_memmove(text+len, comment.text, comment.len); + len += comment.len; + text[len++] = '\n'; + } + return make_string(text, len); +} - for_array(i, pd->docs.list) { - String comment = pd->docs.list[i].string; - if (comment[1] == '/') { - comment.text += 2; - comment.len -= 2; - } else if (comment[1] == '*') { - comment.text += 2; - comment.len -= 4; - } - comment = string_trim_whitespace(comment); +void print_type_spec(AstNode *spec) { + ast_node(ts, TypeSpec, spec); + GB_ASSERT(ts->name->kind == AstNode_Ident); + String name = ts->name->Ident.string; + if (name.len == 0) { + return; + } + if (name[0] == '_') { + return; + } + gb_printf("type %.*s\n", LIT(name)); +} - gb_printf("%.*s\n", LIT(comment)); - } +void print_proc_decl(AstNodeProcDecl *pd) { + GB_ASSERT(pd->name->kind == AstNode_Ident); + String name = pd->name->Ident.string; + if (name.len == 0) { + return; + } + if (name[0] == '_') { + return; + } - ast_node(proc_type, ProcType, pd->type); + String docs = alloc_comment_group_string(heap_allocator(), pd->docs); + defer (gb_free(heap_allocator(), docs.text)); - gbString params = expr_to_string(proc_type->params); - defer (gb_string_free(params)); - gb_printf("proc %.*s(%s)", LIT(name), params); - if (proc_type->results != NULL) { - ast_node(fl, FieldList, proc_type->results); - isize count = fl->list.count; - if (count > 0) { - gbString results = expr_to_string(proc_type->results); - defer (gb_string_free(results)); - gb_printf(" -> "); - if (count != 1) { - gb_printf("("); - } - gb_printf("%s", results); - if (count != 1) { - gb_printf(")"); - } + if (docs.len > 0) { + gb_file_write(&gb__std_files[gbFileStandard_Output], docs.text, docs.len); + } else { + return; + } + + ast_node(proc_type, ProcType, pd->type); + + gbString params = expr_to_string(proc_type->params); + defer (gb_string_free(params)); + gb_printf("proc %.*s(%s)", LIT(name), params); + if (proc_type->results != NULL) { + ast_node(fl, FieldList, proc_type->results); + isize count = fl->list.count; + if (count > 0) { + gbString results = expr_to_string(proc_type->results); + defer (gb_string_free(results)); + gb_printf(" -> "); + if (count != 1) { + gb_printf("("); + } + gb_printf("%s", results); + if (count != 1) { + gb_printf(")"); } } - gb_printf("\n\n"); - case_end; + } + gb_printf("\n\n"); +} +void print_declaration(AstNode *decl) { + switch (decl->kind) { case_ast_node(gd, GenDecl, decl); + for_array(spec_index, gd->specs) { + AstNode *spec = gd->specs[spec_index]; + switch(gd->token.kind) { + case Token_var: + case Token_let: + break; + case Token_const: + break; + case Token_type: + // print_type_spec(spec); + break; + case Token_import: + case Token_import_load: + break; + case Token_foreign_library: + case Token_foreign_system_library: + break; + } + } + case_end; + + case_ast_node(pd, ProcDecl, decl); + print_proc_decl(pd); + case_end; + + case_ast_node(fb, ForeignBlockDecl, decl); + // TODO(bill) case_end; } } @@ -66,7 +131,7 @@ void generate_documentation(Parser *parser) { for_array(decl_index, file->decls) { AstNode *decl = file->decls[decl_index]; - print_declaration(parser, decl); + print_declaration(decl); } } } |