mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	lsp(start_client): Allow passing custom workspaceFolders to the LSP (#15132)
Some language servers *cough*rust-analyzer*cough* need an empty/custom workspaceFolders for certain usecases. For example, rust-analyzer needs an empty workspaceFolders table for standalone file support (See https://github.com/rust-analyzer/rust-analyzer/pull/8955). This can also be useful for other languages that need to commonly open a certain directory (like flutter or lua), which would help prevent spinning up a new language server altogether. In case no workspaceFolders are passed, we fallback to what we had before.
This commit is contained in:
		| @@ -590,6 +590,10 @@ end | ||||
| --- as `initializationOptions`. See `initialize` in the LSP spec. | ||||
| --- | ||||
| --@param name (string, default=client-id) Name in log messages. | ||||
| -- | ||||
| --@param workspace_folders (table) List of workspace folders passed to the | ||||
| --- language server. Defaults to root_dir if not set. See `workspaceFolders` in | ||||
| --- the LSP spec | ||||
| --- | ||||
| --@param get_language_id function(bufnr, filetype) -> language ID as string. | ||||
| --- Defaults to the filetype. | ||||
| @@ -775,6 +779,14 @@ function lsp.start_client(config) | ||||
|       off = 'off'; messages = 'messages'; verbose = 'verbose'; | ||||
|     } | ||||
|     local version = vim.version() | ||||
|  | ||||
|     if not config.workspace_folders then | ||||
|       config.workspace_folders = {{ | ||||
|         uri = vim.uri_from_fname(config.root_dir); | ||||
|         name = string.format("%s", config.root_dir); | ||||
|       }}; | ||||
|     end | ||||
|  | ||||
|     local initialize_params = { | ||||
|       -- The process Id of the parent process that started the server. Is null if | ||||
|       -- the process has not been started by another process.  If the parent | ||||
| @@ -815,10 +827,7 @@ function lsp.start_client(config) | ||||
|       --  -- workspace folder in the user interface. | ||||
|       --  name | ||||
|       -- } | ||||
|       workspaceFolders = {{ | ||||
|         uri = vim.uri_from_fname(config.root_dir); | ||||
|         name = string.format("%s", config.root_dir); | ||||
|       }}; | ||||
|       workspaceFolders = config.workspace_folders, | ||||
|     } | ||||
|     if config.before_init then | ||||
|       -- TODO(ashkan) handle errors here. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 sim
					sim