Chromium Code Reviews| Index: tools/json_to_struct/element_generator.py |
| diff --git a/tools/json_to_struct/element_generator.py b/tools/json_to_struct/element_generator.py |
| index 20d3069a1c07a674e1be8b7e42b1fd24286d95b0..5deacc69800441db16e00c6516c9dd22d17aea76 100644 |
| --- a/tools/json_to_struct/element_generator.py |
| +++ b/tools/json_to_struct/element_generator.py |
| @@ -5,6 +5,8 @@ |
| import json |
| import struct_generator |
| +field_name_count = {} |
|
beaudoin
2015/07/06 16:01:11
Module-global mutable variables are against the st
danduong
2015/07/08 23:07:03
Done.
|
| + |
| def _JSONToCString16(json_string_literal): |
| """Converts a JSON string literal to a C++ UTF-16 string literal. This is |
| done by converting \\u#### to \\x####. |
| @@ -22,42 +24,53 @@ def _JSONToCString16(json_string_literal): |
| escape_index = c_string_literal.find('\\', escape_index + 6) |
| return c_string_literal |
| -def _GenerateString(content, lines): |
| +def _GenerateString(content, lines, indent=' '): |
| """Generates an UTF-8 string to be included in a static structure initializer. |
| If content is not specified, uses NULL. |
| """ |
| if content is None: |
| - lines.append(' NULL,') |
| + lines.append(indent + 'NULL,') |
| else: |
| # json.dumps quotes the string and escape characters as required. |
| - lines.append(' %s,' % json.dumps(content)) |
| + lines.append(indent + '%s,' % json.dumps(content)) |
| -def _GenerateString16(content, lines): |
| +def _GenerateString16(content, lines, indent=' '): |
| """Generates an UTF-16 string to be included in a static structure |
| initializer. If content is not specified, uses NULL. |
| """ |
| if content is None: |
| - lines.append(' NULL,') |
| + lines.append(indent + 'NULL,') |
| else: |
| # json.dumps quotes the string and escape characters as required. |
| - lines.append(' L%s,' % _JSONToCString16(json.dumps(content))) |
| + lines.append(indent + 'L%s,' % _JSONToCString16(json.dumps(content))) |
| + |
| +def _GenerateArrayVariableName(element_name, field_name): |
| + # Generates a unique variable name for an array variable. |
| + global field_name_count |
| + var = 'array_%s_%s' % (element_name, field_name) |
| + if var not in field_name_count: |
| + field_name_count[var] = 0 |
| + return var |
| + new_var = '%s_%d' % (var, field_name_count[var]) |
| + field_name_count[var] += 1 |
| + return new_var |
| -def _GenerateArray(element_name, field_info, content, lines): |
| +def _GenerateArray(element_name, field_info, content, lines, indent=' '): |
| """Generates an array to be included in a static structure initializer. If |
| content is not specified, uses NULL. The array is assigned to a temporary |
| variable which is initialized before the structure. |
| """ |
| if content is None: |
| - lines.append(' NULL,') |
| - lines.append(' 0,') # Size of the array. |
| + lines.append(indent + 'NULL,') |
| + lines.append(indent + '0,') # Size of the array. |
| return |
| # Create a new array variable and use it in the structure initializer. |
| # This prohibits nested arrays. Add a clash detection and renaming mechanism |
| # to solve the problem. |
| - var = 'array_%s_%s' % (element_name, field_info['field']); |
| - lines.append(' %s,' % var) |
| - lines.append(' %s,' % len(content)) # Size of the array. |
| + var = _GenerateArrayVariableName(element_name, field_info['field']) |
| + lines.append(indent + '%s,' % var) |
| + lines.append(indent + '%s,' % len(content)) # Size of the array. |
| # Generate the array content. |
| array_lines = [] |
| field_info['contents']['field'] = var; |
| @@ -65,7 +78,7 @@ def _GenerateArray(element_name, field_info, content, lines): |
| field_info['contents']) + '[] = {') |
| for subcontent in content: |
| GenerateFieldContent(element_name, field_info['contents'], subcontent, |
| - array_lines) |
| + array_lines, indent) |
| array_lines.append('};') |
| # Prepend the generated array so it is initialized before the structure. |
| lines.reverse() |
| @@ -73,7 +86,22 @@ def _GenerateArray(element_name, field_info, content, lines): |
| lines.extend(array_lines) |
| lines.reverse() |
| -def GenerateFieldContent(element_name, field_info, content, lines): |
| +def _GenerateObject(element_name, field_info, content, lines, indent=' '): |
| + """Generates an object to be included in a static structure initializer. If |
| + content is not specified, uses {0}. |
|
beaudoin
2015/07/06 16:01:11
Why {0}? Is this always a valid C++ object? Just f
danduong
2015/07/08 23:07:03
{0} should compile. That will initialize the first
|
| + """ |
| + if content is None: |
| + lines.append(indent + '{0},') |
| + return |
| + |
| + fields = field_info['fields'] |
| + lines.append(indent + '{') |
| + for field in fields: |
| + subcontent = content.get(field['field']) |
| + GenerateFieldContent(element_name, field, subcontent, lines, ' ' + indent) |
| + lines.append(indent + '},') |
| + |
| +def GenerateFieldContent(element_name, field_info, content, lines, indent=' '): |
| """Generate the content of a field to be included in the static structure |
| initializer. If the field's content is not specified, uses the default value |
| if one exists. |
| @@ -82,13 +110,15 @@ def GenerateFieldContent(element_name, field_info, content, lines): |
| content = field_info.get('default', None) |
| type = field_info['type'] |
| if type == 'int' or type == 'enum': |
| - lines.append(' %s,' % content) |
| + lines.append('%s%s,' % (indent, content)) |
| elif type == 'string': |
| - _GenerateString(content, lines) |
| + _GenerateString(content, lines, indent) |
| elif type == 'string16': |
| - _GenerateString16(content, lines) |
| + _GenerateString16(content, lines, indent) |
| elif type == 'array': |
| - _GenerateArray(element_name, field_info, content, lines) |
| + _GenerateArray(element_name, field_info, content, lines, indent) |
| + elif type == 'object': |
| + _GenerateObject(element_name, field_info, content, lines, indent) |
| else: |
| raise RuntimeError('Unknown field type "%s"' % type) |