c162c66118
This PR does two main things: 1. Work through the main low-hanging fruit issues in the formatter keeping it from feeling mature and usable 2. Iterate and prove that point by formatting all of the Jak 1 code base. **This has removed around 100K lines in total.** - The decompiler will now format it's results for jak 1 to keep things from drifting back to where they were. This is controlled by a new config flag `format_code`. How am I confident this hasn't broken anything?: - I compiled the entire project and stored it's `out/jak1/obj` files separately - I then recompiled the project after formatting and wrote a script that md5's each file and compares it (`compare-compilation-outputs.py` - The results (eventually) were the same: ![Screenshot 2024-05-25 132900](https://github.com/open-goal/jak-project/assets/13153231/015e6f20-8d19-49b7-9951-97fa88ddc6c2) > This proves that the only difference before and after is non-critical whitespace for all code/macros that is actually in use. I'm still aware of improvements that could be made to the formatter, as well as general optimization of it's performance. But in general these are for rare or non-critical situations in my opinion and I'll work through them before doing Jak 2. The vast majority looks great and is working properly at this point. Those known issues are the following if you are curious: ![image](https://github.com/open-goal/jak-project/assets/13153231/0edfaba1-6d36-40f5-ab23-0642209867c4) |
||
---|---|---|
.. | ||
config | ||
framework | ||
CMakeLists.txt | ||
offline_test_main.cpp | ||
readme.md |
Offline Reference Test
The offline reference test runs the decompiler on all files that have a corresponding _REF.gc
, then compiles them.
The test passes if all files compile and all decompiler outputs match the _REF.gc
.
The purpose of the offline reference test is:
- To make sure the output of the decompiler can be compiled
- To let us easily see "what source should change, if I changed this type?". This allows us to safely update types without worrying that we forgot to update some other file.
This test doesn't run as part of CI, so it relies on us running it manually. As a result, from time to time, it can be broken on master.
Running the test
Just run offline-test
in the build directory. It takes about a minute and will display diffs of any files that don't match and compiler errors on the first failing file.
What to do if the diff test fails
First, manually read the diff and make sure that it's a good change.
If so, re-run the offline-test
program with the --dump-mode
flag. It will save copies of any differing output in a failures
folder (make sure this is empty before running). To apply these to the _REF.gc
files automatically, there's a python script that you can run like this:
cd jak-project/build
python3 ../scripts/update_decomp_reference.py ./failures ../test/decompiler/referenc
Next, make sure the actual .gc
files in goal_src/
are updated, if they need to be. For large changes, this part can be pretty annoying. There is a update-goal-src.py
script that is helpful for huge changes.
What to do if the compile test fails
Ideally we'd make all code compile successfully without any manual changes. But sometimes there's just one function that doesn't work in a big file, and you'd like to get the rest of it. There's a config.jsonc
file in the test/offline
folder that lets you identify functions by name to skip compiling in the ref tests.