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

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

Issue 2601333002: Update json_schema_compiler to handle the Automation extension API (Closed)
Patch Set: Optional to nullable Created 3 years, 11 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
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 pprint 9 import pprint
10 import re 10 import re
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 to other arguments. 43 to other arguments.
44 |arg2_name|: Description of arg2... 44 |arg2_name|: Description of arg2...
45 45
46 Newlines are removed, and leading and trailing whitespace is stripped. 46 Newlines are removed, and leading and trailing whitespace is stripped.
47 47
48 Args: 48 Args:
49 comment: The string from a Comment node. 49 comment: The string from a Comment node.
50 50
51 Returns: A tuple that looks like: 51 Returns: A tuple that looks like:
52 ( 52 (
53 "The processed comment, minus all |parameter| mentions.", 53 "The processed comment, minus all |parameter| mentions and jsexterns.",
54 "Any block wrapped in <jsexterns></jsexterns>.",
54 { 55 {
55 'parameter_name_1': "The comment that followed |parameter_name_1|:", 56 'parameter_name_1': "The comment that followed |parameter_name_1|:",
56 ... 57 ...
57 } 58 }
58 ) 59 )
59 ''' 60 '''
61 jsexterns = None
62 match = re.search('<jsexterns>(.*)</jsexterns>', comment, re.DOTALL)
Dan Beam 2017/01/12 03:12:50 oh, i guess this is only on the comment, not the w
Devlin 2017/01/12 17:28:47 I'm not in love with it, but there's also not a gr
dmazzoni 2017/01/13 21:22:53 Great, now down to just two special cases, both ma
63 if match:
64 jsexterns = match.group(1).strip()
65 comment = comment[:match.start()] + comment[match.end():]
66
60 def add_paragraphs(content): 67 def add_paragraphs(content):
61 paragraphs = content.split('\n\n') 68 paragraphs = content.split('\n\n')
62 if len(paragraphs) < 2: 69 if len(paragraphs) < 2:
63 return content 70 return content
64 return '<p>' + '</p><p>'.join(p.strip() for p in paragraphs) + '</p>' 71 return '<p>' + '</p><p>'.join(p.strip() for p in paragraphs) + '</p>'
65 72
66 # Find all the parameter comments of the form '|name|: comment'. 73 # Find all the parameter comments of the form '|name|: comment'.
67 parameter_starts = list(re.finditer(r' *\|([^|]*)\| *: *', comment)) 74 parameter_starts = list(re.finditer(r' *\|([^|]*)\| *: *', comment))
68 75
69 # Get the parent comment (everything before the first parameter comment. 76 # Get the parent comment (everything before the first parameter comment.
70 first_parameter_location = (parameter_starts[0].start() 77 first_parameter_location = (parameter_starts[0].start()
71 if parameter_starts else len(comment)) 78 if parameter_starts else len(comment))
72 parent_comment = (add_paragraphs(comment[:first_parameter_location].strip()) 79 parent_comment = (add_paragraphs(comment[:first_parameter_location].strip())
73 .replace('\n', '')) 80 .replace('\n', ''))
74 81
75 params = OrderedDict() 82 params = OrderedDict()
76 for (cur_param, next_param) in itertools.izip_longest(parameter_starts, 83 for (cur_param, next_param) in itertools.izip_longest(parameter_starts,
77 parameter_starts[1:]): 84 parameter_starts[1:]):
78 param_name = cur_param.group(1) 85 param_name = cur_param.group(1)
79 86
80 # A parameter's comment goes from the end of its introduction to the 87 # A parameter's comment goes from the end of its introduction to the
81 # beginning of the next parameter's introduction. 88 # beginning of the next parameter's introduction.
82 param_comment_start = cur_param.end() 89 param_comment_start = cur_param.end()
83 param_comment_end = next_param.start() if next_param else len(comment) 90 param_comment_end = next_param.start() if next_param else len(comment)
84 params[param_name] = ( 91 params[param_name] = (
85 add_paragraphs(comment[param_comment_start:param_comment_end].strip()) 92 add_paragraphs(comment[param_comment_start:param_comment_end].strip())
86 .replace('\n', '')) 93 .replace('\n', ''))
87 94
88 return (parent_comment, params) 95 return (parent_comment, jsexterns, params)
89 96
90 97
91 class Callspec(object): 98 class Callspec(object):
92 ''' 99 '''
93 Given a Callspec node representing an IDL function declaration, converts into 100 Given a Callspec node representing an IDL function declaration, converts into
94 a tuple: 101 a tuple:
95 (name, list of function parameters, return type) 102 (name, list of function parameters, return type)
96 ''' 103 '''
97 def __init__(self, callspec_node, comment): 104 def __init__(self, callspec_node, comment):
98 self.node = callspec_node 105 self.node = callspec_node
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 ('supportsRules', lambda s: s == 'true')]: 195 ('supportsRules', lambda s: s == 'true')]:
189 if self.node.GetProperty(option_name): 196 if self.node.GetProperty(option_name):
190 if 'options' not in properties: 197 if 'options' not in properties:
191 properties['options'] = {} 198 properties['options'] = {}
192 properties['options'][option_name] = sanitizer(self.node.GetProperty( 199 properties['options'][option_name] = sanitizer(self.node.GetProperty(
193 option_name)) 200 option_name))
194 type_override = None 201 type_override = None
195 parameter_comments = OrderedDict() 202 parameter_comments = OrderedDict()
196 for node in self.node.GetChildren(): 203 for node in self.node.GetChildren():
197 if node.cls == 'Comment': 204 if node.cls == 'Comment':
198 (parent_comment, parameter_comments) = ProcessComment(node.GetName()) 205 (parent_comment, jsexterns, parameter_comments) = ProcessComment(
206 node.GetName())
199 properties['description'] = parent_comment 207 properties['description'] = parent_comment
208 properties['jsexterns'] = jsexterns
200 elif node.cls == 'Callspec': 209 elif node.cls == 'Callspec':
201 name, parameters, return_type = (Callspec(node, parameter_comments) 210 name, parameters, return_type = (Callspec(node, parameter_comments)
202 .process(callbacks)) 211 .process(callbacks))
203 if functions_are_properties: 212 if functions_are_properties:
204 # If functions are treated as properties (which will happen if the 213 # If functions are treated as properties (which will happen if the
205 # interface is named Properties) then this isn't a function, it's a 214 # interface is named Properties) then this isn't a function, it's a
206 # property which is encoded as a function with no arguments. The 215 # property which is encoded as a function with no arguments. The
207 # property type is the return type. This is an egregious hack in lieu 216 # property type is the return type. This is an egregious hack in lieu
208 # of the IDL parser supporting 'const'. 217 # of the IDL parser supporting 'const'.
209 assert parameters == [], ( 218 assert parameters == [], (
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 print json.dumps(schema, indent=2) 560 print json.dumps(schema, indent=2)
552 else: 561 else:
553 contents = sys.stdin.read() 562 contents = sys.stdin.read()
554 idl = idl_parser.IDLParser().ParseData(contents, '<stdin>') 563 idl = idl_parser.IDLParser().ParseData(contents, '<stdin>')
555 schema = IDLSchema(idl).process() 564 schema = IDLSchema(idl).process()
556 print json.dumps(schema, indent=2) 565 print json.dumps(schema, indent=2)
557 566
558 567
559 if __name__ == '__main__': 568 if __name__ == '__main__':
560 Main() 569 Main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698