1.1 --- a/resolving.py Fri Mar 31 18:42:27 2017 +0200
1.2 +++ b/resolving.py Fri Mar 31 23:26:47 2017 +0200
1.3 @@ -21,7 +21,7 @@
1.4
1.5 from common import init_item
1.6 from results import AccessRef, InstanceRef, InvocationRef, LocalNameRef, \
1.7 - NameRef, ResolvedNameRef
1.8 + MultipleRef, NameRef, ResolvedNameRef
1.9 from referencing import Reference
1.10 import sys
1.11
1.12 @@ -283,12 +283,40 @@
1.13 initialised reference, along with any aliased name information.
1.14 """
1.15
1.16 - const_accesses = self.const_accesses.get(path)
1.17 -
1.18 initialised_ref = None
1.19 aliased_names = None
1.20 no_reference = None, None
1.21
1.22 + # Attempt to obtain a coherent reference from multiple outcomes.
1.23 +
1.24 + if isinstance(name_ref, MultipleRef):
1.25 + refs = set()
1.26 + aliases = []
1.27 +
1.28 + for result in name_ref.results:
1.29 + _initialised_ref, _aliased_names = self.resolve_reference(path, result)
1.30 +
1.31 + # Unsuitable references at any level cause the result to yield
1.32 + # no reference.
1.33 +
1.34 + if not _initialised_ref:
1.35 + refs = None
1.36 + elif refs is not None:
1.37 + refs.add(_initialised_ref)
1.38 +
1.39 + if not _aliased_names:
1.40 + aliases = None
1.41 + elif aliases is not None:
1.42 + aliases += _aliased_names
1.43 +
1.44 + # Only unambiguous references are returned as initialising
1.45 + # references.
1.46 +
1.47 + if refs and len(refs) == 1:
1.48 + return list(refs)[0], aliases
1.49 + else:
1.50 + return None, aliases
1.51 +
1.52 # Unwrap invocations.
1.53
1.54 if isinstance(name_ref, InvocationRef):
1.55 @@ -297,6 +325,8 @@
1.56 else:
1.57 invocation = False
1.58
1.59 + const_accesses = self.const_accesses.get(path)
1.60 +
1.61 # Obtain a usable reference from names or constants.
1.62
1.63 if isinstance(name_ref, ResolvedNameRef):