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