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

Side by Side Diff: third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py

Issue 2012753003: DevTools: consolidate protocol generators for front-end, backend and type builder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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 2016 The Chromium Authors. All rights reserved. 1 # Copyright 2016 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 import os.path 5 import os.path
6 import sys 6 import sys
7 import string 7 import string
8 import optparse 8 import optparse
9 import re 9 import re
10 try: 10 try:
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 trim_blocks=True) 81 trim_blocks=True)
82 jinja_env.filters.update({"to_title_case": to_title_case, "dash_to_camelcase ": dash_to_camelcase}) 82 jinja_env.filters.update({"to_title_case": to_title_case, "dash_to_camelcase ": dash_to_camelcase})
83 jinja_env.add_extension('jinja2.ext.loopcontrols') 83 jinja_env.add_extension('jinja2.ext.loopcontrols')
84 return jinja_env 84 return jinja_env
85 85
86 86
87 def output_file(file_name): 87 def output_file(file_name):
88 return open(file_name, "w") 88 return open(file_name, "w")
89 89
90 90
91 def topsort_domains():
92 domains = {}
93 for domain in json_api["domains"]:
94 domains[domain["domain"]] = domain
95
96 processed = set()
97 result = []
98
99 def process(name):
100 if name in processed:
101 return
102 domain = domains[name]
103 deps = []
104 if "depends" in domain:
105 for dep in domain["depends"]:
106 process(dep)
107 result.append(domain)
108 processed.add(name)
109
110 for domain in json_api["domains"]:
111 process(domain["domain"])
112 json_api["domains"] = result
113
114
91 def patch_full_qualified_refs(): 115 def patch_full_qualified_refs():
92 def patch_full_qualified_refs_in_domain(json, domain_name): 116 def patch_full_qualified_refs_in_domain(json, domain_name):
93 if isinstance(json, list): 117 if isinstance(json, list):
94 for item in json: 118 for item in json:
95 patch_full_qualified_refs_in_domain(item, domain_name) 119 patch_full_qualified_refs_in_domain(item, domain_name)
96 120
97 if not isinstance(json, dict): 121 if not isinstance(json, dict):
98 return 122 return
99 for key in json: 123 for key in json:
100 if key == "type" and json[key] == "string": 124 if key == "type" and json[key] == "string":
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 if type["type"] == "object": 256 if type["type"] == "object":
233 type_definitions[domain["domain"] + "." + type["id"]] = create_u ser_type_definition(domain["domain"], type) 257 type_definitions[domain["domain"] + "." + type["id"]] = create_u ser_type_definition(domain["domain"], type)
234 elif type["type"] == "array": 258 elif type["type"] == "array":
235 items_type = type["items"]["type"] 259 items_type = type["items"]["type"]
236 type_definitions[domain["domain"] + "." + type["id"]] = wrap_arr ay_definition(type_definitions[items_type]) 260 type_definitions[domain["domain"] + "." + type["id"]] = wrap_arr ay_definition(type_definitions[items_type])
237 elif type["type"] == domain["domain"] + ".string": 261 elif type["type"] == domain["domain"] + ".string":
238 type_definitions[domain["domain"] + "." + type["id"]] = create_s tring_type_definition(domain["domain"]) 262 type_definitions[domain["domain"] + "." + type["id"]] = create_s tring_type_definition(domain["domain"])
239 else: 263 else:
240 type_definitions[domain["domain"] + "." + type["id"]] = create_p rimitive_type_definition(type["type"]) 264 type_definitions[domain["domain"] + "." + type["id"]] = create_p rimitive_type_definition(type["type"])
241 265
266 topsort_domains()
242 patch_full_qualified_refs() 267 patch_full_qualified_refs()
243 create_type_definitions() 268 create_type_definitions()
244 269
245 270
246 def type_definition(name): 271 def type_definition(name):
247 return type_definitions[name] 272 return type_definitions[name]
248 273
249 274
250 def resolve_type(property): 275 def resolve_type(property):
251 if "$ref" in property: 276 if "$ref" in property:
252 return type_definitions[property["$ref"]] 277 return type_definitions[property["$ref"]]
253 if property["type"] == "array": 278 if property["type"] == "array":
254 return wrap_array_definition(resolve_type(property["items"])) 279 return wrap_array_definition(resolve_type(property["items"]))
255 return type_definitions[property["type"]] 280 return type_definitions[property["type"]]
256 281
257 282
258 def join_arrays(dict, keys): 283 def join_arrays(dict, keys):
259 result = [] 284 result = []
260 for key in keys: 285 for key in keys:
261 if key in dict: 286 if key in dict:
262 result += dict[key] 287 result += dict[key]
263 return result 288 return result
264 289
265 290
291 def has_disable(commands):
292 for command in commands:
293 if command["name"] == "disable":
294 return True
295 return False
296
297
266 if os.path.exists(__file__): 298 if os.path.exists(__file__):
267 current_script_timestamp = os.path.getmtime(__file__) 299 current_script_timestamp = os.path.getmtime(__file__)
268 else: 300 else:
269 current_script_timestamp = 0 301 current_script_timestamp = 0
270 302
271 303
272 def is_up_to_date(file, template): 304 def is_up_to_date(file, template):
273 if not os.path.exists(file): 305 if not os.path.exists(file):
274 return False 306 return False
275 timestamp = os.path.getmtime(file) 307 timestamp = os.path.getmtime(file)
276 return timestamp > max(os.path.getmtime(module_path + template), 308 return timestamp > max(os.path.getmtime(module_path + template),
277 current_script_timestamp, json_timestamp) 309 current_script_timestamp, json_timestamp)
278 310
279 311
280 def generate(class_name): 312 def generate(class_name):
281 h_template_name = "/%s_h.template" % class_name 313 h_template_name = "/%s_h.template" % class_name
282 cpp_template_name = "/%s_cpp.template" % class_name 314 cpp_template_name = "/%s_cpp.template" % class_name
283 h_file_name = output_dirname + "/" + class_name + ".h" 315 h_file_name = output_dirname + "/" + class_name + ".h"
284 cpp_file_name = output_dirname + "/" + class_name + ".cpp" 316 cpp_file_name = output_dirname + "/" + class_name + ".cpp"
285 317
286 if (is_up_to_date(cpp_file_name, cpp_template_name) and 318 if (is_up_to_date(cpp_file_name, cpp_template_name) and
287 is_up_to_date(h_file_name, h_template_name)): 319 is_up_to_date(h_file_name, h_template_name)):
288 return 320 return
289 321
290 template_context = { 322 template_context = {
291 "class_name": class_name, 323 "class_name": class_name,
292 "api": json_api, 324 "api": json_api,
293 "join_arrays": join_arrays, 325 "join_arrays": join_arrays,
294 "resolve_type": resolve_type, 326 "resolve_type": resolve_type,
295 "type_definition": type_definition 327 "type_definition": type_definition,
328 "has_disable": has_disable
296 } 329 }
297 h_template = jinja_env.get_template(h_template_name) 330 h_template = jinja_env.get_template(h_template_name)
298 cpp_template = jinja_env.get_template(cpp_template_name) 331 cpp_template = jinja_env.get_template(cpp_template_name)
299 h_file = output_file(h_file_name) 332 h_file = output_file(h_file_name)
300 cpp_file = output_file(cpp_file_name) 333 cpp_file = output_file(cpp_file_name)
301 h_file.write(h_template.render(template_context)) 334 h_file.write(h_template.render(template_context))
302 cpp_file.write(cpp_template.render(template_context)) 335 cpp_file.write(cpp_template.render(template_context))
303 h_file.close() 336 h_file.close()
304 cpp_file.close() 337 cpp_file.close()
305 338
306 339
307 jinja_env = initialize_jinja_env(output_dirname) 340 jinja_env = initialize_jinja_env(output_dirname)
308 generate("Backend")
309 generate("Dispatcher")
310 generate("Frontend")
311 generate("TypeBuilder") 341 generate("TypeBuilder")
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698