Beispiel #1
0
    def _JumpToLocation(self, definition_list):
        if len(definition_list) == 1:
            definition = definition_list[0]
            if definition.in_builtin_module():
                if isinstance(definition.definition, jedi.keywords.Keyword):
                    vimsupport.PostVimMessage(
                        "Cannot get the definition of Python keywords.")
                else:
                    vimsupport.PostVimMessage(
                        "Builtin modules cannot be displayed.")
            else:
                vimsupport.JumpToLocation(definition.module_path,
                                          definition.line_nr,
                                          definition.column + 1)
        else:
            # multiple definitions
            defs = []
            for definition in definition_list:
                if definition.in_builtin_module():
                    defs.append( {'text': 'Builtin ' + \
                                 definition.description.encode( 'utf-8' ) } )
                else:
                    defs.append({
                        'filename':
                        definition.module_path.encode('utf-8'),
                        'lnum':
                        definition.line_nr,
                        'col':
                        definition.column + 1,
                        'text':
                        definition.description.encode('utf-8')
                    })

            vim.eval('setqflist( %s )' % repr(defs))
            vim.eval('youcompleteme#OpenGoToList()')
    def ShowDetailedDiagnostic(self):
        current_line, current_column = vimsupport.CurrentLineAndColumn()

        # CurrentLineAndColumn() numbers are 0-based, clang numbers are 1-based
        current_line += 1
        current_column += 1

        current_file = vim.current.buffer.name

        if not self.diagnostic_store:
            vimsupport.PostVimMessage("No diagnostic for current line!")
            return

        diagnostics = self.diagnostic_store[current_file][current_line]
        if not diagnostics:
            vimsupport.PostVimMessage("No diagnostic for current line!")
            return

        closest_diagnostic = None
        distance_to_closest_diagnostic = 999

        for diagnostic in diagnostics:
            distance = abs(current_column - diagnostic.column_number_)
            if distance < distance_to_closest_diagnostic:
                distance_to_closest_diagnostic = distance
                closest_diagnostic = diagnostic

        vimsupport.EchoText(closest_diagnostic.long_formatted_text_)
    def CandidatesForQueryAsync(self, query, start_column):
        filename = vim.current.buffer.name

        if not filename:
            return

        if self.completer.UpdatingTranslationUnit(filename):
            vimsupport.PostVimMessage(
                'Still parsing file, no completions yet.')
            self.completions_future = None
            return

        flags = self.flags.FlagsForFile(filename)
        if not flags:
            vimsupport.PostVimMessage(
                'Still no compile flags, no completions yet.')
            self.completions_future = None
            return

        # TODO: sanitize query, probably in C++ code

        files = ycm_core.UnsavedFileVec()
        if not query:
            files = self.GetUnsavedFilesVector()

        line, _ = vim.current.window.cursor
        column = start_column + 1
        self.completions_future = (
            self.completer.CandidatesForQueryAndLocationInFileAsync(
                query, filename, line, column, files, flags))
    def CandidatesForQueryAsyncInner(self, query):
        if not self.omnifunc:
            self.stored_candidates = None
            return

        try:
            return_value = int(vim.eval(self.omnifunc + '(1,"")'))
            if return_value < 0:
                self.stored_candidates = None
                return

            omnifunc_call = [
                self.omnifunc, "(0,'",
                vimsupport.EscapeForVim(query), "')"
            ]

            items = vim.eval(''.join(omnifunc_call))
            if hasattr(items, 'words'):
                items = items.words
            if not hasattr(items, '__iter__'):
                raise TypeError(OMNIFUNC_NOT_LIST)

            self.stored_candidates = filter(bool, items)
        except (TypeError, ValueError) as error:
            vimsupport.PostVimMessage(OMNIFUNC_RETURNED_BAD_VALUE + ' ' +
                                      str(error))
            self.stored_candidates = None
            return
    def NotifyUserIfServerCrashed(self):
        if (not self._server_popen or self._user_notified_about_crash
                or self.IsServerAlive()):
            return
        self._user_notified_about_crash = True

        return_code = self._server_popen.poll()
        logfile = os.path.basename(self._server_stderr)
        # See https://github.com/Valloric/ycmd#exit-codes for the list of exit
        # codes.
        if return_code == 3:
            error_message = CORE_UNEXPECTED_MESSAGE.format(logfile=logfile)
        elif return_code == 4:
            error_message = CORE_MISSING_MESSAGE
        elif return_code == 5:
            error_message = CORE_PYTHON2_MESSAGE
        elif return_code == 6:
            error_message = CORE_PYTHON3_MESSAGE
        elif return_code == 7:
            error_message = CORE_OUTDATED_MESSAGE
        else:
            error_message = EXIT_CODE_UNEXPECTED_MESSAGE.format(
                code=return_code, logfile=logfile)
        self._logger.error(error_message)
        error_message = SERVER_SHUTDOWN_MESSAGE + ' ' + error_message
        vimsupport.PostVimMessage(error_message)
Beispiel #6
0
    def _GetDefinitionsList(self, declaration=False):
        definitions = []
        script = self._GetJediScript()
        try:
            if declaration:
                definitions = script.get_definition()
            else:
                definitions = script.goto()
        except jedi.NotFoundError:
            vimsupport.PostVimMessage(
                "Cannot follow nothing. Put your cursor on a valid name.")
        except Exception as e:
            vimsupport.PostVimMessage(
                "Caught exception, aborting. Full error: " + str(e))

        return definitions
    def _GoToDeclaration(self):
        location = self._LocationForGoTo('GetDeclarationLocation')
        if not location or not location.IsValid():
            vimsupport.PostVimMessage('Can\'t jump to declaration.')
            return

        vimsupport.JumpToLocation(location.filename_, location.line_number_,
                                  location.column_number_)
Beispiel #8
0
 def CandidatesFromStoredRequest( self ):
   if not self.completions_future:
     return []
   results = [ CompletionDataToDict( x ) for x in
               self.completions_future.GetResults() ]
   if not results:
     vimsupport.PostVimMessage( 'No completions found; errors in the file?' )
   return results
Beispiel #9
0
 def _GoToDefinitionElseDeclaration(self):
     definitions = self._GetDefinitionsList() or \
         self._GetDefinitionsList( declaration = True )
     if definitions:
         self._JumpToLocation(definitions)
     else:
         vimsupport.PostVimMessage(
             'Can\'t jump to definition or declaration.')
def DisplayServerException( exception, truncate_message = False ):
    serialized_exception = str( exception )

  # We ignore the exception about the file already being parsed since it comes
  # up often and isn't something that's actionable by the user.
    if 'already being parsed' in serialized_exception:
        return
    vimsupport.PostVimMessage( serialized_exception, truncate = truncate_message )
    def _SetUpServer(self):
        if self.vim:
            self._user_options = base.GetUserOptions()
        else:
            self._user_options = {}
        self._user_options['log_level'] = 0
        options_dict = dict(self._user_options)
        pprint(options_dict)
        server_port = utils.GetUnusedLocalhostPort()
        BaseRequest.server_location = 'http://127.0.0.1:' + str(server_port)
        self.server_location = BaseRequest.server_location
        print(BaseRequest.server_location)
        with NamedTemporaryFile(delete=False, mode='w+') as options_file:
            json.dump(options_dict, options_file)
        try:
            python_interpreter = paths.PathToPythonInterpreter()
            self._logger.info(python_interpreter)
        except RuntimeError as error:
            error_message = ("Unable to start the ycmd server. {0}. "
                             "Correct the error then restart the server "
                             "with ':YcmRestartServer'.".format(
                                 str(error).rstrip('.')))
            self._logger.exception(error_message)
            vimsupport.PostVimMessage(error_message)
            return

        path = os.path.normpath('/Users/phil/nvidia/editor/server/main.py')
        print(python_interpreter)
        args = [
            python_interpreter,
            path,
            '--port={0}'.format(server_port),
            '--options_file={0}'.format(
                '/Users/phil/nvidia/editor/options.json'
            ),  #options_file.name),
            '--log={0}'.format(self._user_options['log_level']),
            '--idle_suicide_seconds={0}'.format(SERVER_IDLE_SUICIDE_SECONDS)
        ]
        self._server_stdout = utils.logfile
        self._server_stderr = utils.logfile
        args.append('--stdout={0}'.format(self._server_stdout))
        args.append('--stderr={0}'.format(self._server_stderr))
        #TODO: add logging
        #log = open("./erroroutput", "w")
        pprint(args)
        self._server_popen = Popen(args, stdout=PIPE,
                                   stderr=PIPE)  #, stdout=PIPE, stderr=PIPE)
    def _LocationForGoTo(self, goto_function):
        filename = vim.current.buffer.name
        if not filename:
            return None

        flags = self.flags.FlagsForFile(filename)
        if not flags:
            vimsupport.PostVimMessage(
                'Still no compile flags, can\'t compile.')
            return None

        files = self.GetUnsavedFilesVector()
        line, column = vimsupport.CurrentLineAndColumn()
        # Making the line & column 1-based instead of 0-based
        line += 1
        column += 1
        return getattr(self.completer, goto_function)(filename, line, column,
                                                      files, flags)
Beispiel #13
0
    def FlagsForFile(self, filename):
        try:
            return self.flags_for_file[filename]
        except KeyError:
            flags_module = self._FlagsModuleForFile(filename)
            if not flags_module:
                if not self.no_extra_conf_file_warning_posted:
                    vimsupport.PostVimMessage(NO_EXTRA_CONF_FILENAME_MESSAGE)
                    self.no_extra_conf_file_warning_posted = True
                return None

            results = flags_module.FlagsForFile(filename)

            if not results.get('flags_ready', True):
                return None

            results['flags'] += self.special_clang_flags
            sanitized_flags = _SanitizeFlags(results['flags'])

            if results['do_cache']:
                self.flags_for_file[filename] = sanitized_flags
            return sanitized_flags
Beispiel #14
0
# You should have received a copy of the GNU General Public License
# along with YouCompleteMe.  If not, see <http://www.gnu.org/licenses/>.

import imp
import os
import sys
import vimsupport
import vim
import ycm_utils as utils

try:
    import ycm_core
except ImportError as e:
    vimsupport.PostVimMessage(
        'Error importing ycm_core. Are you sure you have placed a version 3.2+ '
        'libclang.[so|dll|dylib] in folder "{0}"? See the Installation Guide in '
        'the docs. Full error: {1}'.format(
            os.path.dirname(os.path.abspath(__file__)), str(e)))

from completers.all.identifier_completer import IdentifierCompleter
from completers.all.omni_completer import OmniCompleter

FILETYPE_SPECIFIC_COMPLETION_TO_DISABLE = vim.eval(
    'g:ycm_filetype_specific_completion_to_disable')


class YouCompleteMe(object):
    def __init__(self):
        self.identcomp = IdentifierCompleter()
        self.omnicomp = OmniCompleter()
        self.filetype_completers = {}
Beispiel #15
0
import vim
from completers.threaded_completer import ThreadedCompleter
import vimsupport

import sys
from os.path import join, abspath, dirname

# We need to add the jedi package to sys.path, but it's important that we clean
# up after ourselves, because ycm.YouCompletMe.GetFiletypeCompleterForFiletype
# removes sys.path[0] after importing completers.python.hook
sys.path.insert(0, join(abspath(dirname(__file__)), 'jedi'))
try:
    import jedi
except ImportError:
    vimsupport.PostVimMessage(
        'Error importing jedi. Make sure the jedi submodule has been checked out. '
        'In the YouCompleteMe folder, run "git submodule update --init --recursive"'
    )
sys.path.pop(0)

USER_COMMANDS_HELP_MESSAGE = """
Supported commands are:
  GoToDefinition
  GoToDeclaration
  GoToDefinitionElseDeclaration
See the docs for information on what they do."""


class JediCompleter(ThreadedCompleter):
    """
  A Completer that uses the Jedi completion engine.
  https://jedi.readthedocs.org/en/latest/
Beispiel #16
0
 def OnUserCommand(self, arguments):
     vimsupport.PostVimMessage(NO_USER_COMMANDS)
Beispiel #17
0
 def _GoToDefinition(self):
     definitions = self._GetDefinitionsList()
     if definitions:
         self._JumpToLocation(definitions)
     else:
         vimsupport.PostVimMessage('Can\'t jump to definition.')