Skip to content

Commit

Permalink
Build imenu.py, for cleaner code.
Browse files Browse the repository at this point in the history
  • Loading branch information
manateelazycat committed Jun 27, 2024
1 parent 06f3030 commit a10091d
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 48 deletions.
1 change: 1 addition & 0 deletions core/handler/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
61 changes: 15 additions & 46 deletions core/handler/document_symbol.py
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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())
43 changes: 43 additions & 0 deletions core/handler/imenu.py
Original file line number Diff line number Diff line change
@@ -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())
4 changes: 2 additions & 2 deletions lsp-bridge-imenu.el
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand All @@ -31,4 +31,4 @@
(call-interactively 'imenu))))

(provide 'lsp-bridge-imenu)
;;; lsp-bridge-imenu.el ends here
;;; lsp-bridge-imenu.el ends here

0 comments on commit a10091d

Please sign in to comment.