Spaces:
Sleeping
Sleeping
| from copy import deepcopy | |
| # TODO: | |
| # If multiple symbols have the same name, | |
| # keep all of them instead of overwriting. | |
| class ResolverService: | |
| def resolve(self, code_index: list[dict]) -> list[dict]: | |
| resolved = deepcopy(code_index) | |
| symbols = self._build_symbol_table(resolved) | |
| for file in resolved: | |
| import_table = self._build_import_table(file) | |
| self._resolve_functions( | |
| file["functions"], | |
| symbols, | |
| import_table, | |
| ) | |
| for cls in file["classes"]: | |
| self._resolve_functions( | |
| cls["methods"], | |
| symbols, | |
| import_table, | |
| ) | |
| return resolved | |
| def _build_symbol_table(self, code_index): | |
| table = {} | |
| for file in code_index: | |
| for function in file["functions"]: | |
| table[ | |
| function["qualified_name"] | |
| .split(".")[-1] | |
| ] = function["qualified_name"] | |
| for cls in file["classes"]: | |
| table[ | |
| cls["qualified_name"] | |
| .split(".")[-1] | |
| ] = cls["qualified_name"] | |
| for method in cls["methods"]: | |
| table[ | |
| method["qualified_name"] | |
| .split(".")[-1] | |
| ] = method["qualified_name"] | |
| return table | |
| def _resolve_functions( | |
| self, | |
| functions, | |
| symbols, | |
| imports, | |
| ): | |
| for function in functions: | |
| for call in function["calls"]: | |
| raw = call["name"] | |
| parts = raw.split(".") | |
| first = parts[0] | |
| # اول importهای فایل | |
| if first in imports: | |
| resolved = imports[first] | |
| if len(parts) > 1: | |
| resolved += "." + ".".join(parts[1:]) | |
| call["qualified_name"] = resolved | |
| # بعد symbolهای پروژه | |
| elif first in symbols: | |
| resolved = symbols[first] | |
| if len(parts) > 1: | |
| resolved += "." + ".".join(parts[1:]) | |
| call["qualified_name"] = resolved | |
| def _build_import_table(self, file): | |
| table = {} | |
| for imp in file["imports"]: | |
| key = imp["alias"] or imp["name"] | |
| if imp["module"]: | |
| if imp["module"] == imp["name"]: | |
| table[key] = imp["module"] | |
| else: | |
| table[key] = f'{imp["module"]}.{imp["name"]}' | |
| return table |