ability to highlight global variables (#655)

anything declared with "var" at the root level
This commit is contained in:
nullptrdevs 2022-10-09 22:13:15 -07:00 committed by GitHub
parent f204f3467e
commit 19fd17ff76
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 16 deletions

View File

@ -123,6 +123,7 @@ The following options are currently available.
|`include_at_in_builtins`|`bool`|`false`| Whether the @ sign should be part of the completion of builtins. |`include_at_in_builtins`|`bool`|`false`| Whether the @ sign should be part of the completion of builtins.
|`max_detail_length`|`usize`|`1024 * 1024`| The detail field of completions is truncated to be no longer than this (in bytes). |`max_detail_length`|`usize`|`1024 * 1024`| The detail field of completions is truncated to be no longer than this (in bytes).
| `skip_std_references` | `bool` | `false` | When true, skips searching for references in std. Improves lookup speed for functions in user's code. Renaming and go-to-definition will continue to work as is. | `skip_std_references` | `bool` | `false` | When true, skips searching for references in std. Improves lookup speed for functions in user's code. Renaming and go-to-definition will continue to work as is.
| `highlight_global_var_declarations` | `bool` | `false` | Whether to highlight global var declarations.
### Per-build Configuration Options ### Per-build Configuration Options

View File

@ -94,6 +94,11 @@
"description": "When true, skips searching for references in std. Improves lookup speed for functions in user's code. Renaming and go-to-definition will continue to work as is", "description": "When true, skips searching for references in std. Improves lookup speed for functions in user's code. Renaming and go-to-definition will continue to work as is",
"type": "boolean", "type": "boolean",
"default": "false" "default": "false"
},
"highlight_global_var_declarations": {
"description": "Whether to highlight global var declarations",
"type": "boolean",
"default": "false"
} }
} }
} }

View File

@ -76,6 +76,9 @@ skip_std_references: bool = false,
/// Path to "builtin;" useful for debugging, automatically set if let null /// Path to "builtin;" useful for debugging, automatically set if let null
builtin_path: ?[]const u8 = null, builtin_path: ?[]const u8 = null,
/// Whether to highlight global var declarations.
highlight_global_var_declarations: bool = false,
pub fn loadFromFile(allocator: std.mem.Allocator, file_path: []const u8) ?Config { pub fn loadFromFile(allocator: std.mem.Allocator, file_path: []const u8) ?Config {
const tracy_zone = tracy.trace(@src()); const tracy_zone = tracy.trace(@src());
defer tracy_zone.end(); defer tracy_zone.end();

View File

@ -175,6 +175,24 @@ fn publishDiagnostics(server: *Server, writer: anytype, handle: *DocumentStore.H
}); });
} }
for (handle.cimports) |cimport| {
if (cimport.result != .failure) continue;
const stderr = std.mem.trim(u8, cimport.result.failure, " ");
var pos_and_diag_iterator = std.mem.split(u8, stderr, ":");
_ = pos_and_diag_iterator.next(); // skip file path
_ = pos_and_diag_iterator.next(); // skip line
_ = pos_and_diag_iterator.next(); // skip character
try diagnostics.append(allocator, .{
.range = offsets.nodeToRange(handle.tree, cimport.node, server.offset_encoding),
.severity = .Error,
.code = "cImport",
.source = "zls",
.message = try allocator.dupe(u8, pos_and_diag_iterator.rest()),
});
}
if (server.config.enable_ast_check_diagnostics and tree.errors.len == 0) { if (server.config.enable_ast_check_diagnostics and tree.errors.len == 0) {
try getAstCheckDiagnostics(server, handle, &diagnostics); try getAstCheckDiagnostics(server, handle, &diagnostics);
} }
@ -251,23 +269,34 @@ fn publishDiagnostics(server: *Server, writer: anytype, handle: *DocumentStore.H
} }
} }
} }
if (server.config.highlight_global_var_declarations) {
const main_tokens = tree.nodes.items(.main_token);
const tags = tree.tokens.items(.tag);
for (tree.rootDecls()) |decl| {
const decl_tag = tree.nodes.items(.tag)[decl];
const decl_main_token = tree.nodes.items(.main_token)[decl];
for (handle.cimports) |cimport| { switch (decl_tag) {
if (cimport.result != .failure) continue; .simple_var_decl,
const stderr = std.mem.trim(u8, cimport.result.failure, " "); .aligned_var_decl,
.local_var_decl,
var pos_and_diag_iterator = std.mem.split(u8, stderr, ":"); .global_var_decl,
_ = pos_and_diag_iterator.next(); // skip file path => {
_ = pos_and_diag_iterator.next(); // skip line if (tags[main_tokens[decl]] != .keyword_var) continue; // skip anything immutable
_ = pos_and_diag_iterator.next(); // skip character // uncomment this to get a list :)
//log.debug("possible global variable \"{s}\"", .{tree.tokenSlice(decl_main_token + 1)});
try diagnostics.append(allocator, .{ try diagnostics.append(allocator, .{
.range = offsets.nodeToRange(handle.tree, cimport.node, server.offset_encoding), .range = offsets.tokenToRange(tree, decl_main_token, server.offset_encoding),
.severity = .Error, .severity = .Hint,
.code = "cImport", .code = "highlight_global_var_declarations",
.source = "zls", .source = "zls",
.message = try allocator.dupe(u8, pos_and_diag_iterator.rest()), .message = "Global var declaration",
}); });
},
else => {},
}
}
} }
try send(writer, server.arena.allocator(), types.Notification{ try send(writer, server.arena.allocator(), types.Notification{