72 lines
1.7 KiB
Python
72 lines
1.7 KiB
Python
import os
|
|
import re
|
|
from collections import defaultdict, deque
|
|
|
|
ROOT = "lib"
|
|
|
|
IMPORT_RE = re.compile(r"import\s+'package:[^/]+/(.+?)';")
|
|
|
|
def list_dart_files():
|
|
files = []
|
|
for root, _, filenames in os.walk(ROOT):
|
|
for f in filenames:
|
|
if f.endswith(".dart"):
|
|
files.append(os.path.join(root, f))
|
|
return files
|
|
|
|
def normalize(path):
|
|
return path.replace("\\", "/")
|
|
|
|
def build_graph(files):
|
|
graph = defaultdict(list)
|
|
reverse_graph = defaultdict(list)
|
|
|
|
for f in files:
|
|
rel = normalize(f)
|
|
with open(f, "r", encoding="utf-8") as fh:
|
|
content = fh.read()
|
|
|
|
for m in IMPORT_RE.findall(content):
|
|
imported = normalize(os.path.join(ROOT, m))
|
|
if imported in files:
|
|
graph[rel].append(imported)
|
|
reverse_graph[imported].append(rel)
|
|
|
|
return graph, reverse_graph
|
|
|
|
def reachable_from_main(graph):
|
|
start = "lib/main.dart"
|
|
visited = set()
|
|
queue = deque([start])
|
|
|
|
while queue:
|
|
node = queue.popleft()
|
|
if node in visited:
|
|
continue
|
|
visited.add(node)
|
|
for nxt in graph.get(node, []):
|
|
queue.append(nxt)
|
|
|
|
return visited
|
|
|
|
files = list_dart_files()
|
|
files = [normalize(f) for f in files]
|
|
|
|
graph, reverse_graph = build_graph(files)
|
|
reachable = reachable_from_main(graph)
|
|
|
|
unused = sorted(set(files) - reachable)
|
|
|
|
print("\n=== FILE NON USATI ===")
|
|
for f in unused:
|
|
print(f)
|
|
|
|
print("\n=== DIPENDENZE ===")
|
|
for f in sorted(files):
|
|
print(f"\n{f}")
|
|
print(" importa:")
|
|
for dep in graph[f]:
|
|
print(" -", dep)
|
|
print(" importato da:")
|
|
for dep in reverse_graph[f]:
|
|
print(" -", dep)
|