Chromium Code Reviews| Index: ppapi/generators/idl_node.py |
| =================================================================== |
| --- ppapi/generators/idl_node.py (revision 163185) |
| +++ ppapi/generators/idl_node.py (working copy) |
| @@ -63,6 +63,7 @@ |
| self.lineno = lineno |
| self.pos = pos |
| self.filename = filename |
| + self.filenode = None |
| self.hashes = {} |
| self.deps = {} |
| self.errors = 0 |
| @@ -70,6 +71,13 @@ |
| self.typelist = None |
| self.parent = None |
| self.property_node = IDLPropertyNode() |
| + |
| + # A list of unique releases for this node |
| + self.releases = None |
| + |
| + # A map from any release, to the first unique release |
| + self.first_release = None |
| + |
| # self.children is a list of children ordered as defined |
| self.children = [] |
| # Process the passed in list of children, placing ExtAttributes into the |
| @@ -104,7 +112,9 @@ |
| self.errors += 1 |
| ErrOut.LogLine(self.filename, self.lineno, 0, ' %s %s' % |
| (str(self), msg)) |
| - if self.lineno == 46: raise Exception("huh?") |
| + if self.filenode: |
| + errcnt = self.filenode.GetProperty('ERRORS', 0) |
| + self.filenode.SetProperty('ERRORS', errcnt + 1) |
| # Log a warning for this object |
| def Warning(self, msg): |
| @@ -130,13 +140,19 @@ |
| if not comments and is_comment: return |
| tab = ''.rjust(depth * 2) |
| - |
| if is_comment: |
| out.write('%sComment\n' % tab) |
| for line in self.GetName().split('\n'): |
| out.write('%s "%s"\n' % (tab, line)) |
| else: |
| - out.write('%s%s\n' % (tab, self)) |
| + ver = IDLRelease.__str__(self) |
| + if self.releases: |
| + release_list = ': ' + ' '.join(self.releases) |
| + else: |
| + release_list = ': undefined' |
| + out.write('%s%s%s%s\n' % (tab, self, ver, release_list)) |
| + if self.typelist: |
| + out.write('%s Typelist: %s\n' % (tab, self.typelist.GetReleases()[0])) |
| properties = self.property_node.GetPropertyList() |
| if properties: |
| out.write('%s Properties\n' % tab) |
| @@ -151,7 +167,6 @@ |
| # |
| # Search related functions |
| # |
| - |
| # Check if node is of a given type |
| def IsA(self, *typelist): |
| if self.cls in typelist: return True |
| @@ -247,59 +262,103 @@ |
| return None |
| return filenode.release_map.GetVersion(release) |
| + def GetUniqueReleases(self, releases): |
| + my_min, my_max = self.GetMinMax(releases) |
| + if my_min > releases[-1] or my_max < releases[0]: |
| + return [] |
| + |
| + out = set() |
| + for rel in releases: |
| + remapped = self.first_release[rel] |
| + if not remapped: continue |
| + if remapped < releases[0]: |
| + remapped = releases[0] |
| + out |= set([remapped]) |
| + out = sorted(out) |
| + return out |
| + |
| + |
| def GetRelease(self, version): |
| filenode = self.GetProperty('FILE') |
| if not filenode: |
| return None |
| return filenode.release_map.GetRelease(version) |
| - def GetUniqueReleases(self, releases): |
| - # Given a list of global release, return a subset of releases |
| - # for this object that change. |
| - last_hash = None |
| - builds = [] |
| - filenode = self.GetProperty('FILE') |
| - file_releases = filenode.release_map.GetReleases() |
| + def _GetReleases(self, releases): |
| + if not self.releases: |
| + my_min, my_max = self.GetMinMax(releases) |
| + my_releases = [my_min] |
| + if my_max != releases[-1]: |
| + my_releases.append(my_max) |
| + my_releases = set(my_releases) |
| + for child in self.GetChildren(): |
| + if child.IsA('Copyright', 'Comment', 'Label'): |
| + continue |
| + my_releases |= child.GetReleases(releases) |
| + self.releases = my_releases |
| + return self.releases |
| - # Generate a set of unique releases for this object based on versions |
| - # available in this file's release labels. |
| - for rel in file_releases: |
| - # Check if this object is valid for the release in question. |
| - if not self.IsRelease(rel): continue |
| - # Only add it if the hash is different. |
| - cur_hash = self.GetHash(rel) |
| - if last_hash != cur_hash: |
| - builds.append(rel) |
| - last_hash = cur_hash |
| - # Remap the requested releases to releases in the unique build set to |
| - # use first available release names and remove duplicates. |
| - # UNIQUE VERSION: 'M13', 'M14', 'M17' |
| - # REQUESTED RANGE: 'M15', 'M16', 'M17', 'M18' |
| - # REMAP RESULT: 'M14', 'M17' |
| - out_list = [] |
| - build_len = len(builds) |
| - build_index = 0 |
| - rel_len = len(releases) |
| - rel_index = 0 |
| + def _GetReleaseList(self, releases): |
| + if not self.releases: |
| + # If we are unversionable, then return first available release |
| + if self.IsA('Comment', 'Copyright', 'Label'): |
| + self.releases = [] |
| + return self.releases |
| - while build_index < build_len and rel_index < rel_len: |
| - while rel_index < rel_len and releases[rel_index] < builds[build_index]: |
| - rel_index = rel_index + 1 |
| + # Generate the first and if deprecated within this subset, the |
| + # last release for this node |
| + my_min, my_max = self.GetMinMax(releases) |
| - # If we've reached the end of the request list, we must be done |
| - if rel_index == rel_len: |
| - break |
| + if my_max != releases[-1]: |
| + my_releases = set([my_min, my_max]) |
| + else: |
| + my_releases = set([my_min]) |
| - # Check this current request |
| - cur = releases[rel_index] |
| - while build_index < build_len and cur >= builds[build_index]: |
| - build_index = build_index + 1 |
| + # Files inherit all there releases from items in the file |
|
sehr
2012/10/22 18:20:09
s/there/their/
|
| + if self.IsA('AST', 'File'): |
| + my_releases = set() |
| - out_list.append(builds[build_index - 1]) |
| - rel_index = rel_index + 1 |
| - return out_list |
| + child_releases = set() |
| + for child in self.children: |
| + child_releases |= set(child._GetReleaseList(releases)) |
| + type_releases = set() |
| + if self.typelist: |
| + type_list = self.typelist.GetReleases() |
| + for typenode in type_list: |
| + type_releases |= set(typenode._GetReleaseList(releases)) |
| + |
| + type_release_list = sorted(type_releases) |
| + if my_min < type_release_list[0]: |
| + type_node = type_list[0] |
| + self.Error('requires %s in %s which is undefined at %s.' % ( |
| + type_node, type_node.filename, my_min)) |
| + |
| + for rel in child_releases: |
| + if rel >= my_min and rel <= my_max: |
| + my_releases |= set([rel]) |
| + |
| + self.releases = sorted(my_releases) |
| + |
| + return self.releases |
| + |
| + def GetReleaseList(self): |
| + return self.releases |
| + |
| + def BuildReleaseMap(self, releases): |
| + unique_list = self._GetReleaseList(releases) |
| + my_min, my_max = self.GetMinMax(releases) |
| + |
| + self.first_release = {} |
| + last_rel = None |
| + for rel in releases: |
| + if rel in unique_list: |
| + last_rel = rel |
| + self.first_release[rel] = last_rel |
| + if rel == my_max: |
| + last_rel = None |
| + |
| def SetProperty(self, name, val): |
| self.property_node.SetProperty(name, val) |
| @@ -393,3 +452,4 @@ |
| if __name__ == '__main__': |
| sys.exit(Main()) |
| + |