mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-05-19 02:24:54 +00:00
Replace lazy implementation - Tools find-includes-cycles
This commit is contained in:
parent
fc0179c1ea
commit
a327466771
1 changed files with 20 additions and 21 deletions
|
@ -1,26 +1,20 @@
|
||||||
#! /usr/bin/env python
|
#! /usr/bin/env python3
|
||||||
|
|
||||||
'''
|
'''
|
||||||
Run this script from Source/Core/ to find all the #include cycles.
|
Run this script from Source/Core/ to find all the #include cycles.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
import subprocess
|
from typing import Iterator
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
def get_local_includes_for(path):
|
def get_local_includes_for(path: Path) -> Iterator[str]:
|
||||||
lines = open(path).read().split('\n')
|
with path.open() as file:
|
||||||
includes = [l.strip() for l in lines if l.strip().startswith('#include')]
|
for line in file:
|
||||||
return [i.split()[1][1:-1] for i in includes if '"' in i.split()[1]]
|
line = line.strip()
|
||||||
|
if line.startswith("#include") and '"' in line:
|
||||||
|
yield line.split()[1].strip(' "')
|
||||||
|
|
||||||
def find_all_files():
|
def strongly_connected_components(graph: dict[str, list[str]]) -> list[tuple[str, ...]]:
|
||||||
'''Could probably use os.walk, but meh.'''
|
|
||||||
f = subprocess.check_output(['find', '.', '-name', '*.h'],
|
|
||||||
universal_newlines=True).strip().split('\n')
|
|
||||||
return [p[2:] for p in f]
|
|
||||||
|
|
||||||
def make_include_graph():
|
|
||||||
return { f: get_local_includes_for(f) for f in find_all_files() }
|
|
||||||
|
|
||||||
def strongly_connected_components(graph):
|
|
||||||
"""
|
"""
|
||||||
Tarjan's Algorithm (named for its discoverer, Robert Tarjan) is a graph theory algorithm
|
Tarjan's Algorithm (named for its discoverer, Robert Tarjan) is a graph theory algorithm
|
||||||
for finding the strongly connected components of a graph.
|
for finding the strongly connected components of a graph.
|
||||||
|
@ -34,7 +28,7 @@ def strongly_connected_components(graph):
|
||||||
index = {}
|
index = {}
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
def strongconnect(node):
|
def strongconnect(node: str) -> None:
|
||||||
# set the depth index for this node to the smallest unused index
|
# set the depth index for this node to the smallest unused index
|
||||||
index[node] = index_counter[0]
|
index[node] = index_counter[0]
|
||||||
lowlinks[node] = index_counter[0]
|
lowlinks[node] = index_counter[0]
|
||||||
|
@ -74,7 +68,12 @@ def strongly_connected_components(graph):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
comp = strongly_connected_components(make_include_graph())
|
paths = Path(".").glob("**/*.h")
|
||||||
for c in comp:
|
graph = {
|
||||||
if len(c) != 1:
|
path.as_posix(): list(get_local_includes_for(path))
|
||||||
print(c)
|
for path in paths
|
||||||
|
}
|
||||||
|
components = strongly_connected_components(graph)
|
||||||
|
for component in components:
|
||||||
|
if len(component) != 1:
|
||||||
|
print(component)
|
||||||
|
|
Loading…
Add table
Reference in a new issue