# Copyright (C) 2016 - Oscar Campos <oscar.campos@member.fsf.org> # This program is Free Software see LICENSE file for details import traceback import sublime import sublime_plugin from anaconda_go.lib import go from anaconda_go.lib.plugin import typing from anaconda_go.lib.helpers import get_settings, get_scope from anaconda_go.lib.plugin import Worker, Callback, ExplorerPanel, is_code class AnacondaGoCallees(sublime_plugin.TextCommand): """Execute guru and callees any returnd definition """ def run(self, edit: sublime.Edit) -> None: try: view = self.view scope = get_settings(view, 'anaconda_go_guru_scope') row, col = view.rowcol(view.sel()[0].begin()) offset = view.text_point(row, col) code = view.substr(sublime.Region(0, view.size())) data = { 'vid': view.id(), 'scope': scope if scope is not None else get_scope(view, go.GOPATH), # noqa 'path': view.file_name(), 'offset': offset, 'modified_buffer': self._modified_buffer(view, code), 'go_env': { 'GOROOT': go.GOROOT, 'GOPATH': go.GOPATH, 'CGO_ENABLED': go.CGO_ENABLED }, 'method': 'callees', 'handler': 'anaGonda' } Worker().execute( Callback( on_success=self._on_success, on_failure=self._on_failure, on_timeout=self._on_timeout ), **data ) except Exception as err: print('anaconda_go: callees error') print(traceback.print_exc()) def is_enabled(self) -> bool: """Determine if this command is enabled or not """ if len(sublime.active_window().views()) == 0: return False if not go.ANAGONDA_PRESENT: return False return is_code(self.view, lang='go') def _on_success(self, data): """Process result and normalize it for anaconda's goto """ if not data['result']: sublime.status_message('Symbol not found...') return callees = [] for result in data['result'].get('callees', []): f, l, c = result['pos'].split(':') callees.append({ 'title': result['name'], 'location': 'File: {} Line: {} Column: {}'.format(f, l, c), 'position': result['pos'] }) ExplorerPanel(self.view, callees).show([]) def _on_failure(self, data: typing.Dict) -> None: """Fired on failures from the callback """ print('anaconda_go: callees error') print(data['error']) sublime.status_message(data['error']) def _on_timeout(self, data: typing.Dict) -> None: """Fired when the callback times out """ print('Golang callees definition timed out') def _modified_buffer(self, view: sublime.View, code: str) -> str: """Guru needs this to use unsaved buffers instead of files """ return '\n'.join([ view.file_name(), str(len(code.encode('utf8'))), code ])