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

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

Issue 10082038: Hack together a quick doc generator for IDL files. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: separate alarms change Created 8 years, 8 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 | « chrome/common/extensions/docs/samples.json ('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 json 6 import json
7 import os.path 7 import os.path
8 import sys 8 import sys
9 import re
9 10
10 # This file is a peer to json_schema.py. Each of these files understands a 11 # This file is a peer to json_schema.py. Each of these files understands a
11 # certain format describing APIs (either JSON or IDL), reads files written 12 # certain format describing APIs (either JSON or IDL), reads files written
12 # in that format into memory, and emits them as a Python array of objects 13 # in that format into memory, and emits them as a Python array of objects
13 # corresponding to those APIs, where the objects are formatted in a way that 14 # corresponding to those APIs, where the objects are formatted in a way that
14 # the JSON schema compiler understands. compiler.py drives both idl_schema.py 15 # the JSON schema compiler understands. compiler.py drives both idl_schema.py
15 # and json_schema.py. 16 # and json_schema.py.
16 17
17 # idl_parser expects to be able to import certain files in its directory, 18 # idl_parser expects to be able to import certain files in its directory,
18 # so let's set things up the way it wants. 19 # so let's set things up the way it wants.
19 idl_generators_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 20 idl_generators_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
20 os.pardir, os.pardir, 'ppapi', 'generators') 21 os.pardir, os.pardir, 'ppapi', 'generators')
21 if idl_generators_path not in sys.path: 22 if idl_generators_path not in sys.path:
22 sys.path.insert(0, idl_generators_path) 23 sys.path.insert(0, idl_generators_path)
23 import idl_parser 24 import idl_parser
24 25
26 def ProcessComment(comment):
27 '''
28 Given the string from a Comment node, parse it into a tuple that looks
29 like:
30 (
31 "The processed comment, minus all |parameter| mentions.",
32 {
33 'parameter_name_1': "The comment that followed |parameter_name_1|:",
34 ...
35 }
36 )
37 '''
38 # Find all the parameter comments of the form "|name|: comment".
39 parameter_comments = re.findall(r'\n *\|([^|]*)\| *: *(.*)', comment)
40 # Get the parent comment (everything before the first parameter comment.
41 parent_comment = re.sub(r'\n *\|.*', '', comment)
42 parent_comment = parent_comment.replace('\n', '').strip()
43
44 parsed = {}
45 for (name, comment) in parameter_comments:
46 parsed[name] = comment.replace('\n', '').strip()
47 return (parent_comment, parsed)
48
25 class Callspec(object): 49 class Callspec(object):
26 ''' 50 '''
27 Given a Callspec node representing an IDL function declaration, converts into 51 Given a Callspec node representing an IDL function declaration, converts into
28 a name/value pair where the value is a list of function parameters. 52 a name/value pair where the value is a list of function parameters.
29 ''' 53 '''
30 def __init__(self, callspec_node): 54 def __init__(self, callspec_node, comment):
31 self.node = callspec_node 55 self.node = callspec_node
56 self.comment = comment
32 57
33 def process(self, callbacks): 58 def process(self, callbacks):
34 parameters = [] 59 parameters = []
35 for node in self.node.children: 60 for node in self.node.children:
36 parameters.append(Param(node).process(callbacks)) 61 parameter = Param(node).process(callbacks)
62 if parameter['name'] in self.comment:
63 parameter['description'] = self.comment[parameter['name']]
64 parameters.append(parameter)
37 return self.node.GetName(), parameters 65 return self.node.GetName(), parameters
38 66
39 class Param(object): 67 class Param(object):
40 ''' 68 '''
41 Given a Param node representing a function parameter, converts into a Python 69 Given a Param node representing a function parameter, converts into a Python
42 dictionary that the JSON schema compiler expects to see. 70 dictionary that the JSON schema compiler expects to see.
43 ''' 71 '''
44 def __init__(self, param_node): 72 def __init__(self, param_node):
45 self.node = param_node 73 self.node = param_node
46 74
(...skipping 30 matching lines...) Expand all
77 self.node = member_node 105 self.node = member_node
78 106
79 def process(self, callbacks): 107 def process(self, callbacks):
80 properties = {} 108 properties = {}
81 name = self.node.GetName() 109 name = self.node.GetName()
82 if self.node.GetProperty('OPTIONAL'): 110 if self.node.GetProperty('OPTIONAL'):
83 properties['optional'] = True 111 properties['optional'] = True
84 if self.node.GetProperty('nodoc'): 112 if self.node.GetProperty('nodoc'):
85 properties['nodoc'] = True 113 properties['nodoc'] = True
86 is_function = False 114 is_function = False
115 parameter_comments = {}
116 for node in self.node.children:
117 if node.cls == 'Comment':
118 (parent_comment, parameter_comments) = ProcessComment(node.GetName())
119 properties['description'] = parent_comment
87 for node in self.node.children: 120 for node in self.node.children:
88 if node.cls == 'Callspec': 121 if node.cls == 'Callspec':
89 is_function = True 122 is_function = True
90 name, parameters = Callspec(node).process(callbacks) 123 name, parameters = Callspec(node, parameter_comments).process(callbacks)
91 properties['parameters'] = parameters 124 properties['parameters'] = parameters
92 properties['name'] = name 125 properties['name'] = name
93 if is_function: 126 if is_function:
94 properties['type'] = 'function' 127 properties['type'] = 'function'
95 else: 128 else:
96 properties = Typeref(self.node.GetProperty('TYPEREF'), 129 properties = Typeref(self.node.GetProperty('TYPEREF'),
97 self.node, properties).process(callbacks) 130 self.node, properties).process(callbacks)
98 return name, properties 131 return name, properties
99 132
100 class Typeref(object): 133 class Typeref(object):
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 ''' 274 '''
242 Dump a json serialization of parse result for the IDL files whose names 275 Dump a json serialization of parse result for the IDL files whose names
243 were passed in on the command line. 276 were passed in on the command line.
244 ''' 277 '''
245 for filename in sys.argv[1:]: 278 for filename in sys.argv[1:]:
246 schema = Load(filename) 279 schema = Load(filename)
247 print json.dumps(schema, indent=2) 280 print json.dumps(schema, indent=2)
248 281
249 if __name__ == '__main__': 282 if __name__ == '__main__':
250 Main() 283 Main()
OLDNEW
« no previous file with comments | « chrome/common/extensions/docs/samples.json ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698