Chromium Code Reviews| Index: ppapi/generators/idl_generator.py |
| =================================================================== |
| --- ppapi/generators/idl_generator.py (revision 0) |
| +++ ppapi/generators/idl_generator.py (revision 0) |
| @@ -0,0 +1,172 @@ |
| +#!/usr/bin/python |
| +# |
| +# Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +import sys |
| + |
| +from idl_log import ErrOut, InfoOut, WarnOut |
| +from idl_option import GetOption, Option, ParseOptions |
| + |
| +GeneratorList = [] |
| + |
| +Option('version', 'Which version to generate.', default='M14') |
| +Option('range', 'Which version ranges in the form of MIN,MAX.', default='') |
| + |
| + |
| +# |
| +# Generator |
| +# |
| +# Base class for generators. This class provides a mechanism for |
| +# adding new generator objects to the IDL driver. To use this class |
| +# override the GenerateVersion and GenerateRange members, and |
| +# instantiate one copy of the class in the same module which defines it to |
| +# register the generator. After the AST is generated, call the static Run |
| +# member which will check every registered generator to see which ones have |
| +# been enabled through command-line options. To a enable generator use the |
|
sehr (please use chromium)
2011/08/16 16:43:12
s/a enable/enable a/
noelallen1
2011/08/19 17:07:29
Done.
|
| +# switches: |
| +# --<sname> : To enable with defaults |
| +# --<sname>_opt=<XXX,YYY=y> : To enable with generator specific options. |
| +# |
| +# NOTE: Generators still have access to global options |
| + |
| +class Generator(object): |
| + def __init__(self, name, sname, desc): |
| + self.name = name |
| + self.run_switch = Option(sname, desc) |
| + self.opt_switch = Option(sname + '_opt', 'Options for %s.' % sname, |
| + default='') |
| + GeneratorList.append(self) |
| + self.errors = 0 |
| + |
| + def Error(self, msg): |
| + ErrOut.Log('Error %s : %s' % (self.name, msg)) |
| + self.errors += 1 |
| + |
| + def GetRunOptions(self): |
| + options = {} |
| + option_list = self.opt_switch.Get() |
| + if option_list: |
| + option_list = option_list.split(',') |
| + for opt in option_list: |
| + offs = opt.find('=') |
| + if offs > 0: |
| + options[opt[:offs]] = opt[offs+1:] |
| + else: |
| + options[opt] = True |
| + return options |
| + if self.run_switch.Get(): |
| + return options |
| + return None |
| + |
| + def Generate(self, ast, options): |
| + self.errors = 0 |
| + |
| + rangestr = GetOption('range') |
| + versionstr = GetOption('version') |
| + |
| + # Check for a range option which over-rides a version option |
| + if rangestr: |
| + range_list = rangestr.split(',') |
| + if len(range_list) != 2: |
| + self.Error('Failed to generate for %s, incorrect range: "%s"' % |
| + (self.name, rangestr)) |
| + else: |
| + vmin = range_list[0] |
| + vmax = range_list[1] |
| + ret = self.GenerateRange(ast, vmin, vmax, options) |
| + if not ret: |
| + self.Error('Failed to generate range %s : %s.' %(vmin, vmax)) |
| + # Otherwise this should be a single version generation |
| + else: |
| + if versionstr: |
| + ret = self.GenerateVersion(ast, versionstr, options) |
| + if not ret: |
| + self.Error('Failed to generate version.') |
| + else: |
| + self.Error('No range or version specified for %s.' % versionstr) |
| + return self.errors |
| + |
| + def GenerateVersion(self, ast, version, options): |
| + __pychecker__ = 'unusednames=ast,version,options' |
| + self.Error("Undefined version generator.") |
| + |
| + def GenerateRange(self, ast, vmin, vmax, options): |
| + __pychecker__ = 'unusednames=ast,vmin,vmax,options' |
| + self.Error("Undefined range generator.") |
| + |
| + @staticmethod |
| + def Run(ast): |
| + count = 0 |
| + |
| + # Check all registered generators if they should run. |
| + for gen in GeneratorList: |
| + options = gen.GetRunOptions() |
| + if options is not None: |
| + if not gen.Generate(ast, options): |
| + count += 1 |
| + return count |
|
sehr (please use chromium)
2011/08/16 16:43:12
what is the significance of count? The number of
noelallen1
2011/08/19 17:07:29
Done.
|
| + |
| + |
| +check_version = 0 |
| +check_range = 0 |
| + |
| +class GeneratorVersionTest(Generator): |
| + def GenerateVersion(self, ast, version, options = {}): |
| + __pychecker__ = 'unusednames=ast,version,options' |
| + global check_version |
| + check_map = { |
| + 'so_long': True, |
| + 'MyOpt': 'XYZ', |
| + 'goodbye': True |
| + } |
| + check_version = 1 |
| + for item in check_map: |
| + check_item = check_map[item] |
| + option_item = options.get(item, None) |
| + if check_item != option_item: |
| + print 'Option %s is %s, expecting %s' % (item, option_item, check_item) |
| + check_version = 0 |
| + |
| + if version != 'M14': |
| + check_version = 0 |
| + return check_version == 1 |
| + |
| + def GenerateRange(self, ast, vmin, vmax, options = {}): |
| + __pychecker__ = 'unusednames=ast,vmin,vmax,options' |
| + global check_range |
| + check_range = 1 |
| + return True |
| + |
| +def Main(args): |
| + __pychecker__ = 'unusednames=args' |
| + global check_version |
| + global check_range |
| + |
| + ParseOptions(['--testgen_opt=so_long,MyOpt=XYZ,goodbye']) |
| + if Generator.Run('AST') != 1: |
| + print 'Generate version: Failed.\n' |
| + return -1 |
| + |
| + if check_version != 1 or check_range != 0: |
| + print 'Gererate version: Failed to run.\n' |
| + return -1 |
| + |
| + check_version = 0 |
| + ParseOptions(['--testgen_opt="HELLO"', '--range=M14,M16']) |
| + if Generator.Run('AST') != 1: |
| + print 'Generate range: Failed.\n' |
| + return -1 |
| + |
| + if check_version != 0 or check_range != 1: |
| + print 'Gererate range: Failed to run.\n' |
| + return -1 |
| + |
| + print 'Generator test: Pass' |
| + return 0 |
| + |
| +if __name__ == '__main__': |
| + GeneratorVersionTest('Test Gen', 'testgen', 'Generator Class Test.') |
| + sys.exit(Main(sys.argv[1:])) |
| + |
| Property changes on: ppapi/generators/idl_generator.py |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |