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