jak-project/scripts/setup_art_group_imports.py
water111 148f52876a
[decomp] add import statements for art groups (#1372)
* new code

* update goal_src and remove all_imports

* update reference

* add decompiler list of imports

* deduplicate and move below decomp begins
2022-05-23 18:53:02 -04:00

79 lines
2.5 KiB
Python

import os
import glob
import argparse
import re
import json
def get_goal_files(root_dir, ext = "*.gc"):
"""Get all GOAL source files under root_dir."""
return [goal_file for file in os.walk(root_dir) for goal_file in glob.glob(os.path.join(file[0], ext))]
def get_sgs(goal_file):
"""Get a list of all the skel groups defined in the file, excluding the -sg and *'s."""
with open(goal_file, "r") as f:
text = f.read()
# given "(defskelgroup *foo* bar", will match "bar"
matches = re.findall(r'\(defskelgroup \*[\w-]+-sg\* ([\w-]+)', text)
return matches
def main():
parser = argparse.ArgumentParser()
parser.add_argument(dest='goal_src', help='the goal_src folder')
args = parser.parse_args()
all_import_files = get_goal_files(os.path.join(args.goal_src, "import"))
all_files = get_goal_files(args.goal_src)
all_non_import_files = list(set(all_files) - set(all_import_files))
output_json = {}
to_modify = {}
import_map = {}
for import_file in all_import_files:
base = os.path.basename(import_file)
# make sure extention is -ag.gc
assert base[-6:] == "-ag.gc"
base_no_extension = base[:-6]
import_map[base_no_extension] = "goal_src/import/" + import_file.split("import/")[1]
# print(import_map)
# sg_locations = {}
for source_file in all_non_import_files:
sgs = get_sgs(source_file)
deps = set()
for sg in sgs:
if sg not in import_map:
print("missing: ", sg)
else:
deps.add(import_map[sg])
if len(deps) > 0:
output_json[os.path.basename(source_file)[:-3]] = list(deps)
to_modify[source_file] = deps
# uncomment to modify files
# for file, deps in to_modify.items():
# print("modifying ", file, deps)
# with open(file, "r") as f:
# lines = f.readlines()
# to_add = [] # ["\n"]
# for dep in deps:
# to_add.append("(import \"{}\")\n".format(dep))
# print(to_add)
# added = False
# for i, line in enumerate(lines):
# if ";; decomp begins" in line.lower():
# lines[i+1:i+1] = to_add
# added = True
# break
# if not added:
# lines[6:6] = to_add
# assert lines[1] == "(in-package goal)\n"
# with open(file, "w") as f:
# f.writelines(lines)
# uncomment to print json.
# print(json.dumps(output_json, indent=4))
if __name__ == "__main__":
main()