1.1 --- a/results.py Mon Feb 06 22:29:25 2017 +0100
1.2 +++ b/results.py Mon Feb 06 22:30:47 2017 +0100
1.3 @@ -33,6 +33,9 @@
1.4 def reference(self):
1.5 return None
1.6
1.7 + def references(self):
1.8 + return None
1.9 +
1.10 def get_name(self):
1.11 return None
1.12
1.13 @@ -112,9 +115,15 @@
1.14
1.15 "A resolved reference mix-in."
1.16
1.17 + def __init__(self, ref):
1.18 + self.ref = ref
1.19 +
1.20 def reference(self):
1.21 return self.ref
1.22
1.23 + def references(self):
1.24 + return [self.ref]
1.25 +
1.26 def get_name(self):
1.27 return self.ref and self.ref.get_name() or None
1.28
1.29 @@ -139,7 +148,7 @@
1.30
1.31 def __init__(self, name, ref, expr=None):
1.32 NameRef.__init__(self, name, expr)
1.33 - self.ref = ref
1.34 + ResolvedRef.__init__(self, ref)
1.35
1.36 def __repr__(self):
1.37 return "ResolvedNameRef(%r, %r, %r)" % (self.name, self.ref, self.expr)
1.38 @@ -160,9 +169,6 @@
1.39
1.40 "An instance reference."
1.41
1.42 - def __init__(self, ref):
1.43 - self.ref = ref
1.44 -
1.45 def reference(self):
1.46 return self.ref
1.47
2.1 --- a/translator.py Mon Feb 06 22:29:25 2017 +0100
2.2 +++ b/translator.py Mon Feb 06 22:30:47 2017 +0100
2.3 @@ -194,6 +194,9 @@
2.4 self.refs = refs
2.5 self.accessor_kinds = accessor_kinds
2.6
2.7 + def references(self):
2.8 + return self.refs
2.9 +
2.10 def get_origin(self):
2.11 return self.refs and len(self.refs) == 1 and first(self.refs).get_origin()
2.12
2.13 @@ -286,6 +289,8 @@
2.14 else:
2.15 return Expression(str(expr))
2.16
2.17 +
2.18 +
2.19 # The actual translation process itself.
2.20
2.21 class TranslatedModule(CommonModule):
2.22 @@ -1129,20 +1134,32 @@
2.23
2.24 expr = self.process_structure_node(n.node)
2.25 objpath = expr.get_origin()
2.26 +
2.27 + # Identified target details.
2.28 +
2.29 target = None
2.30 target_structure = None
2.31 +
2.32 + # Specific function target information.
2.33 +
2.34 function = None
2.35 +
2.36 + # Instantiation involvement.
2.37 +
2.38 instantiation = False
2.39 literal_instantiation = False
2.40 +
2.41 + # Invocation requirements.
2.42 +
2.43 context_required = True
2.44 -
2.45 - # Obtain details of the callable.
2.46 + parameters = None
2.47 +
2.48 + # Obtain details of the callable and of its parameters.
2.49
2.50 # Literals may be instantiated specially.
2.51
2.52 if expr.is_name() and expr.name.startswith("$L") and objpath:
2.53 instantiation = literal_instantiation = objpath
2.54 - parameters = None
2.55 target = encode_literal_instantiator(objpath)
2.56 context_required = False
2.57
2.58 @@ -1186,7 +1203,30 @@
2.59 # Other targets are retrieved at run-time.
2.60
2.61 else:
2.62 - parameters = None
2.63 + refs = expr.references()
2.64 +
2.65 + # Attempt to test the number of arguments and warn about possible
2.66 + # invocation problems.
2.67 +
2.68 + if refs:
2.69 + for ref in refs:
2.70 + _objpath = ref.get_origin()
2.71 + _parameters = self.importer.function_parameters.get(_objpath)
2.72 +
2.73 + if _parameters is None:
2.74 + continue
2.75 +
2.76 + # Determine whether the possible target has a different
2.77 + # number of parameters to the number of arguments given.
2.78 +
2.79 + num_parameters = len(_parameters)
2.80 + _defaults = len(self.importer.function_defaults.get(_objpath, []))
2.81 +
2.82 + if len(n.args) < num_parameters - _defaults or len(n.args) > num_parameters:
2.83 + print "In %s, at line %d, inappropriate number of " \
2.84 + "arguments given. Need %d arguments to call %s." % (
2.85 + self.get_namespace_path(), n.lineno, num_parameters,
2.86 + _objpath)
2.87
2.88 # Arguments are presented in a temporary frame array with any context
2.89 # always being the first argument. Where it would be unused, it may be
2.90 @@ -1198,6 +1238,9 @@
2.91 else:
2.92 args = ["__NULL"]
2.93
2.94 + # Complete the array with null values, permitting tests for a complete
2.95 + # set of arguments.
2.96 +
2.97 args += [None] * (not parameters and len(n.args) or parameters and len(parameters) or 0)
2.98 kwcodes = []
2.99 kwargs = []
2.100 @@ -1888,9 +1931,6 @@
2.101 self.writeline("}")
2.102
2.103 def statement(self, expr):
2.104 - # NOTE: Should never be None.
2.105 - if not expr:
2.106 - self.writestmt("...;")
2.107 s = str(expr)
2.108 if s:
2.109 self.writestmt("%s;" % s)