Skip to content
Snippets Groups Projects
CompNode.py 2.18 KiB
from AST import ASTNode, getParseTreeNodes
from TypeNodes import InterNode, ClassNode
from Environment import Env

# compilation unit
class CompNode(ASTNode):
    # always list all fields in the init method to show the class structure
    def __init__(self, parseTree):
        self.parseTree = parseTree
        self.packageName = ''
        self.importNames = [] # list of strings representing names getting imported
        self.env = None
        self.typeDcl = None
        self.children = []

        for node in parseTree.children:
            if node.name == 'packageDcl':
                nameNodes = getParseTreeNodes(['ID', 'COMPID'], node)
                for n in nameNodes:
                    self.packageName = n.lex
            elif node.name == 'importDcls':
                nameNodes = getParseTreeNodes(['ID', 'COMPID', 'IMPORTALL'], node)
                for n in nameNodes:
                    self.importNames.append(n.lex)
            elif node.name == 'topDcls':
                typeNode = getParseTreeNodes('classDcl', node)
                if not typeNode:
                    typeNode = getParseTreeNodes('interfaceDcl', node)
                    self.typeDcl = InterNode(typeNode[0])
                else:
                    self.typeDcl = ClassNode(typeNode[0])
        # always populate the children list
        self.children.append(self.typeDcl)

    def buildEnv(self, parentEnv):
        env = Env(None)  # global environment is not the parent Env, each file don't have access to all the stuff in global env
        env.addtoEnv(self.typeDcl)
        # # add imports
        # for i in self.importNames:
        #     pName = i.split('.*') # check if it's import all
        #     if len(pName) == 2:
        #         nodes = parentEnv.getNodesByPackage(pName[0])
        #         for k, v in nodes:
        #             if k in env.map:
        #                 raise Exception('ERROR: Declaration of {} is already in current Environment, cannot import it again'.format(pName + '.'  + typeDcl.name))
        #             env.map[k] = v
        #     else:
        #         node = parentEnv.getNode(pName[0])
        #         env.addtoEnv(node)
        self.env = env
        return env