|
1 | 1 | import os
|
| 2 | +import posixpath |
| 3 | +import re |
| 4 | +import sublime |
2 | 5 | import webbrowser
|
3 | 6 |
|
| 7 | +from LSP.plugin.core.url import uri_to_filename |
4 | 8 | from lsp_utils import NpmClientHandler
|
5 | 9 |
|
6 | 10 |
|
@@ -33,7 +37,71 @@ def on_workspace_configuration(self, params, configuration) -> None:
|
33 | 37 | if session:
|
34 | 38 | scope_uri = params.get('scopeUri')
|
35 | 39 | if scope_uri:
|
| 40 | + workspace_folder = None |
36 | 41 | for folder in session.get_workspace_folders():
|
37 | 42 | if folder.includes_uri(scope_uri):
|
38 |
| - configuration['workspaceFolder'] = folder.to_lsp() |
| 43 | + workspace_folder = folder |
39 | 44 | break
|
| 45 | + if workspace_folder: |
| 46 | + configuration['workspaceFolder'] = workspace_folder.to_lsp() |
| 47 | + self.resolve_working_directory(configuration, scope_uri, workspace_folder) |
| 48 | + |
| 49 | + def resolve_working_directory(self, configuration, scope_uri, workspace_folder) -> None: |
| 50 | + working_directories = configuration.get('workingDirectories', None) |
| 51 | + if isinstance(working_directories, list): |
| 52 | + working_directory = None |
| 53 | + workspace_folder_path = workspace_folder.path if workspace_folder else None |
| 54 | + for entry in working_directories: |
| 55 | + directory = None |
| 56 | + no_cwd = False |
| 57 | + if isinstance(entry, str): |
| 58 | + directory = entry |
| 59 | + elif self.is_working_directory_item(entry, 'directory'): |
| 60 | + directory = entry.directory |
| 61 | + if isinstance(entry.get('!cwd', None), bool): |
| 62 | + no_cwd = entry['!cwd'] |
| 63 | + elif self.is_working_directory_item(entry, 'pattern'): |
| 64 | + print('LSP-eslint: workingDirectories configuration that uses "pattern" is not supported') |
| 65 | + continue |
| 66 | + elif self.is_mode_item(entry): |
| 67 | + working_directory = entry |
| 68 | + continue |
| 69 | + |
| 70 | + directory_value = None |
| 71 | + if directory: |
| 72 | + file_path = uri_to_filename(scope_uri) |
| 73 | + if directory: |
| 74 | + directory = self.to_os_path(directory) |
| 75 | + if not os.path.isabs(directory) and workspace_folder_path: |
| 76 | + # Trailing '' will add trailing slash if missing. |
| 77 | + directory = os.path.join(workspace_folder_path, directory, '') |
| 78 | + if file_path.startswith(directory): |
| 79 | + directory_value = directory |
| 80 | + |
| 81 | + if directory_value: |
| 82 | + if not working_directory or self.is_mode_item(working_directory): |
| 83 | + working_directory = { 'directory': directory_value, '!cwd': no_cwd } |
| 84 | + else: |
| 85 | + if len(working_directory['directory']) < len(directory_value): |
| 86 | + working_directory['directory'] = directory_value |
| 87 | + working_directory['!cwd'] = no_cwd |
| 88 | + configuration['workingDirectory'] = working_directory |
| 89 | + configuration.pop('workingDirectories', None) |
| 90 | + |
| 91 | + def is_working_directory_item(self, item, configuration_key) -> bool: |
| 92 | + if isinstance(item, dict): |
| 93 | + value = item.get(configuration_key, None) |
| 94 | + not_cwd = item.get('!cwd', None) |
| 95 | + return isinstance(value, str) and (isinstance(not_cwd, bool) or not_cwd == None) |
| 96 | + return False |
| 97 | + |
| 98 | + def is_mode_item(self, item) -> bool: |
| 99 | + if isinstance(item, dict): |
| 100 | + mode = item.get('mode', None) |
| 101 | + return isinstance(mode, str) and mode in ('auto', 'location') |
| 102 | + return False |
| 103 | + |
| 104 | + def to_os_path(self, path) -> str: |
| 105 | + if sublime.platform == 'windows': |
| 106 | + path = re.sub(r'^\/(\w)\/', r'\1:\\', path) |
| 107 | + return os.path.normpath(path); |
0 commit comments