diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2025-09-22 22:33:28 +0200 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2025-09-22 22:33:28 +0200 |
| commit | 0cc6300920f1a8b8f5191f30f9f5eae1b301959d (patch) | |
| tree | 0c1827fc11d9c12071fe02a4ae66f4dbd1b418b6 /src/server | |
| parent | 28d540bb5f838815e23622d97cd5d3a55776414d (diff) | |
Add support for graying out unused imports
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/documents.odin | 65 | ||||
| -rw-r--r-- | src/server/requests.odin | 2 | ||||
| -rw-r--r-- | src/server/types.odin | 7 |
3 files changed, 44 insertions, 30 deletions
diff --git a/src/server/documents.odin b/src/server/documents.odin index cf8a344..591c56c 100644 --- a/src/server/documents.odin +++ b/src/server/documents.odin @@ -76,7 +76,7 @@ document_get_allocator :: proc() -> ^virtual.Arena { return pop(&document_storage.free_allocators) } else { allocator := new(virtual.Arena) - _ = virtual.arena_init_growing(allocator) + _ = virtual.arena_init_growing(allocator) return allocator } } @@ -319,26 +319,50 @@ document_refresh :: proc(document: ^Document, config: ^common.Config, writer: ^W return .None } - if writer != nil && len(errors) > 0 && !config.disable_parser_errors { + if writer != nil && !config.disable_parser_errors { document.diagnosed_errors = true + diagnostics := make([dynamic]Diagnostic, 0, len(errors), context.temp_allocator) + params := NotificationPublishDiagnosticsParams { - uri = document.uri.uri, - diagnostics = make([]Diagnostic, len(errors), context.temp_allocator), + uri = document.uri.uri, } for error, i in errors { - params.diagnostics[i] = Diagnostic { - range = common.Range { - start = common.Position{line = error.line - 1, character = 0}, - end = common.Position{line = error.line, character = 0}, + append( + &diagnostics, + Diagnostic { + range = common.Range { + start = common.Position{line = error.line - 1, character = 0}, + end = common.Position{line = error.line, character = 0}, + }, + severity = DiagnosticSeverity.Error, + code = "Syntax", + message = error.message, }, - severity = DiagnosticSeverity.Error, - code = "Syntax", - message = error.message, + ) + } + + if config.enable_unused_imports_reporting { + unused_imports := find_unused_imports(document, context.temp_allocator) + + for imp in unused_imports { + append( + &diagnostics, + Diagnostic { + range = common.get_token_range(imp.import_decl, document.ast.src), + severity = DiagnosticSeverity.Hint, + code = "Unused", + message = "unused import", + tags = {.Unnecessary}, + }, + ) } + } + params.diagnostics = diagnostics[:] + notifaction := Notification { jsonrpc = "2.0", method = "textDocument/publishDiagnostics", @@ -348,25 +372,6 @@ document_refresh :: proc(document: ^Document, config: ^common.Config, writer: ^W send_notification(notifaction, writer) } - if writer != nil && len(errors) == 0 { - //send empty diagnosis to remove the clients errors - if document.diagnosed_errors { - - notifaction := Notification { - jsonrpc = "2.0", - method = "textDocument/publishDiagnostics", - params = NotificationPublishDiagnosticsParams { - uri = document.uri.uri, - diagnostics = make([]Diagnostic, len(errors), context.temp_allocator), - }, - } - - document.diagnosed_errors = false - - send_notification(notifaction, writer) - } - } - return .None } diff --git a/src/server/requests.odin b/src/server/requests.odin index 0cbcd99..355cf1b 100644 --- a/src/server/requests.odin +++ b/src/server/requests.odin @@ -362,6 +362,7 @@ read_ols_initialize_options :: proc(config: ^common.Config, ols_config: OlsConfi config.enable_format = ols_config.enable_format.(bool) or_else config.enable_format config.enable_hover = ols_config.enable_hover.(bool) or_else config.enable_hover config.enable_semantic_tokens = ols_config.enable_semantic_tokens.(bool) or_else config.enable_semantic_tokens + config.enable_unused_imports_reporting = ols_config.enable_unused_imports_reporting.(bool) or_else config.enable_unused_imports_reporting config.enable_procedure_context = ols_config.enable_procedure_context.(bool) or_else config.enable_procedure_context config.enable_snippets = ols_config.enable_snippets.(bool) or_else config.enable_snippets @@ -614,6 +615,7 @@ request_initialize :: proc( config.enable_format = true config.enable_hover = true config.enable_semantic_tokens = false + config.enable_unused_imports_reporting = true config.enable_procedure_context = false config.enable_snippets = false config.enable_references = true diff --git a/src/server/types.odin b/src/server/types.odin index 6442503..75161c5 100644 --- a/src/server/types.odin +++ b/src/server/types.odin @@ -274,11 +274,17 @@ DiagnosticSeverity :: enum { Hint = 4, } + DiagnosticTag :: enum int { + Unnecessary = 1, + Deprecated = 2, + } + Diagnostic :: struct { range: common.Range, severity: DiagnosticSeverity, code: string, message: string, + tags: [1]DiagnosticTag, } DidOpenTextDocumentParams :: struct { @@ -417,6 +423,7 @@ OlsConfig :: struct { enable_inlay_hints_params: Maybe(bool), enable_inlay_hints_default_params: Maybe(bool), enable_semantic_tokens: Maybe(bool), + enable_unused_imports_reporting: Maybe(bool), enable_procedure_context: Maybe(bool), enable_snippets: Maybe(bool), enable_procedure_snippet: Maybe(bool), |