From a10091d28767c502aedf0cd6f15d8338e0fa89e0 Mon Sep 17 00:00:00 2001 From: Andy Stewart Date: Thu, 27 Jun 2024 17:52:01 +0800 Subject: [PATCH] Build imenu.py, for cleaner code. --- core/handler/__init__.py | 1 + core/handler/document_symbol.py | 61 ++++++++------------------------- core/handler/imenu.py | 43 +++++++++++++++++++++++ lsp-bridge-imenu.el | 4 +-- 4 files changed, 61 insertions(+), 48 deletions(-) create mode 100644 core/handler/imenu.py diff --git a/core/handler/__init__.py b/core/handler/__init__.py index 710ff6e7a8..5b71b3fc30 100644 --- a/core/handler/__init__.py +++ b/core/handler/__init__.py @@ -64,6 +64,7 @@ def handle_response(self, request_id, response): from core.handler.workspace_symbol import WorkspaceSymbol # noqa: F401 from core.handler.call_hierarchy import PrepareCallHierarchyIncomingCalls, PrepareCallHierarchyOutgoingCalls, CallHierarchyIncomingCalls, CallHierarchyOutgoingCalls # noqa: F401 from core.handler.document_symbol import DocumentSymbol # noqa: F401 +from core.handler.imenu import IMenu # noqa: F401 from core.handler.jdtls.jdtls_list_overridable_methods import JdtlsListOverridableMethods # noqa: F401 from core.handler.jdtls.jdtls_add_overridable_methods import JdtlsAddOverridableMethods # noqa: F401 from core.handler.inlay_hint import InlayHint # noqa: F401 diff --git a/core/handler/document_symbol.py b/core/handler/document_symbol.py index 6d0bda68f5..210f68939a 100644 --- a/core/handler/document_symbol.py +++ b/core/handler/document_symbol.py @@ -1,16 +1,6 @@ from core.handler import Handler from core.utils import * -SYMBOL_KIND_NAMES = { - 1: "File", 2: "Module", 3: "Namespace", 4: "Package", 5: "Class", - 6: "Method", 7: "Property", 8: "Field", 9: "Constructor", - 10: "Enum", 11: "Interface", 12: "Function", 13: "Variable", - 14: "Constant", 15: "String", 16: "Number", 17: "Boolean", - 18: "Array", 19: "Object", 20: "Key", 21: "Null", - 22: "EnumMember", 23: "Struct", 24: "Event", 25: "Operator", - 26: "TypeParameter" -} - class DocumentSymbol(Handler): name = "document_symbol" method = "textDocument/documentSymbol" @@ -24,42 +14,21 @@ def process_request(self, position) -> dict: def process_response(self, response: dict) -> None: if response is not None: try: - if not bool(self.position): - grouped_data = {} - - for item in response: - kind = item['kind'] - if "range" not in item: - item["range"] = item['location']["range"] - - if kind not in grouped_data: - grouped_data[kind] = [] - grouped_data[kind].append(item) - - new_response = [] - for kind, items in grouped_data.items(): - new_response.append({'name': SYMBOL_KIND_NAMES[kind], 'children': items}) - - eval_in_emacs("lsp-bridge--imenu-show", - self.file_action.filepath, - get_lsp_file_host(), - new_response) - else: - symbols = [] - current_defun = '' - for symbol in response: - if "range" in symbol: - range = symbol["range"] - else: - range = symbol['location']["range"] - if range['start']['line'] < self.position['line'] < range['end']['line'] or\ - (range['start']['line'] == self.position['line'] and range['start']['character'] <= self.position['character']) or\ - (range['end']['line'] == self.position['line'] and range['end']['character'] >= self.position['character']): - if len(current_defun): - current_defun += '.' - current_defun += symbol['name'] - symbols.append(symbol) - eval_in_emacs("lsp-bridge-symbols--record-current-defun", current_defun) + symbols = [] + current_defun = '' + for symbol in response: + if "range" in symbol: + range = symbol["range"] + else: + range = symbol['location']["range"] + if range['start']['line'] < self.position['line'] < range['end']['line'] or\ + (range['start']['line'] == self.position['line'] and range['start']['character'] <= self.position['character']) or\ + (range['end']['line'] == self.position['line'] and range['end']['character'] >= self.position['character']): + if len(current_defun): + current_defun += '.' + current_defun += symbol['name'] + symbols.append(symbol) + eval_in_emacs("lsp-bridge-symbols--record-current-defun", current_defun) except: import traceback logger.error(traceback.format_exc()) diff --git a/core/handler/imenu.py b/core/handler/imenu.py new file mode 100644 index 0000000000..577713f2ef --- /dev/null +++ b/core/handler/imenu.py @@ -0,0 +1,43 @@ +from core.handler import Handler +from core.utils import * + +SYMBOL_KIND_NAMES = { + 1: "File", 2: "Module", 3: "Namespace", 4: "Package", 5: "Class", + 6: "Method", 7: "Property", 8: "Field", 9: "Constructor", + 10: "Enum", 11: "Interface", 12: "Function", 13: "Variable", + 14: "Constant", 15: "String", 16: "Number", 17: "Boolean", + 18: "Array", 19: "Object", 20: "Key", 21: "Null", + 22: "EnumMember", 23: "Struct", 24: "Event", 25: "Operator", + 26: "TypeParameter" +} + +class IMenu(Handler): + name = "imenu" + method = "textDocument/documentSymbol" + send_document_uri = True + + def process_request(self) -> dict: + return dict() + + def process_response(self, response: dict) -> None: + if response is not None: + try: + grouped_data = {} + + for item in response: + kind = item['kind'] + if "range" not in item: + item["range"] = item['location']["range"] + + if kind not in grouped_data: + grouped_data[kind] = [] + grouped_data[kind].append(item) + + new_response = [] + for kind, items in grouped_data.items(): + new_response.append({'name': SYMBOL_KIND_NAMES[kind], 'children': items}) + + eval_in_emacs("lsp-bridge--imenu-show", self.file_action.filepath, get_lsp_file_host(), new_response) + except: + import traceback + logger.error(traceback.format_exc()) diff --git a/lsp-bridge-imenu.el b/lsp-bridge-imenu.el index 3fb21373ba..a2776895ba 100644 --- a/lsp-bridge-imenu.el +++ b/lsp-bridge-imenu.el @@ -12,7 +12,7 @@ (interactive) (if (equal major-mode 'emacs-lisp-mode) (call-interactively 'imenu) - (lsp-bridge-call-file-api "document_symbol" nil))) + (lsp-bridge-call-file-api "imenu"))) (defun lsp-bridge--imenu-show (filename filehost res) "Compute `imenu--index-alist' for RES vector of FILEHOST:FILENAME." @@ -31,4 +31,4 @@ (call-interactively 'imenu)))) (provide 'lsp-bridge-imenu) -;;; lsp-bridge-imenu.el ends here \ No newline at end of file +;;; lsp-bridge-imenu.el ends here