layout/style/tools/cleanup_computed_getters.py
author Emilio Cobos Álvarez <emilio@crisal.io>
Thu, 27 Jun 2019 20:24:02 +0200
changeset 543425 2086a08e77feeeaddcff0399deef434ac2e8c17e
parent 481617 8b99a48a2b7062aef9540b947b9ba675da301b95
child 566929 96695741c87a1557ed6122a5606fa22cc43408fb
permissions -rw-r--r--
Bug 1562269 - Serialize grid-auto-rows / grid-auto-columns with Servo. r=boris Two less properties, now that we're not using nsStyleCoord for them we can do this. Unfortunately the grid resolved value code needs to serialize it still, so this doesn't remove as much code. Also fix the script since the generated file was renamed. Differential Revision: https://phabricator.services.mozilla.com/D36349

#!/usr/bin/env python3

"""
Script to remove unused getters in nsComputedDOMStyle.

It needs to be run from the topsrcdir, and it requires passing in the objdir
as first argument. It can only be run after nsComputedDOMStyleGenerated.inc
is generated in the objdir.
"""

import re
import sys

from pathlib import Path

if len(sys.argv) != 2:
    print("Usage: {} objdir".format(sys.argv[0]))
    exit(1)

generated = Path(sys.argv[1]) / "layout" / "style"
generated = generated / "nsComputedDOMStyleGenerated.inc"
RE_GENERATED = re.compile(r"DoGet\w+")
keeping = set()
with generated.open() as f:
    for line in f:
        m = RE_GENERATED.search(line)
        if m is not None:
            keeping.add(m.group(0))

HEADER = "layout/style/nsComputedDOMStyle.h"
SOURCE = "layout/style/nsComputedDOMStyle.cpp"

# We need to keep functions invoked by others
RE_DEF = re.compile(r"nsComputedDOMStyle::(DoGet\w+)\(\)")
RE_SRC = re.compile(r"\b(DoGet\w+)\(\)")
with open(SOURCE, "r") as f:
    for line in f:
        m = RE_DEF.search(line)
        if m is not None:
            continue
        m = RE_SRC.search(line)
        if m is not None:
            keeping.add(m.group(1))

removing = set()
remaining_lines = []
with open(HEADER, "r") as f:
    for line in f:
        m = RE_SRC.search(line)
        if m is not None:
            name = m.group(1)
            if name not in keeping:
                print("Removing " + name)
                removing.add(name)
                continue
        remaining_lines.append(line)

with open(HEADER, "w", newline="") as f:
    f.writelines(remaining_lines)

remaining_lines = []
is_removing = False
with open(SOURCE, "r") as f:
    for line in f:
        if is_removing:
            if line == "}\n":
                is_removing = False
            continue
        m = RE_DEF.search(line)
        if m is not None:
            name = m.group(1)
            if name in removing:
                remaining_lines.pop()
                if remaining_lines[-1] == "\n":
                    remaining_lines.pop()
                is_removing = True
                continue
        remaining_lines.append(line)

with open(SOURCE, "w", newline="") as f:
    f.writelines(remaining_lines)