[Python] Cannot structure `WorkspaceSymbolResponse` with unresolved symbols
0xJonas opened this issue · comments
Jonas Rinke commented
The workspace/symbol request can include WorkspaceSymbol
instances where the location
field only contains a uri
but not a range
. The spec models this incomplete Location
as a distinct type: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspaceSymbol. However, when attempting to structure such a response, an exception is raised:
>>> from lsprotocol import types, converters
>>> converter = converters.get_converter()
>>> converter.structure({"id": 1, "result": [{"name": "test", "kind": 1, "location": {"uri": "test"}}], "jsonrpc": "2.0"}, types.WorkspaceSymbolResponse)
+ Exception Group Traceback (most recent call last):
| File "<stdin>", line 1, in <module>
| File "C:\Users\Jonas\Documents\quickP\LSPScript\.venv\lib\site-packages\cattrs\converters.py", line 332, in structure
| return self._structure_func.dispatch(cl)(obj, cl)
| File "<cattrs generated structure lsprotocol.types.WorkspaceSymbolResponse>", line 21, in structure_WorkspaceSymbolResponse
| if errors: raise __c_cve('While structuring ' + 'WorkspaceSymbolResponse', errors, __cl)
| cattrs.errors.ClassValidationError: While structuring WorkspaceSymbolResponse (1 sub-exception)
+-+---------------- 1 ----------------
| Exception Group Traceback (most recent call last):
| File "<cattrs generated structure lsprotocol.types.WorkspaceSymbolResponse>", line 11, in structure_WorkspaceSymbolResponse
| res['result'] = __c_structure_result(o['result'], __c_type_result)
| File "C:\Users\Jonas\Documents\quickP\LSPScript\.venv\lib\site-packages\cattrs\converters.py", line 632, in _structure_union
| return handler(obj, union)
| File "C:\Users\Jonas\Documents\quickP\LSPScript\.venv\lib\site-packages\lsprotocol\_hooks.py", line 693, in _symbol_list_hook
| return [
| File "C:\Users\Jonas\Documents\quickP\LSPScript\.venv\lib\site-packages\lsprotocol\_hooks.py", line 694, in <listcomp>
| converter.structure(item, lsp_types.SymbolInformation)
| File "C:\Users\Jonas\Documents\quickP\LSPScript\.venv\lib\site-packages\cattrs\converters.py", line 332, in structure
| return self._structure_func.dispatch(cl)(obj, cl)
| File "<cattrs generated structure lsprotocol.types.SymbolInformation>", line 37, in structure_SymbolInformation
| if errors: raise __c_cve('While structuring ' + 'SymbolInformation', errors, __cl)
| cattrs.errors.ClassValidationError: While structuring SymbolInformation (1 sub-exception)
| Structuring class WorkspaceSymbolResponse @ attribute result
+-+---------------- 1 ----------------
| Exception Group Traceback (most recent call last):
| File "<cattrs generated structure lsprotocol.types.SymbolInformation>", line 5, in structure_SymbolInformation
| res['location'] = __c_structure_location(o['location'], __c_type_location)
| File "<cattrs generated structure lsprotocol.types.Location>", line 14, in structure_Location
| if errors: raise __c_cve('While structuring ' + 'Location', errors, __cl)
| cattrs.errors.ClassValidationError: While structuring Location (1 sub-exception)
| Structuring class SymbolInformation @ attribute location
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "<cattrs generated structure lsprotocol.types.Location>", line 10, in structure_Location
| res['range'] = __c_structure_range(o['range'], __c_type_range)
| KeyError: 'range'
| Structuring class Location @ attribute range
+------------------------------------
It appears that cattrs tries to interpret the data as a SymbolInformation
which, unlike WorkspaceSymbol
, requires both uri
and range
to be present in the location
.