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 |
+ 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()) |
+ |