diff --git a/src/lib/CFGGenerator.py b/src/lib/CFGGenerator.py index 21f11b94725c295ac36de10ef4f753871d24807d..d0fbfb1deca3b676b7f498df613bb2fd0f3f74a3 100644 --- a/src/lib/CFGGenerator.py +++ b/src/lib/CFGGenerator.py @@ -3,8 +3,8 @@ from lib.ASTGenerator import ASTGenerator from lib.utils import format_log from tree_sitter import Node,TreeCursor from typing import Optional -import copy -import re +from .DependencyManager import FileInformation +from sys import platform class CFGGenerator(): def __init__(self): @@ -17,7 +17,9 @@ class CFGGenerator(): ast,cursor,source_code = self.ast_parser.generate(ctx) method_list = self.ast_parser.get_all_function_info(source_code,ctx.location) deps_list = self.ast_parser.get_dependency_list(source_code,method_list) - return CFG(ast,ctx,cursor,method_list,deps_list,source_code) + replacement = "\\" if platform.startswith("win") else "/" + dependency = FileInformation(ctx.location.split(replacement)[-1],ctx.location,deps_list,method_list) + return CFG(ast,ctx,cursor,method_list,deps_list,source_code),dependency class CFG(): diff --git a/src/lib/DependencyManager.py b/src/lib/DependencyManager.py index a81d7e1bcb27e979023268d885e183ce74f6dcd0..24dc27c638a0f2876b65b3ae11fcfe0a11aaf813 100644 --- a/src/lib/DependencyManager.py +++ b/src/lib/DependencyManager.py @@ -2,18 +2,34 @@ class DependencyManager(): def __init__(self) -> None: self.informations = [] - def add(self,info): - self.informations.append(info) + def add(self,information): + for info in self.informations: + if info.name == information.name and info.path == information.path: + return + # Belum ada + self.informations.append(information) def get(self,name,path): for info in self.informations: if info.name == name and info.path == path: return info return None + + def __repr__(self) -> str: + return self.__str__() + + def __str__(self) -> str: + return f"DependencyManager(informations={self.informations})" class FileInformation(): - def __call__(self,name,path,dependency_list,method_list): + def __init__(self,name,path,dependency_list,method_list): self.name:str = name self.path:str = path self.dependency_list:list = dependency_list - self.method_list:list = method_list \ No newline at end of file + self.method_list:list = method_list + + def __repr__(self) -> str: + return self.__str__() + + def __str__(self) -> str: + return f"FileInformation(name={self.name},path={self.path},dependency_list=[{len(self.dependency_list)} item],method_list=[{len(self.method_list)} item])" \ No newline at end of file diff --git a/src/lib/FileReader.py b/src/lib/FileReader.py index cbd8445b646f9ae0f625485b8c55b9fa53c45c80..7bdaa783dbae4281b65d0ae99c7cc62d695182be 100644 --- a/src/lib/FileReader.py +++ b/src/lib/FileReader.py @@ -5,6 +5,7 @@ from typing import Optional from lib.CFGGenerator import CFGGenerator,CFG from lib.custom_class import ElementContext from sys import platform +from .DependencyManager import DependencyManager,FileInformation class FileReader: ANNOTATION_PATTERN = "\S*@.+" def __init__(self, project_path:str)->None: @@ -56,7 +57,8 @@ class FileReader: else: continue # Tentukan parent node ini - parent = self.cfg_generator.generate(curr_node).ast.parent + tmp,_= self.cfg_generator.generate(curr_node) + parent = tmp.ast.parent if parent.type=='decorated_definition': parent = parent.parent if parent.type=='block': @@ -94,7 +96,11 @@ class FileReader: # Ini kelas biasa continue # Generate CFG jika ini acl - project_info.acl_class[-1].set_cfg(self.cfg_generator.generate(project_info.acl_class[-1])) + cfg,deps = self.cfg_generator.generate(project_info.acl_class[-1]) + project_info.acl_class[-1].set_cfg(cfg) + #Daftarkan dependency + project_info.dependency_manager.add(deps) + # project_info.dependency_manager.add(FileInformation("","",)) # Cek jika ini fungsi dalam kelas if(project_info.acl_class[-1].type=='function'): parent = project_info.acl_class[-1].cfg.ast.parent.parent @@ -132,7 +138,9 @@ class FileReader: replacement = "\\" if platform.startswith("win") else "/" project_info.route_class.append(ElementContext(".".join(file.split(replacement)[-1].split(".")[:-1]),'module',file,additional_context)) # Generate CFG jika ini rute - project_info.route_class[-1].set_cfg(self.cfg_generator.generate(project_info.route_class[-1])) + cfg,deps = self.cfg_generator.generate(project_info.route_class[-1]) + project_info.route_class[-1].set_cfg(cfg) + project_info.dependency_manager.add(deps) # Cek jika ini fungsi dalam kelas if(project_info.route_class[-1].type=='function'): parent = project_info.route_class[-1].cfg.ast.parent.parent @@ -167,10 +175,11 @@ class ProjectInfo(): def __init__(self) -> None: self.acl_class:list[ElementContext] = [] self.route_class:list[ElementContext] = [] + self.dependency_manager:DependencyManager= DependencyManager() def __repr__(self) -> str: return self.__str__() def __str__(self) -> str: - return f"ProjectInfo(acl_class={self.acl_class},route_class={self.route_class})" + return f"ProjectInfo(acl_class={self.acl_class},route_class={self.route_class},dependency_manager={self.dependency_manager})" \ No newline at end of file