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

Side by Side Diff: headless/lib/browser/client_api_generator.py

Issue 2219843002: headless: Make API generator more robust against weird enum literals (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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
« no previous file with comments | « no previous file | headless/lib/browser/client_api_generator_unittest.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 argparse 5 import argparse
6 import os.path 6 import os.path
7 import sys 7 import sys
8 import re 8 import re
9 try: 9 try:
10 import json 10 import json
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 52
53 53
54 def CamelCaseToHackerStyle(name): 54 def CamelCaseToHackerStyle(name):
55 # Do two passes to insert '_' chars to deal with overlapping matches (e.g., 55 # Do two passes to insert '_' chars to deal with overlapping matches (e.g.,
56 # 'LoLoLoL'). 56 # 'LoLoLoL').
57 name = re.sub(r'([^_])([A-Z][a-z]+?)', r'\1_\2', name) 57 name = re.sub(r'([^_])([A-Z][a-z]+?)', r'\1_\2', name)
58 name = re.sub(r'([^_])([A-Z][a-z]+?)', r'\1_\2', name) 58 name = re.sub(r'([^_])([A-Z][a-z]+?)', r'\1_\2', name)
59 return name.lower() 59 return name.lower()
60 60
61 61
62 def MangleEnum(value): 62 def SanitizeLiteral(literal):
63 # Rename NULL enumeration values to avoid a clash with the actual NULL. 63 return {
64 return 'NONE' if value == 'NULL' else value 64 # Rename null enumeration values to avoid a clash with the NULL macro.
65 'null': 'none',
66 # Rename mathematical constants to avoid colliding with C macros.
67 'Infinity': 'InfinityValue',
68 '-Infinity': 'NegativeInfinityValue',
69 'NaN': 'NaNValue',
70 # Turn negative zero into a safe identifier.
71 '-0': 'NegativeZeroValue',
72 }.get(literal, literal)
65 73
66 74
67 def InitializeJinjaEnv(cache_dir): 75 def InitializeJinjaEnv(cache_dir):
68 jinja_env = jinja2.Environment( 76 jinja_env = jinja2.Environment(
69 loader=jinja2.FileSystemLoader(templates_dir), 77 loader=jinja2.FileSystemLoader(templates_dir),
70 # Bytecode cache is not concurrency-safe unless pre-cached: 78 # Bytecode cache is not concurrency-safe unless pre-cached:
71 # if pre-cached this is read-only, but writing creates a race condition. 79 # if pre-cached this is read-only, but writing creates a race condition.
72 bytecode_cache=jinja2.FileSystemBytecodeCache(cache_dir), 80 bytecode_cache=jinja2.FileSystemBytecodeCache(cache_dir),
73 keep_trailing_newline=True, # Newline-terminate generated files. 81 keep_trailing_newline=True, # Newline-terminate generated files.
74 lstrip_blocks=True, # So we can indent control flow tags. 82 lstrip_blocks=True, # So we can indent control flow tags.
75 trim_blocks=True) 83 trim_blocks=True)
76 jinja_env.filters.update({ 84 jinja_env.filters.update({
77 'to_title_case': ToTitleCase, 85 'to_title_case': ToTitleCase,
78 'dash_to_camelcase': DashToCamelCase, 86 'dash_to_camelcase': DashToCamelCase,
79 'camelcase_to_hacker_style': CamelCaseToHackerStyle, 87 'camelcase_to_hacker_style': CamelCaseToHackerStyle,
80 'mangle_enum': MangleEnum, 88 'sanitize_literal': SanitizeLiteral,
81 }) 89 })
82 jinja_env.add_extension('jinja2.ext.loopcontrols') 90 jinja_env.add_extension('jinja2.ext.loopcontrols')
83 return jinja_env 91 return jinja_env
84 92
85 93
86 def PatchFullQualifiedRefs(json_api): 94 def PatchFullQualifiedRefs(json_api):
87 def PatchFullQualifiedRefsInDomain(json, domain_name): 95 def PatchFullQualifiedRefsInDomain(json, domain_name):
88 if isinstance(json, list): 96 if isinstance(json, list):
89 for item in json: 97 for item in json:
90 PatchFullQualifiedRefsInDomain(item, domain_name) 98 PatchFullQualifiedRefsInDomain(item, domain_name)
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 json_api, output_dirname = ParseArguments(sys.argv[1:]) 421 json_api, output_dirname = ParseArguments(sys.argv[1:])
414 jinja_env = InitializeJinjaEnv(output_dirname) 422 jinja_env = InitializeJinjaEnv(output_dirname)
415 PatchHiddenCommandsAndEvents(json_api) 423 PatchHiddenCommandsAndEvents(json_api)
416 SynthesizeCommandTypes(json_api) 424 SynthesizeCommandTypes(json_api)
417 SynthesizeEventTypes(json_api) 425 SynthesizeEventTypes(json_api)
418 PatchFullQualifiedRefs(json_api) 426 PatchFullQualifiedRefs(json_api)
419 CreateTypeDefinitions(json_api) 427 CreateTypeDefinitions(json_api)
420 Generate(jinja_env, output_dirname, json_api, 'types', ['cc', 'h']) 428 Generate(jinja_env, output_dirname, json_api, 'types', ['cc', 'h'])
421 Generate(jinja_env, output_dirname, json_api, 'type_conversions', ['h']) 429 Generate(jinja_env, output_dirname, json_api, 'type_conversions', ['h'])
422 GenerateDomains(jinja_env, output_dirname, json_api, 'domain', ['cc', 'h']) 430 GenerateDomains(jinja_env, output_dirname, json_api, 'domain', ['cc', 'h'])
OLDNEW
« no previous file with comments | « no previous file | headless/lib/browser/client_api_generator_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698