From 30c01e08d4f566f724bf50c781ae6db57b236c8f Mon Sep 17 00:00:00 2001 From: Jake Wang Date: Fri, 18 Sep 2026 20:55:35 -0400 Subject: [PATCH] Preserve target authorities in definition and reference URIs --- pylsp/plugins/definition.py | 2 +- pylsp/plugins/references.py | 2 +- test/plugins/test_location_uris.py | 65 ++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 test/plugins/test_location_uris.py diff --git a/pylsp/plugins/definition.py b/pylsp/plugins/definition.py index a40ffbbd..ff8c806d 100644 --- a/pylsp/plugins/definition.py +++ b/pylsp/plugins/definition.py @@ -64,7 +64,7 @@ def pylsp_definitions( follow_builtin_defns = settings.get("follow_builtin_definitions", True) return [ { - "uri": uris.uri_with(document.uri, path=str(d.module_path)), + "uri": uris.from_fs_path(str(d.module_path)), "range": { "start": {"line": d.line - 1, "character": d.column}, "end": {"line": d.line - 1, "character": d.column + len(d.name)}, diff --git a/pylsp/plugins/references.py b/pylsp/plugins/references.py index a4c61b52..fb76d704 100644 --- a/pylsp/plugins/references.py +++ b/pylsp/plugins/references.py @@ -20,7 +20,7 @@ def pylsp_references(document, position, exclude_declaration): # Filter out builtin modules return [ { - "uri": uris.uri_with(document.uri, path=str(d.module_path)) + "uri": uris.from_fs_path(str(d.module_path)) if d.module_path else document.uri, "range": { diff --git a/test/plugins/test_location_uris.py b/test/plugins/test_location_uris.py new file mode 100644 index 00000000..0133348a --- /dev/null +++ b/test/plugins/test_location_uris.py @@ -0,0 +1,65 @@ +# Copyright 2021- Python Language Server Contributors. + +from pathlib import PureWindowsPath +from types import SimpleNamespace + +import pytest + +from pylsp import uris +from pylsp.plugins.definition import pylsp_definitions +from pylsp.plugins.references import pylsp_references +from pylsp.workspace import Document + + +@pytest.mark.parametrize("operation", ["definition", "references"]) +@pytest.mark.parametrize( + "document_uri,target_path,expected_uri", + [ + ( + "file:///c:/project/main.py", + r"\\server\share\target.py", + "file://server/share/target.py", + ), + ( + "file://server/share/main.py", + r"\\other\share\target.py", + "file://other/share/target.py", + ), + ( + "file://server/share/main.py", + r"C:\project\target.py", + "file:///c:/project/target.py", + ), + ( + "file://server/share/main.py", + r"\\server\share\target.py", + "file://server/share/target.py", + ), + ], +) +def test_location_uri( + config, workspace, monkeypatch, operation, document_uri, target_path, expected_uri +) -> None: + monkeypatch.setattr(uris, "IS_WIN", True) + name = SimpleNamespace( + module_path=PureWindowsPath(target_path), + line=1, + column=0, + name="target", + is_definition=lambda: True, + in_builtin_module=lambda: False, + ) + script = SimpleNamespace( + goto=lambda **kwargs: [name], get_references=lambda **kwargs: [name] + ) + document = Document(document_uri, workspace, "target()") + monkeypatch.setattr(document, "jedi_script", lambda **kwargs: script) + position = {"line": 0, "character": 0} + + if operation == "definition": + locations = pylsp_definitions(config, document, position) + else: + locations = pylsp_references(document, position, exclude_declaration=False) + + assert len(locations) == 1 + assert locations[0]["uri"] == expected_uri