From c62c25f3a1eda8078fcb414d15494219ccfb90bc Mon Sep 17 00:00:00 2001
From: Xun Yang <x299yang@uwaterloo.ca>
Date: Mon, 24 Feb 2020 17:25:18 -0500
Subject: [PATCH] some nodes

---
 CompNode.py    | 25 ++++++++++++-------------
 LineNodes.py   | 44 ++++++++++++++++++++++----------------------
 MemberNodes.py |  3 ++-
 TypeNodes.py   | 13 +++++++++++--
 4 files changed, 47 insertions(+), 38 deletions(-)

diff --git a/CompNode.py b/CompNode.py
index d77cc1c..98db315 100644
--- a/CompNode.py
+++ b/CompNode.py
@@ -35,18 +35,17 @@ class CompNode(ASTNode):
     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)
-
+        # # 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
diff --git a/LineNodes.py b/LineNodes.py
index eb8e271..0e3013b 100644
--- a/LineNodes.py
+++ b/LineNodes.py
@@ -1,37 +1,37 @@
 from AST import ASTNode, getParseTreeNodes, getTypeName
 from Environment import Env
+from WordNodes import ExprNode
 
-# expr
-class ExprNode(ASTNode):
+# containing line level nodes: block, for/while/if, declaration
+
+# block
+class BlockNode(ASTNode):
+    # always list all fields in the init method to show the class structure
+    def __init__(self, parseTree):
+        self.parseTree = parseTree
+        self.statements = StatementsNode(parseTree.children[1])  # block LBRACK statements RBRACK
+        self.env = None
+        self.children = self.statements
+    # a wrapper around statementsNode use to check double declaration within a block
+
+class VarDclNode(ASTNode):
     # always list all fields in the init method to show the class structure
     def __init__(self, parseTree):
         self.parseTree = parseTree
-        self.left = ''
-        self.op = ''
-        self.right = None  # another expr
+        self.dclType = ''
+        self.name = ''
+        self.assign = None # AssignNode, can be None
+        self.statements = []  # list of nodes representing statements in a block
         self.env = None
         self.children = []
+    # input is :    statement type variableDcl SEMICO
 
-    # def buildEnv(self, parentEnv):
-    #     env = Env(parentEnv)
-    #     # env.addtoEnv()
-    #
-    #
-    #     self.env = env
-    #     return env
 
-# block
-class BlockNode(ASTNode):
+
+class ForNode(ASTNode):
     # always list all fields in the init method to show the class structure
     def __init__(self, parseTree):
         self.parseTree = parseTree
-        self.statements = []  # list of statements in a block
+        self.statements = []  # list of nodes representing statements in a block
         self.env = None
         self.children = []
-
-    # def buildEnv(self, parentEnv):
-    #     env = Env(parentEnv)
-    #     # env.addtoEnv()
-    #
-    #     self.env = env
-    #     return env
diff --git a/MemberNodes.py b/MemberNodes.py
index 0785aad..445f8c6 100644
--- a/MemberNodes.py
+++ b/MemberNodes.py
@@ -1,5 +1,6 @@
 from AST import ASTNode, getParseTreeNodes, getTypeName
-from LineNodes import ExprNode, BlockNode
+from LineNodes import BlockNode
+from WordNodes import ExprNode
 from Environment import Env
 from collections import OrderedDict
 
diff --git a/TypeNodes.py b/TypeNodes.py
index 2d82d99..e9b1300 100644
--- a/TypeNodes.py
+++ b/TypeNodes.py
@@ -52,11 +52,20 @@ class ClassNode(ASTNode):
 
     def buildEnv(self, parentEnv):
         env = Env(parentEnv)
-        for c in self.children:
-            env.addtoEnv(c)
+        for m in self.methods:
+            env.addtoEnv(m)
+        for f in self.fields:
+            env.addtoEnv(f)
+        # not adding constructor to the environment, since it's in the type namespace
+        # when looking for a constructor, look for a class with the same name, and look in its constructors field
         self.env = env
         return env
 
+    def getConstructor(self, argTypes):
+        for c in self.constructors:
+            if c.paramTypes == argTypes:
+                return c
+
 #####################################################################
 # interface
 class InterNode(ASTNode):
-- 
GitLab