From 8ac7e4b8b56bee55f456c067a85bd20b2e2382a5 Mon Sep 17 00:00:00 2001
From: Katherine Braught <braught2@illinois.edu>
Date: Mon, 4 Apr 2022 21:43:00 -0500
Subject: [PATCH] wip

---
 pythonparser.py | 128 ++++++++++++++++++++++++++----------------------
 1 file changed, 70 insertions(+), 58 deletions(-)

diff --git a/pythonparser.py b/pythonparser.py
index 6b3464c7..3b67d1f3 100644
--- a/pythonparser.py
+++ b/pythonparser.py
@@ -1,5 +1,6 @@
 #parse python file
 
+#REQUIRES PYTHON 3.8!
 from cgitb import reset
 #import clang.cindex
 import typing
@@ -14,35 +15,49 @@ import ast
 #import clang.cfg
 
 class Statement:
-  def __init__(self, code, mode, modeType):
-    self.code = code
-    self.modeType = modeType
-    self.mode = mode
+    def __init__(self, code, mode, modeType):
+        self.code = code
+        self.modeType = modeType
+        self.mode = mode
 
     def __init__(self, code):
         self.code = code
         self.modeType = None
         self.mode = None
+    
+    def print(self):
+        print(self.code)
+
+
 
 class Guard(Statement):
     def __init__(self, code, mode, modeType):
-        super().__init__(self, code, mode, modeType)
+        super().__init__(code, mode, modeType)
 
     def __init__(self, code):
-        super().__init__(self, code)
+        super().__init__(code)
+
+    def isModeCheck(self):
+        return self.modeType != None
 
-    def isModeCheck():
-        return modeType != None
+    def parseGuard(node, code):
+        #TODO parse out mode and modeType
+        return Guard(ast.get_source_segment(code, node.test))
+        
 
 class Reset(Statement):
     def __init__(self, code, mode, modeType):
-        super().__init__(self, code, mode, modeType)
+        super().__init__(code, mode, modeType)
 
     def __init__(self, code):
-        super().__init__(self, code)
+        super().__init__(code)
 
-    def isModeUpdate():
-        return modeType != None
+    def isModeUpdate(self):
+        return self.modeType != None
+
+    def parseReset(node, code):
+        #TODO parse out mode and modeType
+        return Reset(ast.get_source_segment(code, node))
 
 def walktree(code, tree):
     vars = []
@@ -50,7 +65,7 @@ def walktree(code, tree):
     for node in ast.walk(tree): #don't think we want to walk the whole thing because lose ordering/depth
         if isinstance(node, ast.FunctionDef):
             if node.name == 'controller':
-                print(node.body)
+                #print(node.body)
                 out = parsenodelist(code, node.body, False)
                 #args = node.args
                 #for arg in args:
@@ -66,60 +81,55 @@ def parsenodelist(code, nodes, addResets):
     found = []
     for childnode in nodes:
         if isinstance(childnode, ast.Assign) and addResets:
-            #found.append(str(childnode.targets[0].id)+'=' + str(childnode.value.id)) #TODO, does this work with a value?
-            print("found reset" + ast.get_source_segment(code, childnode))
-            childrens_resets.append(ast.get_source_segment(code, childnode))
+            reset = Reset.parseReset(childnode, code)
+            print("found reset: " + reset.code)
+            childrens_resets.append(reset)
         if isinstance(childnode, ast.If):
-            childrens_guards.append(ast.get_source_segment(code, childnode.test))
-            #childrens_guards.append(childnode.test.id)
-            print("found if statement: " + ast.get_source_segment(code, childnode.test))
-            results = parsenodelist(code, childnode.body, True)
-            for result in results:
+            guard = Guard.parseGuard(childnode, code)
+            childrens_guards.append(guard)
+            print("found if statement: " + guard.code)
+            tempresults = parsenodelist(code, childnode.body, True)
+            for result in tempresults:
                 found.append(results)
         #TODO - can add support for elif and else
+    print("********")
+    print("Begin ending iteration:")
+    print("We have found this many items before: " + str(len(found)))
+    for item in found:
+        if isinstance(item, Statement):
+            print(item.code)
+        else:
+            print(item)
+    
+    print("And now we want to add these -----")
+    for item in childrens_guards:
+        print(item.code)
+    for item in childrens_resets:
+        print(item.code)
+    print("-------")
 
     if len(found) == 0 and len(childrens_resets) > 0:
         found.append([])
     for item in found:
         for reset in childrens_resets:
         #for item in found:
-            item.append([reset, 'r'])
+            item.append(reset)
         results.append(item)
         for guard in childrens_guards:
-            item.append([guard, 'g'])
+            item.append(guard)
+        
+    print("now we generated these results -----")
+    for result in results:
+        for item in result:
+            if isinstance(item, Statement):
+                print(item.code)
+            else:
+                print(item)
+                
+    print("----------")
+    print("********")
     return results
 
-def parsenodes(innode):
-    for node in innode:
-        #print(node)
-        if isinstance(node, ast.If):
-            print("found if")
-            print(node.body)
-        #walktree(node.body)
-        #walktree(node)
-            #print(node.name)
-
-class BinOpVisitor(ast.NodeVisitor):
-
-    def visit_BinOp(self, node):
-        print(f"found BinOp at line: {node.lineno}")
-        self.generic_visit(node)
-
-class Analyzer(ast.NodeVisitor):
-    def __init__(self):
-        self.stats = {'if': []}
-
-    def visit_If(self, node):
-        # Add the "s" attribute access here
-        print("If:", node.test.left)
-        self.stats["if"].append(node.body)
-        self.generic_visit(node)
-
-    def report(self):
-        pprint(self.stats)
-
-
-
 
 ##main code###
 #print(sys.argv)
@@ -146,9 +156,11 @@ if __name__ == "__main__":
     #tree = ast.parse()
     results = walktree(code, tree)
     print("resultsssss:")
-    for result in results:
-        print(result)
-        print()
+    #for result in results:
+    #    for item in result:
+    #        item.print()
+    #    print()
+    print(results)
 
     #a = Analyzer()
     #a.visit(tree)
@@ -157,7 +169,7 @@ if __name__ == "__main__":
 
     #cfge = pycfg.PyCFGExtractor()
 
-    
+
     #for node in ast.walk(tree):
     #    print(node.__class__.__name__)
 
-- 
GitLab