DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (b6d82b1a6b02)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
# 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)
                  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)
    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:
        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))