1.1 --- a/deducer.py Sat Sep 24 22:32:52 2016 +0200
1.2 +++ b/deducer.py Sat Sep 24 22:44:45 2016 +0200
1.3 @@ -62,6 +62,10 @@
1.4
1.5 self.alias_index = {}
1.6
1.7 + # Map constant accesses to redefined accesses.
1.8 +
1.9 + self.const_accesses = {}
1.10 +
1.11 # Map usage observations to assigned attributes.
1.12
1.13 self.assigned_attrs = {}
1.14 @@ -1031,17 +1035,6 @@
1.15 for access_location, accessor_locations in self.access_index.items():
1.16 self.record_types_for_access(access_location, accessor_locations, alias_accesses)
1.17
1.18 - # Aliased name definitions. All aliases with usage will have been
1.19 - # defined, but they may be refined according to referenced accesses.
1.20 -
1.21 - for accessor_location in self.alias_index.keys():
1.22 - self.record_types_for_alias(accessor_location)
1.23 -
1.24 - # Update accesses employing aliases.
1.25 -
1.26 - for access_location in alias_accesses:
1.27 - self.record_types_for_access(access_location, self.access_index[access_location])
1.28 -
1.29 # Anonymous references with attribute chains.
1.30
1.31 for location, accesses in self.importer.all_attr_accesses.items():
1.32 @@ -1112,28 +1105,45 @@
1.33
1.34 class_types, instance_types, module_types = accessor.get_types()
1.35 self.record_reference_types(accessor_location, class_types, instance_types, module_types, True, True)
1.36 - continue
1.37 +
1.38 + else:
1.39
1.40 - # Build a descriptive location based on the original
1.41 - # details, employing the first remaining attribute name.
1.42 + # Build a descriptive location based on the original
1.43 + # details, employing the first remaining attribute name.
1.44 +
1.45 + l = get_attrnames(attrnames)
1.46 + attrname = l[0]
1.47
1.48 - l = get_attrnames(attrnames)
1.49 - attrname = l[0]
1.50 + oa = original_accessor[:-len(l)]
1.51 + oa = ".".join(oa)
1.52
1.53 - oa = original_accessor[:-len(l)]
1.54 - oa = ".".join(oa)
1.55 + access_location = (location, oa, attrnames, 0)
1.56 + accessor_location = (location, oa, None, 0)
1.57 + self.access_index[access_location] = [accessor_location]
1.58 +
1.59 + self.init_access_details(access_location)
1.60 + self.init_definition_details(accessor_location)
1.61
1.62 - access_location = (location, oa, attrnames, 0)
1.63 - accessor_location = (location, oa, None, 0)
1.64 - self.access_index[access_location] = [accessor_location]
1.65 + class_types, instance_types, module_types = ref.get_types()
1.66 +
1.67 + self.identify_reference_attributes(access_location, attrname, class_types, instance_types, module_types, True)
1.68 + self.record_reference_types(accessor_location, class_types, instance_types, module_types, True, True)
1.69 +
1.70 + original_location = (location, original_name, original_attrnames, 0)
1.71 +
1.72 + if original_location != access_location:
1.73 + self.const_accesses[original_location] = access_location
1.74
1.75 - self.init_access_details(access_location)
1.76 - self.init_definition_details(accessor_location)
1.77 + # Aliased name definitions. All aliases with usage will have been
1.78 + # defined, but they may be refined according to referenced accesses.
1.79
1.80 - class_types, instance_types, module_types = ref.get_types()
1.81 + for accessor_location in self.alias_index.keys():
1.82 + self.record_types_for_alias(accessor_location)
1.83
1.84 - self.identify_reference_attributes(access_location, attrname, class_types, instance_types, module_types, True)
1.85 - self.record_reference_types(accessor_location, class_types, instance_types, module_types, True, True)
1.86 + # Update accesses employing aliases.
1.87 +
1.88 + for access_location in alias_accesses:
1.89 + self.record_types_for_access(access_location, self.access_index[access_location])
1.90
1.91 def constrain_types(self, path, class_types, instance_types, module_types):
1.92
1.93 @@ -1432,6 +1442,12 @@
1.94 refs = set()
1.95
1.96 for access_location in self.alias_index[accessor_location]:
1.97 +
1.98 + # Obtain any redefined constant access location.
1.99 +
1.100 + if self.const_accesses.has_key(access_location):
1.101 + access_location = self.const_accesses[access_location]
1.102 +
1.103 location, name, attrnames, access_number = access_location
1.104
1.105 # Alias references an attribute access.