1.1 --- a/inspector.py Sat Mar 11 16:46:36 2017 +0100
1.2 +++ b/inspector.py Sat Mar 11 22:27:45 2017 +0100
1.3 @@ -271,7 +271,7 @@
1.4 self.trackers[-1].abandon_branch()
1.5
1.6 elif isinstance(n, compiler.ast.Return):
1.7 - self.process_structure(n)
1.8 + self.record_return_value(self.process_structure_node(n.value))
1.9 self.trackers[-1].abandon_returning_branch()
1.10
1.11 # Print statements.
1.12 @@ -654,7 +654,14 @@
1.13
1.14 self.start_tracking(locals)
1.15 self.process_structure_node(n.code)
1.16 - self.stop_tracking()
1.17 + returns_value = self.stop_tracking()
1.18 +
1.19 + # Record any null result.
1.20 +
1.21 + is_initialiser = is_method and name == "__init__"
1.22 +
1.23 + if not returns_value and not is_initialiser:
1.24 + self.record_return_value(ResolvedNameRef("None", self.get_builtin("None")))
1.25
1.26 # Exit to the parent.
1.27
1.28 @@ -1075,6 +1082,7 @@
1.29
1.30 """
1.31 Stop tracking attribute usage, recording computed usage for the current
1.32 + namespace. Indicate whether a value is always returned from the
1.33 namespace.
1.34 """
1.35
1.36 @@ -1085,6 +1093,8 @@
1.37 self.attr_usage[path] = tracker.get_all_usage()
1.38 self.name_initialisers[path] = tracker.get_all_values()
1.39
1.40 + return tracker.returns_value()
1.41 +
1.42 def start_tracking_in_module(self):
1.43
1.44 "Start tracking attribute usage in the module."
1.45 @@ -1469,4 +1479,14 @@
1.46
1.47 self.exception_namespaces.add(self.get_namespace_path())
1.48
1.49 + # Return values.
1.50 +
1.51 + def record_return_value(self, expr):
1.52 +
1.53 + "Record the given return 'expr'."
1.54 +
1.55 + path = self.get_namespace_path()
1.56 + init_item(self.return_values, path, set)
1.57 + self.return_values[path].add(expr)
1.58 +
1.59 # vim: tabstop=4 expandtab shiftwidth=4