Files
email-tracker/external/duckdb/scripts/include_analyzer.py
2025-10-24 19:21:19 -05:00

79 lines
2.4 KiB
Python

import amalgamation
import os
import re
import sys
import shutil
from python_helpers import open_utf8
include_counts = {}
include_chains = {}
cached_includes = {}
def analyze_include_file(fpath, already_included_files, prev_include=""):
if fpath in already_included_files:
return
if fpath in amalgamation.always_excluded:
return
if fpath not in cached_includes:
# print(fpath)
with open_utf8(fpath, 'r') as f:
text = f.read()
(statements, includes) = amalgamation.get_includes(fpath, text)
cached_includes[fpath] = includes
else:
includes = cached_includes[fpath]
if fpath in include_counts:
include_counts[fpath] += 1
else:
include_counts[fpath] = 1
if fpath not in include_chains:
include_chains[fpath] = {}
if prev_include not in include_chains[fpath]:
include_chains[fpath][prev_include] = 0
include_chains[fpath][prev_include] += 1
already_included_files.append(fpath)
if fpath.endswith('.h') or fpath.endswith('.hpp'):
prev_include = fpath
for include in includes:
analyze_include_file(include, already_included_files, prev_include)
def analyze_includes(dir):
files = os.listdir(dir)
files.sort()
for fname in files:
if fname in amalgamation.excluded_files:
continue
fpath = os.path.join(dir, fname)
if os.path.isdir(fpath):
analyze_includes(fpath)
elif fname.endswith('.cpp') or fname.endswith('.c') or fname.endswith('.cc'):
analyze_include_file(fpath, [])
for compile_dir in amalgamation.compile_directories:
analyze_includes(compile_dir)
kws = []
for entry in include_counts.keys():
kws.append([entry, include_counts[entry]])
kws.sort(key=lambda tup: -tup[1])
for k in range(0, len(kws)):
include_file = kws[k][0]
include_count = kws[k][1]
print("------------------------------------------------------------")
print(include_file + " (" + str(include_count) + ")")
print("------------------------------------------------------------")
print("FILE INCLUDED FROM:")
chainkws = []
for chain in include_chains[include_file]:
chainkws.append([chain, include_chains[include_file][chain]])
chainkws.sort(key=lambda tup: -tup[1])
for l in range(0, min(5, len(chainkws))):
print(chainkws[l])