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 in_generator | 9 import in_generator |
10 import template_expander | 10 import template_expander |
(...skipping 17 matching lines...) Expand all Loading... |
28 - 'enum', for fields that store the values of an enum | 28 - 'enum', for fields that store the values of an enum |
29 - 'inherited_flag', for single-bit flags that store whether a property is | 29 - 'inherited_flag', for single-bit flags that store whether a property is |
30 inherited by this style or set explicitly | 30 inherited by this style or set explicitly |
31 """ | 31 """ |
32 def __init__(self, field_family, **kwargs): | 32 def __init__(self, field_family, **kwargs): |
33 # Values common to all fields | 33 # Values common to all fields |
34 # Name of field | 34 # Name of field |
35 self.name = kwargs.pop('name') | 35 self.name = kwargs.pop('name') |
36 # Name of property field is for | 36 # Name of property field is for |
37 self.property_name = kwargs.pop('property_name') | 37 self.property_name = kwargs.pop('property_name') |
38 # Internal field storage type | 38 # Internal field storage type (storage_type_path can be None) |
39 self.storage_type = kwargs.pop('storage_type') | 39 self.storage_type = kwargs.pop('storage_type') |
| 40 self.storage_type_path = kwargs.pop('storage_type_path') |
40 # Bits needed for storage | 41 # Bits needed for storage |
41 self.size = kwargs.pop('size') | 42 self.size = kwargs.pop('size') |
42 # Default value for field | 43 # Default value for field |
43 self.default_value = kwargs.pop('default_value') | 44 self.default_value = kwargs.pop('default_value') |
44 # Method names | 45 # Method names |
45 self.getter_method_name = kwargs.pop('getter_method_name') | 46 self.getter_method_name = kwargs.pop('getter_method_name') |
46 self.setter_method_name = kwargs.pop('setter_method_name') | 47 self.setter_method_name = kwargs.pop('setter_method_name') |
47 self.initial_method_name = kwargs.pop('initial_method_name') | 48 self.initial_method_name = kwargs.pop('initial_method_name') |
48 self.resetter_method_name = kwargs.pop('resetter_method_name') | 49 self.resetter_method_name = kwargs.pop('resetter_method_name') |
49 | 50 |
(...skipping 21 matching lines...) Expand all Loading... |
71 super(ComputedStyleBaseWriter, self).__init__(in_file_path) | 72 super(ComputedStyleBaseWriter, self).__init__(in_file_path) |
72 self._outputs = { | 73 self._outputs = { |
73 'ComputedStyleBase.h': self.generate_base_computed_style_h, | 74 'ComputedStyleBase.h': self.generate_base_computed_style_h, |
74 'ComputedStyleBase.cpp': self.generate_base_computed_style_cpp, | 75 'ComputedStyleBase.cpp': self.generate_base_computed_style_cpp, |
75 'ComputedStyleBaseConstants.h': self.generate_base_computed_style_co
nstants, | 76 'ComputedStyleBaseConstants.h': self.generate_base_computed_style_co
nstants, |
76 } | 77 } |
77 | 78 |
78 # A map of enum name -> list of enum values | 79 # A map of enum name -> list of enum values |
79 self._computed_enums = {} | 80 self._computed_enums = {} |
80 for property in self._properties.values(): | 81 for property in self._properties.values(): |
81 if property['keyword_only']: | 82 # Only generate enums for keyword properties that use the default fi
eld_storage_type. |
| 83 if property['keyword_only'] and property['field_storage_type'] is No
ne: |
82 enum_name = property['type_name'] | 84 enum_name = property['type_name'] |
83 # From the Blink style guide: Enum members should use InterCaps
with an initial capital letter. [names-enum-members] | 85 # From the Blink style guide: Enum members should use InterCaps
with an initial capital letter. [names-enum-members] |
84 enum_values = [camel_case(k) for k in property['keywords']] | 86 enum_values = [camel_case(k) for k in property['keywords']] |
85 self._computed_enums[enum_name] = enum_values | 87 self._computed_enums[enum_name] = enum_values |
86 | 88 |
87 # A list of all the fields to be generated. | 89 # A list of all the fields to be generated. |
88 self._fields = [] | 90 self._fields = [] |
89 for property in self._properties.values(): | 91 for property in self._properties.values(): |
90 if property['keyword_only']: | 92 if property['keyword_only']: |
91 property_name = property['name_for_methods'] | 93 property_name = property['name_for_methods'] |
92 property_name_lower = property_name[0].lower() + property_name[1
:] | 94 property_name_lower = property_name[0].lower() + property_name[1
:] |
93 | 95 |
94 # From the Blink style guide: Other data members should be prefi
xed by "m_". [names-data-members] | 96 # From the Blink style guide: Other data members should be prefi
xed by "m_". [names-data-members] |
95 field_name = 'm_' + property_name_lower | 97 field_name = 'm_' + property_name_lower |
96 bits_needed = math.log(len(property['keywords']), 2) | 98 bits_needed = math.log(len(property['keywords']), 2) |
| 99 |
| 100 # Separate the type path from the type name, if specified. |
97 type_name = property['type_name'] | 101 type_name = property['type_name'] |
| 102 type_path = None |
| 103 if property['field_storage_type']: |
| 104 type_path = property['field_storage_type'] |
| 105 type_name = type_path.split('/')[-1] |
98 | 106 |
99 assert property['initial_keyword'] is not None, \ | 107 assert property['initial_keyword'] is not None, \ |
100 ('MakeComputedStyleBase requires an initial keyword for keyw
ord_only values, none specified ' | 108 ('MakeComputedStyleBase requires an initial keyword for keyw
ord_only values, none specified ' |
101 'for property ' + property['name']) | 109 'for property ' + property['name']) |
102 default_value = type_name + '::' + camel_case(property['initial_
keyword']) | 110 default_value = type_name + '::' + camel_case(property['initial_
keyword']) |
103 | 111 |
104 # If the property is independent, add the single-bit sized isInh
erited flag | 112 # If the property is independent, add the single-bit sized isInh
erited flag |
105 # to the list of Fields as well. | 113 # to the list of Fields as well. |
106 if property['independent']: | 114 if property['independent']: |
107 field_name_suffix_upper = property_name + 'IsInherited' | 115 field_name_suffix_upper = property_name + 'IsInherited' |
108 field_name_suffix_lower = property_name_lower + 'IsInherited
' | 116 field_name_suffix_lower = property_name_lower + 'IsInherited
' |
109 self._fields.append(Field( | 117 self._fields.append(Field( |
110 'inherited_flag', | 118 'inherited_flag', |
111 name='m_' + field_name_suffix_lower, | 119 name='m_' + field_name_suffix_lower, |
112 property_name=property['name'], | 120 property_name=property['name'], |
113 storage_type='bool', | 121 storage_type='bool', |
| 122 storage_type_path=None, |
114 size=1, | 123 size=1, |
115 default_value='true', | 124 default_value='true', |
116 getter_method_name=field_name_suffix_lower, | 125 getter_method_name=field_name_suffix_lower, |
117 setter_method_name='set' + field_name_suffix_upper, | 126 setter_method_name='set' + field_name_suffix_upper, |
118 initial_method_name='initial' + field_name_suffix_upper, | 127 initial_method_name='initial' + field_name_suffix_upper, |
119 resetter_method_name='reset' + field_name_suffix_upper, | 128 resetter_method_name='reset' + field_name_suffix_upper, |
120 )) | 129 )) |
121 | 130 |
122 # Add the property itself as a member variable. | 131 # Add the property itself as a member variable. |
123 self._fields.append(Field( | 132 self._fields.append(Field( |
124 'enum', | 133 'enum', |
125 name=field_name, | 134 name=field_name, |
126 property_name=property['name'], | 135 property_name=property['name'], |
127 inherited=property['inherited'], | 136 inherited=property['inherited'], |
128 independent=property['independent'], | 137 independent=property['independent'], |
129 storage_type=type_name, | 138 storage_type=type_name, |
| 139 storage_type_path=type_path, |
130 size=int(math.ceil(bits_needed)), | 140 size=int(math.ceil(bits_needed)), |
131 default_value=default_value, | 141 default_value=default_value, |
132 getter_method_name=property_name_lower, | 142 getter_method_name=property_name_lower, |
133 setter_method_name='set' + property_name, | 143 setter_method_name='set' + property_name, |
134 initial_method_name='initial' + property_name, | 144 initial_method_name='initial' + property_name, |
135 resetter_method_name='reset' + property_name, | 145 resetter_method_name='reset' + property_name, |
136 is_inherited_method_name=property_name_lower + 'IsInherited'
, | 146 is_inherited_method_name=property_name_lower + 'IsInherited'
, |
137 )) | 147 )) |
138 | 148 |
139 # Small optimization: order fields by size, from largest to smallest, | 149 # Small optimization: order fields by size, from largest to smallest, |
(...skipping 19 matching lines...) Expand all Loading... |
159 @template_expander.use_jinja('ComputedStyleBaseConstants.h.tmpl') | 169 @template_expander.use_jinja('ComputedStyleBaseConstants.h.tmpl') |
160 def generate_base_computed_style_constants(self): | 170 def generate_base_computed_style_constants(self): |
161 return { | 171 return { |
162 'properties': self._properties, | 172 'properties': self._properties, |
163 'enums': self._computed_enums, | 173 'enums': self._computed_enums, |
164 'fields': self._fields, | 174 'fields': self._fields, |
165 } | 175 } |
166 | 176 |
167 if __name__ == '__main__': | 177 if __name__ == '__main__': |
168 in_generator.Maker(ComputedStyleBaseWriter).main(sys.argv) | 178 in_generator.Maker(ComputedStyleBaseWriter).main(sys.argv) |
OLD | NEW |