bh_buffer sym_def_section;
bh_buffer_init(&sym_def_section, global_heap_allocator, 2048);
+
+ bh_buffer docs_section;
+ bh_buffer_init(&docs_section, global_heap_allocator, 4096);
+
bh_arr_each(SymbolInfo, sym, syminfo->symbols) {
bh_buffer_write_u32(&sym_def_section, sym->id);
bh_buffer_write_u32(&sym_def_section, sym->file_id);
bh_buffer_write_u32(&sym_def_section, sym->line);
bh_buffer_write_u32(&sym_def_section, sym->column);
+
+ if (context.options->generate_lsp_info_file) {
+ if (sym->documentation) {
+ bh_buffer_write_u32(&sym_def_section, docs_section.length);
+ bh_buffer_write_u32(&sym_def_section, sym->documentation->length);
+
+ bh_buffer_append(&docs_section, sym->documentation->text, sym->documentation->length);
+ } else {
+ bh_buffer_write_u32(&sym_def_section, 0);
+ bh_buffer_write_u32(&sym_def_section, 0);
+ }
+ }
}
bh_buffer sym_res_section;
bh_buffer header_section;
bh_buffer_init(&header_section, global_heap_allocator, 16);
bh_buffer_append(&header_section, "OSYM", 4);
- bh_buffer_write_u32(&header_section, 1);
- bh_buffer_write_u32(&header_section, 32);
+
+ u32 header_size = 32;
+ if (context.options->generate_lsp_info_file) {
+ bh_buffer_write_u32(&header_section, 2);
+ header_size = 40;
+ } else {
+ bh_buffer_write_u32(&header_section, 1);
+ }
+
+ bh_buffer_write_u32(&header_section, header_size);
bh_buffer_write_u32(&header_section, shlenu(syminfo->files));
- bh_buffer_write_u32(&header_section, 32 + file_section.length);
+ bh_buffer_write_u32(&header_section, header_size + file_section.length);
bh_buffer_write_u32(&header_section, bh_arr_length(syminfo->symbols));
- bh_buffer_write_u32(&header_section, 32 + file_section.length + sym_def_section.length);
+ bh_buffer_write_u32(&header_section, header_size + file_section.length + sym_def_section.length);
bh_buffer_write_u32(&header_section, bh_arr_length(syminfo->symbols_resolutions));
+ if (context.options->generate_lsp_info_file) {
+ bh_buffer_write_u32(&header_section, header_size + file_section.length + sym_def_section.length + sym_res_section.length);
+ bh_buffer_write_u32(&header_section, docs_section.length);
+ }
+
bh_file_write(&sym_file, header_section.data, header_section.length);
bh_file_write(&sym_file, file_section.data, file_section.length);
bh_file_write(&sym_file, sym_def_section.data, sym_def_section.length);
bh_file_write(&sym_file, sym_res_section.data, sym_res_section.length);
+ if (context.options->generate_lsp_info_file) {
+ bh_file_write(&sym_file, docs_section.data, docs_section.length);
+ }
+
bh_file_close(&sym_file);
bh_buffer_free(&header_section);
#include "wasm_emit.h"
#include "doc.h"
-#define VERSION "v0.1.7"
+#define VERSION "v0.1.8"
Context context;
"\t Automatically enabled for \"onyx\" runtime.\n"
"\t--doc <doc_file> Generates an O-DOC file, a.k.a an Onyx documentation file. Used by onyx-doc-gen.\n"
"\t--tag Generates a C-Tag file.\n"
- "\t--syminfo <target_file> Generates a symbol resolution information file. Used by onyx-lsp.\n"
+ "\t--syminfo <target_file> (DEPRECATED) Generates a symbol resolution information file. Used by onyx-lsp.\n"
+ "\t--lspinfo <target_file> Generates an LSP information file. Used by onyx-lsp.\n"
"\t--stack-trace Enable dynamic stack trace.\n"
"\t--no-std Disable automatically including \"core/std\".\n"
"\t--no-stale-code Disables use of `#allow_stale_code` directive\n"
.generate_tag_file = 0,
.generate_symbol_info_file = 0,
+ .generate_lsp_info_file = 0,
};
bh_arr_new(alloc, options.files, 2);
options.generate_symbol_info_file = 1;
options.symbol_info_file = argv[++i];
}
+ else if (!strcmp(argv[i], "--lspinfo")) {
+ options.generate_symbol_info_file = 1;
+ options.generate_lsp_info_file = 1;
+ options.symbol_info_file = argv[++i];
+ }
else if (!strcmp(argv[i], "--debug")) {
options.debug_session = 1;
options.debug_info_enabled = 1;
bh_imap_put(&syminfo->node_to_id, (u64) node, (u64) symbol_id);
}
+void track_documentation_for_symbol_info(AstNode *node, OnyxToken *documentation) {
+ if (!context.options->generate_lsp_info_file) return;
+ if (!context.options->generate_symbol_info_file) return;
+
+ SymbolInfoTable *syminfo = context.symbol_info;
+ assert(syminfo);
+
+ if (!bh_imap_has(&syminfo->node_to_id, (u64) node)) return;
+
+ u64 symbol_id = bh_imap_get(&syminfo->node_to_id, (u64) node);
+ syminfo->symbols[symbol_id].documentation = documentation;
+}
+
void track_resolution_for_symbol_info(AstNode *original, AstNode *resolved) {
if (!context.options->generate_symbol_info_file) return;
if (!resolved) return;