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

Side by Side Diff: tools/json_schema_compiler/idl_schema.py

Issue 98343005: Pepper: More IDL generator cleanup. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix for json_schema_compiler Created 7 years 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/test_lex.in ('k') | no next file » | 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/env python 1 #! /usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 import itertools 6 import itertools
7 import json 7 import json
8 import os.path 8 import os.path
9 import re 9 import re
10 import sys 10 import sys
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 return_type = None 100 return_type = None
101 if self.node.GetProperty('TYPEREF') not in ('void', None): 101 if self.node.GetProperty('TYPEREF') not in ('void', None):
102 return_type = Typeref(self.node.GetProperty('TYPEREF'), 102 return_type = Typeref(self.node.GetProperty('TYPEREF'),
103 self.node.parent, 103 self.node.parent,
104 {'name': self.node.GetName()}).process(callbacks) 104 {'name': self.node.GetName()}).process(callbacks)
105 # The IDL parser doesn't allow specifying return types as optional. 105 # The IDL parser doesn't allow specifying return types as optional.
106 # Instead we infer any object return values to be optional. 106 # Instead we infer any object return values to be optional.
107 # TODO(asargent): fix the IDL parser to support optional return types. 107 # TODO(asargent): fix the IDL parser to support optional return types.
108 if return_type.get('type') == 'object' or '$ref' in return_type: 108 if return_type.get('type') == 'object' or '$ref' in return_type:
109 return_type['optional'] = True 109 return_type['optional'] = True
110 for node in self.node.children: 110 for node in self.node.GetChildren():
111 parameter = Param(node).process(callbacks) 111 parameter = Param(node).process(callbacks)
112 if parameter['name'] in self.comment: 112 if parameter['name'] in self.comment:
113 parameter['description'] = self.comment[parameter['name']] 113 parameter['description'] = self.comment[parameter['name']]
114 parameters.append(parameter) 114 parameters.append(parameter)
115 return (self.node.GetName(), parameters, return_type) 115 return (self.node.GetName(), parameters, return_type)
116 116
117 117
118 class Param(object): 118 class Param(object):
119 ''' 119 '''
120 Given a Param node representing a function parameter, converts into a Python 120 Given a Param node representing a function parameter, converts into a Python
(...skipping 11 matching lines...) Expand all
132 class Dictionary(object): 132 class Dictionary(object):
133 ''' 133 '''
134 Given an IDL Dictionary node, converts into a Python dictionary that the JSON 134 Given an IDL Dictionary node, converts into a Python dictionary that the JSON
135 schema compiler expects to see. 135 schema compiler expects to see.
136 ''' 136 '''
137 def __init__(self, dictionary_node): 137 def __init__(self, dictionary_node):
138 self.node = dictionary_node 138 self.node = dictionary_node
139 139
140 def process(self, callbacks): 140 def process(self, callbacks):
141 properties = OrderedDict() 141 properties = OrderedDict()
142 for node in self.node.children: 142 for node in self.node.GetChildren():
143 if node.cls == 'Member': 143 if node.cls == 'Member':
144 k, v = Member(node).process(callbacks) 144 k, v = Member(node).process(callbacks)
145 properties[k] = v 145 properties[k] = v
146 result = {'id': self.node.GetName(), 146 result = {'id': self.node.GetName(),
147 'properties': properties, 147 'properties': properties,
148 'type': 'object'} 148 'type': 'object'}
149 if self.node.GetProperty('inline_doc'): 149 if self.node.GetProperty('inline_doc'):
150 result['inline_doc'] = True 150 result['inline_doc'] = True
151 elif self.node.GetProperty('noinline_doc'): 151 elif self.node.GetProperty('noinline_doc'):
152 result['noinline_doc'] = True 152 result['noinline_doc'] = True
(...skipping 21 matching lines...) Expand all
174 ('supportsFilters', lambda s: s == 'true'), 174 ('supportsFilters', lambda s: s == 'true'),
175 ('supportsListeners', lambda s: s == 'true'), 175 ('supportsListeners', lambda s: s == 'true'),
176 ('supportsRules', lambda s: s == 'true')]: 176 ('supportsRules', lambda s: s == 'true')]:
177 if self.node.GetProperty(option_name): 177 if self.node.GetProperty(option_name):
178 if 'options' not in properties: 178 if 'options' not in properties:
179 properties['options'] = {} 179 properties['options'] = {}
180 properties['options'][option_name] = sanitizer(self.node.GetProperty( 180 properties['options'][option_name] = sanitizer(self.node.GetProperty(
181 option_name)) 181 option_name))
182 is_function = False 182 is_function = False
183 parameter_comments = OrderedDict() 183 parameter_comments = OrderedDict()
184 for node in self.node.children: 184 for node in self.node.GetChildren():
185 if node.cls == 'Comment': 185 if node.cls == 'Comment':
186 (parent_comment, parameter_comments) = ProcessComment(node.GetName()) 186 (parent_comment, parameter_comments) = ProcessComment(node.GetName())
187 properties['description'] = parent_comment 187 properties['description'] = parent_comment
188 elif node.cls == 'Callspec': 188 elif node.cls == 'Callspec':
189 is_function = True 189 is_function = True
190 name, parameters, return_type = (Callspec(node, parameter_comments) 190 name, parameters, return_type = (Callspec(node, parameter_comments)
191 .process(callbacks)) 191 .process(callbacks))
192 properties['parameters'] = parameters 192 properties['parameters'] = parameters
193 if return_type is not None: 193 if return_type is not None:
194 properties['returns'] = return_type 194 properties['returns'] = return_type
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 ''' 283 '''
284 Given an IDL Enum node, converts into a Python dictionary that the JSON 284 Given an IDL Enum node, converts into a Python dictionary that the JSON
285 schema compiler expects to see. 285 schema compiler expects to see.
286 ''' 286 '''
287 def __init__(self, enum_node): 287 def __init__(self, enum_node):
288 self.node = enum_node 288 self.node = enum_node
289 self.description = '' 289 self.description = ''
290 290
291 def process(self, callbacks): 291 def process(self, callbacks):
292 enum = [] 292 enum = []
293 for node in self.node.children: 293 for node in self.node.GetChildren():
294 if node.cls == 'EnumItem': 294 if node.cls == 'EnumItem':
295 enum_value = {'name': node.GetName()} 295 enum_value = {'name': node.GetName()}
296 for child in node.children: 296 for child in node.GetChildren():
297 if child.cls == 'Comment': 297 if child.cls == 'Comment':
298 enum_value['description'] = ProcessComment(child.GetName())[0] 298 enum_value['description'] = ProcessComment(child.GetName())[0]
299 else: 299 else:
300 raise ValueError('Did not process %s %s' % (child.cls, child)) 300 raise ValueError('Did not process %s %s' % (child.cls, child))
301 enum.append(enum_value) 301 enum.append(enum_value)
302 elif node.cls == 'Comment': 302 elif node.cls == 'Comment':
303 self.description = ProcessComment(node.GetName())[0] 303 self.description = ProcessComment(node.GetName())[0]
304 else: 304 else:
305 sys.exit('Did not process %s %s' % (node.cls, node)) 305 sys.exit('Did not process %s %s' % (node.cls, node))
306 result = {'id' : self.node.GetName(), 306 result = {'id' : self.node.GetName(),
(...skipping 24 matching lines...) Expand all
331 self.internal = internal 331 self.internal = internal
332 self.platforms = platforms 332 self.platforms = platforms
333 self.compiler_options = compiler_options 333 self.compiler_options = compiler_options
334 self.events = [] 334 self.events = []
335 self.functions = [] 335 self.functions = []
336 self.types = [] 336 self.types = []
337 self.callbacks = OrderedDict() 337 self.callbacks = OrderedDict()
338 self.description = description 338 self.description = description
339 339
340 def process(self): 340 def process(self):
341 for node in self.namespace.children: 341 for node in self.namespace.GetChildren():
342 if node.cls == 'Dictionary': 342 if node.cls == 'Dictionary':
343 self.types.append(Dictionary(node).process(self.callbacks)) 343 self.types.append(Dictionary(node).process(self.callbacks))
344 elif node.cls == 'Callback': 344 elif node.cls == 'Callback':
345 k, v = Member(node).process(self.callbacks) 345 k, v = Member(node).process(self.callbacks)
346 self.callbacks[k] = v 346 self.callbacks[k] = v
347 elif node.cls == 'Interface' and node.GetName() == 'Functions': 347 elif node.cls == 'Interface' and node.GetName() == 'Functions':
348 self.functions = self.process_interface(node) 348 self.functions = self.process_interface(node)
349 elif node.cls == 'Interface' and node.GetName() == 'Events': 349 elif node.cls == 'Interface' and node.GetName() == 'Events':
350 self.events = self.process_interface(node) 350 self.events = self.process_interface(node)
351 elif node.cls == 'Enum': 351 elif node.cls == 'Enum':
352 self.types.append(Enum(node).process(self.callbacks)) 352 self.types.append(Enum(node).process(self.callbacks))
353 else: 353 else:
354 sys.exit('Did not process %s %s' % (node.cls, node)) 354 sys.exit('Did not process %s %s' % (node.cls, node))
355 if self.compiler_options is not None: 355 if self.compiler_options is not None:
356 compiler_options = self.compiler_options 356 compiler_options = self.compiler_options
357 else: 357 else:
358 compiler_options = {} 358 compiler_options = {}
359 return {'namespace': self.namespace.GetName(), 359 return {'namespace': self.namespace.GetName(),
360 'description': self.description, 360 'description': self.description,
361 'nodoc': self.nodoc, 361 'nodoc': self.nodoc,
362 'types': self.types, 362 'types': self.types,
363 'functions': self.functions, 363 'functions': self.functions,
364 'internal': self.internal, 364 'internal': self.internal,
365 'events': self.events, 365 'events': self.events,
366 'platforms': self.platforms, 366 'platforms': self.platforms,
367 'compiler_options': compiler_options} 367 'compiler_options': compiler_options}
368 368
369 def process_interface(self, node): 369 def process_interface(self, node):
370 members = [] 370 members = []
371 for member in node.children: 371 for member in node.GetChildren():
372 if member.cls == 'Member': 372 if member.cls == 'Member':
373 name, properties = Member(member).process(self.callbacks) 373 name, properties = Member(member).process(self.callbacks)
374 members.append(properties) 374 members.append(properties)
375 return members 375 return members
376 376
377 377
378 class IDLSchema(object): 378 class IDLSchema(object):
379 ''' 379 '''
380 Given a list of IDLNodes and IDLAttributes, converts into a Python list 380 Given a list of IDLNodes and IDLAttributes, converts into a Python list
381 of api_defs that the JSON schema compiler expects to see. 381 of api_defs that the JSON schema compiler expects to see.
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 Dump a json serialization of parse result for the IDL files whose names 446 Dump a json serialization of parse result for the IDL files whose names
447 were passed in on the command line. 447 were passed in on the command line.
448 ''' 448 '''
449 for filename in sys.argv[1:]: 449 for filename in sys.argv[1:]:
450 schema = Load(filename) 450 schema = Load(filename)
451 print json.dumps(schema, indent=2) 451 print json.dumps(schema, indent=2)
452 452
453 453
454 if __name__ == '__main__': 454 if __name__ == '__main__':
455 Main() 455 Main()
OLDNEW
« no previous file with comments | « ppapi/generators/test_lex.in ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698