From f5e58d69d74d6b12f526316d5fc7b9342ffb9b73 Mon Sep 17 00:00:00 2001
From: Xun Yang <x299yang@uwaterloo.ca>
Date: Fri, 6 Mar 2020 22:10:44 -0500
Subject: [PATCH] staticThis

---
 MemberNodes.py | 22 ++++++++++++++++++++++
 NameNode.py    |  3 +++
 2 files changed, 25 insertions(+)

diff --git a/MemberNodes.py b/MemberNodes.py
index 87caedc..8245cfb 100644
--- a/MemberNodes.py
+++ b/MemberNodes.py
@@ -139,6 +139,13 @@ class MethodNode(ASTNode):
         if not self.body:
             return
 
+        # check no use of this in static method
+        if 'static' in self.mods:
+            names = getNameNodes(self.body)
+            for n in names:
+                if n.pointToThis and n.prefixLink.__class__.__name__ in ['MethodNode', 'FieldNode'] and 'static' not in n.prefixLink.mods:
+                        raise Exception("ERROR: Cannot use non-static member {} in static method {} in class {}".format(n.name, self.name, self.typeName))
+
         # With method body
         returnNodes = getASTNode(["ReturnNode"], self.body)
 
@@ -177,3 +184,18 @@ def getForwardRefNames(node):
             result.extend(getForwardRefNames(c))
 
     return result
+
+# Input: AST Node
+# Output: A list of names to be check
+def getNameNodes(node):
+    if not node:
+        return []
+
+    if node.__class__.__name__ == 'NameNode':
+        return [node]
+
+    result = []
+    for c in node.children:
+        result.extend(getNameNodes(c))
+
+    return result
diff --git a/NameNode.py b/NameNode.py
index 3401352..c547fde 100644
--- a/NameNode.py
+++ b/NameNode.py
@@ -34,6 +34,7 @@ class NameNode(ASTNode):
         self.children = []
         self.myType = None # will become TypeStruct to tell us what the whole is/returns
         self.shouldBeStatic = False
+        self.pointToThis = False
 
 
         self.name = getParseTreeNodes(["ID", "COMPID"], parseTree)[0].lex
@@ -148,6 +149,7 @@ class NameNode(ASTNode):
     def disambigName(self):
         # Checking if a1 is "this"
         if self.checkThis():
+            self.pointToThis = True
             return
 
         # Checking if a1 is a local variable
@@ -156,6 +158,7 @@ class NameNode(ASTNode):
 
         # Checking if a1 is in contains set
         if self.checkContains():
+            self.pointToThis = True
             return
 
 
-- 
GitLab