summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2025-09-22 22:33:28 +0200
committerDanielGavin <danielgavin5@hotmail.com>2025-09-22 22:33:28 +0200
commit0cc6300920f1a8b8f5191f30f9f5eae1b301959d (patch)
tree0c1827fc11d9c12071fe02a4ae66f4dbd1b418b6
parent28d540bb5f838815e23622d97cd5d3a55776414d (diff)
Add support for graying out unused imports
-rw-r--r--src/common/config.odin1
-rw-r--r--src/server/documents.odin65
-rw-r--r--src/server/requests.odin2
-rw-r--r--src/server/types.odin7
4 files changed, 45 insertions, 30 deletions
diff --git a/src/common/config.odin b/src/common/config.odin
index 5b2923c..ae5597f 100644
--- a/src/common/config.odin
+++ b/src/common/config.odin
@@ -21,6 +21,7 @@ Config :: struct {
enable_hover: bool,
enable_document_symbols: bool,
enable_semantic_tokens: bool,
+ enable_unused_imports_reporting: bool,
enable_inlay_hints: bool,
enable_inlay_hints_params: bool,
enable_inlay_hints_default_params: bool,
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),