Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1324)

Side by Side Diff: ppapi/generators/idl_generator.py

Issue 7477056: Add base class for generators (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ppapi/generators/idl_c_proto.py ('k') | ppapi/generators/idl_namespace.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 #!/usr/bin/python
2 #
3 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
6
7 import sys
8
9 from idl_log import ErrOut, InfoOut, WarnOut
10 from idl_option import GetOption, Option, ParseOptions
11
12 GeneratorList = []
13
14 Option('release', 'Which release to generate.', default='M14')
15 Option('range', 'Which release ranges in the form of MIN,MAX.', default='')
16
17
18 #
19 # Generator
20 #
21 # Base class for generators. This class provides a mechanism for
22 # adding new generator objects to the IDL driver. To use this class
23 # override the GenerateVersion and GenerateRange members, and
24 # instantiate one copy of the class in the same module which defines it to
25 # register the generator. After the AST is generated, call the static Run
26 # member which will check every registered generator to see which ones have
27 # been enabled through command-line options. To enable a generator use the
28 # switches:
29 # --<sname> : To enable with defaults
30 # --<sname>_opt=<XXX,YYY=y> : To enable with generator specific options.
31 #
32 # NOTE: Generators still have access to global options
33
34 class Generator(object):
35 def __init__(self, name, sname, desc):
36 self.name = name
37 self.run_switch = Option(sname, desc)
38 self.opt_switch = Option(sname + '_opt', 'Options for %s.' % sname,
39 default='')
40 GeneratorList.append(self)
41 self.errors = 0
42
43 def Error(self, msg):
44 ErrOut.Log('Error %s : %s' % (self.name, msg))
45 self.errors += 1
46
47 def GetRunOptions(self):
48 options = {}
49 option_list = self.opt_switch.Get()
50 if option_list:
51 option_list = option_list.split(',')
52 for opt in option_list:
53 offs = opt.find('=')
54 if offs > 0:
55 options[opt[:offs]] = opt[offs+1:]
56 else:
57 options[opt] = True
58 return options
59 if self.run_switch.Get():
60 return options
61 return None
62
63 def Generate(self, ast, options):
64 self.errors = 0
65
66 rangestr = GetOption('range')
67 releasestr = GetOption('release')
68
69 # Check for a range option which over-rides a release option
70 if rangestr:
71 range_list = rangestr.split(',')
72 if len(range_list) != 2:
73 self.Error('Failed to generate for %s, incorrect range: "%s"' %
74 (self.name, rangestr))
75 else:
76 vmin = range_list[0]
77 vmax = range_list[1]
78 ret = self.GenerateRange(ast, vmin, vmax, options)
79 if not ret:
80 self.Error('Failed to generate range %s : %s.' %(vmin, vmax))
81 # Otherwise this should be a single release generation
82 else:
83 if releasestr:
84 ret = self.GenerateVersion(ast, releasestr, options)
85 if ret < 0:
86 self.Error('Failed to generate release %s.' % releasestr)
87 else:
88 InfoOut.Log('%s wrote %d files.' % (self.name, ret))
89
90 else:
91 self.Error('No range or release specified for %s.' % releasestr)
92 return self.errors
93
94 def GenerateVersion(self, ast, release, options):
95 __pychecker__ = 'unusednames=ast,release,options'
96 self.Error("Undefined release generator.")
97 return 0
98
99 def GenerateRange(self, ast, vmin, vmax, options):
100 __pychecker__ = 'unusednames=ast,vmin,vmax,options'
101 self.Error("Undefined range generator.")
102 return 0
103
104 @staticmethod
105 def Run(ast):
106 fail_count = 0
107
108 # Check all registered generators if they should run.
109 for gen in GeneratorList:
110 options = gen.GetRunOptions()
111 if options is not None:
112 if gen.Generate(ast, options):
113 fail_count += 1
114 return fail_count
115
116
117 check_release = 0
118 check_range = 0
119
120 class GeneratorVersionTest(Generator):
121 def GenerateVersion(self, ast, release, options = {}):
122 __pychecker__ = 'unusednames=ast,release,options'
123 global check_release
124 check_map = {
125 'so_long': True,
126 'MyOpt': 'XYZ',
127 'goodbye': True
128 }
129 check_release = 1
130 for item in check_map:
131 check_item = check_map[item]
132 option_item = options.get(item, None)
133 if check_item != option_item:
134 print 'Option %s is %s, expecting %s' % (item, option_item, check_item)
135 check_release = 0
136
137 if release != 'M14':
138 check_release = 0
139 return check_release == 1
140
141 def GenerateRange(self, ast, vmin, vmax, options = {}):
142 __pychecker__ = 'unusednames=ast,vmin,vmax,options'
143 global check_range
144 check_range = 1
145 return True
146
147 def Test():
148 __pychecker__ = 'unusednames=args'
149 global check_release
150 global check_range
151
152 ParseOptions(['--testgen_opt=so_long,MyOpt=XYZ,goodbye'])
153 if Generator.Run('AST') != 0:
154 print 'Generate release: Failed.\n'
155 return -1
156
157 if check_release != 1 or check_range != 0:
158 print 'Gererate release: Failed to run.\n'
159 return -1
160
161 check_release = 0
162 ParseOptions(['--testgen_opt="HELLO"', '--range=M14,M16'])
163 if Generator.Run('AST') != 0:
164 print 'Generate range: Failed.\n'
165 return -1
166
167 if check_release != 0 or check_range != 1:
168 print 'Gererate range: Failed to run.\n'
169 return -1
170
171 print 'Generator test: Pass'
172 return 0
173
174
175 def Main(args):
176 if not args: return Test()
177
178 filenames = ParseOptions(args)
179 ast = ParseFiles(filenames)
180
181 return Generator.Run(ast)
182
183
184 if __name__ == '__main__':
185 GeneratorVersionTest('Test Gen', 'testgen', 'Generator Class Test.')
186 sys.exit(Main(sys.argv[1:]))
187
OLDNEW
« no previous file with comments | « ppapi/generators/idl_c_proto.py ('k') | ppapi/generators/idl_namespace.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698