Move the parameter rules.

This commit is contained in:
Dave Halter
2017-08-18 18:37:16 +02:00
parent ceb7121dc6
commit 84e5adb364
+22 -17
View File
@@ -343,22 +343,6 @@ class ErrorFinder(Normalizer):
if count >= 256: if count >= 256:
message = "too many expressions in star-unpacking assignment" message = "too many expressions in star-unpacking assignment"
self._add_syntax_error(message, starred[0]) self._add_syntax_error(message, starred[0])
elif node.type in ('parameters', 'lambdef'):
param_names = set()
default_only = False
for p in _iter_params(node):
if p.name.value in param_names:
message = "duplicate argument '%s' in function definition"
self._add_syntax_error(message % p.name.value, p.name)
param_names.add(p.name.value)
if p.default is None and not p.star_count:
if default_only:
# def f(x=3, y): pass
message = "non-default argument follows default argument"
self._add_syntax_error(message, node)
else:
default_only = True
elif node.type == 'expr_stmt': elif node.type == 'expr_stmt':
for before_equal in node.children[:-2:2]: for before_equal in node.children[:-2:2]:
self._check_assignment(before_equal) self._check_assignment(before_equal)
@@ -842,7 +826,7 @@ class _CompForRule(SyntaxRule):
@ErrorFinder.register_rule(type='arglist') @ErrorFinder.register_rule(type='arglist')
class ArglistRule(SyntaxRule): class _ArglistRule(SyntaxRule):
message = "Generator expression must be parenthesized if not sole argument" message = "Generator expression must be parenthesized if not sole argument"
def is_issue(self, node): def is_issue(self, node):
@@ -898,3 +882,24 @@ class ArglistRule(SyntaxRule):
# f(x=2, y) # f(x=2, y)
message = "positional argument follows keyword argument" message = "positional argument follows keyword argument"
self.add_issue(argument, message=message) self.add_issue(argument, message=message)
@ErrorFinder.register_rule(type='parameters')
@ErrorFinder.register_rule(type='lambdef')
class _ParameterRule(SyntaxRule):
# def f(x=3, y): pass
message = "non-default argument follows default argument"
def is_issue(self, node):
param_names = set()
default_only = False
for p in _iter_params(node):
if p.name.value in param_names:
message = "duplicate argument '%s' in function definition"
self.add_issue(p.name, message=message % p.name.value)
param_names.add(p.name.value)
if p.default is None and not p.star_count:
if default_only:
return True
else:
default_only = True