1.1 --- a/resolving.py Fri Mar 17 00:59:21 2017 +0100
1.2 +++ b/resolving.py Sun Mar 19 00:16:10 2017 +0100
1.3 @@ -244,11 +244,11 @@
1.4 aliased_names = {}
1.5
1.6 for i, name_ref in enumerate(values):
1.7 - initialised_ref, aliased_name = self.resolve_reference(path, name_ref)
1.8 + initialised_ref, _aliased_names = self.resolve_reference(path, name_ref)
1.9 if initialised_ref:
1.10 initialised_names[i] = initialised_ref
1.11 - if aliased_name:
1.12 - aliased_names[i] = aliased_name
1.13 + if _aliased_names:
1.14 + aliased_names[i] = _aliased_names
1.15
1.16 if initialised_names:
1.17 self.initialised_names[(path, name)] = initialised_names
1.18 @@ -269,11 +269,11 @@
1.19 aliased_names = {}
1.20
1.21 for i, name_ref in enumerate(values):
1.22 - initialised_ref, aliased_name = self.resolve_reference(path, name_ref)
1.23 + initialised_ref, _aliased_names = self.resolve_reference(path, name_ref)
1.24 if initialised_ref:
1.25 initialised_names[i] = initialised_ref
1.26 - if aliased_name:
1.27 - aliased_names[i] = aliased_name
1.28 + if _aliased_names:
1.29 + aliased_names[i] = _aliased_names
1.30
1.31 if initialised_names:
1.32 self.initialised_names[(path, "$return")] = initialised_names
1.33 @@ -290,7 +290,7 @@
1.34 const_accesses = self.const_accesses.get(path)
1.35
1.36 initialised_ref = None
1.37 - aliased_name = None
1.38 + aliased_names = None
1.39 no_reference = None, None
1.40
1.41 # Unwrap invocations.
1.42 @@ -336,9 +336,9 @@
1.43 # alongside original name, attribute and access
1.44 # number details.
1.45
1.46 - aliased_name = path, name_ref.original_name, name_ref.attrnames, name_ref.number
1.47 + aliased_names = [(path, name_ref.original_name, name_ref.attrnames, name_ref.number)]
1.48
1.49 - return None, aliased_name
1.50 + return None, aliased_names
1.51
1.52 # Attempt to resolve a plain name reference.
1.53
1.54 @@ -355,9 +355,9 @@
1.55 # alongside original name, attribute and access
1.56 # number details.
1.57
1.58 - aliased_name = path, name_ref.name, None, name_ref.number
1.59 + aliased_names = [(path, name_ref.name, None, name_ref.number)]
1.60
1.61 - return None, aliased_name
1.62 + return None, aliased_names
1.63
1.64 ref = self.get_resolved_object(ref.get_origin())
1.65 if not ref:
1.66 @@ -382,13 +382,32 @@
1.67
1.68 # Convert class invocations to instances.
1.69
1.70 - if ref and invocation or ref.has_kind("<invoke>"):
1.71 - ref = self.convert_invocation(ref)
1.72 + if ref and (invocation or ref.has_kind("<invoke>")):
1.73 + target_ref = ref
1.74 + ref = self.convert_invocation(target_ref)
1.75 +
1.76 + if not ref or ref.has_kind("<var>"):
1.77 + aliased_names = self.get_aliases_for_target(target_ref.get_origin())
1.78 + else:
1.79 + initialised_ref = ref
1.80
1.81 - if ref and not ref.has_kind("<var>"):
1.82 + elif ref and not ref.has_kind("<var>"):
1.83 initialised_ref = ref
1.84 +
1.85 + return initialised_ref, aliased_names
1.86
1.87 - return initialised_ref, aliased_name
1.88 + def get_aliases_for_target(self, path):
1.89 +
1.90 + "Return a list of return value locations for the given 'path'."
1.91 +
1.92 + return_values = self.importer.all_return_values.get(path)
1.93 + locations = []
1.94 +
1.95 + if return_values:
1.96 + for version in range(0, len(return_values)):
1.97 + locations.append((path, "$return", None, version))
1.98 +
1.99 + return locations
1.100
1.101 def resolve_literals(self):
1.102