From 6b771591b674bad3a0acb5c02883897a7c2398ea Mon Sep 17 00:00:00 2001
From: Recolic Keghart <root@recolic.net>
Date: Mon, 8 Apr 2019 19:57:55 -0700
Subject: [PATCH] nonlocal_forward pass

---
 src/main/java/chocopy/pa2/TypeChecker.java | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/main/java/chocopy/pa2/TypeChecker.java b/src/main/java/chocopy/pa2/TypeChecker.java
index 1a24a45..4fc8662 100644
--- a/src/main/java/chocopy/pa2/TypeChecker.java
+++ b/src/main/java/chocopy/pa2/TypeChecker.java
@@ -196,7 +196,6 @@ public class TypeChecker extends AbstractNodeAnalyzer<SymbolType> {
     public SymbolType analyze(GlobalDecl globalDecl) {
         String name = globalDecl.variable.name;
         SymbolType T = globals.get(name);
-        System.out.println("DEBUG< GOL< " + isBuildingSym + " buildingSym, name=" + name + ", Type=" + T);
         if(T == null) {
             if(isBuildingSym)
                 return OBJECT_TYPE; // workaround for fucking use-before-decl
@@ -213,14 +212,16 @@ public class TypeChecker extends AbstractNodeAnalyzer<SymbolType> {
     @Override
     public SymbolType analyze(NonLocalDecl nonLocalDecl) {
         String name = nonLocalDecl.variable.name;
-        SymbolType T = sym.get(name); // auto-iterate through the tree.
+        if(sym.getParent() == null) {
+            errors.semError(nonLocalDecl, "nonlocal declaration '" + name + "' not allowed in global scope.");
+        }
+        SymbolType T = sym.getParent().get(name); // auto-iterate through the tree.
+        System.out.println("DEBUG< NONL< " + isBuildingSym + " buildingSym, name=" + name + ", Type=" + T);
         if(T == null) {
             if(isBuildingSym)
                 return OBJECT_TYPE;
             errors.semError(nonLocalDecl, "nonlocal id '" + name + "' not found in parent scope..");
         }
-        if(sym == globals)
-            errors.semError(nonLocalDecl, "nonlocal declaration '" + name + "' not allowed in global scope.");
         if(!isBuildingSym)
             // dirty! see comment in StudentAnalysis.java
             sym.overwrite_put(name, T);
-- 
GitLab