Closed Qejun closed 8 months ago
I changed python's lsp and now it works correctly. Change python-lsp-server to pyright in lua/modules/configs/completion/mason.lua However, there is still no way to solve the c file.Do you have any recommended c language server?
ys, the syntax tree is generated from treesitter and lsp. glad to see u try out different lsp on python first.
for c/c++ part, what c lsp r u using now? what c lsp have u tried?
Hmm, I think this is more of an "upstream support" issue. Below are some results of trying to communicate with pylsp
and clangd
via json-rpc (correct me if im wrong 😃):
Consider the following code for pylsp
(taken from here):
class NlAttr:
def __init__(self, raw, offset):
self._len, self._type = struct.unpack("HH", raw[offset:offset + 4])
self.type = self._type & ~Netlink.NLA_TYPE_MASK
self.payload_len = self._len
self.full_len = (self.payload_len + 3) & ~3
self.raw = raw[offset + 4:offset + self.payload_len]
def as_u8(self):
return struct.unpack("B", self.raw)[0]
def as_u16(self):
return struct.unpack("H", self.raw)[0]
def as_u32(self):
return struct.unpack("I", self.raw)[0]
def as_u64(self):
return struct.unpack("Q", self.raw)[0]
def as_strz(self):
return self.raw.decode('ascii')[:-1]
def as_bin(self):
return self.raw
def __repr__(self):
return f"[type:{self.type} len:{self._len}] {self.raw}"
This is the (formatted) result returned when pylsp
accepted textDocument/documentSymbol
request:
pylsp.config.config - finish pylsp_document_symbols
--> [[{'name': 'struct', 'containerName': None, 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 0, 'character': 13}}}, 'kind': 2},
{'name': 'NlAttr', 'containerName': None, 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 2, 'character': 0}, 'end': {'line': 30, 'character': 0}}}, 'kind': 5},
{'name': '__init__', 'containerName': 'NlAttr', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 3, 'character': 4}, 'end': {'line': 9, 'character': 0}}}, 'kind': 6},
{'name': 'as_u8', 'containerName': 'NlAttr', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 10, 'character': 4}, 'end': {'line': 12, 'character': 0}}}, 'kind': 6},
{'name': 'as_u16', 'containerName': 'NlAttr', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 13, 'character': 4}, 'end': {'line': 15, 'character': 0}}}, 'kind': 6},
{'name': 'as_u32', 'containerName': 'NlAttr', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 16, 'character': 4}, 'end': {'line': 18, 'character': 0}}}, 'kind': 6},
{'name': 'as_u64', 'containerName': 'NlAttr', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 19, 'character': 4}, 'end': {'line': 21, 'character': 0}}}, 'kind': 6},
{'name': 'as_strz', 'containerName': 'NlAttr', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 22, 'character': 4}, 'end': {'line': 24, 'character': 0}}}, 'kind': 6},
{'name': 'as_bin', 'containerName': 'NlAttr', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 25, 'character': 4}, 'end': {'line': 27, 'character': 0}}}, 'kind': 6},
{'name': '__repr__', 'containerName': 'NlAttr', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 28, 'character': 4}, 'end': {'line': 30, 'character': 0}}}, 'kind': 6},
{'name': '_len', 'containerName': '__init__', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 4, 'character': 8}, 'end': {'line': 4, 'character': 77}}}, 'kind': 8},
{'name': '_type', 'containerName': '__init__', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 4, 'character': 8}, 'end': {'line': 4, 'character': 77}}}, 'kind': 8},
{'name': 'type', 'containerName': '__init__', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 5, 'character': 8}, 'end': {'line': 5, 'character': 55}}}, 'kind': 8},
{'name': 'payload_len', 'containerName': '__init__', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 6, 'character': 8}, 'end': {'line': 6, 'character': 36}}}, 'kind': 8},
{'name': 'full_len', 'containerName': '__init__', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 7, 'character': 8}, 'end': {'line': 7, 'character': 51}}}, 'kind': 8},
{'name': 'raw', 'containerName': '__init__', 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 8, 'character': 8}, 'end': {'line': 8, 'character': 62}}}, 'kind': 8}]]
clangd
(adapted from the Lua programming language):
/*
* WARNING: if you change the order of this enumeration,
* grep "ORDER RESERVED"
*/
enum RESERVED {
/* terminal symbols denoted by reserved words */
TK_AND = FIRST_RESERVED,
TK_BREAK,
TK_DO,
TK_ELSE,
TK_ELSEIF,
TK_END,
TK_FALSE,
TK_FOR,
TK_FUNCTION,
TK_GOTO,
TK_IF,
TK_IN,
TK_LOCAL,
TK_NIL,
TK_NOT,
TK_OR,
TK_REPEAT,
TK_RETURN,
TK_THEN,
TK_TRUE,
TK_UNTIL,
TK_WHILE,
/* other terminal symbols */
TK_IDIV,
TK_CONCAT,
TK_DOTS,
TK_EQ,
TK_GE,
TK_LE,
TK_NE,
TK_SHL,
TK_SHR,
TK_DBCOLON,
TK_EOS,
TK_FLT,
TK_INT,
TK_NAME,
TK_STRING
};
This is what clangd
returned when it accepted the same request (formatted):
--> reply:textDocument/documentSymbol(14) 0 ms
>>> [[{"id":14, "jsonrpc":"2.0", "result":
[{"children":
[{"detail":"int","kind":22,"name":"TK_AND","range":{"end":{"character":24,"line":8},"start":{"character":1,"line":8}},"selectionRange":{"end":{"character":7,"line":8},"start":{"character":1,"line":8}}},
{"detail":"int","kind":22,"name":"TK_BREAK","range":{"end":{"character":9,"line":9},"start":{"character":1,"line":9}},"selectionRange":{"end":{"character":9,"line":9},"start":{"character":1,"line":9}}},
{"detail":"int","kind":22,"name":"TK_DO","range":{"end":{"character":6,"line":10},"start":{"character":1,"line":10}},"selectionRange":{"end":{"character":6,"line":10},"start":{"character":1,"line":10}}},
{"detail":"int","kind":22,"name":"TK_ELSE","range":{"end":{"character":8,"line":11},"start":{"character":1,"line":11}},"selectionRange":{"end":{"character":8,"line":11},"start":{"character":1,"line":11}}},
{"detail":"int","kind":22,"name":"TK_ELSEIF","range":{"end":{"character":10,"line":12},"start":{"character":1,"line":12}},"selectionRange":{"end":{"character":10,"line":12},"start":{"character":1,"line":12}}},
{"detail":"int","kind":22,"name":"TK_END","range":{"end":{"character":7,"line":13},"start":{"character":1,"line":13}},"selectionRange":{"end":{"character":7,"line":13},"start":{"character":1,"line":13}}},
{"detail":"int","kind":22,"name":"TK_FALSE","range":{"end":{"character":9,"line":14},"start":{"character":1,"line":14}},"selectionRange":{"end":{"character":9,"line":14},"start":{"character":1,"line":14}}},
{"detail":"int","kind":22,"name":"TK_FOR","range":{"end":{"character":7,"line":15},"start":{"character":1,"line":15}},"selectionRange":{"end":{"character":7,"line":15},"start":{"character":1,"line":15}}},
{"detail":"int","kind":22,"name":"TK_FUNCTION","range":{"end":{"character":12,"line":16},"start":{"character":1,"line":16}},"selectionRange":{"end":{"character":12,"line":16},"start":{"character":1,"line":16}}},
{"detail":"int","kind":22,"name":"TK_GOTO","range":{"end":{"character":8,"line":17},"start":{"character":1,"line":17}},"selectionRange":{"end":{"character":8,"line":17},"start":{"character":1,"line":17}}},
{"detail":"int","kind":22,"name":"TK_IF","range":{"end":{"character":6,"line":18},"start":{"character":1,"line":18}},"selectionRange":{"end":{"character":6,"line":18},"start":{"character":1,"line":18}}},
{"detail":"int","kind":22,"name":"TK_IN","range":{"end":{"character":6,"line":19},"start":{"character":1,"line":19}},"selectionRange":{"end":{"character":6,"line":19},"start":{"character":1,"line":19}}},
{"detail":"int","kind":22,"name":"TK_LOCAL","range":{"end":{"character":9,"line":20},"start":{"character":1,"line":20}},"selectionRange":{"end":{"character":9,"line":20},"start":{"character":1,"line":20}}},
{"detail":"int","kind":22,"name":"TK_NIL","range":{"end":{"character":7,"line":21},"start":{"character":1,"line":21}},"selectionRange":{"end":{"character":7,"line":21},"start":{"character":1,"line":21}}},
{"detail":"int","kind":22,"name":"TK_NOT","range":{"end":{"character":7,"line":22},"start":{"character":1,"line":22}},"selectionRange":{"end":{"character":7,"line":22},"start":{"character":1,"line":22}}},
{"detail":"int","kind":22,"name":"TK_OR","range":{"end":{"character":6,"line":23},"start":{"character":1,"line":23}},"selectionRange":{"end":{"character":6,"line":23},"start":{"character":1,"line":23}}},
{"detail":"int","kind":22,"name":"TK_REPEAT","range":{"end":{"character":10,"line":24},"start":{"character":1,"line":24}},"selectionRange":{"end":{"character":10,"line":24},"start":{"character":1,"line":24}}},
{"detail":"int","kind":22,"name":"TK_RETURN","range":{"end":{"character":10,"line":25},"start":{"character":1,"line":25}},"selectionRange":{"end":{"character":10,"line":25},"start":{"character":1,"line":25}}},
{"detail":"int","kind":22,"name":"TK_THEN","range":{"end":{"character":8,"line":26},"start":{"character":1,"line":26}},"selectionRange":{"end":{"character":8,"line":26},"start":{"character":1,"line":26}}},
{"detail":"int","kind":22,"name":"TK_TRUE","range":{"end":{"character":8,"line":27},"start":{"character":1,"line":27}},"selectionRange":{"end":{"character":8,"line":27},"start":{"character":1,"line":27}}},
{"detail":"int","kind":22,"name":"TK_UNTIL","range":{"end":{"character":9,"line":28},"start":{"character":1,"line":28}},"selectionRange":{"end":{"character":9,"line":28},"start":{"character":1,"line":28}}},
{"detail":"int","kind":22,"name":"TK_WHILE","range":{"end":{"character":9,"line":29},"start":{"character":1,"line":29}},"selectionRange":{"end":{"character":9,"line":29},"start":{"character":1,"line":29}}},
{"detail":"int","kind":22,"name":"TK_IDIV","range":{"end":{"character":8,"line":31},"start":{"character":1,"line":31}},"selectionRange":{"end":{"character":8,"line":31},"start":{"character":1,"line":31}}},
{"detail":"int","kind":22,"name":"TK_CONCAT","range":{"end":{"character":10,"line":32},"start":{"character":1,"line":32}},"selectionRange":{"end":{"character":10,"line":32},"start":{"character":1,"line":32}}},
{"detail":"int","kind":22,"name":"TK_DOTS","range":{"end":{"character":8,"line":33},"start":{"character":1,"line":33}},"selectionRange":{"end":{"character":8,"line":33},"start":{"character":1,"line":33}}},
{"detail":"int","kind":22,"name":"TK_EQ","range":{"end":{"character":6,"line":34},"start":{"character":1,"line":34}},"selectionRange":{"end":{"character":6,"line":34},"start":{"character":1,"line":34}}},
{"detail":"int","kind":22,"name":"TK_GE","range":{"end":{"character":6,"line":35},"start":{"character":1,"line":35}},"selectionRange":{"end":{"character":6,"line":35},"start":{"character":1,"line":35}}},
{"detail":"int","kind":22,"name":"TK_LE","range":{"end":{"character":6,"line":36},"start":{"character":1,"line":36}},"selectionRange":{"end":{"character":6,"line":36},"start":{"character":1,"line":36}}},
{"detail":"int","kind":22,"name":"TK_NE","range":{"end":{"character":6,"line":37},"start":{"character":1,"line":37}},"selectionRange":{"end":{"character":6,"line":37},"start":{"character":1,"line":37}}},
{"detail":"int","kind":22,"name":"TK_SHL","range":{"end":{"character":7,"line":38},"start":{"character":1,"line":38}},"selectionRange":{"end":{"character":7,"line":38},"start":{"character":1,"line":38}}},
{"detail":"int","kind":22,"name":"TK_SHR","range":{"end":{"character":7,"line":39},"start":{"character":1,"line":39}},"selectionRange":{"end":{"character":7,"line":39},"start":{"character":1,"line":39}}},
{"detail":"int","kind":22,"name":"TK_DBCOLON","range":{"end":{"character":11,"line":40},"start":{"character":1,"line":40}},"selectionRange":{"end":{"character":11,"line":40},"start":{"character":1,"line":40}}},
{"detail":"int","kind":22,"name":"TK_EOS","range":{"end":{"character":7,"line":41},"start":{"character":1,"line":41}},"selectionRange":{"end":{"character":7,"line":41},"start":{"character":1,"line":41}}},
{"detail":"int","kind":22,"name":"TK_FLT","range":{"end":{"character":7,"line":42},"start":{"character":1,"line":42}},"selectionRange":{"end":{"character":7,"line":42},"start":{"character":1,"line":42}}},
{"detail":"int","kind":22,"name":"TK_INT","range":{"end":{"character":7,"line":43},"start":{"character":1,"line":43}},"selectionRange":{"end":{"character":7,"line":43},"start":{"character":1,"line":43}}},
{"detail":"int","kind":22,"name":"TK_NAME","range":{"end":{"character":8,"line":44},"start":{"character":1,"line":44}},"selectionRange":{"end":{"character":8,"line":44},"start":{"character":1,"line":44}}},
{"detail":"int","kind":22,"name":"TK_STRING","range":{"end":{"character":10,"line":45},"start":{"character":1,"line":45}},"selectionRange":{"end":{"character":10,"line":45},"start":{"character":1,"line":45}}}
], "detail":"enum","kind":10,"name":"RESERVED","range":{"end":{"character":1,"line":46},"start":{"character":0,"line":6}},"selectionRange":{"end":{"character":13,"line":6},"start":{"character":5,"line":6}}}]}]]
Note this line (L3) from clangd
:
[{"children":
^^^^^^^^
And a single entry returned by both servers (pylsp
then clangd
):
{'name': 'struct', 'containerName': None, 'location': {'uri': 'file:///Users/jint/*/.tmp.py', 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 0, 'character': 13}}}, 'kind': 2},
<name>
, <kind>
, <location>
, and <range>
^^^^^{"detail":"int","kind":22,"name":"TK_AND","range":{"end":{"character":24,"line":8},"start":{"character":1,"line":8}},"selectionRange":{"end":{"character":7,"line":8},"start":{"character":1,"line":8}}},
<detail>
, <kind>
, <name>
, <range>
, and <selectionRange>
^^^^^^^^^^^^^^
This at least means that only `clangd` (and [only when the compilation database can be located](https://clangd.llvm.org/config#compileflags)) supports symbol _hierarchy_ for the [(v3.10.0)](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#version_3_10_0) method `textDocument/documentSymbol`. But since [symbols-outline.nvim](https://github.com/simrat39/symbols-outline.nvim) doesn't implement treesitter integration, it just displayed them _as is_, resulting in a lack of "hierarchy" between symbols for `pylsp`. So IMHO maybe a better approach would be to submit an issue upstream instead of changing plugins lol (b/c I think we don't need all those features that aerial.nvim provides :D).
ys, the syntax tree is generated from treesitter and lsp. glad to see u try out different lsp on python first.
for c/c++ part, what c lsp r u using now? what c lsp have u tried?
I'm using clangd now
I'm using clangd now
Have u defined a compilation database in ur project root directory?
I'm using clangd now
Have u defined a compilation database in ur project root directory?
I used compile_flags.txt, in the root directory
clangd can only display function names, not variable names
clangd can only display function names, not variable names
AFAIK this feature hasn't been implemented yet. More info: https://github.com/clangd/clangd/issues/616.
@Qejun can u try out the latest pr to see if it works for u?
Version confirmation
Following prerequisites
Not a user config issue
Neovim version
nvim0.9.4
Operating system/version
win10
Terminal name/version
Windows terminal
$TERM environment variable
No response
Branch info
main (Default/Latest)
Fetch Preferences
SSH (use_ssh = true)
How to reproduce the issue
Symbol outline doesn't work properly in python files and C files,I wonder where to start with this problem![屏幕截图 2023-11-09 080019](https://github.com/ayamir/nvimdots/assets/24759432/b9121a93-2b6b-4c32-89b9-4ceb04fda7f2)
Expected behavior
In a lua file, the symbol outline correctly displays the hierarchical structure of the content
Actual behavior
In python files and C files, everything is displayed on the same level when navigating with symbol outline![屏幕截图 2023-11-09 080019](https://github.com/ayamir/nvimdots/assets/24759432/68b13266-7ba3-4715-bd5e-adf531ae40e7)
Additional information
No response