diff --git a/jedi/parser/pgen2/parse.py b/jedi/parser/pgen2/parse.py index 7a533890..5614081a 100644 --- a/jedi/parser/pgen2/parse.py +++ b/jedi/parser/pgen2/parse.py @@ -178,10 +178,15 @@ class Parser(object): def pop(self): """Pop a nonterminal. (Internal)""" popdfa, popstate, popnode = self.stack.pop() - newnode = self.convert(self.grammar, popnode) - if newnode is not None: - if self.stack: - dfa, state, node = self.stack[-1] - node[-1].append(newnode) - else: - self.rootnode = newnode + children = popnode[3] + if len(children) != 1 or popnode[0] in (self.grammar.symbol2number['expr_stmt'], + self.grammar.symbol2number['file_input']): + newnode = self.convert(self.grammar, popnode) + else: + newnode = children[0] + + if self.stack: + dfa, state, node = self.stack[-1] + node[-1].append(newnode) + else: + self.rootnode = newnode diff --git a/jedi/parser/pytree.py b/jedi/parser/pytree.py index dbb9a6b9..16fb6690 100644 --- a/jedi/parser/pytree.py +++ b/jedi/parser/pytree.py @@ -57,15 +57,7 @@ def type_repr(type_num): return _type_reprs.setdefault(type_num, type_num) -def convert(grammar, raw_node): - """ - Convert raw node information to a Node or Leaf instance. - - This is passed to the parser driver which calls it whenever a reduction of a - grammar rule produces a new complete node, so that the tree is build - strictly bottom-up. - """ - +def gen_ast_mapping(): from jedi.parser import representation as pr _ast_mapping = { 'expr_stmt': pr.ExprStmt, @@ -91,9 +83,23 @@ def convert(grammar, raw_node): 'try_stmt': pr.TryStmt, } + global ast_mapping, pr ast_mapping = dict((getattr(python_symbols, k), v) for k, v in _ast_mapping.items()) +def convert(grammar, raw_node): + """ + Convert raw node information to a Node or Leaf instance. + + This is passed to the parser driver which calls it whenever a reduction of a + grammar rule produces a new complete node, so that the tree is build + strictly bottom-up. + """ + try: + ast_mapping + except NameError: + gen_ast_mapping() + #import pdb; pdb.set_trace() type, value, context, children = raw_node if type in grammar.number2symbol: