Exemple #1
0
def get_calltip(project, source_code, offset, resource=None,
                maxfixes=1, ignore_unknown=False, remove_self=False):
    """Get the calltip of a function

    The format of the returned string is
    ``module_name.holding_scope_names.function_name(arguments)``.  For
    classes `__init__()` and for normal objects `__call__()` function
    is used.

    Note that the offset is on the function itself *not* after the its
    open parenthesis.  (Actually it used to be the other way but it
    was easily confused when string literals were involved.  So I
    decided it is better for it not to try to be too clever when it
    cannot be clever enough).  You can use a simple search like::

        offset = source_code.rindex('(', 0, offset) - 1

    to handle simple situations.

    If `ignore_unknown` is `True`, `None` is returned for functions
    without source-code like builtins and extensions.

    If `remove_self` is `True`, the first parameter whose name is self
    will be removed for methods.
    """
    fixer = fixsyntax.FixSyntax(project.pycore, source_code,
                                resource, maxfixes)
    pymodule = fixer.get_pymodule()
    pyname = fixer.pyname_at(offset)
    if pyname is None:
        return None
    pyobject = pyname.get_object()
    return PyDocExtractor().get_calltip(pyobject, ignore_unknown, remove_self)
Exemple #2
0
def get_doc(project, source_code, offset, resource=None, maxfixes=1):
    """Get the pydoc"""
    fixer = fixsyntax.FixSyntax(project, source_code, resource, maxfixes)
    pyname = fixer.pyname_at(offset)
    if pyname is None:
        return None
    pyobject = pyname.get_object()
    return PyDocExtractor().get_doc(pyobject)
Exemple #3
0
 def test_caching_pymodule_with_syntax_errors(self):
     self.project.prefs['ignore_syntax_errors'] = True
     self.project.prefs['automatic_soa'] = True
     self.project.pycore._init_automatic_soa()
     source = 'import sys\nab cd'
     mod = testutils.create_module(self.project, 'mod')
     mod.write(source)
     from rope.contrib import fixsyntax
     fixer = fixsyntax.FixSyntax(self.project, source, mod, 10)
     pymodule = fixer.get_pymodule()
     self.assertTrue(pymodule.source_code.startswith('import sys\npass\n'))
Exemple #4
0
def get_definition_location(project, source_code, offset,
                            resource=None, maxfixes=1):
    """Return the definition location of the python name at `offset`

    Return a (`rope.base.resources.Resource`, lineno) tuple.  If no
    `resource` is given and the definition is inside the same module,
    the first element of the returned tuple would be `None`.  If the
    location cannot be determined ``(None, None)`` is returned.

    """
    fixer = fixsyntax.FixSyntax(project, source_code, resource, maxfixes)
    pyname = fixer.pyname_at(offset)
    if pyname is not None:
        module, lineno = pyname.get_definition_location()
        if module is not None:
            return module.get_module().get_resource(), lineno
    return (None, None)
Exemple #5
0
 def _code_completions(self):
     lineno = self.code.count('\n', 0, self.offset) + 1
     fixer = fixsyntax.FixSyntax(self.pycore, self.code,
                                 self.resource, self.maxfixes)
     pymodule = fixer.get_pymodule()
     module_scope = pymodule.get_scope()
     code = pymodule.source_code
     lines = code.split('\n')
     result = {}
     start = fixsyntax._logical_start(lines, lineno)
     indents = fixsyntax._get_line_indents(lines[start - 1])
     inner_scope = module_scope.get_inner_scope_for_line(start, indents)
     if self.word_finder.is_a_name_after_from_import(self.offset):
         return self._from_import_completions(pymodule)
     if self.expression.strip() != '':
         result.update(self._dotted_completions(module_scope, inner_scope))
     else:
         result.update(self._keyword_parameters(module_scope.pyobject,
                                                inner_scope))
         self._undotted_completions(inner_scope, result, lineno=lineno)
     return result
Exemple #6
0
def find_definition(project, code, offset, resource=None, maxfixes=1):
    """Return the definition location of the python name at `offset`

    A `Location` object is returned if the definition location can be
    determined, otherwise ``None`` is returned.
    """
    fixer = fixsyntax.FixSyntax(project, code, resource, maxfixes)
    pyname = fixer.pyname_at(offset)
    if pyname is not None:
        module, lineno = pyname.get_definition_location()
        name = rope.base.worder.Worder(code).get_word_at(offset)
        if lineno is not None:
            start = module.lines.get_line_start(lineno)

            def check_offset(occurrence):
                if occurrence.offset < start:
                    return False

            pyname_filter = occurrences.PyNameFilter(pyname)
            finder = occurrences.Finder(project, name,
                                        [check_offset, pyname_filter])
            for occurrence in finder.find_occurrences(pymodule=module):
                return Location(occurrence)
Exemple #7
0
    def get_documentation(self, buffer, offset):
        mp = ModuleParser(self.document.filename,
                          project=self.document.project)
        buffer = buffer + ('\n' * 20)

        from rope.contrib.codeassist import PyDocExtractor
        from rope.base.exceptions import RopeError
        from rope.contrib import fixsyntax
        try:
            fix = fixsyntax.FixSyntax(mp.project.pycore,
                                      buffer,
                                      None,
                                      maxfixes=MAX_FIXES)
            pymodule = fix.get_pymodule()
            pyname = fix.pyname_at(offset)
        except RopeError:
            return
        if pyname is None:
            return
        pyobject = pyname.get_object()
        rv = Documentation(short=PyDocExtractor().get_calltip(
            pyobject, False, False),
                           long_=PyDocExtractor().get_doc(pyobject))
        yield rv