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

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

Issue 1062573004: [Extension API Extern Generation] Fix a few bugs in extern generation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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
OLDNEW
1 # Copyright 2015 The Chromium Authors. All rights reserved. 1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 """ 4 """
5 Generator that produces an externs file for the Closure Compiler. 5 Generator that produces an externs file for the Closure Compiler.
6 Note: This is a work in progress, and generated externs may require tweaking. 6 Note: This is a work in progress, and generated externs may require tweaking.
7 7
8 See https://developers.google.com/closure/compiler/docs/api-tutorial3#externs 8 See https://developers.google.com/closure/compiler/docs/api-tutorial3#externs
9 """ 9 """
10 10
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 c = Code() 119 c = Code()
120 c.Append('@typedef {') 120 c.Append('@typedef {')
121 c.Concat(self._GenerateObjectDefinition(properties), new_line=False) 121 c.Concat(self._GenerateObjectDefinition(properties), new_line=False)
122 c.Append('}', new_line=False) 122 c.Append('}', new_line=False)
123 return c 123 return c
124 124
125 def _GenerateObjectDefinition(self, properties): 125 def _GenerateObjectDefinition(self, properties):
126 """Given an OrderedDict of properties, returns a Code containing the 126 """Given an OrderedDict of properties, returns a Code containing the
127 description of an object. 127 description of an object.
128 """ 128 """
129 if not properties: return '' 129 if not properties: return Code()
130 130
131 c = Code() 131 c = Code()
132 c.Sblock('{') 132 c.Sblock('{')
133 first = True 133 first = True
134 for field, prop in properties.items(): 134 for field, prop in properties.items():
135 # Avoid trailing comma. 135 # Avoid trailing comma.
136 # TODO(devlin): This will be unneeded, if/when 136 # TODO(devlin): This will be unneeded, if/when
137 # https://github.com/google/closure-compiler/issues/796 is fixed. 137 # https://github.com/google/closure-compiler/issues/796 is fixed.
138 if not first: 138 if not first:
139 c.Append(',', new_line=False) 139 c.Append(',', new_line=False)
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 c.Append('void', new_line=False) 209 c.Append('void', new_line=False)
210 210
211 return c 211 return c
212 212
213 def _TypeToJsType(self, js_type): 213 def _TypeToJsType(self, js_type):
214 """Converts a model.Type to a JS type (number, Array, etc.)""" 214 """Converts a model.Type to a JS type (number, Array, etc.)"""
215 c = Code() 215 c = Code()
216 if js_type.property_type in (PropertyType.INTEGER, PropertyType.DOUBLE): 216 if js_type.property_type in (PropertyType.INTEGER, PropertyType.DOUBLE):
217 c.Append('number') 217 c.Append('number')
218 elif js_type.property_type is PropertyType.OBJECT: 218 elif js_type.property_type is PropertyType.OBJECT:
219 c = self._GenerateObjectDefinition(js_type.properties) 219 if js_type.properties:
220 c = self._GenerateObjectDefinition(js_type.properties)
Dan Beam 2015/04/07 01:54:46 this is OK i guess but it might be mildly better i
Devlin 2015/04/07 16:13:27 Yeah, I guess "return Code().Append('foo')" isn't
221 else:
222 c.Append('Object')
220 elif js_type.property_type is PropertyType.ARRAY: 223 elif js_type.property_type is PropertyType.ARRAY:
221 (c.Append('!Array<'). 224 (c.Append('!Array<').
222 Concat(self._TypeToJsType(js_type.item_type), new_line=False). 225 Concat(self._TypeToJsType(js_type.item_type), new_line=False).
223 Append('>', new_line=False)) 226 Append('>', new_line=False))
224 elif js_type.property_type is PropertyType.REF: 227 elif js_type.property_type is PropertyType.REF:
225 ref_type = js_type.ref_type 228 ref_type = js_type.ref_type
226 # Enums are defined as chrome.fooAPI.MyEnum, but types are defined simply 229 # Enums are defined as chrome.fooAPI.MyEnum, but types are defined simply
227 # as MyType. 230 # as MyType.
228 if self._namespace.types[ref_type].property_type is PropertyType.ENUM: 231 if self._namespace.types[ref_type].property_type is PropertyType.ENUM:
229 ref_type = '!chrome.%s.%s' % (self._namespace.name, ref_type) 232 ref_type = '!chrome.%s.%s' % (self._namespace.name, ref_type)
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 """Generates a @see link for a given API 'object' (type, method, or event). 309 """Generates a @see link for a given API 'object' (type, method, or event).
307 """ 310 """
308 311
309 # NOTE(devlin): This is kind of a hack. Some APIs will be hosted on 312 # NOTE(devlin): This is kind of a hack. Some APIs will be hosted on
310 # developer.chrome.com/apps/ instead of /extensions/, and some APIs have 313 # developer.chrome.com/apps/ instead of /extensions/, and some APIs have
311 # '.'s in them (like app.window), which should resolve to 'app_window'. 314 # '.'s in them (like app.window), which should resolve to 'app_window'.
312 # Luckily, the doc server has excellent url resolution, and knows exactly 315 # Luckily, the doc server has excellent url resolution, and knows exactly
313 # what we mean. This saves us from needing any complicated logic here. 316 # what we mean. This saves us from needing any complicated logic here.
314 return ('@see https://developer.chrome.com/extensions/%s#%s-%s' % 317 return ('@see https://developer.chrome.com/extensions/%s#%s-%s' %
315 (self._namespace.name, object_type, object_name)) 318 (self._namespace.name, object_type, object_name))
OLDNEW
« no previous file with comments | « tools/json_schema_compiler/code_test.py ('k') | tools/json_schema_compiler/js_externs_generator_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698