Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Invoking goto_assignments fails with KeyError: u'classmethod' #451

Closed
rakanalh opened this issue Aug 12, 2015 · 5 comments
Closed

Invoking goto_assignments fails with KeyError: u'classmethod' #451

rakanalh opened this issue Aug 12, 2015 · 5 comments

Comments

@rakanalh
Copy link

Hello,

I am currently using vim-jedi working on one of my python projects. Sometimes when i click g which i mapped to go to assignment, jedi fails:

Traceback (most recent call last):
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi_vim.py", line 110, in wrapper
    return func(*args, **kwargs)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi_vim.py", line 220, in goto
    definitions = script.goto_assignments()
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/api/__init__.py", line 378, in goto_assignments
    results = self._goto()
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/api/__init__.py", line 445, in _goto
    defs = self._evaluator.goto(last_name)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/__init__.py", line 369, in goto
    types = self.eval_element(call)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/cache.py", line 41, in wrapper
    rv = function(obj, *args, **kwargs)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/__init__.py", line 183, in eval_element
    types = self._eval_atom(element.children[0])
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/__init__.py", line 230, in _eval_atom
    return self.find_types(scope, atom, stmt.start_pos, search_global=True)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/__init__.py", line 120, in find_types
    return f.find(scopes, search_global)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/debug.py", line 52, in wrapper
    result = func(*args, **kwargs)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/finder.py", line 87, in find
    types = self._names_to_types(names, search_global)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/finder.py", line 233, in _names_to_types
    new_types = _name_to_types(self._evaluator, name, self.scope)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/cache.py", line 41, in wrapper
    rv = function(obj, *args, **kwargs)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/finder.py", line 282, in _name_to_types
    types += imports.ImportWrapper(evaluator, name).follow()
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/cache.py", line 41, in wrapper
    rv = function(obj, *args, **kwargs)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/imports.py", line 94, in follow
    types = importer.follow()
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/cache.py", line 41, in wrapper
    rv = function(obj, *args, **kwargs)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/imports.py", line 252, in follow
    return self._do_import(self.import_path, self.sys_path_with_modifications())
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/imports.py", line 347, in _do_import
    module = _load_module(self._evaluator, module_path, source, sys_path)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/imports.py", line 450, in _load_module
    module = load(source) if cached is None else cached.module
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/evaluate/imports.py", line 445, in load
    p = fast.FastParser(evaluator.grammar, common.source_to_unicode(source), p)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/fast.py", line 106, in __call__
    p = super(CachedFastParser, self).__call__(grammar, source, module_path)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/fast.py", line 243, in __init__
    self.update(source)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/fast.py", line 257, in update
    self._parse(source)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/fast.py", line 383, in _parse
    line_offset, nodes)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/fast.py", line 435, in _get_node
p = Parser(self._grammar, parser_code, self.module_path, tokenizer=tokenizer)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/__init__.py", line 155, in __init__
    self.module = p.parse(self._tokenize(tokenizer))
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/pgen2/parse.py", line 106, in parse
    if self.addtoken(type, value, prefix, start_pos):
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/pgen2/parse.py", line 170, in addtoken
    value, start_pos, prefix, self.addtoken)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/__init__.py", line 269, in error_recovery
    self._stack_removal(grammar, stack, index + 1, value, start_pos)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/__init__.py", line 304, in _stack_removal
    clear_names(children=node[1])
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/__init__.py", line 294, in clear_names
    clear_names(c.children)
  File "/Users/rakan/.vim/bundle/jedi-vim/jedi/jedi/parser/__init__.py", line 298, in clear_names
    self._scope_names_stack[-1][c.value].remove(c)
KeyError: u'classmethod'

I am running the latest master currently at d3484afe20cf1a3c9fb20ba44d6e06a6feff8ee3 commit hash.

Please advise

@blueyed
Copy link
Collaborator

blueyed commented Aug 12, 2015

Looks like a Jedi issue. You could try updating Jedi (in the jedi submodule/folder) to the latest version.

A simple test case to reproduce this would help addressing / fixing it.

@davidhalter
Copy link
Owner

Yeah, please try updating Jedi (dev branch). And if it's still not working, please post the source.

@rakanalh
Copy link
Author

I've updated to the latest dev branch but i have encountered the same issue.

I can't share the source code because it's a part of product my company is developing. However, it's a class that defines classmethods:

class SomeClass(object):
    @classmethod
    def do_something(cls, *args, **kwargs):
        passs

I tried a very simple example with a main file that class a class method that is defined in myclass.py

class MyClass(object):
    @classmethod
    def say_hello(cls):
        print 'Hello'

But could not regenerate the issue to be honest. g and d did actually do what's expected. I am not sure what makes the difference between smaller class and larger ones with classmethods in jedi.

@davidhalter
Copy link
Owner

It's a parser error. Without the source I cannot debug it. So if you don't post an example that doesn't work (you could delete code until it doesn't work anymore), I cannot fix it.

@davidhalter
Copy link
Owner

Fixed in Jedi's dev branch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants