blob: 6f8788f340402f6cf5914fc762d9634fd35e25b7 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2017 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.
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '../../..'))
import json5_generator
import template_expander
from collections import namedtuple
from make_css_property_base import CSSPropertyBaseWriter
class PropertyMethod(namedtuple('PropertyMethod', 'name,return_type,parameters')):
pass
class CSSPropertiesWriter(CSSPropertyBaseWriter):
def __init__(self, json5_file_paths, output_dir):
super(CSSPropertiesWriter, self).__init__(json5_file_paths, output_dir)
assert len(json5_file_paths) == 3,\
('CSSPropertiesWriter requires 3 input json5 files, ' +
'got {}.'.format(len(json5_file_paths)))
self.template_cache = {}
# Map of property method name -> (return_type, parameters)
self._property_methods = {}
property_methods = json5_generator.Json5File.load_from_files(
[json5_file_paths[2]])
for property_method in property_methods.name_dictionaries:
self._property_methods[property_method['name'].original] = PropertyMethod(
name=property_method['name'].original,
return_type=property_method['return_type'],
parameters=property_method['parameters'],
)
self._outputs = {}
output_dir = sys.argv[sys.argv.index('--output_dir') + 1]
properties = self.css_properties.longhands
namespace_group = 'Longhand'
if 'shorthands' in output_dir:
properties = self.css_properties.shorthands
namespace_group = 'Shorthand'
for property_ in properties:
property_['property_methods'] = [
self._property_methods[method_name]
for method_name in property_['property_methods']
]
property_['namespace_group'] = namespace_group
class_data = self.get_class(property_)
self.calculate_apply_functions_to_declare(property_)
self._outputs[class_data.filename + '.h'] = (
self.generate_property_h_builder(
class_data.classname, class_data.filename, property_))
if not property_['style_builder_inline']:
self._outputs[class_data.filename + '.cc'] = (
self.generate_property_cpp_builder(
class_data.filename, property_))
for property_ in self.css_properties.aliases:
if ('shorthands' in output_dir and property_['longhands']) or \
('longhands' in output_dir and not property_['longhands']):
class_data = self.get_class(property_)
property_['namespace_group'] = namespace_group
self._outputs[class_data.filename + '.h'] = (
self.generate_property_h_builder(
class_data.classname, class_data.filename, property_))
def generate_property_h_builder(self, property_classname, property_filename, property_):
@template_expander.use_jinja(
'core/css/properties/templates/css_property_subclass.h.tmpl',
template_cache=self.template_cache)
def generate_property_h():
return {
'input_files': self._input_files,
'property_classname': property_classname,
'property_filename': property_filename,
'property': property_,
'includes': sorted(list(self.h_includes(property_)))
}
return generate_property_h
def generate_property_cpp_builder(self, property_filename, property_):
@template_expander.use_jinja(
'core/css/properties/templates/css_property_subclass.cc.tmpl',
template_cache=self.template_cache)
def generate_property_cpp():
return {
'input_files': self._input_files,
'property_filename': property_filename,
'property': property_,
'includes': sorted(list(self.cpp_includes(property_)))
}
return generate_property_cpp
def calculate_apply_functions_to_declare(self, property_):
cc_templates = ['background_layer', 'color', 'counter', 'grid', 'mask_layer']
property_['style_builder_inline'] = property_['style_builder_template'] not in cc_templates
property_['style_builder_declare'] = (
property_['is_property'] and
not property_['longhands'])
if not property_['style_builder_declare']:
for x in ['initial', 'inherit', 'value']:
property_['style_builder_generate_%s' % x] = False
def h_includes(self, property_):
if property_['alias_for']:
yield "third_party/blink/renderer/core/css/properties/css_unresolved_property.h"
else:
yield "third_party/blink/renderer/core/css/properties/" + property_['namespace_group'].lower() + ".h"
if property_['direction_aware_options']:
yield "third_party/blink/renderer/core/style_property_shorthand.h"
for include in self.apply_includes(property_):
yield 'third_party/blink/renderer/' + include
if property_['runtime_flag']:
yield "third_party/blink/renderer/platform/runtime_enabled_features.h"
def cpp_includes(self, property_):
if not property_['style_builder_inline']:
for include in self.apply_includes(property_):
yield 'third_party/blink/renderer/' + include
def apply_includes(self, property_):
yield "core/css/resolver/style_resolver_state.h"
yield "core/css/css_primitive_value_mappings.h"
if property_['converter'] == "CSSPrimitiveValue":
yield "core/css/css_primitive_value.h"
yield "core/css/css_primitive_value_mappings.h"
elif property_['converter'] == "CSSIdentifierValue":
yield "core/css/css_identifier_value.h"
elif property_['converter'] == "ConvertElementReference":
yield "core/css/resolver/style_builder_converter.h"
yield "core/style/style_svg_resource.h"
else:
yield "core/css/css_primitive_value_mappings.h"
yield "core/css/resolver/style_builder_converter.h"
if property_['font']:
yield "core/css/resolver/font_builder.h"
elif property_['svg']:
yield "core/css/css_primitive_value_mappings.h"
yield "core/style/computed_style.h"
yield "core/style/svg_computed_style.h"
else:
yield "core/style/computed_style.h"
if ('style_builder_template_args' in property_ and
property_['style_builder_template_args'].get('modifier_type')
in ['Width', 'Slice', 'Outset']):
yield "core/css/properties/style_building_utils.h"
if property_.get('style_builder_template') in ['animation', 'background_layer', 'counter',
'mask_layer', 'transition']:
yield "core/css/css_value_list.h"
if property_.get('style_builder_template') in ['counter']:
yield "core/css/css_value_pair.h"
yield "core/css/css_custom_ident_value.h"
if property_.get('style_builder_template') in ['grid']:
yield "core/css/resolver/style_builder_converter.h"
if __name__ == '__main__':
json5_generator.Maker(CSSPropertiesWriter).main()