docs.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // Generates Documentation
  2. gb_global int print_entity_kind_ordering[Entity_Count] = {
  3. /*Invalid*/ -1,
  4. /*Constant*/ 0,
  5. /*Variable*/ 1,
  6. /*TypeName*/ 4,
  7. /*Procedure*/ 2,
  8. /*ProcGroup*/ 3,
  9. /*Builtin*/ -1,
  10. /*ImportName*/ -1,
  11. /*LibraryName*/ -1,
  12. /*Nil*/ -1,
  13. /*Label*/ -1,
  14. };
  15. gb_global char const *print_entity_names[Entity_Count] = {
  16. /*Invalid*/ "",
  17. /*Constant*/ "constants",
  18. /*Variable*/ "variables",
  19. /*TypeName*/ "types",
  20. /*Procedure*/ "procedures",
  21. /*ProcGroup*/ "proc_group",
  22. /*Builtin*/ "",
  23. /*ImportName*/ "import names",
  24. /*LibraryName*/ "library names",
  25. /*Nil*/ "",
  26. /*Label*/ "",
  27. };
  28. GB_COMPARE_PROC(cmp_entities_for_printing) {
  29. GB_ASSERT(a != nullptr);
  30. GB_ASSERT(b != nullptr);
  31. Entity *x = *cast(Entity **)a;
  32. Entity *y = *cast(Entity **)b;
  33. int res = 0;
  34. res = string_compare(x->pkg->name, y->pkg->name);
  35. if (res != 0) {
  36. return res;
  37. }
  38. int ox = print_entity_kind_ordering[x->kind];
  39. int oy = print_entity_kind_ordering[y->kind];
  40. if (ox < oy) {
  41. return -1;
  42. } else if (ox > oy) {
  43. return +1;
  44. }
  45. res = string_compare(x->token.string, y->token.string);
  46. return res;
  47. }
  48. GB_COMPARE_PROC(cmp_ast_package_by_name) {
  49. GB_ASSERT(a != nullptr);
  50. GB_ASSERT(b != nullptr);
  51. AstPackage *x = *cast(AstPackage **)a;
  52. AstPackage *y = *cast(AstPackage **)b;
  53. return string_compare(x->name, y->name);
  54. }
  55. gbString expr_to_string(Ast *expression);
  56. gbString type_to_string(Type *type);
  57. String alloc_comment_group_string(gbAllocator a, CommentGroup g) {
  58. isize len = 0;
  59. for_array(i, g.list) {
  60. String comment = g.list[i].string;
  61. len += comment.len;
  62. len += 1; // for \n
  63. }
  64. if (len == 0) {
  65. return make_string(nullptr, 0);
  66. }
  67. u8 *text = gb_alloc_array(a, u8, len+1);
  68. len = 0;
  69. for_array(i, g.list) {
  70. String comment = g.list[i].string;
  71. if (comment[1] == '/') {
  72. comment.text += 2;
  73. comment.len -= 2;
  74. } else if (comment[1] == '*') {
  75. comment.text += 2;
  76. comment.len -= 4;
  77. }
  78. comment = string_trim_whitespace(comment);
  79. gb_memmove(text+len, comment.text, comment.len);
  80. len += comment.len;
  81. text[len++] = '\n';
  82. }
  83. return make_string(text, len);
  84. }
  85. void print_doc_line(i32 indent, char const *fmt, ...) {
  86. while (indent --> 0) {
  87. gb_printf("\t");
  88. }
  89. va_list va;
  90. va_start(va, fmt);
  91. gb_printf_va(fmt, va);
  92. va_end(va);
  93. gb_printf("\n");
  94. }
  95. void print_doc_package(CheckerInfo *info, AstPackage *pkg) {
  96. print_doc_line(0, "%.*s", LIT(pkg->name));
  97. }
  98. void generate_documentation(Checker *c) {
  99. CheckerInfo *info = &c->info;
  100. if (build_context.cmd_doc_flags & CmdDocFlag_All) {
  101. auto pkgs = array_make<AstPackage *>(permanent_allocator(), info->packages.entries.count);
  102. for_array(i, info->packages.entries) {
  103. array_add(&pkgs, info->packages.entries[i].value);
  104. }
  105. gb_sort_array(pkgs.data, pkgs.count, cmp_ast_package_by_name);
  106. for_array(i, pkgs) {
  107. print_doc_package(info, pkgs[i]);
  108. }
  109. } else {
  110. GB_ASSERT(info->init_scope->flags & ScopeFlag_Pkg);
  111. AstPackage *pkg = info->init_scope->pkg;
  112. print_doc_package(info, pkg);
  113. }
  114. }