Exemplo n.º 1
0
    def _update_snippets(self, context):
        if 'file_type' in context:
            file_type = context['file_type']
        else:
            file_type = rpc.DoCall('ECY#utils#GetCurrentBufferFileType')

        if file_type in self.snippet_cache:
            return

        snippets = rpc.DoCall('ECY#utils#GetUltiSnippets')

        if snippets == {}:
            return

        results_list = []
        for trigger, snippet in snippets.items():
            results_format = {
                'abbr': '',
                'word': '',
                'kind': '',
                'menu': '',
                'info': '',
                'user_data': ''
            }
            results_format['word'] = trigger
            results_format['abbr'] = trigger
            results_format['kind'] = '[Snippet]'
            description = snippet['description']
            if not description == '':
                results_format['menu'] = description
            results_list.append(results_format)

        self.snippet_cache[file_type] = results_list
Exemplo n.º 2
0
    def DoCodeAction(self, context):
        params = context['params']
        uri = self._lsp.PathToUri(params['buffer_path'])
        ranges = params['buffer_range']
        start_position = ranges['start']
        end_position = ranges['end']
        self.code_action_cache = None

        res = self._lsp.codeAction(
            uri,
            start_position,
            end_position,
            diagnostic=self._diagnosis_cache).GetResponse()

        if len(res) == 0 or res is None:
            rpc.DoCall('ECY#utils#echo', ['Nothing to act.'])
            return

        if 'error' in res:
            self._show_msg(res['error']['message'])
            return

        res = res['result']
        context['result'] = res
        self.code_action_cache = context

        rpc.DoCall('ECY#code_action#Do', [context])

        return context
Exemplo n.º 3
0
    def OnHover(self, context):
        if 'hoverProvider' not in self.capabilities:
            self._show_msg('Hover is not supported.')
            return
        params = context['params']
        uri = params['buffer_path']
        uri = self._lsp.PathToUri(uri)
        start_position = params['buffer_position']
        position = {
            'line': start_position['line'],
            'character': start_position['colum']
        }

        res = self._lsp.hover(position, uri).GetResponse()
        if 'error' in res:
            self._show_msg(res['error']['message'])
            return

        res = res['result']
        if res is None:
            res = {}

        content = []
        if 'contents' in res:
            content = self._format_markupContent(res['contents'])

        if content == []:
            self._show_msg('Nothing to show')
            return
        rpc.DoCall('ECY#hover#Open', [content])
Exemplo n.º 4
0
    def _on_item_seleted_cb(self, res):
        if 'error' in res:
            self._show_msg(res['error']['message'])
            return

        if res['callback_additional_data'] != self.current_seleted_item:
            logger.debug('Outdate item resolve.')
            return

        res = res['result']
        results_format = {
            'abbr': '',
            'word': '',
            'kind': '',
            'menu': '',
            'info': '',
            'user_data': ''
        }

        document = []
        if 'documentation' in res:
            document.extend(self._format_markupContent(res['documentation']))

        detail = []
        if 'detail' in res:
            if type(res['detail']) is str:
                detail = res['detail'].split('\n')
            elif type(res['detail']) is list:
                detail = res['detail']

        results_format['menu'] = detail
        results_format['info'] = document

        rpc.DoCall('ECY#preview_windows#Show', [results_format])
Exemplo n.º 5
0
    def FoldingRange(self, context):
        if 'foldingRangeProvider' not in self.capabilities:
            self._show_not_support_msg('FoldingRange')
            return

        params = context['params']
        path = params['buffer_path']
        start_position = params['buffer_position']
        is_current_line = params['is_current_line']
        uri = self._lsp.PathToUri(path)
        res = self._lsp.foldingRange(uri).GetResponse()
        res = res['result']

        if res is None:
            self._show_msg('Nothing to fold.')
            return

        i = 0
        if is_current_line:
            for item in res:
                if item['startLine'] <= start_position['line'] and item[
                        'endLine'] >= start_position['line']:
                    break
                i += 1

        res = {'res': res}
        res['path'] = path
        res['is_current_line'] = is_current_line
        res['buffer_position'] = start_position
        res['seleting_folding_range'] = i

        rpc.DoCall('ECY#folding_range#Do', [res])
Exemplo n.º 6
0
 def OnCompletion(self, context):
     if context['params']['buffer_id'] != rpc.DoCall(
             'ECY#rpc#rpc_event#GetBufferIDNotChange'):
         logger.debug('filter a outdate context.')
         return False
     context = self.default_engine.OnCompletion(context)
     return context
Exemplo n.º 7
0
    def DocumentLink(self, context):
        if 'documentLinkProvider' not in self.capabilities:
            return
        params = context['params']
        path = params['buffer_path']
        uri = self._lsp.PathToUri(path)
        res = self._lsp.documentLink(uri).GetResponse()
        res = res['result']

        if 'error' in res:
            self._show_msg(res['error']['message'])
            return

        if res is None:
            return

        for item in res:
            if 'target' in item:
                item['target']['path'] = self._lsp.UriToPath(
                    item['target']['uri'])

        res = {'res': res}
        res['buffer_path'] = path
        res['buffer_id'] = params['buffer_id']

        rpc.DoCall('ECY#document_link#Do', [res])
Exemplo n.º 8
0
    def CheckEngine(self, context):
        params = context['params']
        to_be_check_engine_list = params['engine_list']
        res = {}
        for item in to_be_check_engine_list:
            temp = self._get_engine_obj(item)
            if temp == self.default_engine_name:
                res[item] = [
                    '{Error} Engine not exists or having critical errors.'
                ]
            else:
                check_res = self.CallFunction(temp, 'Check', item, context)
                if check_res is None:
                    res[item] = ['{Warning} Has no check function.']
                elif 'res' not in check_res or type(
                        check_res['res']) is not list:
                    res[item] = ["{Error} ECY can NOT parse engine's return."]
                else:
                    res[item] = check_res['res']

        returns = []
        i = 0
        for item in res:
            returns.append('%s. Engine name: [%s] \n' % (str(i), item))
            returns.extend(res[item])
            returns.append('\n')
            i += 1
        rpc.DoCall('ECY#utils#show', [returns, 'buffer', 'ECY_check'])
Exemplo n.º 9
0
 def OnCompletion(self, context):
     file_type = rpc.DoCall('ECY#utils#GetCurrentBufferFileType')
     context['file_type'] = file_type
     self._update_snippets(context)
     if file_type not in self.snippet_cache:
         return
     context['show_list'] = self.snippet_cache[file_type]
     return context
Exemplo n.º 10
0
def ReadFileContent(path):
    # open a file; if it's not exists or have no right to operate them raise a error
    res = rpc.DoCall('ECY#utils#IsFileOpenedInVim', [path, 'return_list'])
    if res is False:
        with open(path, 'r+', encoding='utf-8') as f:
            content = f.read()
            f.close()
        res = content.split('\n')
    return res
Exemplo n.º 11
0
 def OpenFZF(self, context):
     engine = context['params']['engines']
     if engine not in self.loaded_engiens:
         self._show_msg("Wrong engine_name '%s'" % engine)
         return
     self.fzf_rpc.new(self.New(self.loaded_engiens[engine].Operate,
                               context))
     rpc.DoCall('OpenPopupWindows')
     return context
Exemplo n.º 12
0
 def _rename_callabck(self, context):
     if 'rename_id' not in context or context[
             'rename_id'] not in self.rename_info:
         return
     rename_info = self.rename_info[context['rename_id']]
     if 'is_quit' in context and context['is_quit']:
         pass  # return
     else:
         rpc.DoCall('ECY#code_action#ApplyEdit', [rename_info['res']])
     del self.rename_info[context['rename_id']]
Exemplo n.º 13
0
    def OnCompletion(self, context):
        context['trigger_key'] = self.trigger_key
        params = context['params']
        uri = params['buffer_path']
        uri = self._lsp.PathToUri(uri)

        start_position = params['buffer_position']

        current_cache = self._is_need_to_update(context, r'[\#\:\w+]')

        current_start_postion = {
            'line': start_position['line'],
            'character': current_cache['current_colum']
        }

        if 'is_vim_lsp_callback' not in params:
            logger.debug('request')
            params['vim_lsp_position'] = current_start_postion
            params['buffer_content'] = ''
            rpc.DoCall('ECY#vim_lsp#main#Request', [params])
            return

        self.results_list = []

        return_data = params['response']

        logger.debug(return_data)
        if return_data is None:
            return

        if return_data['result'] is None:
            return

        # self.is_InComplete = return_data['result']['isIncomplete']

        for item in return_data['result']['items']:
            results_format = {
                'abbr': '',
                'word': '',
                'kind': '',
                'menu': '',
                'info': '',
                'user_data': ''
            }

            results_format['kind'] = self._lsp.GetKindNameByNumber(
                item['kind'])

            item_name = item['label']
            results_format['abbr'] = item_name
            results_format['word'] = item_name

            self.results_list.append(results_format)
        context['show_list'] = self.results_list
        return context
Exemplo n.º 14
0
    def _change_workspace_folder(self, context):
        if 'workspace' not in self.capabilities or 'workspaceFolders' not in self.capabilities[
                'workspace'] or not self.capabilities['workspace'][
                    'workspaceFolders']:
            return

        path = rpc.DoCall('ECY#rooter#GetCurrentBufferWorkSpace')
        if path not in self.workspace_cache and path != '':
            self.workspace_cache.append(path)
            add_workspace = {'uri': self._lsp.PathToUri(path), 'name': path}
            self._lsp.didChangeWorkspaceFolders(add_workspace=[add_workspace])
Exemplo n.º 15
0
    def _do_action(self, res):
        for item in res:
            if 'text' in res[item]:
                res[item]['new_text_len'] = len(res[item]['text'])
                del res[item]['text']

        self.workspace_edit_undo = copy.deepcopy(res)

        for item in res:
            if 'undo_text' in res[item]:
                del res[item]['undo_text']
        rpc.DoCall('ECY#utils#ApplyTextEdit', [res])
Exemplo n.º 16
0
    def GetSource(self, event):
        params = event['params']

        buffers_list = rpc.DoCall('ECY#utils#GetBufferPath')
        add_list = []
        self.items = []
        for item in buffers_list:
            item = item.replace('\\', '/')
            name = utils.GetAbbr(item, add_list)
            add_list.append(name)
            self.items.append({'abbr': name, 'path': item})
        return self.items
Exemplo n.º 17
0
 def _get_diagnosis(self):
     while True:
         try:
             temp = self._lsp.GetRequestOrNotification(
                 'textDocument/publishDiagnostics')
             self._diagnosis_cache = temp['params']['diagnostics']
             lists = self._diagnosis_analysis(temp['params'])
             rpc.DoCall('ECY#diagnostics#PlaceSign', [{
                 'engine_name': self.engine_name,
                 'res_list': lists
             }])
         except Exception as e:
             logger.exception(e)
Exemplo n.º 18
0
    def GetSource(self, event):
        params = event['params']

        current_buffer_nr = params['current_buffer_nr']
        buffer_line_list = rpc.DoCall('ECY#utils#GetBufferContent',
                                      [current_buffer_nr])
        logger.debug(buffer_line_list)
        i = 0
        self.items = []
        for item in buffer_line_list:
            self.items.append({'abbr': str(item), 'line': i})
            i += 1
        return self.items
Exemplo n.º 19
0
 def _handle_file_status(self):
     # clangd 8+
     while 1:
         try:
             response = self._lsp.GetRequestOrNotification(
                 'textDocument/clangd.fileStatus')
             res_path = response['params']['uri']
             res_path = self._lsp.UriToPath(res_path)
             current_buffer_path = rpc.DoCall(
                 'ECY#utils#GetCurrentBufferPath')
             if res_path == current_buffer_path:
                 self._show_msg(response['params']['state'])
         except:
             pass
Exemplo n.º 20
0
    def _goto_response(self, res):
        if 'error' in res:
            self._show_msg(res['error']['message'])
            return

        res = res['result']
        if res is None:
            res = []

        if len(res) == 0:
            self._show_msg("No position to go.")
            return

        for item in res:
            if 'uri' in item:
                item['path'] = self._lsp.UriToPath(item['uri'])

        rpc.DoCall('ECY#goto#Do', [res])
Exemplo n.º 21
0
    def _signature_help(self, res):
        if 'error' in res:
            self._show_msg(res['error']['message'])
            return

        res = res['result']
        if res is None:
            return

        # if len(res['signatures']) == 0:
        #     return

        # i = 0
        # content = []
        # for item in res['signatures']:
        #     content.append("%s. %s" % (i, item['label']))

        # hilight_str = []
        # if 'activeSignature' in res and res['activeSignature'] is not None:
        #     hilight_str.append("%s\." % (res['activeSignature']))
        #     activeSignature = res['activeSignature']
        # else:
        #     activeSignature = {}

        # if 'activeParameter' in res and res['activeParameter'] is not None:
        #     try:
        #         activeParameter = res['parameters'][res['activeParameter']]
        #         hilight_str.append("%s" % (activeParameter))
        #     except:
        #         activeParameter = {}
        # else:
        #     activeParameter = {}

        # if 'documentation' in activeParameter:
        #     content.extend(
        #         self._format_markupContent(activeParameter['documentation']))

        # if 'documentation' in activeSignature:
        #     content.extend(
        #         self._format_markupContent(activeSignature['documentation']))

        if len(res) != 0:
            rpc.DoCall('ECY#signature_help#Show', [res])
Exemplo n.º 22
0
    def SelectionRange(self, context):
        if 'selectionRangeProvider' not in self.capabilities:
            self._show_not_support_msg('SelectionRange')
            return

        params = context['params']
        path = params['buffer_path']
        uri = self._lsp.PathToUri(path)
        start_position = params['buffer_position']
        position = {
            'line': start_position['line'],
            'character': start_position['colum']
        }

        res = self._lsp.selectionRange(position, uri).GetResponse()
        res = res['result']

        if res is not None:
            res = res[0]
            res['path'] = path
            rpc.DoCall('ECY#selete_range#Do', [res])
Exemplo n.º 23
0
 def _handle_diagnosis(self):
     reporter = PyflakesDiagnosticReport('')
     self.document_id = -1
     while 1:
         try:
             context = self._diagnosis_queue.get()
             params = context['params']
             if params['buffer_id'] <= self.document_id:
                 continue
             self.document_id = params['buffer_id']
             text_string = '\n'.join(params['buffer_content'])
             reporter.SetContent(text_string)
             pyflakes_api.check(text_string,
                                params['buffer_path'],
                                reporter=reporter)
             res = reporter.GetDiagnosis()
             rpc.DoCall('ECY#diagnostics#PlaceSign', [{
                 'engine_name': self.engine_name,
                 'res_list': res
             }])
             time.sleep(1)
         except Exception as e:
             logger.exception(e)
             break
Exemplo n.º 24
0
 def _update_root(self, context=None):
     self.root_path = rpc.DoCall('ECY#rooter#GetCurrentBufferWorkSpace')
     self.root_path = self.root_path.replace('\\', '/')
     if context is None:
         return
     try:
         self.exists_regex = []
         buffer_path = context['params']['buffer_path']
         while True:
             temp = os.path.dirname(buffer_path)
             if buffer_path == temp:
                 break
             buffer_path = temp
             temp = buffer_path + '/.gitignore'
             if os.path.exists(temp):
                 with open(temp, encoding="utf8") as f:
                     for item in f.read().split('\n'):
                         if item == '':
                             continue
                         self.exists_regex.append(item)
                 break
         logger.debug(self.exists_regex)
     except:
         pass
Exemplo n.º 25
0
 def _open_vertically(self, event):
     res = event['res']
     if res == {}:
         return
     rpc.DoCall('ClosePopupWindows2')
     rpc.DoCall('ECY#utils#OpenFile', [res['path'], 'x'])
Exemplo n.º 26
0
 def _open_in_new_tab(self, event):
     res = event['res']
     if res == {}:
         return
     rpc.DoCall('ClosePopupWindows2')
     rpc.DoCall('ECY#utils#OpenFile', [res['path'], 't'])
Exemplo n.º 27
0
def GetEngineConfig(engine_name, opt_name):
    viml_engine_config = rpc.DoCall('ECY#engine_config#GetEngineConfig',
                                    [engine_name, opt_name])
    return viml_engine_config
Exemplo n.º 28
0
def GetInstallerConfig(installer_name):  # return {} if it is not installed.
    temp = rpc.DoCall('ECY#engine_config#GetInstallerInfo', [installer_name])
    return temp
Exemplo n.º 29
0
    def OnCompletion(self, context):
        if 'show_list' not in context:
            logger.debug('missing params. "show_list"')
            return

        params = context['params']
        current_line = params['buffer_line']
        current_line = bytes(current_line, encoding='utf-8')

        context['next_key'] = str(
            current_line[params['buffer_position']['colum']:],
            encoding='utf-8')

        context['prev_key'] = str(
            current_line[:params['buffer_position']['colum']],
            encoding='utf-8')

        if 'regex' in context:
            regex = context['regex']
        else:  # default one
            regex = r'[\w+]'

        current_colum, filter_words, last_key = utils.MatchFilterKeys(
            context['prev_key'], regex)

        context['filter_key'] = filter_words
        context['filter_key_len'] = len(filter_words)
        context['start_position'] = {
            'line': params['buffer_position']['line'],
            'colum': current_colum
        }

        ########################
        #  completion resolve  #
        ########################
        i = 0
        for item in context['show_list']:
            item['ECY_item_index'] = i
            i += 1

        if 'is_filter' not in context:
            context['is_filter'] = True

        if context['is_filter']:
            res_list = self.fuzzy_match.FilterItems(
                context['filter_key'],
                context['show_list'],
                isindent=self.is_indent,
                isreturn_match_point=self.is_indent)

        if 'must_show' not in context:
            if 'trigger_key' in context:
                if last_key in context['trigger_key']:
                    context['must_show'] = True
                else:
                    context['must_show'] = False
            else:
                context['must_show'] = False

        # show_list_len = self.show_list_len - len(res_list)
        if len(res_list) == 0:
            res_list = self.fuzzy_match.FilterItems(
                context['filter_key'],
                context['buffer_show_list'],
                isindent=self.is_indent,
                isreturn_match_point=self.is_indent)

        context['show_list'] = res_list
        rpc.DoCall('ECY#completion#Open', [context])
 def Closed(self, event):
     res = event['res']
     if res != {}:
         pass
     rpc.DoCall('ECho', [str(event)])