Add idl version of ppb_flash_menu.idl

See CR=11013017

Convert .h to .idl

[email protected]
BUG=None


Review URL: https://chromiumcodereview.appspot.com/11446066

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172932 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/ppapi/generators/idl_c_header.py b/ppapi/generators/idl_c_header.py
index d4561d5..7311472 100755
--- a/ppapi/generators/idl_c_header.py
+++ b/ppapi/generators/idl_c_header.py
@@ -18,11 +18,43 @@
 from idl_parser import ParseFiles
 from idl_c_proto import CGen, GetNodeComments, CommentLines, Comment
 from idl_generator import Generator, GeneratorByFile
+from idl_visitor import IDLVisitor
 
 Option('dstroot', 'Base directory of output', default=os.path.join('..', 'c'))
 Option('guard', 'Include guard prefix', default=os.path.join('ppapi', 'c'))
 
 
+#
+# PrototypeResolver
+#
+# A specialized visitor which traverses the AST, building a mapping of
+# Release names to Versions numbers and calculating a min version.
+# The mapping is applied to the File nodes within the AST.
+#
+class ProtoResolver(IDLVisitor):
+  def __init__(self):
+    IDLVisitor.__init__(self)
+    self.struct_map = {}
+    self.interface_map = {}
+
+  def Arrive(self, node, ignore):
+    if node.IsA('Member') and node.GetProperty('ref'):
+      typeref = node.typelist.GetReleases()[0]
+      if typeref.IsA('Struct'):
+        nodelist = self.struct_map.get(typeref.GetName(), [])
+        nodelist.append(node)
+        self.struct_map[typeref.GetName()] = nodelist
+
+    if node.IsA('Param'):
+      typeref = node.typelist.GetReleases()[0]
+      if typeref.IsA('Interface'):
+        nodelist = self.struct_map.get(typeref.GetName(), [])
+        nodelist.append(node)
+        self.interface_map[typeref.GetName()] = nodelist
+
+    return None
+
+
 def GetPathFromNode(filenode, relpath=None, ext=None):
   path, name = os.path.split(filenode.GetProperty('NAME'))
   if ext: name = os.path.splitext(name)[0] + ext
@@ -128,6 +160,10 @@
 
   def GenerateHead(self, out, filenode, releases, options):
     __pychecker__ = 'unusednames=options'
+
+    proto = ProtoResolver()
+    proto.Visit(filenode, None)
+
     cgen = CGen()
     gpath = GetOption('guard')
     def_guard = GetHeaderFromNode(filenode, relpath=gpath)
@@ -176,6 +212,12 @@
       if include == cur_include: continue
       out.Write('#include "%s"\n' % include)
 
+    # Generate Prototypes
+    if proto.struct_map:
+      out.Write('\n/* Struct prototypes */\n')
+      for struct in proto.struct_map:
+        out.Write('struct %s;\n' % struct)
+
     # If we are generating a single release, then create a macro for the highest
     # available release number.
     if filenode.GetProperty('NAME').endswith('pp_macros.idl'):