Pepper: More IDL generator cleanup.

This change makes running the test for idl_c_proto work again, by fixing the
test.

It also removes an unused "BuiltIn" type list in idl_ast, which was very
confusing, and performs some other small cleanup I came across while adding
support for dev channel versions.

BUG=

Review URL: https://codereview.chromium.org/98343005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@238711 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/ppapi/generators/idl_ast.py b/ppapi/generators/idl_ast.py
index 2aacb11..74dce942 100644
--- a/ppapi/generators/idl_ast.py
+++ b/ppapi/generators/idl_ast.py
@@ -11,15 +11,6 @@
 from idl_release import IDLReleaseMap
 
 #
-# IDL Predefined types
-#
-BuiltIn = set(['int8_t', 'int16_t', 'int32_t', 'int64_t', 'uint8_t',
-               'uint16_t', 'uint32_t', 'uint64_t', 'double_t', 'float_t',
-               'handle_t', 'interface_t', 'char', 'mem_t', 'mem_ptr_t',
-               'str_t', 'void'])
-
-
-#
 # IDLLabelResolver
 #
 # A specialized visitor which traverses the AST, building a mapping of
@@ -78,7 +69,7 @@
       node.namespace = parent_namespace
     else:
     # otherwise create one.
-      node.namespace = IDLNamespace(parent_namespace, node.GetName())
+      node.namespace = IDLNamespace(parent_namespace)
 
     # If this node is named, place it in its parent's namespace
     if parent_namespace and node.cls in IDLNode.NamedSet:
@@ -124,7 +115,7 @@
         node.SetMinRange(file_min)
 
     # If this node has a TYPEREF, resolve it to a version list
-    typeref = node.property_node.GetPropertyLocal('TYPEREF')
+    typeref = node.GetPropertyLocal('TYPEREF')
     if typeref:
       node.typelist = node.parent.namespace.FindList(typeref)
       if not node.typelist:
@@ -164,7 +155,7 @@
     IDLLabelResolver().Visit(self, None)
 
     # Generate the Namesapce Tree
-    self.namespace = IDLNamespace(None, 'AST')
+    self.namespace = IDLNamespace(None)
     IDLNamespaceVersionResolver().Visit(self, self.namespace)
 
     # Using the namespace, resolve type references
diff --git a/ppapi/generators/idl_c_proto.py b/ppapi/generators/idl_c_proto.py
index 7e49c02..34d5361 100755
--- a/ppapi/generators/idl_c_proto.py
+++ b/ppapi/generators/idl_c_proto.py
@@ -568,28 +568,22 @@
       if len(build_list) != 1:
         node.Error('Can not support multiple versions of node.')
       assert len(build_list) == 1
-
+      out = self.DefineStructInternals(node, build_list[-1],
+                                       include_version=False, comment=True)
 
     if node.IsA('Interface'):
       # Build the most recent one versioned, with comments
       out = self.DefineStructInternals(node, build_list[-1],
                                        include_version=True, comment=True)
-
       # Define an unversioned typedef for the most recent version
       out += '\ntypedef struct %s %s;\n' % (
           self.GetStructName(node, build_list[-1], include_version=True),
           self.GetStructName(node, build_list[-1], include_version=False))
-    else:
-      # Build the most recent one versioned, with comments
-      out = self.DefineStructInternals(node, build_list[-1],
-                                       include_version=False, comment=True)
-
-
-    # Build the rest without comments and with the version number appended
-    for rel in build_list[0:-1]:
-      out += '\n' + self.DefineStructInternals(node, rel,
-                                               include_version=True,
-                                               comment=False)
+      # Build the rest without comments and with the version number appended
+      for rel in build_list[0:-1]:
+        out += '\n' + self.DefineStructInternals(node, rel,
+                                                 include_version=True,
+                                                 comment=False)
 
     self.LogExit('Exit DefineStruct')
     return out
@@ -752,7 +746,7 @@
       print 'Skipping %s' % f.GetName()
       continue
     for node in f.GetChildren()[2:]:
-      print cgen.Define(node, comment=True, prefix='tst_')
+      print cgen.Define(node, ast.releases, comment=True, prefix='tst_')
 
 
 if __name__ == '__main__':
diff --git a/ppapi/generators/idl_log.py b/ppapi/generators/idl_log.py
index b7f2151a..f5b103e 100644
--- a/ppapi/generators/idl_log.py
+++ b/ppapi/generators/idl_log.py
@@ -4,54 +4,49 @@
 
 """ Error and information logging for IDL """
 
-#
-# IDL Log
-#
-# And IDLLog object provides a mechanism for capturing logging output
-# and/or sending out via a file handle (usually stdout or stderr).
-#
 import sys
 
 
 class IDLLog(object):
+  """Captures and routes logging output.
+
+  Caputres logging output and/or sends out via a file handle, typically
+  stdout or stderr.
+  """
   def __init__(self, name, out):
     if name:
-      self.name = '%s : ' % name
+      self._name = '%s : ' % name
     else:
-      self.name = ''
+      self._name = ''
 
-    self.out = out
-    self.capture = False
-    self.console = True
-    self.log = []
+    self._out = out
+    self._capture = False
+    self._console = True
+    self._log = []
 
   def Log(self, msg):
-    line = "%s\n" % (msg)
-    if self.console: self.out.write(line)
-    if self.capture:
-      self.log.append(msg)
-
-  def LogTag(self, msg):
-    line = "%s%s\n" % (self.name, msg)
-    if self.console: self.out.write(line)
-    if self.capture:
-      self.log.append(msg)
+    if self._console:
+      line = "%s\n" % (msg)
+      self._out.write(line)
+    if self._capture:
+      self._log.append(msg)
 
   def LogLine(self, filename, lineno, pos, msg):
-    line = "%s(%d) : %s%s\n" % (filename, lineno, self.name, msg)
-    if self.console: self.out.write(line)
-    if self.capture: self.log.append(msg)
+    if self._console:
+      line = "%s(%d) : %s%s\n" % (filename, lineno, self._name, msg)
+      self._out.write(line)
+    if self._capture:
+      self._log.append(msg)
 
-  def SetConsole(self, enable, out = None):
-    self.console = enable
-    if out: self.out = out
+  def SetConsole(self, enable):
+    self._console = enable
 
   def SetCapture(self, enable):
-    self.capture = enable
+    self._capture = enable
 
   def DrainLog(self):
-    out = self.log
-    self.log = []
+    out = self._log
+    self._log = []
     return out
 
 ErrOut  = IDLLog('Error', sys.stderr)
diff --git a/ppapi/generators/idl_namespace.py b/ppapi/generators/idl_namespace.py
index 0d74b547..b81411e 100755
--- a/ppapi/generators/idl_namespace.py
+++ b/ppapi/generators/idl_namespace.py
@@ -28,10 +28,9 @@
 # one or more IDLNodes based on a release or range of releases.
 #
 class IDLNamespace(object):
-  def __init__(self, parent, name):
+  def __init__(self, parent):
     self._name_to_releases = {}
     self._parent = parent
-    self._name = name
 
   def Dump(self):
     for name in self._name_to_releases:
@@ -73,7 +72,6 @@
     return verlist.AddNode(node)
 
 
-
 #
 # Testing Code
 #
diff --git a/ppapi/generators/idl_node.py b/ppapi/generators/idl_node.py
index f9eaddc..3c947070 100755
--- a/ppapi/generators/idl_node.py
+++ b/ppapi/generators/idl_node.py
@@ -58,15 +58,14 @@
     self.cls = cls
     self.lineno = lineno
     self.pos = pos
-    self.filename = filename
-    self.filenode = None
-    self.deps = {}
+    self._filename = filename
+    self._deps = {}
     self.errors = 0
     self.namespace = None
     self.typelist = None
     self.parent = None
-    self.property_node = IDLPropertyNode()
-    self.unique_releases = None
+    self._property_node = IDLPropertyNode()
+    self._unique_releases = None
 
     # A list of unique releases for this node
     self.releases = None
@@ -74,8 +73,8 @@
     # 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 = []
+    # self._children is a list of children ordered as defined
+    self._children = []
     # Process the passed in list of children, placing ExtAttributes into the
     # property dictionary, and nodes into the local child list in order.  In
     # addition, add nodes to the namespace if the class is in the NamedSet.
@@ -86,43 +85,38 @@
         else:
           self.AddChild(child)
 
-#
-# String related functions
-#
-#
-
-  # Return a string representation of this node
   def __str__(self):
     name = self.GetName()
     if name is None:
       name = ''
     return '%s(%s)' % (self.cls, name)
 
-  # Return file and line number for where node was defined
   def Location(self):
-    return '%s(%d)' % (self.filename, self.lineno)
+    """Return a file and line number for where this node was defined."""
+    return '%s(%d)' % (self._filename, self.lineno)
 
-  # Log an error for this object
   def Error(self, msg):
+    """Log an error for this object."""
     self.errors += 1
-    ErrOut.LogLine(self.filename, self.lineno, 0, ' %s %s' %
+    ErrOut.LogLine(self._filename, self.lineno, 0, ' %s %s' %
                    (str(self), msg))
-    if self.filenode:
-      errcnt = self.filenode.GetProperty('ERRORS')
+    filenode = self.GetProperty('FILE')
+    if filenode:
+      errcnt = filenode.GetProperty('ERRORS')
       if not errcnt:
         errcnt = 0
-      self.filenode.SetProperty('ERRORS', errcnt + 1)
+      filenode.SetProperty('ERRORS', errcnt + 1)
 
-  # Log a warning for this object
   def Warning(self, msg):
-    WarnOut.LogLine(self.filename, self.lineno, 0, ' %s %s' %
+    """Log a warning for this object."""
+    WarnOut.LogLine(self._filename, self.lineno, 0, ' %s %s' %
                     (str(self), msg))
 
   def GetName(self):
     return self.GetProperty('NAME')
 
-  # Dump this object and its children
   def Dump(self, depth=0, comments=False, out=sys.stdout):
+    """Dump this object and its children"""
     if self.cls in ['Comment', 'Copyright']:
       is_comment = True
     else:
@@ -146,7 +140,7 @@
       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()
+    properties = self._property_node.GetPropertyList()
     if properties:
       out.write('%s  Properties\n' % tab)
       for p in properties:
@@ -154,41 +148,39 @@
           # Skip printing the name for comments, since we printed above already
           continue
         out.write('%s    %s : %s\n' % (tab, p, self.GetProperty(p)))
-    for child in self.children:
+    for child in self._children:
       child.Dump(depth+1, comments=comments, out=out)
 
-#
-# Search related functions
-#
-  # Check if node is of a given type
   def IsA(self, *typelist):
+    """Check if node is of a given type."""
     return self.cls in typelist
 
-  # Get a list of objects for this key
   def GetListOf(self, *keys):
+    """Get a list of objects for the given key(s)."""
     out = []
-    for child in self.children:
+    for child in self._children:
       if child.cls in keys:
         out.append(child)
     return out
 
   def GetOneOf(self, *keys):
+    """Get an object for the given key(s)."""
     out = self.GetListOf(*keys)
     if out:
       return out[0]
     return None
 
   def SetParent(self, parent):
-    self.property_node.AddParent(parent)
+    self._property_node.AddParent(parent)
     self.parent = parent
 
   def AddChild(self, node):
     node.SetParent(self)
-    self.children.append(node)
+    self._children.append(node)
 
   # Get a list of all children
   def GetChildren(self):
-    return self.children
+    return self._children
 
   def GetType(self, release):
     if not self.typelist:
@@ -203,7 +195,7 @@
       return set([])
 
     # If we have cached the info for this release, return the cached value
-    deps = self.deps.get(release, None)
+    deps = self._deps.get(release, None)
     if deps is not None:
       return deps
 
@@ -225,7 +217,7 @@
     if typeref:
       deps |= typeref.GetDeps(release, visited)
 
-    self.deps[release] = deps
+    self._deps[release] = deps
     return deps
 
   def GetVersion(self, release):
@@ -251,13 +243,13 @@
       out |= set([remapped])
 
     # Cache the most recent set of unique_releases
-    self.unique_releases = sorted(out)
-    return self.unique_releases
+    self._unique_releases = sorted(out)
+    return self._unique_releases
 
   def LastRelease(self, release):
     # Get the most recent release from the most recently generated set of
     # cached unique releases.
-    if self.unique_releases and self.unique_releases[-1] > release:
+    if self._unique_releases and self._unique_releases[-1] > release:
       return False
     return True
 
@@ -300,7 +292,7 @@
       # Exclude sibling results from parent visited set
       cur_visits = visited
 
-      for child in self.children:
+      for child in self._children:
         child_releases |= set(child._GetReleaseList(releases, cur_visits))
         visited |= set(child_releases)
 
@@ -315,7 +307,7 @@
         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))
+              type_node, type_node._filename, my_min))
 
       for rel in child_releases | type_releases:
         if rel >= my_min and rel <= my_max:
@@ -324,9 +316,6 @@
       self.releases = sorted(my_releases)
     return self.releases
 
-  def GetReleaseList(self):
-    return self.releases
-
   def BuildReleaseMap(self, releases):
     unique_list = self._GetReleaseList(releases)
     _, my_max = self.GetMinMax(releases)
@@ -341,11 +330,13 @@
         last_rel = None
 
   def SetProperty(self, name, val):
-    self.property_node.SetProperty(name, val)
+    self._property_node.SetProperty(name, val)
 
   def GetProperty(self, name):
-    return self.property_node.GetProperty(name)
+    return self._property_node.GetProperty(name)
 
+  def GetPropertyLocal(self, name):
+    return self._property_node.GetPropertyLocal(name)
 
 #
 # IDLFile
diff --git a/ppapi/generators/idl_parser.py b/ppapi/generators/idl_parser.py
index 6f0ea12..748056432 100755
--- a/ppapi/generators/idl_parser.py
+++ b/ppapi/generators/idl_parser.py
@@ -976,7 +976,7 @@
 def FlattenTree(node):
   add_self = False
   out = []
-  for child in node.children:
+  for child in node.GetChildren():
     if child.IsA('Comment'):
       add_self = True
     else:
diff --git a/ppapi/generators/idl_tests.py b/ppapi/generators/idl_tests.py
index cfc9fe8..bf6d8a1 100755
--- a/ppapi/generators/idl_tests.py
+++ b/ppapi/generators/idl_tests.py
@@ -30,6 +30,10 @@
   assert errors == 0
   errors += TestIDL('idl_gen_pnacl.py', ['--wnone', '--test'])
   assert errors == 0
+  errors += TestIDL('idl_namespace.py', [])
+  assert errors == 0
+  errors += TestIDL('idl_node.py', [])
+  assert errors == 0
 
   if errors:
     print '\nFailed tests.'
diff --git a/ppapi/generators/test_lex.in b/ppapi/generators/test_lex.in
deleted file mode 100644
index e0a000a..0000000
--- a/ppapi/generators/test_lex.in
+++ /dev/null
@@ -1,65 +0,0 @@
-INT 1 INT 123 INT 12345
-SYMBOL A123 SYMBOL A_A
-
-COMMENT /*XXXX*/
-COMMENT //XXXX
-
-COMMENT /*MULTI LINE*/
-
-[ [
-] ]
-* *
-. .
-( (
-) )
-{ {
-} }
-[ [
-] ]
-, ,
-; ;
-: :
-= =
-+ +
-- -
-/ /
-~ ~
-| |
-& &
-^ ^
-<< <<
->> >>
-
-FLOAT 1.1
-FLOAT 1e1
-FLOAT -1.1
-FLOAT -1e1
-FLOAT 1e-1
-FLOAT -1e-1
-FLOAT 1.0e1
-FLOAT -1.0e-1
-
-HEX 0x1
-HEX 0x0
-HEX 0x10
-HEX 0x112312
-HEX 0x1ABCD0
-HEX 0xA0B0C0
-HEX 0xabcdef
-HEX 0x1ab2cd
-
-OCT 00
-OCT 01
-OCT 0123
-
-INLINE #inline C
-This is an inline block.
-
-Contains /* Comments */
-Contains // Comments
-Contains /* Multi-line
-            Comment */
-
-#endinl 
-SYMBOL blah
-
diff --git a/tools/json_schema_compiler/idl_schema.py b/tools/json_schema_compiler/idl_schema.py
index b516d39..c6e49bf 100644
--- a/tools/json_schema_compiler/idl_schema.py
+++ b/tools/json_schema_compiler/idl_schema.py
@@ -107,7 +107,7 @@
       # TODO(asargent): fix the IDL parser to support optional return types.
       if return_type.get('type') == 'object' or '$ref' in return_type:
         return_type['optional'] = True
-    for node in self.node.children:
+    for node in self.node.GetChildren():
       parameter = Param(node).process(callbacks)
       if parameter['name'] in self.comment:
         parameter['description'] = self.comment[parameter['name']]
@@ -139,7 +139,7 @@
 
   def process(self, callbacks):
     properties = OrderedDict()
-    for node in self.node.children:
+    for node in self.node.GetChildren():
       if node.cls == 'Member':
         k, v = Member(node).process(callbacks)
         properties[k] = v
@@ -181,7 +181,7 @@
           option_name))
     is_function = False
     parameter_comments = OrderedDict()
-    for node in self.node.children:
+    for node in self.node.GetChildren():
       if node.cls == 'Comment':
         (parent_comment, parameter_comments) = ProcessComment(node.GetName())
         properties['description'] = parent_comment
@@ -290,10 +290,10 @@
 
   def process(self, callbacks):
     enum = []
-    for node in self.node.children:
+    for node in self.node.GetChildren():
       if node.cls == 'EnumItem':
         enum_value = {'name': node.GetName()}
-        for child in node.children:
+        for child in node.GetChildren():
           if child.cls == 'Comment':
             enum_value['description'] = ProcessComment(child.GetName())[0]
           else:
@@ -338,7 +338,7 @@
     self.description = description
 
   def process(self):
-    for node in self.namespace.children:
+    for node in self.namespace.GetChildren():
       if node.cls == 'Dictionary':
         self.types.append(Dictionary(node).process(self.callbacks))
       elif node.cls == 'Callback':
@@ -368,7 +368,7 @@
 
   def process_interface(self, node):
     members = []
-    for member in node.children:
+    for member in node.GetChildren():
       if member.cls == 'Member':
         name, properties = Member(member).process(self.callbacks)
         members.append(properties)