Chromium Code Reviews| Index: third_party/WebKit/Source/build/scripts/make_computed_style_base.py |
| diff --git a/third_party/WebKit/Source/build/scripts/make_computed_style_base.py b/third_party/WebKit/Source/build/scripts/make_computed_style_base.py |
| index 1503f4283d48ad0606db2598a640649087e8bd25..1a5e111834f7b447da51e74e5d5bf9929b03b5d3 100755 |
| --- a/third_party/WebKit/Source/build/scripts/make_computed_style_base.py |
| +++ b/third_party/WebKit/Source/build/scripts/make_computed_style_base.py |
| @@ -3,7 +3,6 @@ |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| -from collections import namedtuple |
| import math |
| import sys |
| @@ -13,6 +12,56 @@ import make_style_builder |
| from name_utilities import camel_case |
| + |
| +class Field(object): |
| + """ |
| + The generated ComputedStyle object is made up of a series of Fields. |
| + Each Field has a name, size, type, etc, and a bunch of attributes to |
| + determine which methods it will be used in. |
| + |
| + A Field also has enough information to use any storage type in C++, such as |
| + regular member variables, or more complex storage like vectors or hashmaps. |
| + Almost all properties will have at least one Field, often more than one. |
| + |
| + Fields also fall into various families, which determine the logic that is |
| + used to generate them. The available field families are: |
| + - 'enum', for fields that store the values of an enum |
| + - 'inherited_flag', for single-bit flags that store whether a property is |
| + inherited by this style or set explicitly |
| + """ |
| + def __init__(self, field_family, **kwargs): |
| + # Values common to all fields |
| + # Name of field |
| + self.name = kwargs.pop('name') |
| + # Property field is for |
| + self.property = kwargs.pop('property') |
| + # Field storage type |
| + self.type = kwargs.pop('type') |
| + # Bits needed for storage |
| + self.size = kwargs.pop('size') |
| + # Default value for field |
| + self.default_value = kwargs.pop('default_value') |
| + # Method names |
| + self.getter_method_name = kwargs.pop('getter_method_name') |
| + self.setter_method_name = kwargs.pop('setter_method_name') |
| + self.initial_method_name = kwargs.pop('initial_method_name') |
| + self.resetter_method_name = kwargs.pop('resetter_method_name') |
| + |
| + # Field family: one of these must be true |
| + self.is_enum = field_family == 'enum' |
| + self.is_inherited_flag = field_family == 'inherited_flag' |
| + assert self.is_enum or self.is_inherited_flag, 'Only one field family can be specified at a time' |
|
meade_UTC10
2016/12/06 03:03:36
don't you want
assert !(self.is_enum and self.is_
sashab
2016/12/06 03:05:53
Oh nice lol :) Whoops
|
| + |
| + if self.is_enum: |
| + # Enum-only fields |
| + self.is_inherited_method_name = kwargs.pop('is_inherited_method_name') |
| + elif self.is_inherited_flag: |
| + # Inherited flag-only fields |
| + pass |
|
meade_UTC10
2016/12/06 03:03:36
I assume there will be something here eventually?
sashab
2016/12/06 03:05:54
Yup, think its ok if I leave it there for now just
|
| + |
| + assert len(kwargs) == 0, 'Unexpected arguments provided to Field: ' + str(kwargs) |
| + |
| + |
| class ComputedStyleBaseWriter(make_style_builder.StyleBuilderWriter): |
| def __init__(self, in_file_path): |
| super(ComputedStyleBaseWriter, self).__init__(in_file_path) |
| @@ -31,32 +80,7 @@ class ComputedStyleBaseWriter(make_style_builder.StyleBuilderWriter): |
| enum_values = [camel_case(k) for k in property['keywords']] |
| self._computed_enums[enum_name] = enum_values |
| - # A list of fields for the generated class. |
| - # TODO(sashab): Rename this to Member, and add better documentation for what this list is for, |
| - # including asserts to show inter-field dependencies. |
| - Field = namedtuple('Field', [ |
| - # Name of field member variable |
| - 'name', |
| - # Property field is for |
| - 'property', |
| - # Field family: one of these must be true |
| - 'is_enum', |
| - 'is_inherited_flag', |
| - # Field storage type |
| - 'type', |
| - # Bits needed for storage |
| - 'size', |
| - # Default value for field |
| - 'default_value', |
| - # Method names |
| - 'getter_method_name', |
| - 'setter_method_name', |
| - 'initial_method_name', |
| - 'resetter_method_name', |
| - 'is_inherited_method_name', |
| - ]) |
| - |
| - # A list of all the fields to be generated. Add new fields here. |
| + # A list of all the fields to be generated. |
| self._fields = [] |
| for property in self._properties.values(): |
| if property['keyword_only']: |
| @@ -76,15 +100,14 @@ class ComputedStyleBaseWriter(make_style_builder.StyleBuilderWriter): |
| default_value = type_name + '::' + camel_case(property['initial_keyword']) |
| # If the property is independent, add the single-bit sized isInherited flag |
| - # to the list of member variable as well. |
| + # to the list of Fields as well. |
| if property['independent']: |
| field_name_suffix_upper = property['upper_camel_name'] + 'IsInherited' |
| field_name_suffix_lower = property_name_lower + 'IsInherited' |
| self._fields.append(Field( |
| + 'inherited_flag', |
| name='m_' + field_name_suffix_lower, |
| property=property, |
| - is_enum=False, |
| - is_inherited_flag=True, |
| type='bool', |
| size=1, |
| default_value='true', |
| @@ -92,15 +115,13 @@ class ComputedStyleBaseWriter(make_style_builder.StyleBuilderWriter): |
| setter_method_name='set' + field_name_suffix_upper, |
| initial_method_name='initial' + field_name_suffix_upper, |
| resetter_method_name='reset' + field_name_suffix_upper, |
| - is_inherited_method_name='', |
| )) |
| # Add the property itself as a member variable. |
| self._fields.append(Field( |
| + 'enum', |
| name=field_name, |
| property=property, |
| - is_enum=True, |
| - is_inherited_flag=False, |
| type=type_name, |
| size=int(math.ceil(bits_needed)), |
| default_value=default_value, |