@@ -82,31 +82,40 @@ def _build_suffix_index(
8282 idx [simple ].append ((qn , fi ))
8383 return idx
8484
85+ @staticmethod
86+ def _update_importers_from_called_by (
87+ fi , src_file : str , importers : dict , functions : dict
88+ ) -> None :
89+ """Record that src_file is imported by each caller in fi.called_by."""
90+ for callee in fi .called_by :
91+ ci = functions .get (callee )
92+ if ci and ci .file != src_file :
93+ importers [src_file ].add (ci .file )
94+
95+ @staticmethod
96+ def _update_importers_from_calls (
97+ fi , src_file : str , importers : dict , functions : dict , suffix_idx : dict
98+ ) -> None :
99+ """Record fan-in contribution from each outgoing call in fi.calls."""
100+ for callee in fi .calls :
101+ ci = functions .get (callee )
102+ if ci and ci .file != src_file :
103+ importers [ci .file ].add (src_file )
104+ elif not ci :
105+ for _qn , ci2 in suffix_idx .get (callee , []):
106+ if ci2 .file != src_file :
107+ importers [ci2 .file ].add (src_file )
108+ break
109+
85110 @staticmethod
86111 def _compute_fan_in (files : Dict , result : AnalysisResult ) -> None :
87112 """Compute fan-in per file (how many other files call into this file)."""
88113 importers : Dict [str , set ] = defaultdict (set )
89114 suffix_idx = CoreMetricsComputer ._build_suffix_index (result )
90-
91115 for fname , fi in result .functions .items ():
92116 src_file = fi .file
93- # Forward: who calls me? (called_by)
94- for callee in fi .called_by :
95- callee_info = result .functions .get (callee )
96- if callee_info and callee_info .file != src_file :
97- importers [src_file ].add (callee_info .file )
98- # Reverse: who do I call? → target file gets fan-in
99- for callee in fi .calls :
100- callee_info = result .functions .get (callee )
101- if callee_info and callee_info .file != src_file :
102- importers [callee_info .file ].add (src_file )
103- elif not callee_info :
104- # O(1) suffix lookup instead of O(F) scan
105- for qn , ci in suffix_idx .get (callee , []):
106- if ci .file != src_file :
107- importers [ci .file ].add (src_file )
108- break
109-
117+ CoreMetricsComputer ._update_importers_from_called_by (fi , src_file , importers , result .functions )
118+ CoreMetricsComputer ._update_importers_from_calls (fi , src_file , importers , result .functions , suffix_idx )
110119 for fpath in files :
111120 files [fpath ]["fan_in" ] = len (importers .get (fpath , set ()))
112121
0 commit comments