Commit 21f513be authored by Stefan Behnel's avatar Stefan Behnel

fix Py3-style class declarations after implementing extended PEP448 unpacking syntax

parent 7a8ca7b0
...@@ -4157,9 +4157,11 @@ class OverrideCheckNode(StatNode): ...@@ -4157,9 +4157,11 @@ class OverrideCheckNode(StatNode):
code.funcstate.release_temp(func_node_temp) code.funcstate.release_temp(func_node_temp)
code.putln("}") code.putln("}")
class ClassDefNode(StatNode, BlockNode): class ClassDefNode(StatNode, BlockNode):
pass pass
class PyClassDefNode(ClassDefNode): class PyClassDefNode(ClassDefNode):
# A Python class definition. # A Python class definition.
# #
...@@ -4185,7 +4187,7 @@ class PyClassDefNode(ClassDefNode): ...@@ -4185,7 +4187,7 @@ class PyClassDefNode(ClassDefNode):
mkw = None mkw = None
def __init__(self, pos, name, bases, doc, body, decorators=None, def __init__(self, pos, name, bases, doc, body, decorators=None,
keyword_args=None, starstar_arg=None, force_py3_semantics=False): keyword_args=None, force_py3_semantics=False):
StatNode.__init__(self, pos) StatNode.__init__(self, pos)
self.name = name self.name = name
self.doc = doc self.doc = doc
...@@ -4200,31 +4202,30 @@ class PyClassDefNode(ClassDefNode): ...@@ -4200,31 +4202,30 @@ class PyClassDefNode(ClassDefNode):
doc_node = None doc_node = None
allow_py2_metaclass = not force_py3_semantics allow_py2_metaclass = not force_py3_semantics
if keyword_args or starstar_arg: if keyword_args:
allow_py2_metaclass = False allow_py2_metaclass = False
self.is_py3_style_class = True self.is_py3_style_class = True
if keyword_args and not starstar_arg: if keyword_args.is_dict_literal:
for i, item in list(enumerate(keyword_args.key_value_pairs))[::-1]: if keyword_args.key_value_pairs:
if item.key.value == 'metaclass': for i, item in list(enumerate(keyword_args.key_value_pairs))[::-1]:
if self.metaclass is not None: if item.key.value == 'metaclass':
error(item.pos, "keyword argument 'metaclass' passed multiple times") if self.metaclass is not None:
# special case: we already know the metaclass, error(item.pos, "keyword argument 'metaclass' passed multiple times")
# so we don't need to do the "build kwargs, # special case: we already know the metaclass,
# find metaclass" dance at runtime # so we don't need to do the "build kwargs,
self.metaclass = item.value # find metaclass" dance at runtime
del keyword_args.key_value_pairs[i] self.metaclass = item.value
if starstar_arg: del keyword_args.key_value_pairs[i]
self.mkw = ExprNodes.ProxyNode(ExprNodes.KeywordArgsNode( self.mkw = keyword_args
pos, keyword_args=keyword_args and keyword_args.key_value_pairs or [], else:
starstar_arg=starstar_arg)) assert self.metaclass is not None
elif keyword_args.key_value_pairs:
self.mkw = keyword_args
else: else:
assert self.metaclass is not None # KeywordArgsNode
self.mkw = ExprNodes.ProxyNode(keyword_args)
if force_py3_semantics or self.bases or self.mkw or self.metaclass: if force_py3_semantics or self.bases or self.mkw or self.metaclass:
if self.metaclass is None: if self.metaclass is None:
if starstar_arg: if keyword_args and not keyword_args.is_dict_literal:
# **kwargs may contain 'metaclass' arg # **kwargs may contain 'metaclass' arg
mkdict = self.mkw mkdict = self.mkw
else: else:
......
...@@ -2996,7 +2996,6 @@ def p_class_statement(s, decorators): ...@@ -2996,7 +2996,6 @@ def p_class_statement(s, decorators):
class_name.encoding = s.source_encoding # FIXME: why is this needed? class_name.encoding = s.source_encoding # FIXME: why is this needed?
arg_tuple = None arg_tuple = None
keyword_dict = None keyword_dict = None
starstar_arg = None
if s.sy == '(': if s.sy == '(':
positional_args, keyword_args = p_call_parse_args(s, allow_genexp=False) positional_args, keyword_args = p_call_parse_args(s, allow_genexp=False)
arg_tuple, keyword_dict = p_call_build_packed_args(pos, positional_args, keyword_args) arg_tuple, keyword_dict = p_call_build_packed_args(pos, positional_args, keyword_args)
...@@ -3008,7 +3007,6 @@ def p_class_statement(s, decorators): ...@@ -3008,7 +3007,6 @@ def p_class_statement(s, decorators):
pos, name=class_name, pos, name=class_name,
bases=arg_tuple, bases=arg_tuple,
keyword_args=keyword_dict, keyword_args=keyword_dict,
starstar_arg=starstar_arg,
doc=doc, body=body, decorators=decorators, doc=doc, body=body, decorators=decorators,
force_py3_semantics=s.context.language_level >= 3) force_py3_semantics=s.context.language_level >= 3)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment