bugfixes with symbol information; sorting symbols
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 8 Feb 2023 22:03:38 +0000 (16:03 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 8 Feb 2023 22:03:38 +0000 (16:03 -0600)
compiler/src/doc.c
compiler/src/utils.c

index 0cfc5305861009f46686372eee613c0608b115fd..1808946fdd8bccc90461f8f7db0cef0dbfaf0d83 100644 (file)
@@ -51,6 +51,18 @@ void onyx_docs_emit_tags(char *dest) {
     bh_file_close(&tags_file);
 }
 
+static i32 sort_symbol_resolutions(const SymbolResolution *a, const SymbolResolution *b) {
+    if (a->file_id != b->file_id) {
+        return a->file_id > b->file_id ? 1 : -1;
+    }
+
+    if (a->line != b->line) {
+        return a->line > b->line ? 1 : -1;
+    }
+
+    return 0;
+}
+
 void onyx_docs_emit_symbol_info(const char *dest) {
     bh_file sym_file;
     if (bh_file_create(&sym_file, dest) != BH_FILE_ERROR_NONE) {
@@ -60,6 +72,11 @@ void onyx_docs_emit_symbol_info(const char *dest) {
 
     SymbolInfoTable *syminfo = context.symbol_info;
 
+    qsort(syminfo->symbols_resolutions,
+            bh_arr_length(syminfo->symbols_resolutions),
+            sizeof(SymbolResolution),
+            (int (*)(const void *, const void*)) sort_symbol_resolutions);
+
     bh_buffer file_section;
     bh_buffer_init(&file_section, global_heap_allocator, 2048);
     fori (i, 0, shlen(syminfo->files)) {
index 56a8241d1c19c3f71cd47ca92570433e3e9212d2..37a3383036393b72a8cd53fe501e7d5848c57386 100644 (file)
@@ -1365,6 +1365,8 @@ void track_declaration_for_symbol_info(OnyxFilePos pos, AstNode *node) {
     SymbolInfoTable *syminfo = context.symbol_info;
     assert(syminfo);
 
+    if (bh_imap_has(&syminfo->node_to_id, (u64) node)) return;
+
     u32 symbol_id = syminfo->next_symbol_id++;
     u32 file_id = symbol_info_get_file_id(syminfo, pos.filename);