Merge branch 'master' into document-store-refactor
This commit is contained in:
commit
d6ef330984
@ -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
|
||||||
|
|
||||||
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -175,6 +175,24 @@ fn publishDiagnostics(server: *Server, writer: anytype, handle: DocumentStore.Ha
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
@ -270,6 +288,34 @@ fn publishDiagnostics(server: *Server, writer: anytype, handle: DocumentStore.Ha
|
|||||||
.source = "zls",
|
.source = "zls",
|
||||||
.message = try allocator.dupe(u8, pos_and_diag_iterator.rest()),
|
.message = try allocator.dupe(u8, pos_and_diag_iterator.rest()),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
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];
|
||||||
|
|
||||||
|
switch (decl_tag) {
|
||||||
|
.simple_var_decl,
|
||||||
|
.aligned_var_decl,
|
||||||
|
.local_var_decl,
|
||||||
|
.global_var_decl,
|
||||||
|
=> {
|
||||||
|
if (tags[main_tokens[decl]] != .keyword_var) continue; // skip anything immutable
|
||||||
|
// uncomment this to get a list :)
|
||||||
|
//log.debug("possible global variable \"{s}\"", .{tree.tokenSlice(decl_main_token + 1)});
|
||||||
|
try diagnostics.append(allocator, .{
|
||||||
|
.range = offsets.tokenToRange(tree, decl_main_token, server.offset_encoding),
|
||||||
|
.severity = .Hint,
|
||||||
|
.code = "highlight_global_var_declarations",
|
||||||
|
.source = "zls",
|
||||||
|
.message = "Global var declaration",
|
||||||
|
});
|
||||||
|
},
|
||||||
|
else => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try send(writer, server.arena.allocator(), types.Notification{
|
try send(writer, server.arena.allocator(), types.Notification{
|
||||||
|
@ -2825,7 +2825,9 @@ fn makeScopeInternal(allocator: std.mem.Allocator, context: ScopeContext, node_i
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
.switch_case,
|
.switch_case,
|
||||||
|
.switch_case_inline,
|
||||||
.switch_case_one,
|
.switch_case_one,
|
||||||
|
.switch_case_inline_one,
|
||||||
.switch_range,
|
.switch_range,
|
||||||
=> {
|
=> {
|
||||||
return;
|
return;
|
||||||
|
@ -437,6 +437,8 @@ pub fn lastToken(tree: Ast, node: Ast.Node.Index) Ast.TokenIndex {
|
|||||||
.array_type,
|
.array_type,
|
||||||
.switch_case_one,
|
.switch_case_one,
|
||||||
.switch_case,
|
.switch_case,
|
||||||
|
.switch_case_inline_one,
|
||||||
|
.switch_case_inline,
|
||||||
.switch_range,
|
.switch_range,
|
||||||
=> n = datas[n].rhs,
|
=> n = datas[n].rhs,
|
||||||
|
|
||||||
|
@ -548,8 +548,10 @@ fn writeNodeInlayHint(builder: *Builder, arena: *std.heap.ArenaAllocator, store:
|
|||||||
|
|
||||||
.switch_case_one,
|
.switch_case_one,
|
||||||
.switch_case,
|
.switch_case,
|
||||||
|
.switch_case_inline_one,
|
||||||
|
.switch_case_inline,
|
||||||
=> {
|
=> {
|
||||||
const switch_case = if (tag == .switch_case) tree.switchCase(node) else tree.switchCaseOne(node);
|
const switch_case = if (tag == .switch_case or tag == .switch_case_inline) tree.switchCase(node) else tree.switchCaseOne(node);
|
||||||
|
|
||||||
try callWriteNodeInlayHint(allocator, .{ builder, arena, store, switch_case.ast.target_expr, range });
|
try callWriteNodeInlayHint(allocator, .{ builder, arena, store, switch_case.ast.target_expr, range });
|
||||||
},
|
},
|
||||||
|
@ -176,13 +176,17 @@ fn symbolReferencesInternal(
|
|||||||
try symbolReferencesInternal(builder, case, handle);
|
try symbolReferencesInternal(builder, case, handle);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.switch_case_one => {
|
.switch_case_one,
|
||||||
|
.switch_case_inline_one,
|
||||||
|
=> {
|
||||||
const case_one = tree.switchCaseOne(node);
|
const case_one = tree.switchCaseOne(node);
|
||||||
try symbolReferencesInternal(builder, case_one.ast.target_expr, handle);
|
try symbolReferencesInternal(builder, case_one.ast.target_expr, handle);
|
||||||
for (case_one.ast.values) |val|
|
for (case_one.ast.values) |val|
|
||||||
try symbolReferencesInternal(builder, val, handle);
|
try symbolReferencesInternal(builder, val, handle);
|
||||||
},
|
},
|
||||||
.switch_case => {
|
.switch_case,
|
||||||
|
.switch_case_inline,
|
||||||
|
=> {
|
||||||
const case = tree.switchCase(node);
|
const case = tree.switchCase(node);
|
||||||
try symbolReferencesInternal(builder, case.ast.target_expr, handle);
|
try symbolReferencesInternal(builder, case.ast.target_expr, handle);
|
||||||
for (case.ast.values) |val|
|
for (case.ast.values) |val|
|
||||||
|
@ -354,7 +354,9 @@ fn writeNodeTokens(builder: *Builder, maybe_node: ?Ast.Node.Index) WriteTokensEr
|
|||||||
} else {
|
} else {
|
||||||
try writeTokenMod(builder, var_decl.ast.mut_token + 1, .variable, .{ .declaration = true });
|
try writeTokenMod(builder, var_decl.ast.mut_token + 1, .variable, .{ .declaration = true });
|
||||||
}
|
}
|
||||||
try writeToken(builder, var_decl.ast.mut_token + 2, .operator);
|
if (token_tags[var_decl.ast.mut_token + 2] == .equal) {
|
||||||
|
try writeToken(builder, var_decl.ast.mut_token + 2, .operator);
|
||||||
|
}
|
||||||
|
|
||||||
try callWriteNodeTokens(allocator, .{ builder, var_decl.ast.type_node });
|
try callWriteNodeTokens(allocator, .{ builder, var_decl.ast.type_node });
|
||||||
try callWriteNodeTokens(allocator, .{ builder, var_decl.ast.align_node });
|
try callWriteNodeTokens(allocator, .{ builder, var_decl.ast.align_node });
|
||||||
@ -518,8 +520,11 @@ fn writeNodeTokens(builder: *Builder, maybe_node: ?Ast.Node.Index) WriteTokensEr
|
|||||||
},
|
},
|
||||||
.switch_case_one,
|
.switch_case_one,
|
||||||
.switch_case,
|
.switch_case,
|
||||||
|
.switch_case_inline_one,
|
||||||
|
.switch_case_inline,
|
||||||
=> {
|
=> {
|
||||||
const switch_case = if (tag == .switch_case) tree.switchCase(node) else tree.switchCaseOne(node);
|
const switch_case = if (tag == .switch_case or tag == .switch_case_inline) tree.switchCase(node) else tree.switchCaseOne(node);
|
||||||
|
try writeToken(builder, switch_case.inline_token, .keyword);
|
||||||
for (switch_case.ast.values) |item_node| try callWriteNodeTokens(allocator, .{ builder, item_node });
|
for (switch_case.ast.values) |item_node| try callWriteNodeTokens(allocator, .{ builder, item_node });
|
||||||
// check it it's 'else'
|
// check it it's 'else'
|
||||||
if (switch_case.ast.values.len == 0) try writeToken(builder, switch_case.ast.arrow_token - 1, .keyword);
|
if (switch_case.ast.values.len == 0) try writeToken(builder, switch_case.ast.arrow_token - 1, .keyword);
|
||||||
|
Loading…
Reference in New Issue
Block a user