From ec048fba1252546b7ad2206a4fa556e3457a8d10 Mon Sep 17 00:00:00 2001
From: Fawwaz Anugrah Wiradhika Dharmasatya <anugrahdwfawwaz@gmail.com>
Date: Sun, 9 Jun 2024 14:55:35 +0700
Subject: [PATCH] feat: add to dependency manager

---
 src/lib/CFGGenerator.py      |  8 +++++---
 src/lib/DependencyManager.py | 24 ++++++++++++++++++++----
 src/lib/FileReader.py        | 17 +++++++++++++----
 3 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/src/lib/CFGGenerator.py b/src/lib/CFGGenerator.py
index 21f11b9..d0fbfb1 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 a81d7e1..24dc27c 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 cbd8445..7bdaa78 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
-- 
GitLab