Skip to content
Snippets Groups Projects
Commit f432f1cc authored by Nicholas Robinson's avatar Nicholas Robinson
Browse files

canonName & super set

- class/interface set canonName in constructing of node
- java.lang.Object super set = []
parent 4186f53f
No related branches found
No related tags found
No related merge requests found
......@@ -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:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment