summaryrefslogtreecommitdiffstats
path: root/layout/style/GenerateServoCSSPropList.py
diff options
context:
space:
mode:
Diffstat (limited to 'layout/style/GenerateServoCSSPropList.py')
-rw-r--r--layout/style/GenerateServoCSSPropList.py129
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
+"""
+ )