docs.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Generates Documentation
  2. gbString expr_to_string(AstNode *expression);
  3. String alloc_comment_group_string(gbAllocator a, CommentGroup g) {
  4. isize len = 0;
  5. for_array(i, g.list) {
  6. String comment = g.list[i].string;
  7. len += comment.len;
  8. len += 1; // for \n
  9. }
  10. if (len == 0) {
  11. return make_string(nullptr, 0);
  12. }
  13. u8 *text = gb_alloc_array(a, u8, len+1);
  14. len = 0;
  15. for_array(i, g.list) {
  16. String comment = g.list[i].string;
  17. if (comment[1] == '/') {
  18. comment.text += 2;
  19. comment.len -= 2;
  20. } else if (comment[1] == '*') {
  21. comment.text += 2;
  22. comment.len -= 4;
  23. }
  24. comment = string_trim_whitespace(comment);
  25. gb_memmove(text+len, comment.text, comment.len);
  26. len += comment.len;
  27. text[len++] = '\n';
  28. }
  29. return make_string(text, len);
  30. }
  31. #if 0
  32. void print_type_spec(AstNode *spec) {
  33. ast_node(ts, TypeSpec, spec);
  34. GB_ASSERT(ts->name->kind == AstNode_Ident);
  35. String name = ts->name->Ident.string;
  36. if (name.len == 0) {
  37. return;
  38. }
  39. if (name[0] == '_') {
  40. return;
  41. }
  42. gb_printf("type %.*s\n", LIT(name));
  43. }
  44. void print_proc_decl(AstNodeProcDecl *pd) {
  45. GB_ASSERT(pd->name->kind == AstNode_Ident);
  46. String name = pd->name->Ident.string;
  47. if (name.len == 0) {
  48. return;
  49. }
  50. if (name[0] == '_') {
  51. return;
  52. }
  53. String docs = alloc_comment_group_string(heap_allocator(), pd->docs);
  54. defer (gb_free(heap_allocator(), docs.text));
  55. if (docs.len > 0) {
  56. gb_file_write(&gb__std_files[gbFileStandard_Output], docs.text, docs.len);
  57. } else {
  58. return;
  59. }
  60. ast_node(proc_type, ProcType, pd->type);
  61. gbString params = expr_to_string(proc_type->params);
  62. defer (gb_string_free(params));
  63. gb_printf("proc %.*s(%s)", LIT(name), params);
  64. if (proc_type->results != nullptr) {
  65. ast_node(fl, FieldList, proc_type->results);
  66. isize count = fl->list.count;
  67. if (count > 0) {
  68. gbString results = expr_to_string(proc_type->results);
  69. defer (gb_string_free(results));
  70. gb_printf(" -> ");
  71. if (count != 1) {
  72. gb_printf("(");
  73. }
  74. gb_printf("%s", results);
  75. if (count != 1) {
  76. gb_printf(")");
  77. }
  78. }
  79. }
  80. gb_printf("\n\n");
  81. }
  82. #endif
  83. void print_declaration(AstNode *decl) {
  84. }
  85. void generate_documentation(Parser *parser) {
  86. for_array(file_index, parser->files) {
  87. AstFile *file = &parser->files[file_index];
  88. Tokenizer *tokenizer = &file->tokenizer;
  89. String fullpath = tokenizer->fullpath;
  90. gb_printf("%.*s\n", LIT(fullpath));
  91. for_array(decl_index, file->decls) {
  92. AstNode *decl = file->decls[decl_index];
  93. print_declaration(decl);
  94. }
  95. }
  96. }