diff --git a/TypeNodes.py b/TypeNodes.py index 4581b105fd6d1623e2a915d9a437dde8d6ea8a9a..43652774e74011b3a9197eeb9a1082aaa42cff15 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: