in scripts/extract_public_funcs.py [0:0]
def extract_public_api(api_json_path, output_json_path):
with open(api_json_path, 'r') as file:
data = json.load(file)
api_structure = defaultdict(list)
def traverse(item, current_context=None):
if isinstance(item, dict):
# Update context if the item is a public class, struct, or enum
if 'key.kind' in item and item['key.kind'] in {'source.lang.swift.decl.class', 'source.lang.swift.decl.struct', 'source.lang.swift.decl.enum'}:
if item.get('key.accessibility') == 'source.lang.swift.accessibility.public':
current_context = item.get('key.name', 'Unnamed Context')
else:
current_context = None # Reset context if not public
# Check if item is a public function declaration
if current_context and 'key.kind' in item and item['key.kind'].startswith('source.lang.swift.decl.function') and item.get('key.accessibility') == 'source.lang.swift.accessibility.public':
function_info = {'name': item.get('key.name', 'Unnamed Function'), 'declaration': item.get('key.parsed_declaration', 'unknown declaration') }
api_structure[current_context].append(function_info)
# Recursively handle nested structures
for key in item:
traverse(item[key], current_context)
elif isinstance(item, list):
for sub_item in item:
traverse(sub_item, current_context)
traverse(data)
# Convert defaultdict to a regular list of dictionaries
api_list = [{'className': class_name, 'apiFunctions': functions} for class_name, functions in api_structure.items()]
# Output the result as a JSON document
with open(output_json_path, 'w') as outfile:
json.dump(api_list, outfile, indent=2)
print(f"Extracted public API. Output written to {output_json_path}")