diff options
Diffstat (limited to 'layout/style/GenerateServoCSSPropList.py')
-rw-r--r-- | layout/style/GenerateServoCSSPropList.py | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/layout/style/GenerateServoCSSPropList.py b/layout/style/GenerateServoCSSPropList.py new file mode 100644 index 0000000000..8f8badeb73 --- /dev/null +++ b/layout/style/GenerateServoCSSPropList.py @@ -0,0 +1,129 @@ +# 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 buildconfig +import mozpack.path as mozpath +import os +import runpy +import subprocess +import string +import sys + +SERVO_BASE = mozpath.join(buildconfig.topsrcdir, "servo") +SERVO_PROP_BASE = mozpath.join(SERVO_BASE, "components", "style", "properties") + + +def generate_data(output, template): + output.write("# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT\n\n") + output.write( + subprocess.check_output( + [ + sys.executable, + mozpath.join(SERVO_PROP_BASE, "build.py"), + "gecko", + "geckolib", + template, + ], + universal_newlines=True, + ) + ) + + # Add all relevant files into the dependencies of the generated file. + DEP_EXTS = [".py", ".rs", ".zip"] + deps = set() + for path, dirs, files in os.walk(SERVO_PROP_BASE): + for file in files: + if os.path.splitext(file)[1] in DEP_EXTS: + deps.add(mozpath.join(path, file)) + return deps + + +def generate_header(output, data): + data = runpy.run_path(data)["data"] + + output.write( + """/* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT */ + +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* 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 https://mozilla.org/MPL/2.0/. */ + +#define CSS_PROP_DOMPROP_PREFIXED(name_) \\ + CSS_PROP_PUBLIC_OR_PRIVATE(Moz ## name_, name_) + +#ifndef CSS_PROP_LONGHAND +#define CSS_PROP_LONGHAND(name_, id_, method_, flags_, pref_) /* nothing */ +#define DEFINED_CSS_PROP_LONGHAND +#endif + +#ifndef CSS_PROP_SHORTHAND +#define CSS_PROP_SHORTHAND(name_, id_, method_, flags_, pref_) /* nothing */ +#define DEFINED_CSS_PROP_SHORTHAND +#endif + +#ifndef CSS_PROP_ALIAS +#define CSS_PROP_ALIAS(name_, aliasid_, id_, method_, pref_) /* nothing */ +#define DEFINED_CSS_PROP_ALIAS +#endif + +""" + ) + + # Some flags are only used for code generation, so we don't need to + # expose them to runtime. + COMPILE_TIME_FLAGS = {"ExposedOnGetCS"} + + MACRO_NAMES = { + "longhand": "CSS_PROP_LONGHAND", + "shorthand": "CSS_PROP_SHORTHAND", + "alias": "CSS_PROP_ALIAS", + } + for prop in data: + is_internal = "Internal" in prop.flags + pref = '"' + prop.pref + '"' + if prop.type() == "alias": + params = [prop.name, prop.alias_id, prop.prop_id, prop.method, pref] + else: + method = prop.method + if method == "CssFloat": + method = "CSS_PROP_PUBLIC_OR_PRIVATE(CssFloat, Float)" + elif method.startswith("Moz"): + method = "CSS_PROP_DOMPROP_PREFIXED({})".format(method[3:]) + flags = " | ".join( + "CSSPropFlags::{}".format(flag) + for flag in prop.flags + if flag not in COMPILE_TIME_FLAGS + ) + if not flags: + flags = "CSSPropFlags(0)" + params = [prop.name, prop.id, method, flags, pref] + + if is_internal: + output.write("#ifndef CSS_PROP_LIST_EXCLUDE_INTERNAL\n") + output.write("{}({})\n".format(MACRO_NAMES[prop.type()], ", ".join(params))) + if is_internal: + output.write("#endif\n") + + output.write( + """ +#ifdef DEFINED_CSS_PROP_ALIAS +#undef CSS_PROP_ALIAS +#undef DEFINED_CSS_PROP_ALIAS +#endif + +#ifdef DEFINED_CSS_PROP_SHORTHAND +#undef CSS_PROP_SHORTHAND +#undef DEFINED_CSS_PROP_SHORTHAND +#endif + +#ifdef DEFINED_CSS_PROP_LONGHAND +#undef CSS_PROP_LONGHAND +#undef DEFINED_CSS_PROP_LONGHAND +#endif + +#undef CSS_PROP_DOMPROP_PREFIXED +""" + ) |