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)