From 45f1a26db8ebade3bc5f2bd8eb570a52629d5b9d Mon Sep 17 00:00:00 2001 From: Xun Yang <x299yang@uwaterloo.ca> Date: Fri, 6 Mar 2020 15:57:06 -0500 Subject: [PATCH] init myType for declarations before type checking --- LineNodes.py | 2 +- MemberNodes.py | 2 +- TypeNodes.py | 19 ++----------------- 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/LineNodes.py b/LineNodes.py index 15ac457..52f1a02 100644 --- a/LineNodes.py +++ b/LineNodes.py @@ -108,6 +108,7 @@ class VarDclNode(ASTNode): # Handling rule: variableInit expr self.variableInit = makeNodeFromExpr(parseTree.children[3].children[0], typeName) + self.myType = self.dclType.myType self.children.append(self.dclType) self.children.append(self.variableInit) @@ -122,7 +123,6 @@ class VarDclNode(ASTNode): return self.env def checkType(self): - self.myType = self.dclType.myType if self.variableInit: self.variableInit.checkType() if not self.myType.assignable(self.variableInit.myType): diff --git a/MemberNodes.py b/MemberNodes.py index 6e27b09..13ba951 100644 --- a/MemberNodes.py +++ b/MemberNodes.py @@ -28,6 +28,7 @@ class FieldNode(ASTNode): self.variableDcl = VarDclNode(node, self.typeName) self.name = self.variableDcl.name + self.myType = self.variableDcl.myType self.children.append(self.variableDcl) @@ -36,7 +37,6 @@ class FieldNode(ASTNode): def checkType(self): self.variableDcl.checkType() - self.myType = self.variableDcl.myType ########################################################### diff --git a/TypeNodes.py b/TypeNodes.py index 458dea7..1f793e6 100644 --- a/TypeNodes.py +++ b/TypeNodes.py @@ -143,7 +143,6 @@ class ClassInterNode(ASTNode): print(i.name) def checkType(self): - self.myType = TypeStruct(self.canonName, self) for c in self.children: if c and hasattr(c, 'checkType'): c.checkType() @@ -153,14 +152,6 @@ class ClassNode(ClassInterNode): # always list all fields in the init method to show the class structure def __init__(self, parseTree, packageName): super().__init__(parseTree, packageName) - # self.parseTree = parseTree - # self.packageName = packageName - # self.name = '' - # self.methods = [] - # self.superInter = [] - # self.env = None - # self.children = [] - # self.canonName = self.packageName + '.' + self.name self.fields = [] self.constructors = [] self.mods = [] @@ -196,6 +187,7 @@ class ClassNode(ClassInterNode): order += 1 self.canonName = self.packageName + '.' + self.name + self.myType = TypeStruct(self.canonName, self) self.children += self.fields + self.methods + self.constructors def buildEnv(self, parentEnv): @@ -266,14 +258,6 @@ class InterNode(ClassInterNode): # always list all fields in the init method to show the class structure def __init__(self, parseTree, packageName): super().__init__(parseTree, packageName) - # self.parseTree = parseTree - # self.packageName = packageName - # self.name = '' - # self.methods = [] - # self.superInter = [] - # self.env = None - # self.children = [] - # self.canonName = self.packageName + '.' + self.name for node in parseTree.children: if node.name == 'ID': @@ -290,6 +274,7 @@ class InterNode(ClassInterNode): self.methods.append(MethodNode(n, self.name, 0)) # order = 0 since no method body in interface needs to be checked self.canonName = self.packageName + '.' + self.name + self.myType = TypeStruct(self.canonName, self) self.children.extend(self.methods) def buildEnv(self, parentEnv): -- GitLab