From f432f1ccf4d1fce07849fd9a3723c1ea21317bd7 Mon Sep 17 00:00:00 2001 From: Nicholas Robinson <nwrobins@edu.uwaterloo.ca> Date: Tue, 3 Mar 2020 00:59:56 -0500 Subject: [PATCH] canonName & super set - class/interface set canonName in constructing of node - java.lang.Object super set = [] --- TypeNodes.py | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/TypeNodes.py b/TypeNodes.py index 4581b10..4365277 100644 --- a/TypeNodes.py +++ b/TypeNodes.py @@ -44,17 +44,15 @@ class ClassInterNode(ASTNode): def getContains(self, hierarchy): # check if not acyclic - canonName = self.packageName + '.' + self.name - self.canonName = canonName - if canonName in hierarchy: - raise Exception("ERROR: The hierarchy is not acyclic '{}', saw '{}'".format(hierarchy, canonName)) + if self.canonName in hierarchy: + raise Exception("ERROR: The hierarchy is not acyclic '{}', saw '{}'".format(hierarchy, self.canonName)) # get contains contains = self.methods for inter in self.superInter: - superContains = inter.getContains(hierarchy + [canonName]) + superContains = inter.getContains(hierarchy + [self.canonName]) for con in superContains: conOverwritten = False for method in self.methods: @@ -87,7 +85,7 @@ class ClassNode(ClassInterNode): # self.superInter = [] # self.env = None # self.children = [] - # self.canonName = "" + # self.canonName = self.packageName + '.' + self.name self.fields = [] self.constructors = [] self.mods = [] @@ -122,6 +120,7 @@ class ClassNode(ClassInterNode): for m in methodNodes: self.methods.append(MethodNode(m)) + self.canonName = self.packageName + '.' + self.name self.children += self.fields + self.methods + self.constructors def buildEnv(self, parentEnv): @@ -148,7 +147,7 @@ class ClassNode(ClassInterNode): newSuperInter = self.env.getNode(inter, 'type') self.superInter[index] = newSuperInter self.super.append(newSuperInter) - if not self.super: + if not self.super and self.canonName != "java.lang.Object": objectNode = self.env.getNode("java.lang.Object", 'type') self.super.append(objectNode) @@ -194,13 +193,11 @@ class ClassNode(ClassInterNode): def getContains(self, hierarchy): # centralized logic contains = super().getContains(hierarchy) - canonName = self.packageName + '.' + self.name - self.canonName = canonName # get contains from extends class if self.superClass: addToContains = [] - superContains = self.superClass.getContains(hierarchy + [canonName]) + superContains = self.superClass.getContains(hierarchy + [self.canonName]) for con in superContains: conOverwritten = False for index, method in enumerate(contains): @@ -245,7 +242,7 @@ class InterNode(ClassInterNode): # self.superInter = [] # self.env = None # self.children = [] - # self.canonName = "" + # self.canonName = self.packageName + '.' + self.name for node in parseTree.children: if node.name == 'ID': @@ -261,6 +258,7 @@ class InterNode(ClassInterNode): for n in nodes: self.methods.append(MethodNode(n)) + self.canonName = self.packageName + '.' + self.name self.children = self.methods def buildEnv(self, parentEnv): @@ -298,14 +296,12 @@ class InterNode(ClassInterNode): def getContains(self, hierarchy): # centralized logic contains = super().getContains(hierarchy) - canonName = self.packageName + '.' + self.name - self.canonName = canonName # an interface without any super interfaces implicitly declares an abstract version of every public method in java.lang.Object if not self.superInter: addToContains = [] objectInterface = self.env.getNode('java.lang.Object', 'type') - superContains = objectInterface.getContains(hierarchy + [canonName]) + superContains = objectInterface.getContains(hierarchy + [self.canonName]) for con in superContains: conOverwritten = False if 'public' in con.mods: -- GitLab