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

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

Issue 8538029: Cleanup IDL Generator (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years, 1 month 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_header.py ('k') | ppapi/generators/idl_generator.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # 2 #
3 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file. 5 # found in the LICENSE file.
6 6
7 """ Generator for C style prototypes and definitions """ 7 """ Generator for C style prototypes and definitions """
8 8
9 import glob 9 import glob
10 import os 10 import os
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 if prefix: 51 if prefix:
52 prefix_lines = prefix.split('\n') 52 prefix_lines = prefix.split('\n')
53 # If both the prefix and comment start with a blank line ('*') remove 53 # If both the prefix and comment start with a blank line ('*') remove
54 # the extra one. 54 # the extra one.
55 if prefix_lines[0] == '*' and lines[0] == '*': 55 if prefix_lines[0] == '*' and lines[0] == '*':
56 lines = prefix_lines + lines[1:] 56 lines = prefix_lines + lines[1:]
57 else: 57 else:
58 lines = prefix_lines + lines; 58 lines = prefix_lines + lines;
59 return CommentLines(lines, tabs) 59 return CommentLines(lines, tabs)
60 60
61 def GetNodeComments(node, prefix=None, tabs=0): 61 def GetNodeComments(node, tabs=0):
62 # Generate a comment block joining all comment nodes which are children of 62 # Generate a comment block joining all comment nodes which are children of
63 # the provided node. 63 # the provided node.
64 comment_txt = '' 64 comment_txt = ''
65 for doc in node.GetListOf('Comment'): 65 for doc in node.GetListOf('Comment'):
66 comment_txt += Comment(doc, tabs=tabs) 66 comment_txt += Comment(doc, tabs=tabs)
67 return comment_txt 67 return comment_txt
68 68
69 69
70 class CGen(object): 70 class CGen(object):
71 # TypeMap 71 # TypeMap
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 } 151 }
152 152
153 def __init__(self): 153 def __init__(self):
154 self.dbg_depth = 0 154 self.dbg_depth = 0
155 155
156 # 156 #
157 # Debug Logging functions 157 # Debug Logging functions
158 # 158 #
159 def Log(self, txt): 159 def Log(self, txt):
160 if not GetOption('cgen_debug'): return 160 if not GetOption('cgen_debug'): return
161 tabs = '' 161 tabs = ' ' * self.dbg_depth
162 for tab in range(self.dbg_depth): tabs += ' '
163 print '%s%s' % (tabs, txt) 162 print '%s%s' % (tabs, txt)
164 163
165 def LogEnter(self, txt): 164 def LogEnter(self, txt):
166 if txt: self.Log(txt) 165 if txt: self.Log(txt)
167 self.dbg_depth += 1 166 self.dbg_depth += 1
168 167
169 def LogExit(self, txt): 168 def LogExit(self, txt):
170 self.dbg_depth -= 1 169 self.dbg_depth -= 1
171 if txt: self.Log(txt) 170 if txt: self.Log(txt)
172 171
172
173 def GetDefine(self, name, value):
174 out = '#define %s %s' % (name, value)
175 if len(out) > 80:
176 out = '#define %s \\\n %s' % (name, value)
177 return '%s\n' % out
178
179 #
180 # Interface strings
181 #
182 def GetMacroHelper(self, node):
183 macro = node.GetProperty('macro')
184 if macro: return macro
185 name = node.GetName()
186 name = name.upper()
187 return "%s_INTERFACE" % name
188
189 def GetInterfaceMacro(self, node, version = None):
190 name = self.GetMacroHelper(node)
191 if version is None:
192 return name
193 return '%s_%s' % (name, str(version).replace('.', '_'))
194
195 def GetInterfaceString(self, node, version = None):
196 # If an interface name is specified, use that
197 name = node.GetProperty('iname')
198 if not name:
199 # Otherwise, the interface name is the object's name
200 # With '_Dev' replaced by '(Dev)' if it's a Dev interface.
201 name = node.GetName()
202 if name.endswith('_Dev'):
203 name = '%s(Dev)' % name[:-4]
204 if version is None:
205 return name
206 return "%s;%s" % (name, version)
207
208
173 # 209 #
174 # Return the array specification of the object. 210 # Return the array specification of the object.
175 # 211 #
176 def GetArraySpec(self, node): 212 def GetArraySpec(self, node):
177 assert(node.cls == 'Array') 213 assert(node.cls == 'Array')
178 out = ''
179 fixed = node.GetProperty('FIXED') 214 fixed = node.GetProperty('FIXED')
180 if fixed: 215 if fixed:
181 return '[%s]' % fixed 216 return '[%s]' % fixed
182 else: 217 else:
183 return '[]' 218 return '[]'
184 219
185 # 220 #
186 # GetTypeName 221 # GetTypeName
187 # 222 #
188 # For any valid 'typed' object such as Member or Typedef 223 # For any valid 'typed' object such as Member or Typedef
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 # 395 #
361 def GetSignature(self, node, release, mode, prefix='', func_as_ptr=True): 396 def GetSignature(self, node, release, mode, prefix='', func_as_ptr=True):
362 self.LogEnter('GetSignature %s %s as func=%s' % (node, mode, func_as_ptr)) 397 self.LogEnter('GetSignature %s %s as func=%s' % (node, mode, func_as_ptr))
363 rtype, name, arrayspec, callspec = self.GetComponents(node, release, mode) 398 rtype, name, arrayspec, callspec = self.GetComponents(node, release, mode)
364 out = self.Compose(rtype, name, arrayspec, callspec, prefix, func_as_ptr) 399 out = self.Compose(rtype, name, arrayspec, callspec, prefix, func_as_ptr)
365 self.LogExit('Exit GetSignature: %s' % out) 400 self.LogExit('Exit GetSignature: %s' % out)
366 return out 401 return out
367 402
368 # Define a Typedef. 403 # Define a Typedef.
369 def DefineTypedef(self, node, releases, prefix='', comment=False): 404 def DefineTypedef(self, node, releases, prefix='', comment=False):
405 __pychecker__ = 'unusednames=comment'
370 release = releases[0] 406 release = releases[0]
371 out = 'typedef %s;\n' % self.GetSignature(node, release, 'return', 407 out = 'typedef %s;\n' % self.GetSignature(node, release, 'return',
372 prefix, True) 408 prefix, True)
373 self.Log('DefineTypedef: %s' % out) 409 self.Log('DefineTypedef: %s' % out)
374 return out 410 return out
375 411
376 # Define an Enum. 412 # Define an Enum.
377 def DefineEnum(self, node, releases, prefix='', comment=False): 413 def DefineEnum(self, node, releases, prefix='', comment=False):
414 __pychecker__ = 'unusednames=comment,releases'
378 self.LogEnter('DefineEnum %s' % node) 415 self.LogEnter('DefineEnum %s' % node)
379 unnamed = node.GetProperty('unnamed') 416 unnamed = node.GetProperty('unnamed')
380 if unnamed: 417 if unnamed:
381 out = 'enum {' 418 out = 'enum {'
382 else: 419 else:
383 out = 'typedef enum {' 420 out = 'typedef enum {'
384 name = '%s%s' % (prefix, node.GetName()) 421 name = '%s%s' % (prefix, node.GetName())
385 enumlist = [] 422 enumlist = []
386 for child in node.GetListOf('EnumItem'): 423 for child in node.GetListOf('EnumItem'):
387 value = child.GetProperty('VALUE') 424 value = child.GetProperty('VALUE')
388 comment_txt = GetNodeComments(child, tabs=1) 425 comment_txt = GetNodeComments(child, tabs=1)
389 if value: 426 if value:
390 item_txt = '%s%s = %s' % (prefix, child.GetName(), value) 427 item_txt = '%s%s = %s' % (prefix, child.GetName(), value)
391 else: 428 else:
392 item_txt = '%s%s' % (prefix, child.GetName()) 429 item_txt = '%s%s' % (prefix, child.GetName())
393 enumlist.append('%s %s' % (comment_txt, item_txt)) 430 enumlist.append('%s %s' % (comment_txt, item_txt))
394 self.LogExit('Exit DefineEnum') 431 self.LogExit('Exit DefineEnum')
395 432
396 if unnamed: 433 if unnamed:
397 out = '%s\n%s\n};\n' % (out, ',\n'.join(enumlist)) 434 out = '%s\n%s\n};\n' % (out, ',\n'.join(enumlist))
398 else: 435 else:
399 out = '%s\n%s\n} %s;\n' % (out, ',\n'.join(enumlist), name) 436 out = '%s\n%s\n} %s;\n' % (out, ',\n'.join(enumlist), name)
400 return out 437 return out
401 438
402 def DefineMember(self, node, releases, prefix='', comment=False): 439 def DefineMember(self, node, releases, prefix='', comment=False):
440 __pychecker__ = 'unusednames=prefix,comment'
403 release = releases[0] 441 release = releases[0]
404 self.LogEnter('DefineMember %s' % node) 442 self.LogEnter('DefineMember %s' % node)
405 out = '%s;' % self.GetSignature(node, release, 'store', '', True) 443 out = '%s;' % self.GetSignature(node, release, 'store', '', True)
406 self.LogExit('Exit DefineMember') 444 self.LogExit('Exit DefineMember')
407 return out 445 return out
408 446
409 def DefineStructInternals(self, node, release, suffix='', comment=True): 447 def DefineStructInternals(self, node, release, suffix='', comment=True):
410 out = '' 448 out = ''
411 if node.GetProperty('union'): 449 if node.GetProperty('union'):
412 out += 'union %s%s {\n' % (node.GetName(), suffix) 450 out += 'union %s%s {\n' % (node.GetName(), suffix)
413 else: 451 else:
414 out += 'struct %s%s {\n' % (node.GetName(), suffix) 452 out += 'struct %s%s {\n' % (node.GetName(), suffix)
415 453
416 # Generate Member Functions 454 # Generate Member Functions
417 members = [] 455 members = []
418 for child in node.GetListOf('Member'): 456 for child in node.GetListOf('Member'):
419 member = self.Define(child, [release], tabs=1, comment=comment) 457 member = self.Define(child, [release], tabs=1, comment=comment)
420 if not member: 458 if not member:
421 continue 459 continue
422 members.append(member) 460 members.append(member)
423 out += '%s\n};\n' % '\n'.join(members) 461 out += '%s\n};\n' % '\n'.join(members)
424 return out 462 return out
425 463
426 464
427 def DefineStruct(self, node, releases, prefix='', comment=False): 465 def DefineStruct(self, node, releases, prefix='', comment=False):
466 __pychecker__ = 'unusednames=comment,prefix'
428 self.LogEnter('DefineStruct %s' % node) 467 self.LogEnter('DefineStruct %s' % node)
429 out = '' 468 out = ''
430 build_list = node.GetUniqueReleases(releases) 469 build_list = node.GetUniqueReleases(releases)
431 470
432 # Build the most recent one with comments 471 # Build the most recent one with comments
433 out = self.DefineStructInternals(node, build_list[-1], comment=True) 472 out = self.DefineStructInternals(node, build_list[-1], comment=True)
434 473
435 # Build the rest without comments and with the version number appended 474 # Build the rest without comments and with the version number appended
436 for rel in build_list[0:-1]: 475 for rel in build_list[0:-1]:
437 ver_num = node.GetVersion(rel) 476 ver_num = node.GetVersion(rel)
(...skipping 14 matching lines...) Expand all
452 lines = node.GetName().split('\n') 491 lines = node.GetName().split('\n')
453 return CommentLines(lines, tabs) 492 return CommentLines(lines, tabs)
454 493
455 494
456 # Define a top level object. 495 # Define a top level object.
457 def Define(self, node, releases, tabs=0, prefix='', comment=False): 496 def Define(self, node, releases, tabs=0, prefix='', comment=False):
458 if not node.InReleases(releases): 497 if not node.InReleases(releases):
459 return '' 498 return ''
460 499
461 self.LogEnter('Define %s tab=%d prefix="%s"' % (node,tabs,prefix)) 500 self.LogEnter('Define %s tab=%d prefix="%s"' % (node,tabs,prefix))
462 declmap = { 501 declmap = dict({
463 'Enum' : CGen.DefineEnum, 502 'Enum': CGen.DefineEnum,
464 'Function' : CGen.DefineMember, 503 'Function': CGen.DefineMember,
465 'Interface' : CGen.DefineStruct, 504 'Interface': CGen.DefineStruct,
466 'Member' : CGen.DefineMember, 505 'Member': CGen.DefineMember,
467 'Struct' : CGen.DefineStruct, 506 'Struct': CGen.DefineStruct,
468 'Typedef' : CGen.DefineTypedef, 507 'Typedef': CGen.DefineTypedef
469 } 508 })
470 509
471 out = '' 510 out = ''
472 func = declmap.get(node.cls) 511 func = declmap.get(node.cls, None)
473 if not func: 512 if not func:
474 ErrOut.Log('Failed to define %s named %s' % (node.cls, node.GetName())) 513 ErrOut.Log('Failed to define %s named %s' % (node.cls, node.GetName()))
475 define_txt = func(self, node, releases, prefix=prefix, comment=comment) 514 define_txt = func(self, node, releases, prefix=prefix, comment=comment)
476 515
477 comment_txt = GetNodeComments(node, tabs=0) 516 comment_txt = GetNodeComments(node, tabs=0)
478 if comment_txt and comment: 517 if comment_txt and comment:
479 out += comment_txt 518 out += comment_txt
480 out += define_txt 519 out += define_txt
481 520
482 tab = ' ' * tabs 521 tab = ' ' * tabs
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 if f.GetProperty('ERRORS') > 0: 607 if f.GetProperty('ERRORS') > 0:
569 print 'Skipping %s' % f.GetName() 608 print 'Skipping %s' % f.GetName()
570 continue 609 continue
571 print DefineDepends(node) 610 print DefineDepends(node)
572 for node in f.GetChildren()[2:]: 611 for node in f.GetChildren()[2:]:
573 print Define(node, comment=True, prefix='tst_') 612 print Define(node, comment=True, prefix='tst_')
574 613
575 614
576 if __name__ == '__main__': 615 if __name__ == '__main__':
577 sys.exit(Main(sys.argv[1:])) 616 sys.exit(Main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « ppapi/generators/idl_c_header.py ('k') | ppapi/generators/idl_generator.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698