Skip to content

Commit eaeb148

Browse files
committed
Re-add support for workspace/symbol with Project
1 parent 817f38b commit eaeb148

5 files changed

Lines changed: 60 additions & 27 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
44

55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## 0.6.0
8+
9+
### Added
10+
11+
- Re-added `workspace/symbol` support using Jedi's `Project` object. This is much simpler and faster than the previous implementation.
12+
713
## 0.5.2
814

915
### Changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ A [Language Server](https://microsoft.github.io/language-server-protocol/) for t
1313
From your command line (bash / zsh), run:
1414

1515
```bash
16-
pip install -U jedi jedi-language-server
16+
pip install -U jedi-language-server
1717
```
1818

1919
`-U` ensures that you're pulling the latest version from pypi.
2020

21+
Alternatively, consider using [pipx](https://github.com/pipxproject/pipx) to keep jedi-language-server isolated from your other Python dependencies.
22+
2123
## Overview
2224

2325
jedi-language-server aims to support all of Jedi's capabilities and expose them through the Language Server Protocol. It currently supports the following Language Server requests:
@@ -28,6 +30,7 @@ jedi-language-server aims to support all of Jedi's capabilities and expose them
2830
- [textDocument/hover](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_hover)
2931
- [textDocument/references](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_references)
3032
- [textDocument/rename](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rename)
33+
- [workspace/symbol](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_symbol)
3134

3235
These language server requests are not currently configurable by the user, but we expect to relax this constraint in a future release.
3336

jedi_language_server/server.py

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
https://microsoft.github.io/language-server-protocol/specification
77
"""
88

9+
import itertools
910
from typing import Dict # pylint: disable=unused-import
1011
from typing import List, Optional
1112

@@ -16,6 +17,7 @@
1617
HOVER,
1718
REFERENCES,
1819
RENAME,
20+
WORKSPACE_SYMBOL,
1921
)
2022
from pygls.server import LanguageServer
2123
from pygls.types import (
@@ -30,11 +32,13 @@
3032
TextDocumentPositionParams,
3133
TextEdit,
3234
WorkspaceEdit,
35+
WorkspaceSymbolParams,
3336
)
3437

3538
from .server_utils import (
3639
get_jedi_line_column,
37-
get_jedi_types,
40+
get_jedi_project,
41+
get_jedi_script,
3842
get_location_from_name,
3943
get_symbol_information_from_name,
4044
)
@@ -46,9 +50,9 @@
4650
@SERVER.feature(COMPLETION, triggerCharacters=["."])
4751
def lsp_completion(server: LanguageServer, params: CompletionParams):
4852
"""Returns completion items"""
49-
jedi_types = get_jedi_types(server, params.textDocument)
53+
jedi_script = get_jedi_script(server, params.textDocument)
5054
jedi_lines = get_jedi_line_column(params.position)
51-
completions = jedi_types.script.complete(**jedi_lines)
55+
completions = jedi_script.complete(**jedi_lines)
5256
return CompletionList(
5357
is_incomplete=False,
5458
items=[
@@ -69,9 +73,9 @@ def lsp_definition(
6973
server: LanguageServer, params: TextDocumentPositionParams
7074
) -> List[Location]:
7175
"""Support Goto Definition"""
72-
jedi_types = get_jedi_types(server, params.textDocument)
76+
jedi_script = get_jedi_script(server, params.textDocument)
7377
jedi_lines = get_jedi_line_column(params.position)
74-
names = jedi_types.script.goto(
78+
names = jedi_script.goto(
7579
follow_imports=True, follow_builtin_imports=True, **jedi_lines,
7680
)
7781
return [get_location_from_name(name) for name in names]
@@ -82,10 +86,10 @@ def lsp_hover(
8286
server: LanguageServer, params: TextDocumentPositionParams
8387
) -> Hover:
8488
"""Support Hover"""
85-
jedi_types = get_jedi_types(server, params.textDocument)
89+
jedi_script = get_jedi_script(server, params.textDocument)
8690
jedi_lines = get_jedi_line_column(params.position)
8791
try:
88-
_names = jedi_types.script.help(**jedi_lines)
92+
_names = jedi_script.help(**jedi_lines)
8993
except Exception: # pylint: disable=broad-except
9094
names = [] # type: List[str]
9195
else:
@@ -98,10 +102,10 @@ def lsp_references(
98102
server: LanguageServer, params: TextDocumentPositionParams
99103
) -> List[Location]:
100104
"""Obtain all references to document"""
101-
jedi_types = get_jedi_types(server, params.textDocument)
105+
jedi_script = get_jedi_script(server, params.textDocument)
102106
jedi_lines = get_jedi_line_column(params.position)
103107
try:
104-
names = jedi_types.script.get_references(**jedi_lines)
108+
names = jedi_script.get_references(**jedi_lines)
105109
except Exception: # pylint: disable=broad-except
106110
return []
107111
return [get_location_from_name(name) for name in names]
@@ -112,10 +116,10 @@ def lsp_rename(
112116
server: LanguageServer, params: RenameParams
113117
) -> Optional[WorkspaceEdit]:
114118
"""Rename a symbol across a workspace"""
115-
jedi_types = get_jedi_types(server, params.textDocument)
119+
jedi_script = get_jedi_script(server, params.textDocument)
116120
jedi_lines = get_jedi_line_column(params.position)
117121
try:
118-
names = jedi_types.script.get_references(**jedi_lines)
122+
names = jedi_script.get_references(**jedi_lines)
119123
except Exception: # pylint: disable=broad-except
120124
return None
121125
locations = [get_location_from_name(name) for name in names]
@@ -136,9 +140,27 @@ def lsp_document_symbol(
136140
server: LanguageServer, params: DocumentSymbolParams
137141
) -> List[SymbolInformation]:
138142
"""Document Python document symbols"""
139-
jedi_types = get_jedi_types(server, params.textDocument)
143+
jedi_script = get_jedi_script(server, params.textDocument)
140144
try:
141-
names = jedi_types.script.get_names()
145+
names = jedi_script.get_names()
142146
except Exception: # pylint: disable=broad-except
143147
return []
144148
return [get_symbol_information_from_name(name) for name in names]
149+
150+
151+
@SERVER.feature(WORKSPACE_SYMBOL)
152+
def lsp_workspace_symbol(
153+
server: LanguageServer, params: WorkspaceSymbolParams
154+
) -> List[SymbolInformation]:
155+
"""Document Python workspace symbols"""
156+
jedi_project = get_jedi_project(server)
157+
if params.query.strip() == "":
158+
return []
159+
try:
160+
names = jedi_project.search(params.query)
161+
except Exception: # pylint: disable=broad-except
162+
return []
163+
return [
164+
get_symbol_information_from_name(name)
165+
for name in itertools.islice(names, 20)
166+
]

jedi_language_server/server_utils.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Utility functions used by the language server"""
22

3-
from typing import Dict, NamedTuple, Optional
3+
from typing import Dict, Optional
44

55
from jedi import Project, Script
66
from jedi.api.classes import Name
@@ -18,16 +18,9 @@
1818
from .type_map import get_lsp_symbol_type
1919

2020

21-
class JediTypes(NamedTuple):
22-
"""Jedi types container; return value from get_jedi_types"""
23-
24-
script: Script
25-
project: Project
26-
27-
28-
def get_jedi_types(
21+
def get_jedi_script(
2922
server: LanguageServer, text_document_identifier: TextDocumentIdentifier
30-
) -> JediTypes:
23+
) -> Script:
3124
"""Simplifies getting jedi Script"""
3225
workspace = server.workspace
3326
document = workspace.get_document(text_document_identifier.uri)
@@ -36,13 +29,22 @@ def get_jedi_types(
3629
smart_sys_path=True,
3730
load_unsafe_extensions=False,
3831
)
39-
script = Script(
32+
return Script(
4033
code=document.source,
4134
path=document.path,
4235
project=project,
4336
environment=get_cached_default_environment(),
4437
)
45-
return JediTypes(script=script, project=project)
38+
39+
40+
def get_jedi_project(server: LanguageServer) -> Project:
41+
"""Simplifies getting jedi project"""
42+
workspace = server.workspace
43+
return Project(
44+
path=workspace.root_path,
45+
smart_sys_path=True,
46+
load_unsafe_extensions=False,
47+
)
4648

4749

4850
def get_location_from_name(name: Name) -> Location:

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ include_trailing_comma = true
1313

1414
[tool.poetry]
1515
name = "jedi-language-server"
16-
version = "0.5.2"
16+
version = "0.6.0"
1717
description = "A language server for Jedi!"
1818
authors = ["Sam Roeca <samuel.roeca@gmail.com>"]
1919
readme = "README.md"

0 commit comments

Comments
 (0)