| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2016 The Chromium Authors. All rights reserved. | 2 # Copyright 2016 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 math | 6 import math |
| 7 import sys | 7 import sys |
| 8 | 8 |
| 9 import json5_generator | 9 import json5_generator |
| 10 import template_expander | 10 import template_expander |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 Should be in upper camel case. | 98 Should be in upper camel case. |
| 99 property_name: Name of the property that the field is part of. | 99 property_name: Name of the property that the field is part of. |
| 100 type_name: Name of the C++ type exposed by the generated interface (e.g.
EClear, int). | 100 type_name: Name of the C++ type exposed by the generated interface (e.g.
EClear, int). |
| 101 field_template: Determines the interface generated for the field. Can be
one of: | 101 field_template: Determines the interface generated for the field. Can be
one of: |
| 102 keyword, flag, or monotonic_flag. | 102 keyword, flag, or monotonic_flag. |
| 103 size: Number of bits needed for storage. | 103 size: Number of bits needed for storage. |
| 104 default_value: Default value for this field when it is first initialized
. | 104 default_value: Default value for this field when it is first initialized
. |
| 105 """ | 105 """ |
| 106 | 106 |
| 107 def __init__(self, field_role, name_for_methods, property_name, type_name, | 107 def __init__(self, field_role, name_for_methods, property_name, type_name, |
| 108 field_template, size, default_value, properties, **kwargs): | 108 field_template, size, default_value, getter_method_name, setter
_method_name, |
| 109 initial_method_name, **kwargs): |
| 109 """Creates a new field.""" | 110 """Creates a new field.""" |
| 110 self.name = class_member_name(name_for_methods) | 111 self.name = class_member_name(name_for_methods) |
| 111 self.property_name = property_name | 112 self.property_name = property_name |
| 112 self.type_name = type_name | 113 self.type_name = type_name |
| 113 self.field_template = field_template | 114 self.field_template = field_template |
| 114 self.size = size | 115 self.size = size |
| 115 self.default_value = default_value | 116 self.default_value = default_value |
| 116 | 117 |
| 117 # Field role: one of these must be true | 118 # Field role: one of these must be true |
| 118 self.is_property = field_role == 'property' | 119 self.is_property = field_role == 'property' |
| 119 self.is_inherited_flag = field_role == 'inherited_flag' | 120 self.is_inherited_flag = field_role == 'inherited_flag' |
| 120 self.is_nonproperty = field_role == 'nonproperty' | 121 self.is_nonproperty = field_role == 'nonproperty' |
| 121 assert (self.is_property, self.is_inherited_flag, self.is_nonproperty).c
ount(True) == 1, \ | 122 assert (self.is_property, self.is_inherited_flag, self.is_nonproperty).c
ount(True) == 1, \ |
| 122 'Field role has to be exactly one of: property, inherited_flag, nonp
roperty' | 123 'Field role has to be exactly one of: property, inherited_flag, nonp
roperty' |
| 123 | 124 |
| 124 if not self.is_inherited_flag: | 125 if not self.is_inherited_flag: |
| 125 self.is_inherited = kwargs.pop('inherited') | 126 self.is_inherited = kwargs.pop('inherited') |
| 126 self.is_independent = kwargs.pop('independent') | 127 self.is_independent = kwargs.pop('independent') |
| 127 assert self.is_inherited or not self.is_independent, 'Only inherited
fields can be independent' | 128 assert self.is_inherited or not self.is_independent, 'Only inherited
fields can be independent' |
| 128 | 129 |
| 129 self.is_inherited_method_name = method_name(join_name(name_for_metho
ds, 'is inherited')) | 130 self.is_inherited_method_name = method_name(join_name(name_for_metho
ds, 'is inherited')) |
| 130 | 131 |
| 131 # Method names | 132 # Method names |
| 132 if 'getter' in properties and not self.is_inherited_flag: | 133 self.getter_method_name = getter_method_name |
| 133 self.getter_method_name = properties['getter'] | 134 self.setter_method_name = setter_method_name |
| 134 else: | 135 self.initial_method_name = initial_method_name |
| 135 getter_prefix = 'Get' if name_for_methods == self.type_name else '' | |
| 136 self.getter_method_name = method_name(join_name(getter_prefix, name_fo
r_methods)) | |
| 137 self.setter_method_name = method_name(join_name('Set', name_for_methods)
) | |
| 138 self.initial_method_name = method_name(join_name('Initial', name_for_met
hods)) | |
| 139 self.resetter_method_name = method_name(join_name('Reset', name_for_meth
ods)) | 136 self.resetter_method_name = method_name(join_name('Reset', name_for_meth
ods)) |
| 140 | 137 |
| 141 # If the size of the field is not None, it means it is a bit field | 138 # If the size of the field is not None, it means it is a bit field |
| 142 self.is_bit_field = self.size is not None | 139 self.is_bit_field = self.size is not None |
| 143 | 140 |
| 144 assert len(kwargs) == 0, 'Unexpected arguments provided to Field: ' + st
r(kwargs) | 141 assert len(kwargs) == 0, 'Unexpected arguments provided to Field: ' + st
r(kwargs) |
| 145 | 142 |
| 146 | 143 |
| 147 def _get_include_paths(properties): | 144 def _get_include_paths(properties): |
| 148 """ | 145 """ |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 return Field( | 214 return Field( |
| 218 field_role, | 215 field_role, |
| 219 name_for_methods, | 216 name_for_methods, |
| 220 property_name=property_['name'], | 217 property_name=property_['name'], |
| 221 inherited=property_['inherited'], | 218 inherited=property_['inherited'], |
| 222 independent=property_['independent'], | 219 independent=property_['independent'], |
| 223 type_name=type_name, | 220 type_name=type_name, |
| 224 field_template=property_['field_template'], | 221 field_template=property_['field_template'], |
| 225 size=size, | 222 size=size, |
| 226 default_value=default_value, | 223 default_value=default_value, |
| 227 properties=property_, | 224 getter_method_name=property_['getter'], |
| 225 setter_method_name=property_['setter'], |
| 226 initial_method_name=property_['initial'], |
| 228 ) | 227 ) |
| 229 | 228 |
| 230 | 229 |
| 231 def _create_inherited_flag_field(property_): | 230 def _create_inherited_flag_field(property_): |
| 232 """ | 231 """ |
| 233 Create the field used for an inheritance fast path from an independent CSS p
roperty, | 232 Create the field used for an inheritance fast path from an independent CSS p
roperty, |
| 234 and return the Field object. | 233 and return the Field object. |
| 235 """ | 234 """ |
| 235 name_for_methods = join_name(property_['name_for_methods'], 'is inherited') |
| 236 return Field( | 236 return Field( |
| 237 'inherited_flag', | 237 'inherited_flag', |
| 238 join_name(property_['name_for_methods'], 'is inherited'), | 238 name_for_methods, |
| 239 property_name=property_['name'], | 239 property_name=property_['name'], |
| 240 type_name='bool', | 240 type_name='bool', |
| 241 field_template='primitive', | 241 field_template='primitive', |
| 242 size=1, | 242 size=1, |
| 243 default_value='true', | 243 default_value='true', |
| 244 properties=property_, | 244 getter_method_name=method_name(name_for_methods), |
| 245 setter_method_name=method_name(join_name('set', name_for_methods)), |
| 246 initial_method_name=method_name(join_name('initial', name_for_methods)), |
| 245 ) | 247 ) |
| 246 | 248 |
| 247 | 249 |
| 248 def _create_fields(field_role, properties): | 250 def _create_fields(field_role, properties): |
| 249 """ | 251 """ |
| 250 Create ComputedStyle fields from properties or nonproperties and return a li
st of Field objects. | 252 Create ComputedStyle fields from properties or nonproperties and return a li
st of Field objects. |
| 251 """ | 253 """ |
| 252 fields = [] | 254 fields = [] |
| 253 for property_ in properties: | 255 for property_ in properties: |
| 254 # Only generate properties that have a field template | 256 # Only generate properties that have a field template |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 } | 309 } |
| 308 | 310 |
| 309 # TODO(shend): Remove this once we move NONPROPERTIES to its own JSON fi
le, | 311 # TODO(shend): Remove this once we move NONPROPERTIES to its own JSON fi
le, |
| 310 # since the JSON5 reader will handle missing fields and defaults. | 312 # since the JSON5 reader will handle missing fields and defaults. |
| 311 for property_ in NONPROPERTIES: | 313 for property_ in NONPROPERTIES: |
| 312 property_['name_for_methods'] = property_['name'] | 314 property_['name_for_methods'] = property_['name'] |
| 313 if 'field_type_path' not in property_: | 315 if 'field_type_path' not in property_: |
| 314 property_['field_type_path'] = None | 316 property_['field_type_path'] = None |
| 315 if 'type_name' not in property_: | 317 if 'type_name' not in property_: |
| 316 property_['type_name'] = 'E' + enum_type_name(property_['name_fo
r_methods']) | 318 property_['type_name'] = 'E' + enum_type_name(property_['name_fo
r_methods']) |
| 319 property_['getter'] = method_name(property_['name_for_methods']) |
| 320 property_['setter'] = method_name(join_name('set', property_['name_f
or_methods'])) |
| 321 property_['initial'] = method_name(join_name('initial', property_['n
ame_for_methods'])) |
| 317 | 322 |
| 318 property_values = self._properties.values() | 323 property_values = self._properties.values() |
| 319 | 324 |
| 320 for property_ in property_values: | 325 for property_ in property_values: |
| 321 # Override the type name when field_type_path is specified | 326 # Override the type name when field_type_path is specified |
| 322 if property_['field_type_path']: | 327 if property_['field_type_path']: |
| 323 property_['type_name'] = property_['field_type_path'].split('/')
[-1] | 328 property_['type_name'] = property_['field_type_path'].split('/')
[-1] |
| 324 # CSS properties are not allowed to explicitly specify their field_s
ize. | 329 # CSS properties are not allowed to explicitly specify their field_s
ize. |
| 325 property_['field_size'] = None | 330 property_['field_size'] = None |
| 326 | 331 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 'mapping': [(enum_value_name(k), enum_for_css_keyword(k)) fo
r k in property_['keywords']], | 409 'mapping': [(enum_value_name(k), enum_for_css_keyword(k)) fo
r k in property_['keywords']], |
| 405 } | 410 } |
| 406 | 411 |
| 407 return { | 412 return { |
| 408 'include_paths': self._include_paths, | 413 'include_paths': self._include_paths, |
| 409 'mappings': mappings, | 414 'mappings': mappings, |
| 410 } | 415 } |
| 411 | 416 |
| 412 if __name__ == '__main__': | 417 if __name__ == '__main__': |
| 413 json5_generator.Maker(ComputedStyleBaseWriter).main() | 418 json5_generator.Maker(ComputedStyleBaseWriter).main() |
| OLD | NEW |