diff --git a/pyls/plugins/definition.py b/pyls/plugins/definition.py index cd1e4dd3..0e79a795 100644 --- a/pyls/plugins/definition.py +++ b/pyls/plugins/definition.py @@ -12,8 +12,9 @@ def pyls_definitions(document, position): d for d in definitions if d.is_definition() and d.line is not None and d.column is not None ] + return [{ - 'uri': workspace.get_uri_like(document.uri, d.module_path), + 'uri': workspace.get_uri_like(document.uri, d.module_path) if d.module_path else document.uri, 'range': { 'start': {'line': d.line - 1, 'character': d.column}, 'end': {'line': d.line - 1, 'character': d.column + len(d.name)} diff --git a/pyls/plugins/references.py b/pyls/plugins/references.py index ad338bdf..c77e26c9 100644 --- a/pyls/plugins/references.py +++ b/pyls/plugins/references.py @@ -15,7 +15,7 @@ def pyls_references(document, position, exclude_declaration=False): usages = [d for d in usages if not d.is_definition()] return [{ - 'uri': workspace.get_uri_like(document.uri, d.module_path), + 'uri': workspace.get_uri_like(document.uri, d.module_path) if d.module_path else document.uri, 'range': { 'start': {'line': d.line - 1, 'character': d.column}, 'end': {'line': d.line - 1, 'character': d.column + len(d.name)} diff --git a/pyls/workspace.py b/pyls/workspace.py index 973ce394..29f898de 100644 --- a/pyls/workspace.py +++ b/pyls/workspace.py @@ -4,7 +4,7 @@ import os import re import sys -from urllib.parse import urlparse, urlunparse, unquote +from urllib.parse import urlparse, urlunparse, quote, unquote import jedi @@ -181,5 +181,10 @@ def get_uri_like(doc_uri, path): unicode objects. """ parts = list(urlparse(doc_uri)) + if path[0] != '/' and ':' in path: # fix path for windows + drivespec, path = path.split(':', 1) + path = '/' + drivespec + ':' + quote(path.replace('\\', '/')) + else: + path = quote(path) parts[2] = path return urlunparse([str(p) for p in parts]) diff --git a/test/test_workspace.py b/test/test_workspace.py index 37cbf2db..a66c1927 100644 --- a/test/test_workspace.py +++ b/test/test_workspace.py @@ -36,6 +36,10 @@ def test_bad_get_document(pyls): def test_uri_like(): assert workspace.get_uri_like('file:///some-path', '/my/path') == 'file:///my/path' + win_doc_uri = r'file:///D:/hello%20world.py' + win_doc_path = r'D:\hello world.py' + win_uri = workspace.get_uri_like(win_doc_uri, win_doc_path) + assert win_uri == win_doc_uri def test_non_root_project(pyls):