88import logging
99import argparse
1010import yaml
11+ import json
1112
1213# Add parent directory to path to import generator.py
1314parent_dir = os .path .dirname (os .path .dirname (os .path .abspath (__file__ )))
@@ -29,15 +30,55 @@ def calculate_mask(match_str):
2930 return int ("" .join ("0" if c == "-" else "1" for c in match_str ), 2 )
3031
3132
32- def load_exception_codes (ext_dir , enabled_extensions = None , include_all = False ):
33- """Load exception codes from extension YAML files."""
33+ def load_exception_codes (
34+ ext_dir , enabled_extensions = None , include_all = False , resolved_codes_file = None
35+ ):
36+ """Load exception codes from extension YAML files or pre-resolved JSON file."""
3437 exception_codes = []
3538 found_extensions = 0
3639 found_files = 0
3740
3841 if enabled_extensions is None :
3942 enabled_extensions = []
4043
44+ # If we have a resolved codes file, use it instead of processing YAML files
45+ if resolved_codes_file and os .path .exists (resolved_codes_file ):
46+ try :
47+ with open (resolved_codes_file , encoding = "utf-8" ) as f :
48+ resolved_codes = json .load (f )
49+
50+ for code in resolved_codes :
51+ num = code .get ("num" )
52+ name = code .get ("name" )
53+ if num is not None and name is not None :
54+ sanitized_name = (
55+ name .lower ()
56+ .replace (" " , "_" )
57+ .replace ("/" , "_" )
58+ .replace ("-" , "_" )
59+ )
60+ exception_codes .append ((num , sanitized_name ))
61+
62+ logging .info (
63+ f"Loaded { len (exception_codes )} pre-resolved exception codes from { resolved_codes_file } "
64+ )
65+
66+ # Sort by exception code number and deduplicate
67+ seen_nums = set ()
68+ unique_codes = []
69+ for num , name in sorted (exception_codes , key = lambda x : x [0 ]):
70+ if num not in seen_nums :
71+ seen_nums .add (num )
72+ unique_codes .append ((num , name ))
73+
74+ return unique_codes
75+
76+ except Exception as e :
77+ logging .error (
78+ f"Error loading resolved codes file { resolved_codes_file } : { e } "
79+ )
80+ # Fall back to processing YAML files
81+
4182 for dirpath , _ , filenames in os .walk (ext_dir ):
4283 for fname in filenames :
4384 if not fname .endswith (".yaml" ):
@@ -298,6 +339,10 @@ def main():
298339 action = "store_true" ,
299340 help = "Fallback to hardcoded exception causes if none are loaded from files" ,
300341 )
342+ parser .add_argument (
343+ "--resolved-codes" ,
344+ help = "JSON file containing pre-resolved exception codes" ,
345+ )
301346
302347 args = parser .parse_args ()
303348
@@ -321,7 +366,10 @@ def main():
321366 # Load exception codes
322367 logging .info (f"Loading exception codes from { args .ext_dir } " )
323368 causes = load_exception_codes (
324- args .ext_dir , args .extensions , include_all = args .include_all
369+ args .ext_dir ,
370+ args .extensions ,
371+ include_all = args .include_all ,
372+ resolved_codes_file = args .resolved_codes ,
325373 )
326374
327375 # Process instructions and calculate masks
0 commit comments