Pārlūkot izejas kodu

Make it easier to mass rename symbols in the SDL API

Sam Lantinga 2 gadi atpakaļ
vecāks
revīzija
59467ff063
2 mainītis faili ar 56 papildinājumiem un 32 dzēšanām
  1. 39 23
      build-scripts/rename_api.py
  2. 17 9
      build-scripts/rename_symbols.py

+ 39 - 23
build-scripts/rename_api.py

@@ -1,14 +1,14 @@
 #!/usr/bin/env python3
-
-# WHAT IS THIS?
-#  This script renames symbols in the API, updating SDL_oldnames.h and
-#  adding documentation for the change.
+#
+# This script renames symbols in the API, updating SDL_oldnames.h and
+# adding documentation for the change.
 
 import argparse
 import os
 import pathlib
 import pprint
 import re
+import sys
 from rename_symbols import create_regex_from_replacements, replace_symbols_in_path
 
 SDL_ROOT = pathlib.Path(__file__).resolve().parents[1]
@@ -17,13 +17,15 @@ SDL_INCLUDE_DIR = SDL_ROOT / "include/SDL3"
 
 
 def main():
+    if len(args.args) == 0 or (len(args.args) % 2) != 0:
+        print("Usage: %s [-h] [--skip-header-check] header {enum,function,macro,structure,symbol} [old new ...]" % sys.argv[0])
+        exit(1)
+
     # Check whether we can still modify the ABI
     version_header = pathlib.Path( SDL_INCLUDE_DIR / "SDL_version.h" ).read_text()
     if not re.search("SDL_MINOR_VERSION\s+[01]\s", version_header):
         raise Exception("ABI is frozen, symbols cannot be renamed")
 
-    pattern = re.compile(r"\b%s\b" % args.oldname)
-
     # Find the symbol in the headers
     if pathlib.Path(args.header).is_file():
         header = pathlib.Path(args.header)
@@ -33,21 +35,36 @@ def main():
     if not header.exists():
         raise Exception("Couldn't find header %s" % header)
 
-    if not args.skip_header_check and not pattern.search(header.read_text()):
-        raise Exception("Couldn't find %s in %s" % (args.oldname, header))
+    header_text = header.read_text()
+
+    # Replace the symbols in source code
+    replacements = {}
+    i = 0
+    while i < len(args.args):
+        oldname = args.args[i + 0]
+        newname = args.args[i + 1]
+
+        if not args.skip_header_check and not re.search((r"\b%s\b" % oldname), header_text):
+            raise Exception("Couldn't find %s in %s" % (oldname, header))
+
+        replacements[ oldname ] = newname
+        replacements[ oldname + "_REAL" ] = newname + "_REAL"
+        i += 2
 
-    # Replace the symbol in source code and documentation
-    replacements = {
-        args.oldname: args.newname,
-        args.oldname + "_REAL": args.newname + "_REAL"
-    }
     regex = create_regex_from_replacements(replacements)
     for dir in ["src", "test", "include", "docs", "Xcode-iOS/Demos"]:
         replace_symbols_in_path(SDL_ROOT / dir, regex, replacements)
 
-    add_symbol_to_oldnames(header.name, args.oldname, args.newname)
-    add_symbol_to_migration(header.name, args.type, args.oldname, args.newname)
-    add_symbol_to_whatsnew(args.type, args.oldname, args.newname)
+    # Replace the symbols in documentation
+    i = 0
+    while i < len(args.args):
+        oldname = args.args[i + 0]
+        newname = args.args[i + 1]
+
+        add_symbol_to_oldnames(header.name, oldname, newname)
+        add_symbol_to_migration(header.name, args.type, oldname, newname)
+        add_symbol_to_whatsnew(args.type, oldname, newname)
+        i += 2
 
 
 def add_line(lines, i, section):
@@ -207,14 +224,13 @@ def add_symbol_to_whatsnew(symbol_type, oldname, newname):
     file.write_text("\r\n".join(lines) + "\r\n")
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
 
-    parser = argparse.ArgumentParser()
-    parser.add_argument('--skip-header-check', action='store_true')
-    parser.add_argument('header');
-    parser.add_argument('type', choices=['enum', 'function', 'macro', 'structure']);
-    parser.add_argument('oldname');
-    parser.add_argument('newname');
+    parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
+    parser.add_argument("--skip-header-check", action="store_true")
+    parser.add_argument("header");
+    parser.add_argument("type", choices=["enum", "function", "macro", "structure", "symbol"]);
+    parser.add_argument("args", nargs="*")
     args = parser.parse_args()
 
     try:

+ 17 - 9
build-scripts/rename_symbols.py

@@ -17,7 +17,7 @@ SDL_INCLUDE_DIR = SDL_ROOT / "include/SDL3"
 def main():
     if args.all_symbols:
         if len(args.args) < 1:
-            print("Usage: %s --all-symbols files_or_directories ...")
+            print("Usage: %s --all-symbols files_or_directories ..." % sys.argv[0])
             exit(1)
 
         replacements = get_all_replacements()
@@ -25,13 +25,16 @@ def main():
 
     else:
         if len(args.args) < 3:
-            print("Usage: %s oldname newname files_or_directories ...")
+            print("Usage: %s oldname newname files_or_directories ..." % sys.argv[0])
             exit(1)
 
         replacements = { args.args[0]: args.args[1] }
         entries = args.args[2:]
 
-    regex = create_regex_from_replacements(replacements)
+    if args.substring:
+        regex = create_substring_regex_from_replacements(replacements)
+    else:
+        regex = create_regex_from_replacements(replacements)
 
     for entry in entries:
         path = pathlib.Path(entry)
@@ -68,11 +71,15 @@ def create_regex_from_replacements(replacements):
     return re.compile(r"\b(%s)\b" % "|".join(map(re.escape, replacements.keys())))
 
 
+def create_substring_regex_from_replacements(replacements):
+    return re.compile(r"(%s)" % "|".join(map(re.escape, replacements.keys())))
+
+
 def replace_symbols_in_file(file, regex, replacements):
     try:
-        with file.open('r', encoding='UTF-8', newline='') as rfp:
+        with file.open("r", encoding="UTF-8", newline="") as rfp:
             contents = regex.sub(lambda mo: replacements[mo.string[mo.start():mo.end()]], rfp.read())
-            with file.open('w', encoding='UTF-8', newline='') as wfp:
+            with file.open("w", encoding="UTF-8", newline="") as wfp:
                 wfp.write(contents)
     except UnicodeDecodeError:
         print("%s is not text, skipping" % file)
@@ -94,11 +101,12 @@ def replace_symbols_in_path(path, regex, replacements):
             replace_symbols_in_file(path, regex, replacements)
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
 
-    parser = argparse.ArgumentParser()
-    parser.add_argument('--all-symbols', action='store_true')
-    parser.add_argument('args', nargs='*')
+    parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
+    parser.add_argument("--all-symbols", action="store_true")
+    parser.add_argument("--substring", action="store_true")
+    parser.add_argument("args", nargs="*")
     args = parser.parse_args()
 
     try: