Skip to content

Commit

Permalink
view.window() can be none, workaround for closing (#155)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomv564 authored Oct 7, 2017
1 parent 740b57d commit 970b37e
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 35 deletions.
84 changes: 50 additions & 34 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -801,8 +801,9 @@ def get_project_config(window: sublime.Window) -> dict:


def get_window_client_config(view: sublime.View) -> 'Optional[ClientConfig]':
if view.window():
configs_for_window = window_client_configs.get(view.window().id(), [])
window = view.window()
if window:
configs_for_window = window_client_configs.get(window.id(), [])
return get_scope_client_config(view, configs_for_window)
else:
return None
Expand All @@ -820,35 +821,43 @@ def clear_window_client_configs(window: 'sublime.Window'):


def apply_window_settings(client_config: 'ClientConfig', view: 'sublime.View') -> 'ClientConfig':
window_config = get_project_config(view.window())

if client_config.name in window_config:
overrides = window_config[client_config.name]
debug('window has override for', client_config.name, overrides)
return ClientConfig(
client_config.name,
overrides.get("command", client_config.binary_args),
overrides.get("scopes", client_config.scopes),
overrides.get("syntaxes", client_config.syntaxes),
overrides.get("languageId", client_config.languageId),
overrides.get("enabled", client_config.enabled),
overrides.get("initializationOptions", client_config.init_options),
overrides.get("settings", client_config.settings),
overrides.get("env", client_config.env)
)
else:
return client_config
window = view.window()
if window:
window_config = get_project_config(window)

if client_config.name in window_config:
overrides = window_config[client_config.name]
debug('window has override for', client_config.name, overrides)
return ClientConfig(
client_config.name,
overrides.get("command", client_config.binary_args),
overrides.get("scopes", client_config.scopes),
overrides.get("syntaxes", client_config.syntaxes),
overrides.get("languageId", client_config.languageId),
overrides.get("enabled", client_config.enabled),
overrides.get("initializationOptions", client_config.init_options),
overrides.get("settings", client_config.settings),
overrides.get("env", client_config.env)
)

return client_config


def config_for_scope(view: sublime.View) -> 'Optional[ClientConfig]':
# check window_client_config first
window_client_config = get_window_client_config(view)
if not window_client_config:
global_client_config = get_global_client_config(view)
if global_client_config and view.window():
window_client_config = apply_window_settings(global_client_config, view)
add_window_client_config(view.window(), window_client_config)
return window_client_config

if global_client_config:
window = view.window()
if window:
window_client_config = apply_window_settings(global_client_config, view)
add_window_client_config(window, window_client_config)
return window_client_config
else:
# always return a client config even if the view has no window anymore
return global_client_config

return window_client_config

Expand Down Expand Up @@ -894,14 +903,20 @@ def uri_to_filename(uri: str) -> str:


def client_for_view(view: sublime.View) -> 'Optional[Client]':
window = view.window()
if not window:
debug("no window for view", view.file_name())
return None

config = config_for_scope(view)
if not config:
debug("config not available for view", view.file_name())
return None
clients = window_clients(view.window())

clients = window_clients(window)
if config.name not in clients:
debug(config.name, "not available for view",
view.file_name(), "in window", view.window().id())
view.file_name(), "in window", window.id())
return None
else:
return clients[config.name]
Expand All @@ -920,11 +935,11 @@ def window_clients(window: sublime.Window) -> 'Dict[str, Client]':


def initialize_on_open(view: sublime.View):
if not view.window():
return

window = view.window()

if not window:
return

if window.id() in clients_by_window:
unload_old_clients(window)

Expand All @@ -934,7 +949,7 @@ def initialize_on_open(view: sublime.View):
if config.enabled:
if config.name not in window_clients(window):
didopen_after_initialize.append(view)
get_window_client(view, config)
get_window_client(view, window, config)
else:
debug(config.name, 'is not enabled')
else:
Expand All @@ -952,7 +967,9 @@ def show_enable_config(view: sublime.View, config: ClientConfig):
message = "LSP has found a language server for {}. Run \"Setup Language Server\" to start using it".format(
extract_syntax_name(syntax)
)
view.window().status_message(message)
window = view.window()
if window:
window.status_message(message)


class LspEnableLanguageServerGloballyCommand(sublime_plugin.WindowCommand):
Expand Down Expand Up @@ -1853,10 +1870,9 @@ def start_client(window: sublime.Window, config: ClientConfig):
return client


def get_window_client(view: sublime.View, config: ClientConfig) -> Client:
def get_window_client(view: sublime.View, window: sublime.Window, config: ClientConfig) -> Client:
global clients_by_window

window = view.window()
clients = window_clients(window)
if config.name not in clients:
client = start_client(window, config)
Expand Down Expand Up @@ -2344,7 +2360,7 @@ def get_diagnostics_for_view(view: sublime.View) -> 'List[Diagnostic]':
window = view.window()
file_path = view.file_name()
origin = 'lsp'
if file_path:
if file_path and window:
if window.id() in window_file_diagnostics:
file_diagnostics = window_file_diagnostics[window.id()]
if file_path in file_diagnostics:
Expand Down
2 changes: 1 addition & 1 deletion stubs/sublime.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ class View:
def buffer_id(self) -> int: ...
def is_valid(self) -> bool: ...
def is_primary(self) -> bool: ...
def window(self) -> Window: ...
def window(self) -> Optional[Window]: ...
def file_name(self) -> Optional[str]: ...
def close(self) -> None: ...
def retarget(self, new_fname: str) -> None: ...
Expand Down

0 comments on commit 970b37e

Please sign in to comment.