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

Side by Side Diff: third_party/WebKit/Source/build/scripts/make_computed_style_base.py

Issue 2902433002: Generates predicates to test in diff functions in ComputedStyle (Closed)
Patch Set: alancutter@'s suggestions Created 3 years, 6 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
OLDNEW
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
11 import make_style_builder 11 import make_style_builder
12 12
13 from name_utilities import ( 13 from name_utilities import (
14 enum_for_css_keyword, enum_type_name, enum_value_name, class_member_name, me thod_name, 14 enum_for_css_keyword, enum_type_name, enum_value_name, class_member_name, me thod_name,
15 class_name, join_name 15 class_name, join_name
16 ) 16 )
17 from collections import defaultdict, OrderedDict 17 from collections import defaultdict, OrderedDict
18 from itertools import chain 18 from itertools import chain
19 19
20 # Heuristic ordering of types from largest to smallest, used to sort fields by t heir alignment sizes. 20 # Heuristic ordering of types from largest to smallest, used to sort fields by t heir alignment sizes.
21 # Specifying the exact alignment sizes for each type is impossible because it's platform specific, 21 # Specifying the exact alignment sizes for each type is impossible because it's platform specific,
22 # so we define an ordering instead. 22 # so we define an ordering instead.
23 # The ordering comes from the data obtained in: 23 # The ordering comes from the data obtained in:
24 # https://codereview.chromium.org/2841413002 24 # https://codereview.chromium.org/2841413002
25 # TODO(shend): Put alignment sizes into code form, rather than linking to a CL w hich may disappear. 25 # TODO(shend): Put alignment sizes into code form, rather than linking to a CL w hich may disappear.
26 ALIGNMENT_ORDER = [ 26 ALIGNMENT_ORDER = [
27 'double', 27 'double',
28 'AtomicString', 'RefPtr', 'Persistent', 'Font', 'FillLayer', 'NinePieceImage ', 'LayoutUnit' # Aligns like a pointer (can be 32 or 64 bits) 28 'AtomicString', 'RefPtr', 'Persistent', 'Font', 'FillLayer', 'NinePieceImage ', # Aligns like a pointer (can be 32 or 64 bits)
29 'LengthBox', 'LengthSize', 'Length', 'TextSizeAdjust', 'TabSize', 'float', 29 'LengthBox', 'LengthSize', 'Length', 'TextSizeAdjust', 'TabSize', 'float',
30 'StyleColor', 'Color', 'unsigned', 'int', 30 'StyleColor', 'Color', 'LayoutUnit', 'unsigned', 'int',
31 'short', 31 'short',
32 'uint8_t', 'char', 32 'uint8_t', 'char',
33 'bool' 33 'bool'
34 ] 34 ]
35 35
36 # TODO(shend): Improve documentation and add docstrings. 36 # TODO(shend): Improve documentation and add docstrings.
37 37
38 38
39 def _flatten_list(x): 39 def _flatten_list(x):
40 """Flattens a list of lists into a single list.""" 40 """Flattens a list of lists into a single list."""
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 for a function in ComputedStyle. 79 for a function in ComputedStyle.
80 80
81 Attributes: 81 Attributes:
82 subgroups: List of DiffGroup instances that are stored as subgroups unde r this group. 82 subgroups: List of DiffGroup instances that are stored as subgroups unde r this group.
83 expressions: List of expression that are on this group that need to be d iffed. 83 expressions: List of expression that are on this group that need to be d iffed.
84 """ 84 """
85 def __init__(self, group_name): 85 def __init__(self, group_name):
86 self.group_name = group_name 86 self.group_name = group_name
87 self.subgroups = [] 87 self.subgroups = []
88 self.expressions = [] 88 self.expressions = []
89 self.predicates = []
89 90
90 91
91 class Field(object): 92 class Field(object):
92 """ 93 """
93 The generated ComputedStyle object is made up of a series of Fields. 94 The generated ComputedStyle object is made up of a series of Fields.
94 Each Field has a name, size, type, etc, and a bunch of attributes to 95 Each Field has a name, size, type, etc, and a bunch of attributes to
95 determine which methods it will be used in. 96 determine which methods it will be used in.
96 97
97 A Field also has enough information to use any storage type in C++, such as 98 A Field also has enough information to use any storage type in C++, such as
98 regular member variables, or more complex storage like vectors or hashmaps. 99 regular member variables, or more complex storage like vectors or hashmaps.
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 groups[field.group_name].append(field) 186 groups[field.group_name].append(field)
186 187
187 no_group = groups.pop(None) 188 no_group = groups.pop(None)
188 subgroups = [Group(group_name, [], _reorder_fields(fields)) for group_name, fields in groups.items()] 189 subgroups = [Group(group_name, [], _reorder_fields(fields)) for group_name, fields in groups.items()]
189 return Group('', subgroups=subgroups, fields=_reorder_fields(no_group)) 190 return Group('', subgroups=subgroups, fields=_reorder_fields(no_group))
190 191
191 192
192 def _create_diff_groups_map(diff_function_inputs, root_group): 193 def _create_diff_groups_map(diff_function_inputs, root_group):
193 diff_functions_map = {} 194 diff_functions_map = {}
194 for entry in diff_function_inputs: 195 for entry in diff_function_inputs:
195 diff_functions_map[entry['name']] = _create_diff_groups(entry['fields_to _diff'], entry['methods_to_diff'], root_group) 196 diff_functions_map[entry['name']] = _create_diff_groups(entry['fields_to _diff'],
197 entry['methods_t o_diff'], entry['predicates_to_test'], root_group)
196 return diff_functions_map 198 return diff_functions_map
197 199
198 200
199 def _list_field_dependencies(methods_to_diff): 201 def _list_field_dependencies(entries_with_field_dependencies):
200 field_dependencies = [] 202 field_dependencies = []
201 for entry in methods_to_diff: 203 for entry in entries_with_field_dependencies:
202 field_dependencies += entry['field_dependencies'] 204 field_dependencies += entry['field_dependencies']
203 return field_dependencies 205 return field_dependencies
204 206
205 207
206 def _create_diff_groups(fields_to_diff, methods_to_diff, root_group): 208 def _create_diff_groups(fields_to_diff, methods_to_diff, predicates_to_test, roo t_group):
207 diff_group = DiffGroup(root_group.member_name) 209 diff_group = DiffGroup(root_group.member_name)
208 field_dependencies = _list_field_dependencies(methods_to_diff) 210 field_dependencies = _list_field_dependencies(methods_to_diff + predicates_t o_test)
209 for subgroup in root_group.subgroups: 211 for subgroup in root_group.subgroups:
210 if any(field.property_name in (fields_to_diff + field_dependencies) for field in subgroup.all_fields): 212 if any(field.property_name in (fields_to_diff + field_dependencies) for field in subgroup.all_fields):
211 diff_group.subgroups.append(_create_diff_groups(fields_to_diff, meth ods_to_diff, subgroup)) 213 diff_group.subgroups.append(_create_diff_groups(fields_to_diff, meth ods_to_diff, predicates_to_test, subgroup))
212 for field in root_group.fields: 214 for field in root_group.fields:
213 if field.property_name in fields_to_diff: 215 if field.property_name in fields_to_diff:
214 diff_group.expressions.append(field.getter_expression) 216 diff_group.expressions.append(field.getter_expression)
215 for entry in methods_to_diff: 217 for entry in methods_to_diff:
216 if field.property_name in entry['field_dependencies']: 218 if field.property_name in entry['field_dependencies']:
217 diff_group.expressions.append(entry['method']) 219 diff_group.expressions.append(entry['method'])
220 for entry in predicates_to_test:
221 if field.property_name in entry['field_dependencies']:
222 diff_group.predicates.append(entry['predicate'])
218 return diff_group 223 return diff_group
219 224
220 225
221 def _create_enums(properties): 226 def _create_enums(properties):
222 """ 227 """
223 Returns an OrderedDict of enums to be generated, enum name -> [list of enum values] 228 Returns an OrderedDict of enums to be generated, enum name -> [list of enum values]
224 """ 229 """
225 enums = {} 230 enums = {}
226 for property_ in properties: 231 for property_ in properties:
227 # Only generate enums for keyword properties that use the default field_ type_path. 232 # Only generate enums for keyword properties that use the default field_ type_path.
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 456
452 @template_expander.use_jinja('ComputedStyleBaseConstants.h.tmpl') 457 @template_expander.use_jinja('ComputedStyleBaseConstants.h.tmpl')
453 def generate_base_computed_style_constants(self): 458 def generate_base_computed_style_constants(self):
454 return { 459 return {
455 'properties': self._properties, 460 'properties': self._properties,
456 'enums': self._generated_enums, 461 'enums': self._generated_enums,
457 } 462 }
458 463
459 if __name__ == '__main__': 464 if __name__ == '__main__':
460 json5_generator.Maker(ComputedStyleBaseWriter).main() 465 json5_generator.Maker(ComputedStyleBaseWriter).main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698