Remove Python3 class __qualname__ assignment. Change LOAD_NAME to

LOAD_CLASSNAME to make parsing more reliable and intentional.
This commit is contained in:
rocky
2015-12-24 22:31:24 -05:00
parent c0d50c4d96
commit 1088031335
3 changed files with 20 additions and 11 deletions

View File

@@ -682,6 +682,7 @@ class Python3Parser(PythonParser):
have_loadname = False have_loadname = False
for i in range(i+1, len(tokens)): for i in range(i+1, len(tokens)):
if tokens[i].type == 'LOAD_NAME': if tokens[i].type == 'LOAD_NAME':
tokens[i].type = 'LOAD_CLASSNAME'
have_loadname = True have_loadname = True
break break
if tokens[i].type in 'CALL_FUNCTION': if tokens[i].type in 'CALL_FUNCTION':
@@ -694,9 +695,10 @@ class Python3Parser(PythonParser):
if tokens[i].type in 'CALL_FUNCTION': if tokens[i].type in 'CALL_FUNCTION':
break break
assert tokens[i].type == 'LOAD_NAME' assert tokens[i].type == 'LOAD_NAME'
tokens[i].type = 'LOAD_CLASSNAME'
j += 1 j += 1
pass pass
load_names = 'LOAD_NAME ' * j load_names = 'LOAD_CLASSNAME ' * j
else: else:
j = 0 j = 0
load_names = '' load_names = ''

View File

@@ -866,7 +866,7 @@ class Traverser(pysource.Walker, object):
n = len(node)-1 n = len(node)-1
assert node[n].type.startswith('CALL_FUNCTION') assert node[n].type.startswith('CALL_FUNCTION')
for i in range(n-1, 0, -1): for i in range(n-1, 0, -1):
if node[i].type != 'LOAD_NAME': if node[i].type != 'LOAD_CLASSNAME':
break break
pass pass

View File

@@ -189,6 +189,7 @@ TABLE_DIRECT = {
'load_attr': ( '%c.%[1]{pattr}', 0), 'load_attr': ( '%c.%[1]{pattr}', 0),
'LOAD_FAST': ( '%{pattr}', ), 'LOAD_FAST': ( '%{pattr}', ),
'LOAD_NAME': ( '%{pattr}', ), 'LOAD_NAME': ( '%{pattr}', ),
'LOAD_CLASSNAME': ( '%{pattr}', ),
'LOAD_GLOBAL': ( '%{pattr}', ), 'LOAD_GLOBAL': ( '%{pattr}', ),
'LOAD_DEREF': ( '%{pattr}', ), 'LOAD_DEREF': ( '%{pattr}', ),
'LOAD_LOCALS': ( 'locals()', ), 'LOAD_LOCALS': ( 'locals()', ),
@@ -488,6 +489,7 @@ class Walker(GenericASTTraversal, object):
self.return_none = False self.return_none = False
self.mod_globs = set() self.mod_globs = set()
self.currentclass = None self.currentclass = None
self.classes = []
self.pending_newlines = 0 self.pending_newlines = 0
if version >= 3.0: if version >= 3.0:
@@ -1109,7 +1111,7 @@ class Walker(GenericASTTraversal, object):
n = len(node)-1 n = len(node)-1
assert node[n].type.startswith('CALL_FUNCTION') assert node[n].type.startswith('CALL_FUNCTION')
for i in range(n-1, 0, -1): for i in range(n-1, 0, -1):
if node[i].type != 'LOAD_NAME': if node[i].type != 'LOAD_CLASSNAME':
break break
pass pass
@@ -1484,6 +1486,7 @@ class Walker(GenericASTTraversal, object):
"""Dump class definition, doc string and class body.""" """Dump class definition, doc string and class body."""
assert inspect.iscode(code) assert inspect.iscode(code)
self.classes.append(self.currentclass)
code = Code(code, self.scanner, self.currentclass) code = Code(code, self.scanner, self.currentclass)
# assert isinstance(code, Code) # assert isinstance(code, Code)
@@ -1495,14 +1498,17 @@ class Walker(GenericASTTraversal, object):
if ast[0][0] == NAME_MODULE: if ast[0][0] == NAME_MODULE:
del ast[0] del ast[0]
QUAL_NAME = AST('stmt', pass
[ AST('assign',
[ AST('expr', [Token('LOAD_CONST', pattr=self.currentclass)]), qualname = '.'.join(self.classes)
AST('designator', [ Token('STORE_NAME', pattr='__qualname__')])
])]) QUAL_NAME = AST('stmt',
if ast[0][0] == QUAL_NAME: [ AST('assign',
del ast[0] [ AST('expr', [Token('LOAD_CONST', pattr=qualname)]),
pass AST('designator', [ Token('STORE_NAME', pattr='__qualname__')])
])])
if ast[0][0] == QUAL_NAME:
del ast[0]
pass pass
# if docstring exists, dump it # if docstring exists, dump it
@@ -1524,6 +1530,7 @@ class Walker(GenericASTTraversal, object):
self.gen_source(ast, code._customize) self.gen_source(ast, code._customize)
code._tokens = None; code._customize = None # save memory code._tokens = None; code._customize = None # save memory
self.classes.pop(-1)
def gen_source(self, ast, customize, isLambda=0, returnNone=False): def gen_source(self, ast, customize, isLambda=0, returnNone=False):
"""convert AST to source code""" """convert AST to source code"""