Luma 0.1.0
A low-level compiled alternative to C, C++, and more!
Loading...
Searching...
No Matches
lsp.h
Go to the documentation of this file.
1
6#pragma once
7
8#include "../c_libs/memory/memory.h"
9#include "../lexer/lexer.h"
10#include "../parser/parser.h"
11#include "../typechecker/type.h"
12#include <stdbool.h>
13#include <stddef.h>
14
15// ============================================================================
16// CORE LSP TYPES
17// ============================================================================
18
20
42
43// ============================================================================
44// LSP PROTOCOL STRUCTURES (Position, Range, Location)
45// ============================================================================
46
47typedef struct {
48 int line;
51
56
57typedef struct {
58 const char *uri;
61
62// ============================================================================
63// DIAGNOSTICS
64// ============================================================================
65
72
73typedef struct {
76 const char *message;
77 const char *source;
79
80// ============================================================================
81// DOCUMENT SYMBOLS
82// ============================================================================
83
105
114
115// ============================================================================
116// SIGNATURE HELP
117// ============================================================================
118
119typedef struct {
120 const char *label;
121 const char *documentation;
123
131
138
139// ============================================================================
140// CODE ACTION
141// ============================================================================
142
143typedef struct {
144 const char *title;
145 const char *kind;
146 const char *command;
147 const char *edit_title;
148 const char *edit_text;
149 const char *edit_uri;
151
152// ============================================================================
153// DOCUMENT HIGHLIGHT
154// ============================================================================
155
161
166
167// ============================================================================
168// COMPLETION
169// ============================================================================
170
186
191
192typedef struct {
193 const char *label;
195 const char *insert_text;
197 const char *detail;
198 const char *documentation;
199 const char *sort_text;
200 const char *filter_text;
202
203// ============================================================================
204// MODULE SYSTEM
205// ============================================================================
206
207typedef struct {
208 const char *module_path; // e.g., "string", "std/memory"
209 const char *alias; // Import alias (e.g., "str")
210 Scope *scope; // Parsed scope from that module
212
213typedef struct {
214 const char *module_name; // e.g., "math", "string"
215 const char *file_uri; // Full file URI where module is defined
217
218typedef struct {
220 size_t count;
221 size_t capacity;
223
224typedef struct {
225 AstNode *ast; // The module AST node
226 Scope *scope; // The scope created during typecheck
227 const char *module_uri; // URI of the module file
228} ModuleInfo;
229
230// ============================================================================
231// DOCUMENT & SERVER STATE
232// ============================================================================
233
234typedef struct {
235 // Document identity
236 const char *uri;
237 const char *content;
239
240 // Analysis results (cached)
247
248 // Module imports
251
252 // Memory & state
256
257// Cache entry for a parsed dependency module AST.
258// Invalidated when the file's mtime changes — so deps are only re-parsed
259// when actually saved, not on every keystroke of the open document.
260typedef struct {
261 const char *uri; // file:// URI of the dependency
262 AstNode *ast; // result of parse() — owned by cache_arena
263 long mtime; // st_mtime when last parsed (time_t is long on all targets)
265
266#define MODULE_AST_CACHE_MAX 128
267
268typedef struct {
269 // Document tracking
273
274 // Module registry for workspace
276
277 // Per-URI AST cache for dependency modules.
278 // parse_imported_module_ast() checks here before touching the filesystem.
281 ArenaAllocator cache_arena; // owns all cached AST memory
282
283 // Server state
287} LSPServer;
288
289// ============================================================================
290// SERVER LIFECYCLE
291// ============================================================================
292
293bool lsp_server_init(LSPServer *server, ArenaAllocator *arena);
294void lsp_server_run(LSPServer *server);
295void lsp_server_shutdown(LSPServer *server);
296void lsp_handle_message(LSPServer *server, const char *message);
297
298// ============================================================================
299// DOCUMENT MANAGEMENT
300// ============================================================================
301
302LSPDocument *lsp_document_open(LSPServer *server, const char *uri,
303 const char *content, int version);
304bool lsp_document_update(LSPServer *server, const char *uri,
305 const char *content, int version);
306bool lsp_document_close(LSPServer *server, const char *uri);
307LSPDocument *lsp_document_find(LSPServer *server, const char *uri);
309 BuildConfig *config);
310
311// ============================================================================
312// MODULE & IMPORT RESOLUTION
313// ============================================================================
314
317void resolve_imports(LSPServer *server, LSPDocument *doc, BuildConfig *config,
318 GrowableArray *imported_modules);
319void build_module_registry(LSPServer *server, const char *workspace_uri);
320const char *lookup_module(LSPServer *server, const char *module_name);
321AstNode *parse_imported_module_ast(LSPServer *server, const char *module_uri,
322 BuildConfig *config, ArenaAllocator *arena);
323
324// Module AST cache — call after lsp_server_init
325void lsp_ast_cache_init(LSPServer *server);
326// Invalidate a single URI (call when a file is saved/changed)
327void lsp_ast_cache_invalidate(LSPServer *server, const char *uri);
328// Clear the module-not-found negative cache (call on didOpen/didSave)
329void lsp_negative_cache_clear(void);
331
332// ============================================================================
333// LSP FEATURES (Hover, Definition, Completion, etc.)
334// ============================================================================
335
336const char *lsp_hover(LSPDocument *doc, LSPPosition position,
337 ArenaAllocator *arena);
339 LSPPosition position,
340 ArenaAllocator *arena);
342 size_t *completion_count,
343 ArenaAllocator *arena);
345 ArenaAllocator *arena);
347 size_t *signature_count,
348 ArenaAllocator *arena);
350 size_t *action_count, ArenaAllocator *arena);
352 LSPPosition position,
353 size_t *highlight_count,
354 ArenaAllocator *arena);
355const char *lsp_rename(LSPDocument *doc, LSPPosition position,
356 const char *new_name, ArenaAllocator *arena);
357LSPDocumentSymbol **lsp_document_symbols(LSPDocument *doc, size_t *symbol_count,
358 ArenaAllocator *arena);
359LSPDiagnostic *lsp_diagnostics(LSPDocument *doc, size_t *diagnostic_count,
360 ArenaAllocator *arena);
361LSPDiagnostic *convert_errors_to_diagnostics(size_t *diagnostic_count,
362 ArenaAllocator *arena);
363
364// ============================================================================
365// JSON-RPC PROTOCOL
366// ============================================================================
367
368LSPMethod lsp_parse_method(const char *json);
369void lsp_send_response(int id, const char *result);
370void lsp_send_request(const char *method, const char *params);
371void lsp_send_notification(const char *method, const char *params);
372void lsp_send_error(int id, int code, const char *message);
373
374// JSON extraction helpers
375char *extract_string(const char *json, const char *key, ArenaAllocator *arena);
376int extract_int(const char *json, const char *key);
377LSPPosition extract_position(const char *json);
378
379// JSON serialization helpers
380size_t json_escape(char *dst, size_t dst_size, const char *src);
381void serialize_diagnostics_to_json(const char *uri, LSPDiagnostic *diagnostics,
382 size_t diag_count, char *output,
383 size_t output_size);
384void serialize_completion_items(LSPCompletionItem *items, size_t count,
385 char *output, size_t output_size);
386void serialize_signature_help(LSPSignatureInfo *sig, char *output,
387 size_t output_size);
388void serialize_code_actions(LSPCodeAction *actions, size_t count,
389 char *output, size_t output_size);
391 size_t count, char *output,
392 size_t output_size);
393const char *serialize_rename_result(const char *edit_json,
394 ArenaAllocator *arena);
395
396// ============================================================================
397// UTILITY FUNCTIONS
398// ============================================================================
399
400// URI conversion
401const char *lsp_uri_to_path(const char *uri, ArenaAllocator *arena);
402const char *lsp_path_to_uri(const char *path, ArenaAllocator *arena);
403
404// Position-based queries
408
410const char *lsp_semantic_tokens_capabilities(void);
LSPCompletionItem * lsp_completion(LSPDocument *doc, LSPPosition position, size_t *completion_count, ArenaAllocator *arena)
Definition lsp_features.c:543
void serialize_completion_items(LSPCompletionItem *items, size_t count, char *output, size_t output_size)
Definition lsp_json.c:388
const char * lsp_rename(LSPDocument *doc, LSPPosition position, const char *new_name, ArenaAllocator *arena)
Definition lsp_features.c:1109
LSPDiagnosticSeverity
Definition lsp.h:66
@ LSP_DIAGNOSTIC_HINT
Definition lsp.h:70
@ LSP_DIAGNOSTIC_WARNING
Definition lsp.h:68
@ LSP_DIAGNOSTIC_ERROR
Definition lsp.h:67
@ LSP_DIAGNOSTIC_INFORMATION
Definition lsp.h:69
void lsp_ast_cache_init(LSPServer *server)
Definition lsp_module.c:492
void lsp_check_pending_analysis(LSPServer *server)
Definition lsp_message.c:52
bool lsp_document_analyze(LSPDocument *doc, LSPServer *server, BuildConfig *config)
Definition lsp_document.c:182
void lsp_send_error(int id, int code, const char *message)
Definition lsp_json.c:308
void serialize_code_actions(LSPCodeAction *actions, size_t count, char *output, size_t output_size)
Definition lsp_json.c:472
LSPDocument * lsp_document_find(LSPServer *server, const char *uri)
Definition lsp_document.c:87
LSPCompletionItem * lsp_completion_resolve(LSPCompletionItem *item, ArenaAllocator *arena)
Definition lsp_features.c:861
void lsp_send_request(const char *method, const char *params)
Definition lsp_json.c:275
const char * lsp_hover(LSPDocument *doc, LSPPosition position, ArenaAllocator *arena)
Definition lsp_features.c:216
void lsp_send_response(int id, const char *result)
Definition lsp_json.c:256
LSPDocument * lsp_document_open(LSPServer *server, const char *uri, const char *content, int version)
Definition lsp_document.c:4
void serialize_diagnostics_to_json(const char *uri, LSPDiagnostic *diagnostics, size_t diag_count, char *output, size_t output_size)
Definition lsp_json.c:357
const char * lsp_path_to_uri(const char *path, ArenaAllocator *arena)
Definition lsp_server.c:136
AstNode * parse_imported_module_ast(LSPServer *server, const char *module_uri, BuildConfig *config, ArenaAllocator *arena)
Definition lsp_module.c:501
LSPDocumentHighlightKind
Definition lsp.h:156
@ LSP_HIGHLIGHT_WRITE
Definition lsp.h:159
@ LSP_HIGHLIGHT_READ
Definition lsp.h:158
@ LSP_HIGHLIGHT_TEXT
Definition lsp.h:157
LSPSignatureInfo * lsp_signature_help(LSPDocument *doc, LSPPosition position, size_t *signature_count, ArenaAllocator *arena)
Definition lsp_features.c:868
const char * lookup_module(LSPServer *server, const char *module_name)
Definition lsp_module.c:235
void serialize_document_highlights(LSPDocumentHighlight *highlights, size_t count, char *output, size_t output_size)
Definition lsp_json.c:492
int extract_int(const char *json, const char *key)
Definition lsp_json.c:153
LSPDocumentSymbol ** lsp_document_symbols(LSPDocument *doc, size_t *symbol_count, ArenaAllocator *arena)
Definition lsp_symbols.c:42
LSPSymbolKind
Definition lsp.h:84
@ LSP_SYMBOL_CLASS
Definition lsp.h:89
@ LSP_SYMBOL_MODULE
Definition lsp.h:86
@ LSP_SYMBOL_FUNCTION
Definition lsp.h:96
@ LSP_SYMBOL_PROPERTY
Definition lsp.h:91
@ LSP_SYMBOL_CONSTANT
Definition lsp.h:98
@ LSP_SYMBOL_PACKAGE
Definition lsp.h:88
@ LSP_SYMBOL_VARIABLE
Definition lsp.h:97
@ LSP_SYMBOL_BOOLEAN
Definition lsp.h:101
@ LSP_SYMBOL_INTERFACE
Definition lsp.h:95
@ LSP_SYMBOL_NUMBER
Definition lsp.h:100
@ LSP_SYMBOL_CONSTRUCTOR
Definition lsp.h:93
@ LSP_SYMBOL_ENUM
Definition lsp.h:94
@ LSP_SYMBOL_STRUCT
Definition lsp.h:103
@ LSP_SYMBOL_METHOD
Definition lsp.h:90
@ LSP_SYMBOL_FILE
Definition lsp.h:85
@ LSP_SYMBOL_FIELD
Definition lsp.h:92
@ LSP_SYMBOL_NAMESPACE
Definition lsp.h:87
@ LSP_SYMBOL_STRING
Definition lsp.h:99
@ LSP_SYMBOL_ARRAY
Definition lsp.h:102
const char * lsp_uri_to_path(const char *uri, ArenaAllocator *arena)
Definition lsp_server.c:124
LSPPosition extract_position(const char *json)
Definition lsp_json.c:176
void serialize_signature_help(LSPSignatureInfo *sig, char *output, size_t output_size)
Definition lsp_json.c:434
Symbol * lsp_symbol_at_position(LSPDocument *doc, LSPPosition position)
Definition lsp_document.c:385
void lsp_ast_cache_invalidate(LSPServer *server, const char *uri)
Definition lsp_module.c:496
void build_module_registry(LSPServer *server, const char *workspace_uri)
Definition lsp_module.c:221
bool lsp_server_init(LSPServer *server, ArenaAllocator *arena)
Definition lsp_server.c:149
LSPInsertTextFormat
Definition lsp.h:187
@ LSP_INSERT_FORMAT_SNIPPET
Definition lsp.h:189
@ LSP_INSERT_FORMAT_PLAIN_TEXT
Definition lsp.h:188
LSPDiagnostic * lsp_diagnostics(LSPDocument *doc, size_t *diagnostic_count, ArenaAllocator *arena)
Definition lsp_diagnostics.c:74
LSPCompletionItemKind
Definition lsp.h:171
@ LSP_COMPLETION_VARIABLE
Definition lsp.h:177
@ LSP_COMPLETION_METHOD
Definition lsp.h:173
@ LSP_COMPLETION_SNIPPET
Definition lsp.h:183
@ LSP_COMPLETION_PROPERTY
Definition lsp.h:181
@ LSP_COMPLETION_INTERFACE
Definition lsp.h:179
@ LSP_COMPLETION_FUNCTION
Definition lsp.h:174
@ LSP_COMPLETION_CLASS
Definition lsp.h:178
@ LSP_COMPLETION_TEXT
Definition lsp.h:172
@ LSP_COMPLETION_FIELD
Definition lsp.h:176
@ LSP_COMPLETION_STRUCT
Definition lsp.h:184
@ LSP_COMPLETION_MODULE
Definition lsp.h:180
@ LSP_COMPLETION_CONSTRUCTOR
Definition lsp.h:175
@ LSP_COMPLETION_KEYWORD
Definition lsp.h:182
bool lsp_document_close(LSPServer *server, const char *uri)
Definition lsp_document.c:66
void lsp_handle_message(LSPServer *server, const char *message)
Definition lsp_message.c:72
LSPMethod lsp_parse_method(const char *json)
Definition lsp_json.c:190
void lsp_server_run(LSPServer *server)
Definition lsp_server.c:173
void lsp_negative_cache_clear(void)
Definition lsp_module.c:37
AstNode * lsp_node_at_position(LSPDocument *doc, LSPPosition position)
Definition lsp_symbols.c:4
char * lsp_semantic_tokens_full(LSPDocument *doc, ArenaAllocator *arena)
Definition lsp_semantic_tokens.c:363
const char * serialize_rename_result(const char *edit_json, ArenaAllocator *arena)
const char * lsp_semantic_tokens_capabilities(void)
Definition lsp_semantic_tokens.c:454
LSPDocumentHighlight * lsp_document_highlight(LSPDocument *doc, LSPPosition position, size_t *highlight_count, ArenaAllocator *arena)
Definition lsp_features.c:1054
Token * lsp_token_at_position(LSPDocument *doc, LSPPosition position)
Definition lsp_document.c:363
LSPLocation * lsp_definition(LSPDocument *doc, LSPServer *server, LSPPosition position, ArenaAllocator *arena)
Definition lsp_features.c:440
LSPCodeAction * lsp_code_action(LSPDocument *doc, LSPPosition position, size_t *action_count, ArenaAllocator *arena)
Definition lsp_features.c:1011
#define MODULE_AST_CACHE_MAX
Definition lsp.h:266
void scan_std_library(LSPServer *server)
void lsp_server_shutdown(LSPServer *server)
Definition lsp_server.c:282
LSPMessageType
Definition lsp.h:19
@ LSP_RESPONSE
Definition lsp.h:19
@ LSP_NOTIFICATION
Definition lsp.h:19
@ LSP_REQUEST
Definition lsp.h:19
char * extract_string(const char *json, const char *key, ArenaAllocator *arena)
Definition lsp_json.c:78
bool lsp_document_update(LSPServer *server, const char *uri, const char *content, int version)
Definition lsp_document.c:43
LSPMethod
Definition lsp.h:21
@ LSP_METHOD_TEXT_DOCUMENT_CODE_ACTION
Definition lsp.h:35
@ LSP_METHOD_TEXT_DOCUMENT_COMPLETION_ITEM_RESOLVE
Definition lsp.h:38
@ LSP_METHOD_TEXT_DOCUMENT_SIGNATURE_HELP
Definition lsp.h:34
@ LSP_METHOD_TEXT_DOCUMENT_DID_CHANGE
Definition lsp.h:27
@ LSP_METHOD_TEXT_DOCUMENT_SEMANTIC_TOKENS
Definition lsp.h:33
@ LSP_METHOD_UNKNOWN
Definition lsp.h:40
@ LSP_METHOD_TEXT_DOCUMENT_FORMATTING
Definition lsp.h:39
@ LSP_METHOD_TEXT_DOCUMENT_DEFINITION
Definition lsp.h:30
@ LSP_METHOD_SHUTDOWN
Definition lsp.h:24
@ LSP_METHOD_TEXT_DOCUMENT_COMPLETION
Definition lsp.h:31
@ LSP_METHOD_TEXT_DOCUMENT_DID_CLOSE
Definition lsp.h:28
@ LSP_METHOD_TEXT_DOCUMENT_DID_OPEN
Definition lsp.h:26
@ LSP_METHOD_TEXT_DOCUMENT_HOVER
Definition lsp.h:29
@ LSP_METHOD_TEXT_DOCUMENT_DOCUMENT_SYMBOL
Definition lsp.h:32
@ LSP_METHOD_TEXT_DOCUMENT_RENAME
Definition lsp.h:36
@ LSP_METHOD_EXIT
Definition lsp.h:25
@ LSP_METHOD_TEXT_DOCUMENT_DOCUMENT_HIGHLIGHT
Definition lsp.h:37
@ LSP_METHOD_INITIALIZE
Definition lsp.h:22
@ LSP_METHOD_INITIALIZED
Definition lsp.h:23
LSPDiagnostic * convert_errors_to_diagnostics(size_t *diagnostic_count, ArenaAllocator *arena)
Definition lsp_diagnostics.c:4
size_t json_escape(char *dst, size_t dst_size, const char *src)
Definition lsp_json.c:327
void lsp_send_notification(const char *method, const char *params)
Definition lsp_json.c:292
void resolve_imports(LSPServer *server, LSPDocument *doc, BuildConfig *config, GrowableArray *imported_modules)
Definition lsp_module.c:564
void extract_imports(LSPDocument *doc, ArenaAllocator *arena)
Definition lsp_module.c:364
Arena allocator structure.
Definition memory.h:101
Definition ast.h:142
Configuration structure to hold build options parsed from CLI.
Definition help.h:48
Growable array backed by an arena allocator.
Definition memory.h:112
Definition lsp.h:207
const char * alias
Definition lsp.h:209
Scope * scope
Definition lsp.h:210
const char * module_path
Definition lsp.h:208
Definition lsp.h:132
LSPSignatureInfo * signatures
Definition lsp.h:133
size_t active_signature
Definition lsp.h:135
size_t signature_count
Definition lsp.h:134
LSPParameterInfo * active_parameter
Definition lsp.h:136
Definition lsp.h:143
const char * command
Definition lsp.h:146
const char * edit_uri
Definition lsp.h:149
const char * edit_title
Definition lsp.h:147
const char * edit_text
Definition lsp.h:148
const char * kind
Definition lsp.h:145
const char * title
Definition lsp.h:144
Definition lsp.h:192
const char * insert_text
Definition lsp.h:195
const char * detail
Definition lsp.h:197
LSPCompletionItemKind kind
Definition lsp.h:194
const char * documentation
Definition lsp.h:198
const char * label
Definition lsp.h:193
const char * sort_text
Definition lsp.h:199
LSPInsertTextFormat format
Definition lsp.h:196
const char * filter_text
Definition lsp.h:200
Definition lsp.h:73
const char * source
Definition lsp.h:77
const char * message
Definition lsp.h:76
LSPRange range
Definition lsp.h:74
LSPDiagnosticSeverity severity
Definition lsp.h:75
Definition lsp.h:162
LSPDocumentHighlightKind kind
Definition lsp.h:164
LSPRange range
Definition lsp.h:163
Definition lsp.h:106
LSPSymbolKind kind
Definition lsp.h:108
LSPRange range
Definition lsp.h:109
size_t child_count
Definition lsp.h:112
LSPRange selection_range
Definition lsp.h:110
const char * name
Definition lsp.h:107
struct LSPDocumentSymbol ** children
Definition lsp.h:111
Definition lsp.h:234
Scope * scope
Definition lsp.h:244
size_t token_count
Definition lsp.h:242
size_t import_count
Definition lsp.h:250
ImportedModule * imports
Definition lsp.h:249
LSPDiagnostic * diagnostics
Definition lsp.h:245
AstNode * ast
Definition lsp.h:243
Token * tokens
Definition lsp.h:241
size_t diagnostic_count
Definition lsp.h:246
ArenaAllocator * arena
Definition lsp.h:253
const char * uri
Definition lsp.h:236
const char * content
Definition lsp.h:237
int version
Definition lsp.h:238
bool needs_reanalysis
Definition lsp.h:254
Definition lsp.h:57
const char * uri
Definition lsp.h:58
LSPRange range
Definition lsp.h:59
Definition lsp.h:119
const char * label
Definition lsp.h:120
const char * documentation
Definition lsp.h:121
Definition lsp.h:47
int line
Definition lsp.h:48
int character
Definition lsp.h:49
Definition lsp.h:52
LSPPosition start
Definition lsp.h:53
LSPPosition end
Definition lsp.h:54
Definition lsp.h:268
LSPDocument ** documents
Definition lsp.h:270
bool initialized
Definition lsp.h:285
ArenaAllocator cache_arena
Definition lsp.h:281
ArenaAllocator * arena
Definition lsp.h:284
ModuleRegistry module_registry
Definition lsp.h:275
size_t document_count
Definition lsp.h:271
size_t ast_cache_count
Definition lsp.h:280
int client_process_id
Definition lsp.h:286
size_t document_capacity
Definition lsp.h:272
Definition lsp.h:124
size_t active_parameter
Definition lsp.h:128
size_t parameter_count
Definition lsp.h:127
const char * documentation
Definition lsp.h:129
const char * label
Definition lsp.h:125
LSPParameterInfo * parameters
Definition lsp.h:126
Definition lsp.h:260
long mtime
Definition lsp.h:263
AstNode * ast
Definition lsp.h:262
const char * uri
Definition lsp.h:261
Definition lsp.h:224
const char * module_uri
Definition lsp.h:227
AstNode * ast
Definition lsp.h:225
Scope * scope
Definition lsp.h:226
Definition lsp.h:213
const char * file_uri
Definition lsp.h:215
const char * module_name
Definition lsp.h:214
Definition lsp.h:218
ModuleRegistryEntry * entries
Definition lsp.h:219
size_t count
Definition lsp.h:220
size_t capacity
Definition lsp.h:221
Represents a lexical scope with hierarchical relationships.
Definition type.h:67
Represents a symbol with associated type and metadata.
Definition type.h:54
Represents a single token extracted by the lexer.
Definition lexer.h:151