diff options
Diffstat (limited to 'layout/style/GenerateCSSPropsGenerated.py')
-rw-r--r-- | layout/style/GenerateCSSPropsGenerated.py | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/layout/style/GenerateCSSPropsGenerated.py b/layout/style/GenerateCSSPropsGenerated.py new file mode 100644 index 0000000000..90ed792194 --- /dev/null +++ b/layout/style/GenerateCSSPropsGenerated.py @@ -0,0 +1,114 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +import runpy +import sys +import string +import argparse + + +class PropertyWrapper(object): + __slots__ = ["index", "prop", "idlname"] + + def __init__(self, index, prop): + self.index = index + self.prop = prop + if "Internal" in prop.flags: + self.idlname = None + else: + idl_name = prop.method + if not idl_name.startswith("Moz"): + idl_name = idl_name[0].lower() + idl_name[1:] + self.idlname = idl_name + + def __getattr__(self, name): + return getattr(self.prop, name) + + +def generate(output, dataFile): + output.write( + """/* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT */ + +/* processed file that defines CSS property tables that can't be generated + with the pre-processor, designed to be #included in nsCSSProps.cpp */ + +""" + ) + + raw_properties = runpy.run_path(dataFile)["data"] + properties = [ + PropertyWrapper(i, p) + for i, p in enumerate(raw_properties.values()) + if p.type() != "alias" + ] + + # Generate kIDLNameTable + output.write( + "const char* const nsCSSProps::" "kIDLNameTable[eCSSProperty_COUNT] = {\n" + ) + for p in properties: + if p.idlname is None: + output.write(" nullptr, // {}\n".format(p.name)) + else: + output.write(' "{}",\n'.format(p.idlname)) + output.write("};\n\n") + + # Generate kIDLNameSortPositionTable + ps = sorted(properties, key=lambda p: p.idlname if p.idlname else "") + ps = [(p, position) for position, p in enumerate(ps)] + ps.sort(key=lambda item: item[0].index) + output.write( + "const int32_t nsCSSProps::" + "kIDLNameSortPositionTable[eCSSProperty_COUNT] = {\n" + ) + for p, position in ps: + output.write(" {},\n".format(position)) + output.write("};\n\n") + + # Generate preferences table + output.write( + "const nsCSSProps::PropertyPref " "nsCSSProps::kPropertyPrefTable[] = {\n" + ) + for p in raw_properties.values(): + if not p.pref: + continue + if p.type() != "alias": + prop_id = "eCSSProperty_" + p.id + else: + prop_id = "eCSSPropertyAlias_" + p.alias_id + output.write(' {{ {}, "{}" }},\n'.format(prop_id, p.pref)) + output.write(" { eCSSProperty_UNKNOWN, nullptr },\n") + output.write("};\n\n") + + # Generate shorthand subprop tables + names = [] + for p in properties: + if p.type() != "shorthand": + continue + name = "g{}SubpropTable".format(p.method) + names.append(name) + output.write("static const nsCSSPropertyID {}[] = {{\n".format(name)) + for subprop in p.subprops: + output.write(" eCSSProperty_{},\n".format(subprop)) + output.write(" eCSSProperty_UNKNOWN\n") + output.write("};\n\n") + output.write("const nsCSSPropertyID* const\n") + output.write( + "nsCSSProps::kSubpropertyTable[" + "eCSSProperty_COUNT - eCSSProperty_COUNT_no_shorthands" + "] = {\n" + ) + for name in names: + output.write(" {},\n".format(name)) + output.write("};\n\n") + + # Generate assertions + msg = ( + "GenerateCSSPropsGenerated.py did not list properties " + "in nsCSSPropertyID order" + ) + for p in properties: + output.write( + 'static_assert(eCSSProperty_{} == {}, "{}");\n'.format(p.id, p.index, msg) + ) |