From bdbebc2d39338e7da96a1fb5c081d8117df611c2 Mon Sep 17 00:00:00 2001
From: Fawwaz Anugrah Wiradhika Dharmasatya <anugrahdwfawwaz@gmail.com>
Date: Wed, 5 Jun 2024 22:22:36 +0700
Subject: [PATCH] feat: handle exemption in function in module

---
 src/lib/ASTGenerator.py |  2 +-
 src/lib/CFGGenerator.py |  2 +-
 src/lib/FileReader.py   | 14 ++++++++------
 tests/tc1/views.py      |  1 +
 todo.txt                |  4 ++--
 5 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/src/lib/ASTGenerator.py b/src/lib/ASTGenerator.py
index 6537d4a..616f686 100644
--- a/src/lib/ASTGenerator.py
+++ b/src/lib/ASTGenerator.py
@@ -123,7 +123,7 @@ class ASTGenerator():
     # Generate AST untuk file 
     with open(ctx.location,'rb') as f:
       file_content:bytes = bytes(f.read().decode(),'utf-8')
-    ast = self.parser.parse(file_content)
+    ast = self.parser.parse(file_content).root_node
     cursor = ast.walk()
     return (ast,cursor,file_content)
   
diff --git a/src/lib/CFGGenerator.py b/src/lib/CFGGenerator.py
index a2832d7..10f10d1 100644
--- a/src/lib/CFGGenerator.py
+++ b/src/lib/CFGGenerator.py
@@ -412,4 +412,4 @@ class CFG():
     return None
   @staticmethod
   def is_node_equal(node:Node,expected:Node):
-    return node.byte_range == expected.byte_range
\ No newline at end of file
+    return node and expected and node.byte_range == expected.byte_range
\ No newline at end of file
diff --git a/src/lib/FileReader.py b/src/lib/FileReader.py
index bb05f81..2811430 100644
--- a/src/lib/FileReader.py
+++ b/src/lib/FileReader.py
@@ -44,14 +44,16 @@ class FileReader:
                 else:
                   continue
                 # Tentukan parent node ini
-                parent = self.cfg_generator.generate(curr_node).ast.parent.parent
-                print(parent)
-                print(parent.parent)
+                parent = self.cfg_generator.generate(curr_node).ast.parent
+                if parent.type=='decorated_definition':
+                  parent = parent.parent
+                if parent.type=='block':
+                  parent = parent.parent
+                # if curr_node.type=='class':
+                #   parent = parent.parent.parent
                 # Kasih keterangan tambahan ke konteks modul/fungsi yang merupakan parent fungsi ini.
                 for route in project_info.route_class:
-                  print(route.cfg.ast)
-                  if route.location==file and (CFG.is_node_equal(route.cfg.ast,parent) or CFG.is_node_equal(route.cfg.ast,parent.parent)):
-                    print("masuk")
+                  if route.location==file and (CFG.is_node_equal(route.cfg.ast,parent)):
                     route.context.append(f"Exempt::{curr_node.name.split('(')[0]}")
               elif("@ACL" in annotation):
                 # Ini kelas acl
diff --git a/tests/tc1/views.py b/tests/tc1/views.py
index 4d4ce7c..7d69919 100644
--- a/tests/tc1/views.py
+++ b/tests/tc1/views.py
@@ -9,6 +9,7 @@ from lib.RoleCheck import RoleCheck
 
 views = Blueprint('views', __name__)
 
+
 @views.route('/add', methods=['POST'])
 @login_required
 def add_note():
diff --git a/todo.txt b/todo.txt
index ff8c931..fadf9d8 100644
--- a/todo.txt
+++ b/todo.txt
@@ -3,6 +3,6 @@ function
 class:
  - function
 module:
- - function (!)
- - class
+ - function 
+ - class (!)
  - class > function
\ No newline at end of file
-- 
GitLab