blob: 06db1ccf8955b601cf9bc14ab90506d0584a2b95 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2016 The Chromium Authors. All rights reserved.
# 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
import in_generator
import template_expander
import make_style_builder
class ComputedStyleBaseWriter(make_style_builder.StyleBuilderWriter):
def __init__(self, in_file_path):
super(ComputedStyleBaseWriter, self).__init__(in_file_path)
self._outputs = {
'ComputedStyleBase.h': self.generate_base_computed_style_h,
'ComputedStyleBase.cpp': self.generate_base_computed_style_cpp,
'ComputedStyleBaseConstants.h': self.generate_base_computed_style_constants,
}
# A map of enum name -> list of enum values
self._computed_enums = {}
for property in self._properties.values():
if property['keyword_only']:
enum_name = property['type_name']
# From the Blink style guide: Enum members should use InterCaps with an initial capital letter. [names-enum-members]
enum_values = [k.title() for k in property['keywords']]
self._computed_enums[enum_name] = enum_values
# A list of fields
Field = namedtuple('Field', [
# Name of field member variable
'name',
# Property field is for
'property',
# Field storage type
'type',
# Bits needed for storage
'size',
# Default value for field
'default_value',
])
self._fields = []
for property in self._properties.values():
if property['keyword_only']:
# From the Blink style guide: Other data members should be prefixed by "m_". [names-data-members]
field_name = 'm_' + property['lower_camel_name']
bits_needed = math.log(len(property['keywords']), 2)
type_name = property['type_name']
# For now, assume the default value is the first enum value.
default_value = type_name + '::' + self._computed_enums[type_name][0]
self._fields.append(Field(
name=field_name,
property=property,
type=type_name,
size=int(math.ceil(bits_needed)),
default_value=default_value,
))
@template_expander.use_jinja('ComputedStyleBase.h.tmpl')
def generate_base_computed_style_h(self):
return {
'properties': self._properties,
'enums': self._computed_enums,
'fields': self._fields,
}
@template_expander.use_jinja('ComputedStyleBase.cpp.tmpl')
def generate_base_computed_style_cpp(self):
return {
'properties': self._properties,
'enums': self._computed_enums,
'fields': self._fields,
}
@template_expander.use_jinja('ComputedStyleBaseConstants.h.tmpl')
def generate_base_computed_style_constants(self):
return {
'properties': self._properties,
'enums': self._computed_enums,
'fields': self._fields,
}
if __name__ == '__main__':
in_generator.Maker(ComputedStyleBaseWriter).main(sys.argv)