Files
tubestation/layout/style/GenerateCSSPropsGenerated.py
Gregory Szorc 3bcd02ebea Backed out changesets dcdb85fc5517, 702bca0deee2, 9cKX8gC1ATA (bug 1293739) for build bustage; a=bustage
The merge from inbound to central conflicted with the merge from
autoland to central, it appears. Per tree rules, the commit from the
autoland repo wins and the inbound commit gets backed out.

CLOSED TREE
2016-08-16 17:50:40 -07:00

105 lines
3.7 KiB
Python

# 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 sys
import string
import argparse
import subprocess
import buildconfig
from mozbuild import shellutil
def get_properties(preprocessorHeader):
cpp = shellutil.split(buildconfig.substs['CPP'])
cpp += shellutil.split(buildconfig.substs['ACDEFINES'])
cpp.append(preprocessorHeader)
preprocessed = subprocess.check_output(cpp)
properties = [{"name":p[0], "prop":p[1], "id":p[2],
"flags":p[3], "pref":p[4], "proptype":p[5]}
for (i, p) in enumerate(eval(preprocessed))]
# Sort the list so that longhand and logical properties are intermingled
# first, shorthand properties follow, then aliases appear last. This matches
# the order of the nsCSSProperty enum.
def property_compare(x, y):
property_order = {"longhand": 0, "logical": 0, "shorthand": 1, "alias": 2}
return property_order[x["proptype"]] - property_order[y["proptype"]]
properties = sorted(properties, cmp=property_compare)
for i, p in enumerate(properties):
p["index"] = i
# Record each property's IDL name.
for p in properties:
if "CSS_PROPERTY_INTERNAL" in p["flags"]:
p["idlname"] = None
else:
idl_name = p["prop"]
if not idl_name.startswith("Moz"):
idl_name = idl_name[0].lower() + idl_name[1:]
p["idlname"] = idl_name
return properties
def generate_idl_names(properties):
names = []
for p in properties:
if p["proptype"] is "alias":
continue
if p["idlname"] is None:
names.append(" nullptr, // %s" % p["name"])
else:
names.append(' "%s",' % p["idlname"])
return "\n".join(names)
def generate_assertions(properties):
def enum(p):
if p["proptype"] is "alias":
return "eCSSPropertyAlias_%s" % p["prop"]
else:
return "eCSSProperty_%s" % p["id"]
msg = ('static_assert(%s == %d, "GenerateCSSPropsGenerated.py did not list '
'properties in nsCSSProperty order");')
return "\n".join(map(lambda p: msg % (enum(p), p["index"]), properties))
def generate_idl_name_positions(properties):
# Skip aliases.
ps = filter(lambda p: p["proptype"] is not "alias", properties)
# Sort alphabetically by IDL name.
ps = sorted(ps, key=lambda p: p["idlname"])
# Annotate entries with the sorted position.
ps = [(p, position) for position, p in enumerate(ps)]
# Sort back to nsCSSProperty order.
ps = sorted(ps, key=lambda (p, position): p["index"])
return ",\n".join(map(lambda (p, position): " %d" % position, ps))
def generate(output, cppTemplate, preprocessorHeader):
cppFile = open(cppTemplate, "r")
cppTemplate = cppFile.read()
cppFile.close()
properties = get_properties(preprocessorHeader)
substitutions = {
"idl_names": generate_idl_names(properties),
"assertions": generate_assertions(properties),
"idl_name_positions": generate_idl_name_positions(properties),
}
output.write("/* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT */\n\n" +
string.Template(cppTemplate).substitute(substitutions) + "\n")
def main():
parser = argparse.ArgumentParser()
parser.add_argument('cppTemplate', help='CSS property file template')
parser.add_argument('preprocessorHeader', help='Header file to pass through the preprocessor')
args = parser.parse_args()
generate(sys.stdout, args.cppTemplate, args.preprocessorHeader)
if __name__ == '__main__':
main()